diff --git a/appinfo/app.php b/appinfo/app.php index 86a3245..7c48ca1 100644 --- a/appinfo/app.php +++ b/appinfo/app.php @@ -1,71 +1,10 @@ . - */ +use OCA\SideMenu\AppInfo\Application; -namespace OCA\SideMenu\Appinfo; +$app = new Application(); -use OC\Security\CSP\ContentSecurityPolicy; -use OCP\Util; -use OCP\IUserSession; - -$config = \OC::$server->getConfig(); -$cspnm = \OC::$server->getContentSecurityPolicyNonceManager(); -$user = \OC::$server[IUserSession::class]->getUser(); - -$enabled = true; - -if ($user !== null) { - $enabled = (bool) $config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1'); -} - -if ($enabled) { - Util::addScript('side_menu', 'sideMenu'); - Util::addStyle('side_menu', 'sideMenu'); - - $stylesheet = \OC::$server->getURLGenerator()->linkToRoute( - 'side_menu.Css.stylesheet', - [ - 'v' => $config->getAppValue('side_menu', 'cache', '0'), - ] - ); - - $script = \OC::$server->getURLGenerator()->linkToRoute( - 'side_menu.Js.script', - [ - 'v' => $config->getAppValue('side_menu', 'cache', '0'), - ] - ); - - Util::addHeader( - 'link', - [ - 'href' => $stylesheet, - 'rel' => 'stylesheet' - ], - '' - ); - - Util::addHeader( - 'script', - [ - 'src' => $script, - 'nonce' => $cspnm->getNonce(), - ], - '' - ); +if ($app->isEnabled()) { + $app->registerAssets(); + $app->registerServices(); } diff --git a/appinfo/info.xml b/appinfo/info.xml index cdb3422..2541f1f 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -15,7 +15,7 @@ You can report a bug or request a feature by opening an issue. ]]> agpl Simon Vieille - 1.7.0 + 1.8.0-rc1 SideMenu customization https://gitnet.fr/deblan/side_menu diff --git a/appinfo/routes.php b/appinfo/routes.php index dc82109..be3ae60 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -21,6 +21,7 @@ return [ 'routes' => [ ['name' => 'Css#stylesheet', 'url' => '/css/stylesheet', 'verb' => 'GET'], ['name' => 'Js#script', 'url' => '/js/script', 'verb' => 'GET'], + ['name' => 'Nav#items', 'url' => '/nav/items', 'verb' => 'GET'], ['name' => 'PersonalSetting#valueSet', 'url' => '/personalSetting/valueSet', 'verb' => 'POST'], ], ]; diff --git a/css/admin.css b/css/admin.css index 8c59876..6532ea0 100644 --- a/css/admin.css +++ b/css/admin.css @@ -20,6 +20,11 @@ margin: 10px 0 10px 0; } +#side-menu-section input[type="checkbox"] { + vertical-align: middle; +} + + #side-menu-section select { margin: 10px 0 10px 0; } @@ -32,3 +37,5 @@ color: #555; border-radius: 3px; } + + diff --git a/css/sideMenu.css b/css/sideMenu.css index b4c41c1..df705a4 100644 --- a/css/sideMenu.css +++ b/css/sideMenu.css @@ -122,3 +122,68 @@ width: 0; transition-property: width; } + +#side-menu.side-menu-big { + max-width: 100%; + height: auto; +} + +.side-menu-big .side-menu-header { + height: auto; +} + +.side-menu-big .side-menu-apps-list { + height: auto; + position: static; + max-width: 100vw; + overflow: auto; +} + +.side-menu-big .side-menu-app a { + padding: 7px 0 7px 7px; +} + +.side-menu-categories-wrapper { + padding-bottom: 70px; +} + +.side-menu-categories { + max-height: calc(100vh - 50px); + overflow: auto; + position: relative; + top: 50px; + display: flex; + flex-wrap: wrap; + justify-content: center; + padding: 0 10% 0 10%; +} + +.side-menu-category { + padding: 10px 20px; + flex: 1 1 auto; +} + +.side-menu-category-title { + padding-left: 10px; + color: var(--side-menu-text-color, #fff); +} + +.side-menu-big .side-menu-app-icon { + vertical-align: middle; + margin-top: -2px; +} + +@media screen and (max-width: 1024px) { + .side-menu-categories { + display: block; + padding: 0; + } + + .side-menu-category { + padding: 10px 0; + } + + #side-menu.side-menu-big { + height: 100vh; + } +} diff --git a/l10n/ar.js b/l10n/ar.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ar.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ar.json b/l10n/ar.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ar.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ast.js b/l10n/ast.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ast.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ast.json b/l10n/ast.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ast.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/bg.js b/l10n/bg.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/bg.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/bg.json b/l10n/bg.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/bg.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ca.js b/l10n/ca.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ca.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ca.json b/l10n/ca.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ca.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/cs.js b/l10n/cs.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/cs.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/cs.json b/l10n/cs.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/cs.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/da.js b/l10n/da.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/da.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/da.json b/l10n/da.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/da.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/de.js b/l10n/de.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/de.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/de.json b/l10n/de.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/de.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/de_DE.js b/l10n/de_DE.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/de_DE.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/de_DE.json b/l10n/de_DE.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/de_DE.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/el.js b/l10n/el.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/el.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/el.json b/l10n/el.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/el.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/en_GB.js b/l10n/en_GB.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/en_GB.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/en_GB.json b/l10n/en_GB.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/en_GB.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/eo.js b/l10n/eo.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/eo.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/eo.json b/l10n/eo.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/eo.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es.js b/l10n/es.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es.json b/l10n/es.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_419.js b/l10n/es_419.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_419.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_419.json b/l10n/es_419.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_419.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_CL.js b/l10n/es_CL.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_CL.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_CL.json b/l10n/es_CL.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_CL.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_CO.js b/l10n/es_CO.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_CO.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_CO.json b/l10n/es_CO.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_CO.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_CR.js b/l10n/es_CR.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_CR.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_CR.json b/l10n/es_CR.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_CR.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_DO.js b/l10n/es_DO.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_DO.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_DO.json b/l10n/es_DO.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_DO.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_EC.js b/l10n/es_EC.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_EC.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_EC.json b/l10n/es_EC.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_EC.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_GT.js b/l10n/es_GT.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_GT.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_GT.json b/l10n/es_GT.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_GT.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_HN.js b/l10n/es_HN.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_HN.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_HN.json b/l10n/es_HN.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_HN.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_MX.js b/l10n/es_MX.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_MX.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_MX.json b/l10n/es_MX.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_MX.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_NI.js b/l10n/es_NI.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_NI.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_NI.json b/l10n/es_NI.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_NI.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_PA.js b/l10n/es_PA.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_PA.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_PA.json b/l10n/es_PA.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_PA.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_PE.js b/l10n/es_PE.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_PE.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_PE.json b/l10n/es_PE.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_PE.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_PR.js b/l10n/es_PR.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_PR.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_PR.json b/l10n/es_PR.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_PR.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_PY.js b/l10n/es_PY.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_PY.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_PY.json b/l10n/es_PY.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_PY.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_SV.js b/l10n/es_SV.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_SV.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_SV.json b/l10n/es_SV.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_SV.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/es_UY.js b/l10n/es_UY.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/es_UY.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/es_UY.json b/l10n/es_UY.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/es_UY.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/et_EE.js b/l10n/et_EE.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/et_EE.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/et_EE.json b/l10n/et_EE.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/et_EE.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/eu.js b/l10n/eu.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/eu.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/eu.json b/l10n/eu.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/eu.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/fa.js b/l10n/fa.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/fa.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/fa.json b/l10n/fa.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/fa.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/fi.js b/l10n/fi.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/fi.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/fi.json b/l10n/fi.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/fi.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/fr.js b/l10n/fr.js new file mode 100644 index 0000000..6c21d05 --- /dev/null +++ b/l10n/fr.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Menu latéral", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); diff --git a/l10n/fr.json b/l10n/fr.json new file mode 100644 index 0000000..6b18273 --- /dev/null +++ b/l10n/fr.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Menu latéral" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} diff --git a/l10n/gl.js b/l10n/gl.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/gl.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/gl.json b/l10n/gl.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/gl.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/he.js b/l10n/he.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/he.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/he.json b/l10n/he.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/he.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/hr.js b/l10n/hr.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/hr.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/hr.json b/l10n/hr.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/hr.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/hu.js b/l10n/hu.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/hu.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/hu.json b/l10n/hu.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/hu.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/is.js b/l10n/is.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/is.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/is.json b/l10n/is.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/is.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/it.js b/l10n/it.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/it.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/it.json b/l10n/it.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/it.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ja.js b/l10n/ja.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ja.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ja.json b/l10n/ja.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ja.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ka_GE.js b/l10n/ka_GE.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ka_GE.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ka_GE.json b/l10n/ka_GE.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ka_GE.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ko.js b/l10n/ko.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ko.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ko.json b/l10n/ko.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ko.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/lt_LT.js b/l10n/lt_LT.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/lt_LT.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/lt_LT.json b/l10n/lt_LT.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/lt_LT.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/lv.js b/l10n/lv.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/lv.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/lv.json b/l10n/lv.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/lv.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/nb.js b/l10n/nb.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/nb.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/nb.json b/l10n/nb.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/nb.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/nl.js b/l10n/nl.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/nl.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/nl.json b/l10n/nl.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/nl.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/nn_NO.js b/l10n/nn_NO.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/nn_NO.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/nn_NO.json b/l10n/nn_NO.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/nn_NO.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/pl.js b/l10n/pl.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/pl.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/pl.json b/l10n/pl.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/pl.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/pt_BR.js b/l10n/pt_BR.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/pt_BR.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/pt_BR.json b/l10n/pt_BR.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/pt_BR.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/pt_PT.js b/l10n/pt_PT.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/pt_PT.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/pt_PT.json b/l10n/pt_PT.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/pt_PT.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ro.js b/l10n/ro.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ro.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ro.json b/l10n/ro.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ro.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/ru.js b/l10n/ru.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/ru.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/ru.json b/l10n/ru.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/ru.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/sk.js b/l10n/sk.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/sk.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/sk.json b/l10n/sk.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/sk.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/sl.js b/l10n/sl.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/sl.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/sl.json b/l10n/sl.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/sl.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/sr.js b/l10n/sr.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/sr.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/sr.json b/l10n/sr.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/sr.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/sv.js b/l10n/sv.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/sv.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/sv.json b/l10n/sv.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/sv.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/tr.js b/l10n/tr.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/tr.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/tr.json b/l10n/tr.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/tr.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/uk.js b/l10n/uk.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/uk.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/uk.json b/l10n/uk.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/uk.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/vi.js b/l10n/vi.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/vi.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/vi.json b/l10n/vi.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/vi.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/zh_CN.js b/l10n/zh_CN.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/zh_CN.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/zh_CN.json b/l10n/zh_CN.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/zh_CN.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/l10n/zh_TW.js b/l10n/zh_TW.js new file mode 100644 index 0000000..ade1ef4 --- /dev/null +++ b/l10n/zh_TW.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "side_menu", + { + "Side menu": "Side menu", + }, + "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +); \ No newline at end of file diff --git a/l10n/zh_TW.json b/l10n/zh_TW.json new file mode 100644 index 0000000..a091038 --- /dev/null +++ b/l10n/zh_TW.json @@ -0,0 +1,6 @@ +{ + "translations": { + "Side menu": "Side menu" + }, + "pluralForm": "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +} \ No newline at end of file diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php new file mode 100644 index 0000000..35671c1 --- /dev/null +++ b/lib/AppInfo/Application.php @@ -0,0 +1,114 @@ + + */ +class Application extends App +{ + /** + * @var OC\AllConfig + */ + protected $config; + + /** + * @var ContentSecurityPolicyNonceManager + */ + protected $cspnm; + + /** + * @var User + */ + protected $user; + + /** + * {@inheritdoc} + */ + public function __construct(array $urlParams = []) + { + parent::__construct('side_menu', $urlParams); + + $this->config = OC::$server->getConfig(); + $this->cspnm = OC::$server->getContentSecurityPolicyNonceManager(); + $this->user = OC::$server[IUserSession::class]->getUser(); + } + + /** + * Checks if this app is enabled. + */ + public function isEnabled(): bool + { + $enabled = true; + + if (null !== $this->user) { + $enabled = (bool) $this->config->getUserValue($this->user->getUid(), 'side_menu', 'enabled', '1'); + } + + return $enabled; + } + + /** + * Registes services. + */ + public function registerServices() + { + $container = $this->getContainer(); + + $container->registerService('AppRepository', function (ContainerInterface $c) { + return new AppRepository(new OC_App()); + }); + } + + /** + * Registers assets. + */ + public function registerAssets() + { + Util::addScript('side_menu', 'sideMenu'); + Util::addStyle('side_menu', 'sideMenu'); + + $stylesheet = OC::$server->getURLGenerator()->linkToRoute( + 'side_menu.Css.stylesheet', + [ + 'v' => $this->config->getAppValue('side_menu', 'cache', '0'), + ] + ); + + $script = OC::$server->getURLGenerator()->linkToRoute( + 'side_menu.Js.script', + [ + 'v' => $this->config->getAppValue('side_menu', 'cache', '0'), + ] + ); + + Util::addHeader( + 'link', + [ + 'href' => $stylesheet, + 'rel' => 'stylesheet', + ], + '' + ); + + Util::addHeader( + 'script', + [ + 'src' => $script, + 'nonce' => $this->cspnm->getNonce(), + ], + '' + ); + } +} diff --git a/lib/Controller/CssController.php b/lib/Controller/CssController.php index b950115..b06ff49 100644 --- a/lib/Controller/CssController.php +++ b/lib/Controller/CssController.php @@ -18,15 +18,16 @@ namespace OCA\SideMenu\Controller; +use OC; use OCP\AppFramework\Controller; -use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\Response; +use OCP\AppFramework\Http\TemplateResponse; use OCP\IConfig; use OCP\IRequest; +use OCP\IUserSession; class CssController extends Controller { - /** * @var \OCP\IConfig */ @@ -34,8 +35,6 @@ class CssController extends Controller /** * @param string $appName - * @param IRequest $request - * @param IConfig $config */ public function __construct($appName, IRequest $request, IConfig $config) { @@ -56,6 +55,17 @@ class CssController extends Controller $backgroundColor = $this->config->getAppValue('side_menu', 'background-color', '#333333'); $backgroundColorTo = $this->config->getAppValue('side_menu', 'background-color-to', $backgroundColor); + $user = OC::$server[IUserSession::class]->getUser(); + $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true); + + if ($user) { + $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true); + + if (!empty($userTopMenuApps)) { + $topMenuApps = $userTopMenuApps; + } + } + $parameters = [ 'vars' => [ 'background-color' => $backgroundColor, @@ -70,6 +80,8 @@ class CssController extends Controller 'external-sites-in-top-menu' => (bool) $this->config->getAppValue('side_menu', 'external-sites-in-top-menu', 0), 'size-icon' => $this->config->getAppValue('side_menu', 'size-icon', 'normal'), 'size-text' => $this->config->getAppValue('side_menu', 'size-text', 'normal'), + 'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'), + 'top-menu-apps' => $topMenuApps, ]; $response = new TemplateResponse('side_menu', 'css/stylesheet', $parameters, 'blank'); diff --git a/lib/Controller/JsController.php b/lib/Controller/JsController.php index 49eee72..71667b8 100644 --- a/lib/Controller/JsController.php +++ b/lib/Controller/JsController.php @@ -18,15 +18,16 @@ namespace OCA\SideMenu\Controller; +use OC; use OCP\AppFramework\Controller; -use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\Response; +use OCP\AppFramework\Http\TemplateResponse; use OCP\IConfig; use OCP\IRequest; +use OCP\IUserSession; class JsController extends Controller { - /** * @var \OCP\IConfig */ @@ -34,8 +35,6 @@ class JsController extends Controller /** * @param string $appName - * @param IRequest $request - * @param IConfig $config */ public function __construct($appName, IRequest $request, IConfig $config) { @@ -53,6 +52,17 @@ class JsController extends Controller */ public function script() { + $user = OC::$server[IUserSession::class]->getUser(); + $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true); + + if ($user) { + $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true); + + if (!empty($userTopMenuApps)) { + $topMenuApps = $userTopMenuApps; + } + } + $parameters = [ 'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'), 'opener-hover' => (bool) $this->config->getAppValue('side_menu', 'opener-hover', '0'), @@ -60,6 +70,8 @@ class JsController extends Controller 'force-light-icon' => (bool) $this->config->getAppValue('side_menu', 'force-light-icon', '0'), 'hide-when-no-apps' => (bool) $this->config->getAppValue('side_menu', 'hide-when-no-apps', '0'), 'loader-enabled' => (bool) $this->config->getAppValue('side_menu', 'loader-enabled', '1'), + 'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'), + 'top-menu-apps' => $topMenuApps, ]; $response = new TemplateResponse('side_menu', 'js/script', $parameters, 'blank'); diff --git a/lib/Controller/NavController.php b/lib/Controller/NavController.php new file mode 100644 index 0000000..4e0751c --- /dev/null +++ b/lib/Controller/NavController.php @@ -0,0 +1,202 @@ +. + */ + +namespace OCA\SideMenu\Controller; + +use OC; +use OC\App\AppStore\Fetcher\CategoryFetcher; +use OC\URLGenerator; +use OCA\SideMenu\Service\AppRepository; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IRequest; +use OCP\IUserSession; +use OCP\L10N\IFactory; + +class NavController extends Controller +{ + /** + * @var IConfig + */ + protected $config; + + /** + * @var AppRepository + */ + protected $appRepository; + + /** + * @var IFactory + */ + protected $l10nFactory; + + /** + * @var CategoryFetcher + */ + protected $categoryFetcher; + + /** + * @var URLGenerator + */ + protected $router; + + /** + * @param string $appName + */ + public function __construct( + $appName, + IRequest $request, + IConfig $config, + AppRepository $appRepository, + CategoryFetcher $categoryFetcher, + URLGenerator $router, + IL10N $trans, + IFactory $l10nFactory) + { + parent::__construct($appName, $request); + + $this->config = $config; + $this->appRepository = $appRepository; + $this->categoryFetcher = $categoryFetcher; + $this->l10nFactory = $l10nFactory; + $this->router = $router; + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + * + * @return JSONResponse + */ + public function items() + { + $apps = $this->appRepository->getVisibleApps(); + $currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2); + $categoriesLabels = $this->categoryFetcher->get(); + $externalSitesInTopMenu = (bool) $this->config->getAppValue('side_menu', 'external-sites-in-top-menu', 0); + $user = OC::$server[IUserSession::class]->getUser(); + $appsCategories = []; + $categoriesAppsCount = []; + $items = []; + + if (!$user) { + return new JSONResponse([ + 'items' => $items, + ]); + } + + $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true); + $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true); + + if (!empty($userTopMenuApps)) { + $topMenuApps = $userTopMenuApps; + } + + foreach ($categoriesLabels as $k => $category) { + $categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name']; + + unset($categoriesLabels[$k]); + } + + $categoriesLabels['external_links'] = $this->l10nFactory->get('external')->t('External sites'); + + $items['other'] = [ + 'name' => '', + 'apps' => [], + ]; + + foreach ($apps as $app) { + if (in_array($app['id'], $topMenuApps)) { + continue; + } + + $categories = (array) $app['category']; + $appsCategories[$app['id']] = []; + + if (empty($categories)) { + $categories = ['other']; + } + + foreach ($categories as $category) { + if (!isset($items[$category])) { + $items[$category] = [ + 'name' => $categoriesLabels[$category], + 'apps' => [], + ]; + } + + if (!isset($categoriesAppsCount[$category])) { + $categoriesAppsCount[$category] = 0; + } + + ++$categoriesAppsCount[$category]; + + $appsCategories[$app['id']][] = $category; + + $items[$category]['apps'][$app['id']] = [ + 'name' => $app['name'], + 'href' => $this->router->linkTo($app['id'], ''), + 'icon' => $app['previewAsIcon'] ? $app['preview'] : null, + ]; + } + } + + arsort($categoriesAppsCount); + + $keys = array_keys($categoriesAppsCount); + + foreach ($appsCategories as $app => $appCategories) { + $smallerIndex = count($categoriesAppsCount) - 1; + + foreach ($appCategories as $appCategory) { + $appKey = array_keys($keys, $appCategory)[0]; + + if ($appKey < $smallerIndex) { + $smallerIndex = $appKey; + } + } + + $category = $keys[$smallerIndex]; + + foreach ($items as $itemCategory => $value) { + if ($itemCategory !== $category && isset($value['apps'][$app])) { + unset($items[$itemCategory]['apps'][$app]); + + if (empty($items[$itemCategory]['apps'])) { + unset($items[$itemCategory]); + } + } + } + } + + foreach ($items as $category => $value) { + ksort($items[$category]['apps']); + } + + usort($items, function ($a, $b) { + return ($a['name'] < $b['name']) ? -1 : 1; + }); + + return new JSONResponse([ + 'items' => $items, + ]); + } +} diff --git a/lib/Controller/PersonalSettingController.php b/lib/Controller/PersonalSettingController.php index 2beba19..5674175 100644 --- a/lib/Controller/PersonalSettingController.php +++ b/lib/Controller/PersonalSettingController.php @@ -19,7 +19,6 @@ namespace OCA\SideMenu\Controller; use OCP\AppFramework\Controller; -use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\Response; use OCP\IConfig; use OCP\IRequest; @@ -48,6 +47,9 @@ class PersonalSettingController extends Controller /** * @NoAdminRequired * + * @param mixed $name + * @param mixed $value + * * @return Response */ public function valueSet($name, $value) @@ -55,7 +57,7 @@ class PersonalSettingController extends Controller $doSave = false; $user = $this->userSession->getUser(); - if ($name === 'enabled') { + if ('enabled' === $name) { $doSave = true; if (!in_array($value, ['0', '1'])) { @@ -63,8 +65,28 @@ class PersonalSettingController extends Controller } } + if ('top-menu-apps' === $name) { + $doSave = true; + $data = json_decode($value, true); + + if (!is_array($data)) { + $doSave = false; + } else { + foreach ($data as $v) { + if (!is_string($v)) { + $doSave = false; + } + } + } + } + if ($doSave) { - $this->config->setUserValue($user->getUid(), 'side_menu', 'enabled', $value); + $this->config->setUserValue($user->getUid(), 'side_menu', $name, $value); + + return [ + 'name' => $name, + 'value' => $value, + ]; } return []; diff --git a/lib/Service/AppRepository.php b/lib/Service/AppRepository.php new file mode 100644 index 0000000..d2dd024 --- /dev/null +++ b/lib/Service/AppRepository.php @@ -0,0 +1,80 @@ + + */ +class AppRepository +{ + /** + * @var OC_App + */ + protected $ocApp; + + /** + * @var IFactory + */ + protected $l10nFactory; + + public function __construct(OC_App $ocApp, IFactory $l10nFactory) + { + $this->ocApp = $ocApp; + $this->l10nFactory = $l10nFactory; + } + + /** + * Retrieves visibles apps. + * + * @return array + */ + public function getVisibleApps() + { + $navigation = $this->ocApp->getNavigation(); + $apps = $this->ocApp->listAllApps(); + $visibleApps = []; + + foreach ($apps as $app) { + $id = $app['id']; + + if (isset($navigation[$id])) { + $app['name'] = $this->l10nFactory->get($app['id'])->t($app['name']); + + $visibleApps[$id] = $app; + } + } + + foreach ($navigation as $app) { + if ('external_index' === substr($app['id'], 0, 14)) { + $visibleApps[$app['id']] = [ + 'id' => $app['id'], + 'name' => $this->l10nFactory->get($app['id'])->t($app['name']), + 'preview' => $app['icon'], + 'previewAsIcon' => true, + 'category' => [ + 'external_links', + ], + ]; + } elseif ('files' === $app['id']) { + $visibleApps[$app['id']] = [ + 'id' => $app['id'], + 'name' => $this->l10nFactory->get($app['id'])->t($app['name']), + 'preview' => $app['icon'], + 'previewAsIcon' => true, + 'category' => [], + ]; + } + } + + usort($visibleApps, function ($a, $b) { + return ($a['name'] < $b['name']) ? -1 : 1; + }); + + return $visibleApps; + } +} diff --git a/lib/Settings/Admin.php b/lib/Settings/Admin.php index f368bfa..0131a50 100644 --- a/lib/Settings/Admin.php +++ b/lib/Settings/Admin.php @@ -23,6 +23,7 @@ use OCP\IL10N; use OCP\ILogger; use OCP\Settings\ISettings; use OCP\IConfig; +use OCA\SideMenu\Service\AppRepository; class Admin implements ISettings { @@ -41,11 +42,17 @@ class Admin implements ISettings */ private $config; - public function __construct(IL10N $l, ILogger $logger, IConfig $config) + /** + * @var AppRepository + */ + private $appRepository; + + public function __construct(IL10N $l, ILogger $logger, IConfig $config, AppRepository $appRepository) { $this->l = $l; $this->logger = $logger; $this->config = $config; + $this->appRepository = $appRepository; } /** @@ -66,6 +73,7 @@ class Admin implements ISettings 'force-light-icon' => $this->config->getAppValue('side_menu', 'force-light-icon', '0'), 'cache' => $this->config->getAppValue('side_menu', 'cache', '0'), 'opener' => $this->config->getAppValue('side_menu', 'opener', 'side-menu-opener'), + 'big-menu' => $this->config->getAppValue('side_menu', 'big-menu', '0'), 'display-logo' => $this->config->getAppValue('side_menu', 'display-logo', '1'), 'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'), 'opener-hover' => $this->config->getAppValue('side_menu', 'opener-hover', '0'), @@ -73,7 +81,8 @@ class Admin implements ISettings 'hide-when-no-apps' => $this->config->getAppValue('side_menu', 'hide-when-no-apps', '0'), 'size-icon' => $this->config->getAppValue('side_menu', 'size-icon', 'normal'), 'size-text' => $this->config->getAppValue('side_menu', 'size-text', 'normal'), - 'external-sites-in-top-menu' => $this->config->getAppValue('side_menu', 'external-sites-in-top-menu', '0'), + 'top-menu-apps' => (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true), + 'apps' => $this->appRepository->getVisibleApps(), ]; return new TemplateResponse('side_menu', 'settings/admin-form', $parameters, ''); diff --git a/lib/Settings/Personal.php b/lib/Settings/Personal.php index beef491..4a80bfb 100644 --- a/lib/Settings/Personal.php +++ b/lib/Settings/Personal.php @@ -24,6 +24,7 @@ use OCP\ILogger; use OCP\Settings\ISettings; use OCP\IConfig; use OCP\IUserSession; +use OCA\SideMenu\Service\AppRepository; class Personal implements ISettings { @@ -47,12 +48,18 @@ class Personal implements ISettings */ private $userSession; - public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession) + /** + * @var AppRepository + */ + private $appRepository; + + public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession, AppRepository $appRepository) { $this->l = $l; $this->logger = $logger; $this->config = $config; $this->userSession = $userSession; + $this->appRepository = $appRepository; } /** @@ -64,6 +71,8 @@ class Personal implements ISettings $parameters = [ 'enabled' => $this->config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1'), + 'top-menu-apps' => (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true), + 'apps' => $this->appRepository->getVisibleApps(), ]; return new TemplateResponse('side_menu', 'settings/personal-form', $parameters, ''); diff --git a/package.json b/package.json index 3837c1b..38edace 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "dependencies": { "@nextcloud/axios": "^1.3.2", "@nextcloud/vue": "^1.4.0", + "axios": "^0.19.2", "trim": "0.0.1", "vue": "^2.6.11" }, diff --git a/src/SideMenu.js b/src/SideMenu.js index dd7d323..05d5e17 100644 --- a/src/SideMenu.js +++ b/src/SideMenu.js @@ -17,18 +17,28 @@ import Vue from 'vue' import SideMenu from './SideMenu.vue' +import SideMenuBig from './SideMenuBig.vue' // Vue.prototype.t = t -// Vue.prototype.OC = OC +Vue.prototype.OC = OC // Vue.prototype.OC = OCP -const View = Vue.extend(SideMenu) -const sideMenu = new View({}) const mountSideMenuComponent = () => { const sideMenuContainer = document.querySelector('#side-menu') if (sideMenuContainer) { + let component + + if (sideMenuContainer.getAttribute('data-bigmenu')) { + component = SideMenuBig + } else { + component = SideMenu + } + + const View = Vue.extend(component) + const sideMenu = new View({}) + sideMenu.$mount('#side-menu') $('body').trigger('side-menu.ready') diff --git a/src/SideMenu.vue b/src/SideMenu.vue index b715f42..97ab13a 100644 --- a/src/SideMenu.vue +++ b/src/SideMenu.vue @@ -63,7 +63,7 @@ export default { var dataId = parent.getAttribute('data-id') dataId = dataId !== null ? dataId : '' - if (this.ignoreExternalSites && dataId.indexOf('external_index') !== -1) { + if (!parent.classList.contains('app-hidden')) { continue } @@ -113,7 +113,6 @@ export default { this.retrieveApps() this.retrieveLogo() this.forceLightIcon = document.querySelector('#side-menu-container').getAttribute('data-forcelighticon') == 1; - this.ignoreExternalSites = document.querySelector('#side-menu-container').getAttribute('data-externalsitesintopmenu') == 1; const menu = document.querySelector('#appmenu') diff --git a/src/SideMenuBig.vue b/src/SideMenuBig.vue new file mode 100644 index 0000000..67b4787 --- /dev/null +++ b/src/SideMenuBig.vue @@ -0,0 +1,85 @@ + + + + diff --git a/src/admin.js b/src/admin.js index 38c675a..74f6001 100644 --- a/src/admin.js +++ b/src/admin.js @@ -32,8 +32,24 @@ const appConfig = (name, value, callbacks) => { const saveSettings = (key) => { const element = elements.get(key) - const name = $(element).attr('name') - let value = $(element).val() + let value + let name + + if ($(element).is('[data-checkbox]')) { + name = $(element).attr('data-name') + const inputs = $('input[name="' + name + '[]"]:checked') + value = [] + + inputs.each((i, v) => { + value.push(v.value) + }) + + value = JSON.stringify(value) + } else { + name = $(element).attr('name') + value = $(element).val() + } + const size = elements.length if (element === 'side-menu-cache') { diff --git a/templates/css/stylesheet.php b/templates/css/stylesheet.php index adae8c3..1f0ce32 100644 --- a/templates/css/stylesheet.php +++ b/templates/css/stylesheet.php @@ -8,7 +8,7 @@ } - + #appmenu { display: none; } @@ -74,16 +74,31 @@ width: 15px; height: 15px; } + + img.side-menu-app-icon { + width: 15px; + height: 15px; + } .side-menu-app-icon svg { width: 20px; height: 20px; } + + img.side-menu-app-icon { + width: 20px; + height: 20px; + } .side-menu-app-icon svg { width: 23px; height: 23px; } + + img.side-menu-app-icon { + width: 23px; + height: 23px; + } diff --git a/templates/js/_externalSitesInTopMenu.js b/templates/js/_topMenuApps.js similarity index 96% rename from templates/js/_externalSitesInTopMenu.js rename to templates/js/_topMenuApps.js index c2b7224..b6fe1c1 100644 --- a/templates/js/_externalSitesInTopMenu.js +++ b/templates/js/_topMenuApps.js @@ -1,5 +1,3 @@ -sideMenuContainer.attr('data-externalsitesintopmenu', '1') - var menuCache = null var updateTopMenu = function() { @@ -31,7 +29,7 @@ var updateTopMenu = function() { return } - if (dataId.indexOf('external_index') === -1) { + if (topMenuApps.indexOf(dataId) === -1) { app.classList.add('hidden') app.classList.add('app-hidden') } else { diff --git a/templates/js/script.php b/templates/js/script.php index acc730d..660666b 100644 --- a/templates/js/script.php +++ b/templates/js/script.php @@ -5,6 +5,10 @@ var body = $('body') var isTouchDevice = window.matchMedia("(pointer: coarse)").matches + + sideMenu.attr('data-bigmenu', '1') + + sideMenuContainer.attr('data-forcelighticon', '1') @@ -100,7 +104,9 @@ sideMenuOpener.insertAfter('#nextcloud') - - + + var topMenuApps = ; + + })(); diff --git a/templates/settings/admin-form.php b/templates/settings/admin-form.php index a5dc23a..64e8c62 100644 --- a/templates/settings/admin-form.php +++ b/templates/settings/admin-form.php @@ -40,7 +40,7 @@ $choicesSizes = [
-
@@ -60,7 +60,7 @@ $choicesSizes = [
-
@@ -74,7 +74,7 @@ $choicesSizes = [
-
@@ -88,11 +88,13 @@ $choicesSizes = [
-
+

This feature is not compatible with the big menu display.

+
$value): ?> @@ -227,15 +232,34 @@ $choicesSizes = [
-

Use the shortcut Ctrl+o - to open and to hide the side menu. Use tab to navigate.

+
+ +
+ +

The big menu is not compatible with AppOrder.

-
+ +
+
+

This feature is not compatible with the big menu display.

+
+ +
+

+ t('Top menu')); ?> +

-
-
- +
+ +
+ checked + /> + + +
+
@@ -309,7 +346,7 @@ $choicesSizes = [ t('Tips')); ?> -

Use the shortcut Ctrl+o +

Use the shortcut Ctrl+o to open and to hide the side menu. Use tab to navigate.

@@ -323,7 +360,7 @@ $choicesSizes = [
- + t('You like this app and you want to support me?')); ?> diff --git a/templates/settings/personal-form.php b/templates/settings/personal-form.php index 9f7cffe..0ca163d 100644 --- a/templates/settings/personal-form.php +++ b/templates/settings/personal-form.php @@ -34,11 +34,14 @@ $choicesYesNo = [
-
+

Use the shortcut Ctrl+o + to open and to hide the side menu. Use tab to navigate.

+
+
-

Use the shortcut Ctrl+o - to open and to hide the side menu. Use tab to navigate.

+
+

+ t('Top menu')); ?> +

+
+ +
+ +

+ + If there is no selection then the global configuration is applied. + +

+ +
+ +
+ checked + /> + + +
+ +
@@ -61,7 +97,7 @@ $choicesYesNo = [
- + t('You like this app and you want to support me?')); ?>