diff options
-rw-r--r-- | apps/dashboard/appinfo/routes.php | 1 | ||||
-rw-r--r-- | apps/dashboard/lib/Controller/DashboardController.php | 13 | ||||
-rw-r--r-- | apps/dashboard/src/App.vue | 39 |
3 files changed, 49 insertions, 4 deletions
diff --git a/apps/dashboard/appinfo/routes.php b/apps/dashboard/appinfo/routes.php index c4df1f732f8..e0d7979a48e 100644 --- a/apps/dashboard/appinfo/routes.php +++ b/apps/dashboard/appinfo/routes.php @@ -28,6 +28,7 @@ return [ 'routes' => [ ['name' => 'dashboard#index', 'url' => '/', 'verb' => 'GET'], ['name' => 'dashboard#updateLayout', 'url' => '/layout', 'verb' => 'POST'], + ['name' => 'dashboard#updateStatuses', 'url' => '/statuses', 'verb' => 'POST'], ['name' => 'dashboard#getBackground', 'url' => '/background', 'verb' => 'GET'], ['name' => 'dashboard#setBackground', 'url' => '/background/{type}', 'verb' => 'POST'], ] diff --git a/apps/dashboard/lib/Controller/DashboardController.php b/apps/dashboard/lib/Controller/DashboardController.php index a272c9deb14..c9fd96fcb6f 100644 --- a/apps/dashboard/lib/Controller/DashboardController.php +++ b/apps/dashboard/lib/Controller/DashboardController.php @@ -103,7 +103,10 @@ class DashboardController extends Controller { 'url' => $widget->getUrl() ]; }, $this->dashboardManager->getWidgets()); + $configStatuses = $this->config->getUserValue($this->userId, 'dashboard', 'statuses', '{}'); + $statuses = json_decode($configStatuses, true); $this->inititalStateService->provideInitialState('dashboard', 'panels', $widgets); + $this->inititalStateService->provideInitialState('dashboard', 'statuses', $statuses); $this->inititalStateService->provideInitialState('dashboard', 'layout', $userLayout); $this->inititalStateService->provideInitialState('dashboard', 'firstRun', $this->config->getUserValue($this->userId, 'dashboard', 'firstRun', '1') === '1'); $this->inititalStateService->provideInitialState('dashboard', 'shippedBackgrounds', BackgroundService::SHIPPED_BACKGROUNDS); @@ -133,6 +136,16 @@ class DashboardController extends Controller { /** * @NoAdminRequired + * @param string $statuses + * @return JSONResponse + */ + public function updateStatuses(string $statuses): JSONResponse { + $this->config->setUserValue($this->userId, 'dashboard', 'statuses', $statuses); + return new JSONResponse(['statuses' => $statuses]); + } + + /** + * @NoAdminRequired */ public function setBackground(string $type = 'default', string $value = ''): JSONResponse { $currentVersion = (int)$this->config->getUserValue($this->userId, 'dashboard', 'backgroundVersion', '0'); diff --git a/apps/dashboard/src/App.vue b/apps/dashboard/src/App.vue index 7b374065088..b70401c0267 100644 --- a/apps/dashboard/src/App.vue +++ b/apps/dashboard/src/App.vue @@ -2,6 +2,8 @@ <div id="app-dashboard" :style="backgroundStyle"> <h2>{{ greeting.text }}</h2> <ul class="statuses"> + <button @click="enableStatus('weather')">en</button> + <button @click="disableStatus('weather')">dis</button> <div v-for="status in sortedRegisteredStatus" :id="'status-' + status" :key="status"> @@ -108,6 +110,8 @@ export default { registeredStatus: [], callbacks: {}, callbacksStatus: {}, + allCallbacksStatus: {}, + enabledStatuses: loadState('dashboard', 'statuses'), panels, firstRun, displayName: getCurrentUser()?.displayName, @@ -224,10 +228,15 @@ export default { Vue.set(this.callbacks, app, callback) }, registerStatus(app, callback) { - this.registeredStatus.push(app) - this.$nextTick(() => { - Vue.set(this.callbacksStatus, app, callback) - }) + // always save callbacks in case user enables the status later + Vue.set(this.allCallbacksStatus, app, callback) + // register only if status is enabled or missing from config + if (!(app in this.enabledStatuses) || this.enabledStatuses[app]) { + this.registeredStatus.push(app) + this.$nextTick(() => { + Vue.set(this.callbacksStatus, app, callback) + }) + } }, rerenderPanels() { for (const app in this.callbacks) { @@ -253,6 +262,11 @@ export default { layout: this.layout.join(','), }) }, + saveStatuses() { + axios.post(generateUrl('/apps/dashboard/statuses'), { + statuses: JSON.stringify(this.enabledStatuses), + }) + }, showModal() { this.modal = true this.firstRun = false @@ -296,6 +310,23 @@ export default { document.body.classList.remove('dashboard--dark') } }, + enableStatus(app) { + this.enabledStatuses[app] = true + this.registerStatus(app, this.allCallbacksStatus[app]) + this.saveStatuses() + }, + disableStatus(app) { + this.enabledStatuses[app] = false + const i = this.registeredStatus.findIndex((s) => s === app) + if (i !== -1) { + this.registeredStatus.splice(i, 1) + Vue.set(this.statuses, app, { mounted: false }) + this.$nextTick(() => { + Vue.delete(this.callbacksStatus, app) + }) + } + this.saveStatuses() + }, }, } </script> |