Browse Source

add personal settings page to enabled (or not) the side menu

pull/32/head
Simon Vieille 6 months ago
parent
commit
7ac19c7bec
Signed by: deblan GPG Key ID: 03383D15A1D31745
13 changed files with 433 additions and 76 deletions
  1. +43
    -34
      appinfo/app.php
  2. +3
    -1
      appinfo/info.xml
  3. +1
    -0
      appinfo/routes.php
  4. +3
    -1
      lib/Controller/CssController.php
  5. +3
    -1
      lib/Controller/JsController.php
  6. +72
    -0
      lib/Controller/PersonalSettingController.php
  7. +9
    -3
      lib/Settings/Admin.php
  8. +7
    -3
      lib/Settings/AdminSection.php
  9. +91
    -0
      lib/Settings/Personal.php
  10. +88
    -0
      lib/Settings/PersonalSection.php
  11. +26
    -22
      src/admin.js
  12. +15
    -11
      templates/settings/admin-form.php
  13. +72
    -0
      templates/settings/personal-form.php

+ 43
- 34
appinfo/app.php View File

@ -21,42 +21,51 @@ namespace OCA\SideMenu\Appinfo;
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;
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 ($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(),
],
''
);
}

+ 3
- 1
appinfo/info.xml View File

@ -28,6 +28,8 @@ You can report a bug or request a feature by opening an issue.
</dependencies>
<settings>
<admin>OCA\SideMenu\Settings\Admin</admin>
<admin-section>OCA\SideMenu\Settings\Section</admin-section>
<admin-section>OCA\SideMenu\Settings\AdminSection</admin-section>
<personal>OCA\SideMenu\Settings\Personal</personal>
<personal-section>OCA\SideMenu\Settings\PersonalSection</personal-section>
</settings>
</info>

+ 1
- 0
appinfo/routes.php View File

@ -21,5 +21,6 @@ return [
'routes' => [
['name' => 'Css#stylesheet', 'url' => '/css/stylesheet', 'verb' => 'GET'],
['name' => 'Js#script', 'url' => '/js/script', 'verb' => 'GET'],
['name' => 'PersonalSetting#valueSet', 'url' => '/personalSetting/valueSet', 'verb' => 'POST'],
],
];

+ 3
- 1
lib/Controller/CssController.php View File

@ -27,7 +27,9 @@ use OCP\IRequest;
class CssController extends Controller
{
/** @var \OCP\IConfig */
/**
* @var \OCP\IConfig
*/
protected $config;
/**

+ 3
- 1
lib/Controller/JsController.php View File

@ -27,7 +27,9 @@ use OCP\IRequest;
class JsController extends Controller
{
/** @var \OCP\IConfig */
/**
* @var \OCP\IConfig
*/
protected $config;
/**

+ 72
- 0
lib/Controller/PersonalSettingController.php View File

@ -0,0 +1,72 @@
<?php
/**
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\SideMenu\Controller;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Http\Response;
use OCP\IConfig;
use OCP\IRequest;
use OCP\IUserSession;
class PersonalSettingController extends Controller
{
/**
* @var \OCP\IConfig
*/
protected $config;
/**
* @var IUserSession
*/
private $userSession;
public function __construct($appName, IRequest $request, IConfig $config, IUserSession $userSession)
{
parent::__construct($appName, $request);
$this->config = $config;
$this->userSession = $userSession;
}
/**
* @NoAdminRequired
*
* @return Response
*/
public function valueSet($name, $value)
{
$doSave = false;
$user = $this->userSession->getUser();
if ($name === 'enabled') {
$doSave = true;
if (!in_array($value, ['0', '1'])) {
$value = '1';
}
}
if ($doSave) {
$this->config->setUserValue($user->getUid(), 'side_menu', 'enabled', $value);
}
return [];
}
}

+ 9
- 3
lib/Settings/Admin.php View File

@ -26,13 +26,19 @@ use OCP\IConfig;
class Admin implements ISettings
{
/** @var IL10N */
/**
* @var IL10N
*/
private $l;
/** @var ILogger */
/**
* @var ILogger
*/
private $logger;
/** @var IConfig */
/**
* @var IConfig
*/
private $config;
public function __construct(IL10N $l, ILogger $logger, IConfig $config)

lib/Settings/Section.php → lib/Settings/AdminSection.php View File

@ -22,12 +22,16 @@ use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Settings\IIconSection;
class Section implements IIconSection
class AdminSection implements IIconSection
{
/** @var IL10N */
/**
* @var IL10N
*/
private $l;
/** @var IURLGenerator */
/**
* @var IURLGenerator
*/
private $url;
/**

+ 91
- 0
lib/Settings/Personal.php View File

@ -0,0 +1,91 @@
<?php
/**
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\SideMenu\Settings;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IL10N;
use OCP\ILogger;
use OCP\Settings\ISettings;
use OCP\IConfig;
use OCP\IUserSession;
class Personal implements ISettings
{
/**
* @var IL10N
*/
private $l;
/**
* @var ILogger
*/
private $logger;
/**
* @var IConfig
*/
private $config;
/**
* @var IUserSession
*/
private $userSession;
public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession)
{
$this->l = $l;
$this->logger = $logger;
$this->config = $config;
$this->userSession = $userSession;
}
/**
* @return TemplateResponse
*/
public function getForm()
{
$user = $this->userSession->getUser();
$parameters = [
'enabled' => $this->config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1'),
];
return new TemplateResponse('side_menu', 'settings/personal-form', $parameters, '');
}
/**
* @return string the section ID, e.g. 'sharing'
*/
public function getSection()
{
return 'side_menu';
}
/**
* @return int whether the form should be rather on the top or bottom of
* the admin section. The forms are arranged in ascending order of the
* priority values. It is required to return a value between 0 and 100.
*
* E.g.: 70
*/
public function getPriority()
{
return 70;
}
}

+ 88
- 0
lib/Settings/PersonalSection.php View File

@ -0,0 +1,88 @@
<?php
/**
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\SideMenu\Settings;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Settings\IIconSection;
class PersonalSection implements IIconSection
{
/**
* @var IL10N
*/
private $l;
/**
* @var IURLGenerator
*/
private $url;
/**
* @param IURLGenerator $url
* @param IL10N $l
*/
public function __construct(IURLGenerator $url, IL10N $l)
{
$this->url = $url;
$this->l = $l;
}
/**
* returns the ID of the section. It is supposed to be a lower case string,
* e.g. 'ldap'
*
* @returns string
*/
public function getID()
{
return 'side_menu';
}
/**
* returns the translated name as it should be displayed, e.g. 'LDAP / AD
* integration'. Use the L10N service to translate it.
*
* @return string
*/
public function getName()
{
return $this->l->t('Side menu');
}
/**
* @return int whether the form should be rather on the top or bottom of
* the settings navigation. The sections are arranged in ascending order of
* the priority values. It is required to return a value between 0 and 99.
*
* E.g.: 70
*/
public function getPriority()
{
return 70;
}
/**
* {@inheritdoc}
*/
public function getIcon()
{
return $this->url->imagePath('theming', 'app-dark.svg');
}
}

+ 26
- 22
src/admin.js View File

@ -15,37 +15,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
const elements = [
'side-menu-background-color',
'side-menu-background-color-to',
'side-menu-current-app-background-color',
'side-menu-text-color',
'side-menu-force-light-icon',
'side-menu-opener',
'side-menu-opener-position',
'side-menu-opener-hover',
'side-menu-opener-only',
'side-menu-display-logo',
'side-menu-hide-when-no-apps',
'side-menu-size-icon',
'side-menu-size-text',
'side-menu-cache',
'side-menu-external-sites-in-top-menu',
];
let elements = []
const selector = '#side-menu-message';
const userConfig = (name, value, callbacks) => {
const url = OC.generateUrl('/apps/side_menu/personalSetting/valueSet')
$.post(url, {name: name, value: value}, callbacks.success)
.fail(callbacks.error)
}
const appConfig = (name, value, callbacks) => {
OCP.AppConfig.setValue('side_menu', name, value, callbacks)
}
const saveSettings = (key) => {
const element = elements[key]
const name = $('#' + element).attr('name')
let value = $('#' + element).val()
const element = elements.get(key)
const name = $(element).attr('name')
let value = $(element).val()
const size = elements.length
if (element === 'side-menu-cache') {
value++
}
OCP.AppConfig.setValue('side_menu', name, value, {
const callbacks = {
success: () => {
OC.msg.finishedSuccess(
selector,
@ -61,10 +57,18 @@ const saveSettings = (key) => {
error: () => {
OC.msg.finishedError(selector, t('side_menu', 'Error while saving "' + element + '"'))
}
});
}
if ($(element).is('[data-personal]')) {
userConfig(name, value, callbacks)
} else {
appConfig(name, value, callbacks)
}
}
$(document).ready(() => {
elements = $('.side-menu-setting')
$('#side-menu-save').on('click', (event) => {
event.preventDefault()
OC.msg.startSaving(selector)

+ 15
- 11
templates/settings/admin-form.php View File

@ -49,11 +49,13 @@ $choicesSizes = [
id="side-menu-background-color"
name="background-color"
type="color"
class="side-menu-setting"
value="<?php print_unescaped($_['background-color']); ?>">
<input
id="side-menu-background-color-to"
name="background-color-to"
type="color"
class="side-menu-setting"
value="<?php print_unescaped($_['background-color-to']); ?>">
</div>
@ -67,6 +69,7 @@ $choicesSizes = [
id="side-menu-current-app-background-color"
name="current-app-background-color"
type="color"
class="side-menu-setting"
value="<?php print_unescaped($_['current-app-background-color']); ?>">
</div>
@ -80,6 +83,7 @@ $choicesSizes = [
id="side-menu-text-color"
name="text-color"
type="color"
class="side-menu-setting"
value="<?php print_unescaped($_['text-color']); ?>">
</div>
@ -90,7 +94,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-force-light-icon" name="force-light-icon">
<select id="side-menu-force-light-icon" name="force-light-icon" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['force-light-icon']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -123,7 +127,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-opener" name="opener">
<select id="side-menu-opener" name="opener" class="side-menu-setting">
<?php foreach ($choices as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['opener']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -146,7 +150,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-opener-position" name="opener-position">
<select id="side-menu-opener-position" name="opener-position" class="side-menu-setting">
<?php foreach ($choices as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['opener-position']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -162,7 +166,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-opener-only" name="opener-only">
<select id="side-menu-opener-only" name="opener-only" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['opener-only']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -178,7 +182,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-hide-when-no-apps" name="hide-when-no-apps">
<select id="side-menu-hide-when-no-apps" name="hide-when-no-apps" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['hide-when-no-apps']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -200,7 +204,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-opener-hover" name="opener-hover">
<select id="side-menu-opener-hover" name="opener-hover" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['opener-hover']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -216,7 +220,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-display-logo" name="display-logo">
<select id="side-menu-display-logo" name="display-logo" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['display-logo']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -232,7 +236,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-size-icon" name="size-icon">
<select id="side-menu-size-icon" name="size-icon" class="side-menu-setting">
<?php foreach ($choicesSizes as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['size-icon']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?> icon
@ -240,7 +244,7 @@ $choicesSizes = [
<?php endforeach; ?>
</select>
<select id="side-menu-size-text" name="size-text">
<select id="side-menu-size-text" name="size-text" class="side-menu-setting">
<?php foreach ($choicesSizes as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['size-text']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?> text
@ -257,7 +261,7 @@ $choicesSizes = [
</div>
<div>
<select id="side-menu-external-sites-in-top-menu" name="external-sites-in-top-menu">
<select id="side-menu-external-sites-in-top-menu" name="external-sites-in-top-menu" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['external-sites-in-top-menu']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
@ -268,7 +272,7 @@ $choicesSizes = [
</div>
<div class="section">
<input type="hidden" id="side-menu-cache" name="cache" value="<?php print_unescaped($_['cache']); ?>">
<input type="hidden" id="side-menu-cache" name="cache" value="<?php print_unescaped($_['cache']); ?>" class="side-menu-setting">
<button id="side-menu-save" class="btn btn-primary"><?php p($l->t('Save')); ?></button>

+ 72
- 0
templates/settings/personal-form.php View File

@ -0,0 +1,72 @@
<?php
/**
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
script('side_menu', 'admin');
style('side_menu', 'admin');
style('side_menu', 'support');
$choicesYesNo = [
'No' => '0',
'Yes' => '1',
];
?>
<div id="side-menu-section">
<div class="section">
<h2>
<?php p($l->t('Menu')); ?>
</h2>
<div>
<label for="side-menu-enabled" class="settings-hint">
<?php p($l->t('Enable the side menu')); ?>
</label>
</div>
<div>
<select id="side-menu-enabled" name="enabled" class="side-menu-setting" data-personal>
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['enabled']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="section">
<button id="side-menu-save" class="btn btn-primary"><?php p($l->t('Save')); ?></button>
<span id="side-menu-message" class="msg"></span>
<div style="height: 30px"></div>
<div>
<span for="side-menu-opener" class="settings-hint">
<?php p($l->t('You like this app and you want to support me?')); ?>
<a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan">
<button>
<?php p($l->t('Buy me a coffe ☕')); ?>
</button>
</a>
</span>
</div>
</div>
</div>

Loading…
Cancel
Save