diff --git a/css/admin.css b/css/admin.css index 0e0b05b..3cd9c9d 100644 --- a/css/admin.css +++ b/css/admin.css @@ -116,6 +116,7 @@ .side-menu-setting-row { display: table; + margin-bottom: 10px; } .side-menu-setting-label { diff --git a/lib/Controller/JsController.php b/lib/Controller/JsController.php index c873826..2a3231f 100644 --- a/lib/Controller/JsController.php +++ b/lib/Controller/JsController.php @@ -95,6 +95,7 @@ class JsController extends Controller { $topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]'); $topSideMenuApps = $this->config->getAppValueArray('top-side-menu-apps', '[]'); + $topMenuAppsOrder = $this->config->getAppValueArray('top-menu-apps-order', '[]'); $targetBlankApps = $this->config->getAppValueArray('target-blank-apps', '[]'); $useAvatar = $this->config->getAppValueBool('use-avatar', '0'); $isForced = $this->config->getAppValueBool('force', '0'); @@ -164,6 +165,7 @@ class JsController extends Controller 'avatar' => $avatar, 'top-menu-apps' => $topMenuApps, 'top-side-menu-apps' => $topSideMenuApps, + 'top-menu-apps-order' => $topMenuAppsOrder, 'target-blank-apps' => $targetBlankApps, 'settings' => $settings, 'logo' => $this->themingDefaults->getLogo(), diff --git a/lib/Service/AppRepository.php b/lib/Service/AppRepository.php index 258c5c5..e35f65b 100644 --- a/lib/Service/AppRepository.php +++ b/lib/Service/AppRepository.php @@ -105,4 +105,23 @@ class AppRepository return $visibleApps; } + + public function getTopMenuOrderedApps() + { + $apps = $this->getVisibleApps(); + $orders = $this->config->getAppValueArray('top-menu-apps-order', '[]'); + + usort($apps, function ($a, $b) use ($orders) { + $ak = array_keys($orders, $a['id'])[0] ?? null; + $bk = array_keys($orders, $b['id'])[0] ?? null; + + if ($ak === null || $bk === null) { + return ($a['name'] < $b['name']) ? -1 : 1; + } + + return $ak < $bk ? -1 : 1; + }); + + return $apps; + } } diff --git a/lib/Settings/Admin.php b/lib/Settings/Admin.php index a68d30c..20aa9fd 100644 --- a/lib/Settings/Admin.php +++ b/lib/Settings/Admin.php @@ -159,9 +159,11 @@ class Admin implements ISettings 'force' => $this->config->getAppValue('force', '0'), 'target-blank-apps' => $this->config->getAppValueArray('target-blank-apps', '[]'), 'top-menu-apps' => $this->config->getAppValueArray('top-menu-apps', '[]'), + 'top-menu-apps-order' => $this->config->getAppValueArray('top-menu-apps-order', '[]'), 'top-side-menu-apps' => $this->config->getAppValueArray('top-side-menu-apps', '[]'), 'default-enabled' => $this->config->getAppValue('default-enabled', '1'), 'apps' => $this->appRepository->getVisibleApps(), + 'top-menu-ordered-apps' => $this->appRepository->getTopMenuOrderedApps(), 'apps-categories-custom' => $this->config->getAppValueArray('apps-categories-custom', '[]'), 'categories-order-type' => $this->config->getAppValue('categories-order-type', 'default'), 'categories-order' => $this->config->getAppValueArray('categories-order', '[]'), diff --git a/src/AppMenu.vue b/src/AppMenu.vue index 17db6ad..7dff8f5 100644 --- a/src/AppMenu.vue +++ b/src/AppMenu.vue @@ -27,7 +27,9 @@ :key="app.id" :data-app-id="app.id" class="app-menu-entry" - :class="{ 'app-menu-entry__active': app.active }"> + :class="{ 'app-menu-entry__active': app.active }" + :style="makeStyle(app)" + > { + orders[app] = order + 1 + }) + Array.from(window.topMenuApps).forEach((id) => { if (ncApps.hasOwnProperty(id)) { this.apps[id] = ncApps[id] + this.apps[id].order = orders[id] || null } }) @@ -122,6 +131,11 @@ export default { } this.appLimit = appCount }, + makeStyle(app) { + if (app.order !== null) { + return `order: ${app.order}` + } + } }, } diff --git a/src/admin.js b/src/admin.js index 7671c56..e2f38be 100644 --- a/src/admin.js +++ b/src/admin.js @@ -257,4 +257,22 @@ document.addEventListener('DOMContentLoaded', () => { }) } catch (e) { } + + sortable('#top-menu-apps-order-list .side-menu-setting-list', { + placeholderClass: 'side-menu-setting-list-drop' + }) + + try { + sortable('#top-menu-apps-order-list .side-menu-setting-list')[0].addEventListener('sortstop', (e) => { + let value = [] + + for (let item of document.querySelectorAll('#top-menu-apps-order-list .side-menu-setting-list-item')) { + console.log(item.getAttribute('data-id')) + value.push(item.getAttribute('data-id')) + } + + document.querySelector('input[name="top-menu-apps-order"]').value = JSON.stringify(value) + }) + } catch (e) { + } }) diff --git a/templates/js/script.php b/templates/js/script.php index b942533..9911141 100644 --- a/templates/js/script.php +++ b/templates/js/script.php @@ -25,6 +25,7 @@ if ($_['always-displayed']) { const targetBlankApps = window.topMenuApps = + window.topMenuAppsOrder = window.topSideMenuApps = diff --git a/templates/settings/admin-form.php b/templates/settings/admin-form.php index fd71582..6d74ed5 100644 --- a/templates/settings/admin-form.php +++ b/templates/settings/admin-form.php @@ -829,6 +829,33 @@ $labelReset = 'Reset to default'; + +
+
+ t('Customize sorting')); ?> +
+
+ + 🖱️ t($labelShowHideApps)); ?> + + + + + ' name="top-menu-apps-order" class="side-menu-setting"> +
+