diff --git a/composer.json b/composer.json index 2a4358e..21a1082 100644 --- a/composer.json +++ b/composer.json @@ -7,10 +7,12 @@ "type": "flarum-extension", "license": "MIT", "support": { - "forum": "https://discuss.flarum.org/d/31932-flarum-log-viewer" + "forum": "https://discuss.flarum.org/d/31932-flarum-log-viewer", + "source": "https://github.com/imorland/flarum-ext-log-viewer", + "issues": "https://github.com/imorland/flarum-ext-log-viewer/issues" }, "require": { - "flarum/core": "^1.2.0" + "flarum/core": "^1.8.2" }, "authors": [ { @@ -29,9 +31,9 @@ "title": "Log Viewer", "category": "feature", "icon": { - "name": "far fa-file-alt", - "color": "#0072e3", - "backgroundColor": "#fff" + "name": "fas fa-file-alt", + "color": "#fff", + "backgroundColor": "#0072e3" } }, "flarum-cli": { diff --git a/extend.php b/extend.php index 2a274d5..cc72dd0 100644 --- a/extend.php +++ b/extend.php @@ -24,7 +24,9 @@ (new Extend\Routes('api')) ->get('/logs', 'logs.index', Api\Controller\ListLogfilesController::class) - ->get('/logs/{file}', 'logs.show', Api\Controller\ShowLogFileController::class), + ->get('/logs/{file}', 'logs.show', Api\Controller\ShowLogFileController::class) + ->get('/logs/download/{file}', 'logs.download', Api\Controller\DownloadLogFileController::class) + ->delete('/logs/{file}', 'logs.delete', Api\Controller\DeleteLogFileController::class), (new Extend\Settings()) ->default('ianm-log-viewer.purge-days', 90) diff --git a/js/dist-typings/components/LogFileList.d.ts b/js/dist-typings/components/LogFileList.d.ts deleted file mode 100644 index 5a36327..0000000 --- a/js/dist-typings/components/LogFileList.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/// -import Component from 'flarum/common/Component'; -export default class LogFileList extends Component { - oninit(vnode: any): void; - view(): JSX.Element; - refresh(clear?: boolean): Promise; - loadResults(): Promise>; - parseResults(results: any): any; -} diff --git a/js/dist-typings/components/LogFileListItem.d.ts b/js/dist-typings/components/LogFileListItem.d.ts deleted file mode 100644 index 5ec1a7d..0000000 --- a/js/dist-typings/components/LogFileListItem.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// -import Component from 'flarum/common/Component'; -export default class LogFileListItem extends Component { - oninit(vnode: any): void; - view(): JSX.Element; - setFile(fileName: string): void; -} diff --git a/js/dist-typings/components/LogFileViewer.d.ts b/js/dist-typings/components/LogFileViewer.d.ts deleted file mode 100644 index cd55197..0000000 --- a/js/dist-typings/components/LogFileViewer.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/// -import Component from 'flarum/common/Component'; -export default class LogFileViewer extends Component { - oninit(vnode: any): void; - view(): JSX.Element; -} diff --git a/js/dist-typings/components/LogViewerPage.d.ts b/js/dist-typings/components/LogViewerPage.d.ts deleted file mode 100644 index 88f5500..0000000 --- a/js/dist-typings/components/LogViewerPage.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -import ExtensionPage from 'flarum/admin/components/ExtensionPage'; -export default class LogViewerPage extends ExtensionPage { - content(): JSX.Element; -} diff --git a/js/dist-typings/index.d.ts b/js/dist-typings/index.d.ts deleted file mode 100644 index cb0ff5c..0000000 --- a/js/dist-typings/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/js/dist-typings/models/LogFile.d.ts b/js/dist-typings/models/LogFile.d.ts deleted file mode 100644 index e134e2c..0000000 --- a/js/dist-typings/models/LogFile.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Model from 'flarum/common/Model'; -export default class LogFile extends Model { - fileName(): string; - fullPath(): string; - size(): number; - modified(): Date | null | undefined; - content(): string | null; -} diff --git a/js/dist-typings/state/LogFileState.d.ts b/js/dist-typings/state/LogFileState.d.ts deleted file mode 100644 index 059b62b..0000000 --- a/js/dist-typings/state/LogFileState.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default class LogFileState { - constructor(); - loadLogFile(filename: string): void; - getFile(): any; -} diff --git a/js/package.json b/js/package.json index 6897fef..87c5135 100644 --- a/js/package.json +++ b/js/package.json @@ -3,14 +3,14 @@ "private": true, "version": "0.0.0", "devDependencies": { - "flarum-webpack-config": "^2.0.0", - "webpack": "^5.88.2", - "webpack-cli": "^5.1.4", - "prettier": "^3.0.3", "@flarum/prettier-config": "^1.0.0", "flarum-tsconfig": "^1.0.2", - "typescript": "^4.5.4", - "typescript-coverage-report": "^0.6.1" + "flarum-webpack-config": "^2.0.2", + "prettier": "^3.0.3", + "typescript": "^5.2.2", + "typescript-coverage-report": "^0.8.0", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" }, "scripts": { "dev": "webpack --mode development --watch", diff --git a/js/src/admin/components/LogFileList.tsx b/js/src/admin/components/LogFileList.tsx index 2fc196e..03d97d3 100644 --- a/js/src/admin/components/LogFileList.tsx +++ b/js/src/admin/components/LogFileList.tsx @@ -1,18 +1,24 @@ import app from 'flarum/admin/app'; -import Component from 'flarum/common/Component'; +import Component, { ComponentAttrs } from 'flarum/common/Component'; import LoadingIndicator from 'flarum/common/components/LoadingIndicator'; import type Mithril from 'mithril'; import LogFileListItem from './LogFileListItem'; +import LogFile from '../models/LogFile'; +import LogFileState from '../state/LogFileState'; -export default class LogFileList extends Component { - oninit(vnode) { - super.oninit(vnode); +interface LogFileListAttrs extends ComponentAttrs { + state: LogFileState; +} - this.loading = true; - this.files = []; +export default class LogFileList extends Component { + loading: boolean = true; + files: LogFile[] = []; + logFileState!: LogFileState; - this.state = this.attrs.state; + oninit(vnode: Mithril.Vnode) { + super.oninit(vnode); + this.logFileState = vnode.attrs.state; this.refresh(); } @@ -20,17 +26,16 @@ export default class LogFileList extends Component { if (this.loading) { return ; } - return (
{this.files.map((file) => { - return ; + return ; })}
); } - refresh(clear = true) { + refresh(clear: boolean = true) { if (clear) { this.loading = true; this.files = []; @@ -39,15 +44,14 @@ export default class LogFileList extends Component { return this.loadResults().then(this.parseResults.bind(this)); } - loadResults() { - return app.store.find('logs'); + async loadResults(): Promise { + const results = await app.store.find('logs'); + return results as unknown as Promise; } - parseResults(results) { + parseResults(results: LogFile[]) { this.files.push(...results); - this.loading = false; - m.redraw(); return results; } diff --git a/js/src/admin/components/LogFileListItem.tsx b/js/src/admin/components/LogFileListItem.tsx index 56aa341..e554213 100644 --- a/js/src/admin/components/LogFileListItem.tsx +++ b/js/src/admin/components/LogFileListItem.tsx @@ -1,52 +1,117 @@ import app from 'flarum/admin/app'; -import Component from 'flarum/common/Component'; +import Component, { ComponentAttrs } from 'flarum/common/Component'; import Button from 'flarum/common/components/Button'; import humanTime from 'flarum/common/utils/humanTime'; -import classList from 'flarum/common/utils/classList'; import icon from 'flarum/common/helpers/icon'; +import LogFile from '../models/LogFile'; +import LogFileState from '../state/LogFileState'; +import Mithril from 'mithril'; +import LogFileViewModal from './LogFileViewModal'; +import ItemList from 'flarum/common/utils/ItemList'; +import LabelValue from 'flarum/common/components/LabelValue'; +import Tooltip from 'flarum/common/components/Tooltip'; -export default class LogFileListItem extends Component { - oninit(vnode) { - super.oninit(vnode); +interface LogFileListItemAttrs extends ComponentAttrs { + file: LogFile; + state: LogFileState; +} - this.file = this.attrs.file; - this.state = this.attrs.state; +export default class LogFileListItem extends Component { + file!: LogFile; + logFileState!: LogFileState; + + oninit(vnode: Mithril.Vnode) { + super.oninit(vnode); + this.file = vnode.attrs.file; + this.logFileState = vnode.attrs.state; } view() { - const file = this.file; - const selected = this.state?.file?.data.id === file?.data.id; - return (
+
{icon('fas fa-file-alt')}
+
{this.infoItems().toArray()}
+
{this.actionItems().toArray()}
+
+ ); + } + + infoItems(): ItemList { + const items = new ItemList(); + + items.add( + 'fileName', +
+ {this.file.fileName()} +
, + 100 + ); + + items.add( + 'fileDate', +
+ +
, + 80 + ); + + items.add( + 'fileInfo', +
+ +
, + 60 + ); + + return items; + } + + actionItems(): ItemList { + const items = new ItemList(); + const fileName = this.file.fileName(); + + items.add( + 'view', + - + /> + , + 50 + ); + + items.add( + 'download', + +