From f3e2f10478adb5c021d855ff9086f01c15af4e3f Mon Sep 17 00:00:00 2001 From: Johannes Zellner Date: Sat, 25 Jan 2025 17:09:53 +0100 Subject: [PATCH] Convert Eventlogs to vue --- dashboard/package-lock.json | 14 +- dashboard/package.json | 2 +- dashboard/public/js/index.js | 4 +- dashboard/src/Index.vue | 6 + dashboard/src/components/AppPasswords.vue | 4 +- dashboard/src/models/AppsModel.js | 7 +- dashboard/src/models/EventlogsModel.js | 33 ++ dashboard/src/views/AppsView.vue | 4 +- dashboard/src/views/EventlogView.vue | 669 ++++++++++++++++++++++ 9 files changed, 726 insertions(+), 17 deletions(-) create mode 100644 dashboard/src/models/EventlogsModel.js create mode 100644 dashboard/src/views/EventlogView.vue diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 5911db321..cde88a3bb 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -25,7 +25,7 @@ "jquery": "^3.7.1", "marked": "^15.0.6", "moment": "^2.30.1", - "pankow": "^2.7.0", + "pankow": "^2.7.1", "pankow-viewers": "^1.0.11", "sass": "^1.83.4", "vite": "^6.0.11", @@ -2416,9 +2416,9 @@ } }, "node_modules/pankow": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.7.0.tgz", - "integrity": "sha512-NCeRJ1PTr4BIY+RBk60Cj7+IUBPjtcXIOFFPSP6OaFgdh/M7Nq9ib7dg4n4MiULiCP77wAZX4qau4B6PU4dy5Q==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.7.1.tgz", + "integrity": "sha512-dUGvaDnsh6NKUELvjtyrjuce5OBCOhZY7uGib0DgueyaZi3ZsZHy2IxJq7Sfy0iRUr2u3xgpeKmojoWKDatQJA==", "license": "ISC", "dependencies": { "@fontsource/inter": "^5.1.1", @@ -4500,9 +4500,9 @@ } }, "pankow": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.7.0.tgz", - "integrity": "sha512-NCeRJ1PTr4BIY+RBk60Cj7+IUBPjtcXIOFFPSP6OaFgdh/M7Nq9ib7dg4n4MiULiCP77wAZX4qau4B6PU4dy5Q==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.7.1.tgz", + "integrity": "sha512-dUGvaDnsh6NKUELvjtyrjuce5OBCOhZY7uGib0DgueyaZi3ZsZHy2IxJq7Sfy0iRUr2u3xgpeKmojoWKDatQJA==", "requires": { "@fontsource/inter": "^5.1.1", "@fortawesome/fontawesome-free": "^6.7.2", diff --git a/dashboard/package.json b/dashboard/package.json index c2ff325aa..65d059888 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -26,7 +26,7 @@ "jquery": "^3.7.1", "marked": "^15.0.6", "moment": "^2.30.1", - "pankow": "^2.7.0", + "pankow": "^2.7.1", "pankow-viewers": "^1.0.11", "sass": "^1.83.4", "vite": "^6.0.11", diff --git a/dashboard/public/js/index.js b/dashboard/public/js/index.js index 7fd604ae7..fe8668ae1 100644 --- a/dashboard/public/js/index.js +++ b/dashboard/public/js/index.js @@ -100,8 +100,8 @@ app.config(['$routeProvider', function ($routeProvider) { // controller: 'SettingsController', // templateUrl: 'views/settings.html?' + window.VITE_CACHE_ID }).when('/eventlog', { - controller: 'EventLogController', - templateUrl: 'views/eventlog.html?' + window.VITE_CACHE_ID + // controller: 'EventLogController', + // templateUrl: 'views/eventlog.html?' + window.VITE_CACHE_ID }).when('/support', { // controller: 'SupportController', // templateUrl: 'views/support.html?' + window.VITE_CACHE_ID diff --git a/dashboard/src/Index.vue b/dashboard/src/Index.vue index f45f8edb3..94ca84030 100644 --- a/dashboard/src/Index.vue +++ b/dashboard/src/Index.vue @@ -4,6 +4,7 @@ import { Notification } from 'pankow'; import AppsView from './views/AppsView.vue'; import AppstoreView from './views/AppstoreView.vue'; +import EventlogView from './views/EventlogView.vue'; import NetworkView from './views/NetworkView.vue'; import ProfileView from './views/ProfileView.vue'; import ServicesView from './views/ServicesView.vue'; @@ -19,6 +20,7 @@ const API_ORIGIN = import.meta.env.VITE_API_ORIGIN ? import.meta.env.VITE_API_OR const VIEWS = { APPS: 'apps', APPSTORE: 'appstore', + EVENTLOG: 'eventlog', NETWORK: 'network', PROFILE: 'profile', SERVICES: 'services', @@ -33,6 +35,7 @@ export default { components: { AppsView, AppstoreView, + EventlogView, NetworkView, Notification, ProfileView, @@ -69,6 +72,8 @@ export default { that.view = VIEWS.APPS; } else if (view.indexOf(VIEWS.APPSTORE) === 0) { that.view = VIEWS.APPSTORE; + } else if (view === VIEWS.EVENTLOG) { + that.view = VIEWS.EVENTLOG; } else if (view === VIEWS.NETWORK) { that.view = VIEWS.NETWORK; } else if (view === VIEWS.PROFILE) { @@ -104,6 +109,7 @@ export default { + diff --git a/dashboard/src/components/AppPasswords.vue b/dashboard/src/components/AppPasswords.vue index e6f2b240a..6ceb503bc 100644 --- a/dashboard/src/components/AppPasswords.vue +++ b/dashboard/src/components/AppPasswords.vue @@ -120,7 +120,9 @@ onMounted(async () => { // build the password identifier selection model identifiers.value = [{ id: 'mail', label: 'Mail client' }]; - const apps = await appsModel.list(); + const [error, apps] = await appsModel.list(); + if (error) return console.error(error); + apps.forEach(function (app) { if (!app.manifest.addons) return; if (app.manifest.addons.email) return; diff --git a/dashboard/src/models/AppsModel.js b/dashboard/src/models/AppsModel.js index ee1742326..604bd642a 100644 --- a/dashboard/src/models/AppsModel.js +++ b/dashboard/src/models/AppsModel.js @@ -122,10 +122,7 @@ function create(origin, accessToken, id) { error = e; } - if (error || result.status !== 200) { - console.error('Failed to list apps.', error || result.status); - return []; - } + if (error || result.status !== 200) return [error || result]; for (const app of result.body.apps) { app.ssoAuth = app.sso && (app.manifest.addons['ldap'] || app.manifest.addons['oidc'] || app.manifest.addons['proxyAuth']); // checking app.sso first ensures app.manifest.addons is not null @@ -150,7 +147,7 @@ function create(origin, accessToken, id) { } } - return result.body.apps; + return [null, result.body.apps]; }, async get(id) { let error, result; diff --git a/dashboard/src/models/EventlogsModel.js b/dashboard/src/models/EventlogsModel.js new file mode 100644 index 000000000..3ab6f7946 --- /dev/null +++ b/dashboard/src/models/EventlogsModel.js @@ -0,0 +1,33 @@ + +import { fetcher } from 'pankow'; + +function create(origin, accessToken) { + return { + async search(actions, search, page, per_page) { + let error, result; + try { + result = await fetcher.get(`${origin}/api/v1/eventlog`, { actions, search, page, per_page, access_token: accessToken }); + } catch (e) { + error = e; + } + + if (error || result.status !== 200) return [error || result]; + return [null, result.body.eventlogs]; + }, + async get(id) { + let error, result; + try { + result = await fetcher.get(`${origin}/api/v1/eventlog/${id}`, { access_token: accessToken }); + } catch (e) { + error = e; + } + + if (error || result.status !== 200) return [error || result]; + return [null, result.body.event]; + }, + }; +} + +export default { + create, +}; diff --git a/dashboard/src/views/AppsView.vue b/dashboard/src/views/AppsView.vue index b6d86c30e..dfa82a67b 100644 --- a/dashboard/src/views/AppsView.vue +++ b/dashboard/src/views/AppsView.vue @@ -148,7 +148,9 @@ export default { return app.accessLevel === 'operator' || app.accessLevel === 'admin'; }, async refreshApps() { - const apps = await appsModel.list(); + const [error, apps] = await appsModel.list(); + if (error) return console.error(error); + const applinks = await applinksModel.list(); // amend properties to mimick full app diff --git a/dashboard/src/views/EventlogView.vue b/dashboard/src/views/EventlogView.vue new file mode 100644 index 000000000..9953b2093 --- /dev/null +++ b/dashboard/src/views/EventlogView.vue @@ -0,0 +1,669 @@ + + + + +