]> source.dussan.org Git - nextcloud-server.git/commitdiff
now able to toggle statuses
authorJulien Veyssier <eneiluj@posteo.net>
Fri, 21 Aug 2020 12:58:12 +0000 (14:58 +0200)
committerJulien Veyssier <eneiluj@posteo.net>
Fri, 21 Aug 2020 12:58:12 +0000 (14:58 +0200)
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
apps/dashboard/appinfo/routes.php
apps/dashboard/lib/Controller/DashboardController.php
apps/dashboard/src/App.vue

index c4df1f732f8a37078a4716dd3b30d2f10e468bb2..e0d7979a48e9dd685bd80fc83c44ac4fdb5525c6 100644 (file)
@@ -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'],
        ]
index a272c9deb14d9e509841d42a2d9b188418844518..c9fd96fcb6f74c12c5e224b5d99aa45fa75af830 100644 (file)
@@ -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);
@@ -131,6 +134,16 @@ class DashboardController extends Controller {
                return new JSONResponse(['layout' => $layout]);
        }
 
+       /**
+        * @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
         */
index 7b374065088751e6e636aa1386501f952fb93c3f..b70401c02671d9d1829fa162c136cbf0d0a60043 100644 (file)
@@ -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>