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

This commit is contained in:
Simon Vieille 2020-05-11 22:51:27 +02:00
parent 375ed7d2f1
commit 7ac19c7bec
Signed by: deblan
GPG Key ID: 03383D15A1D31745
13 changed files with 429 additions and 72 deletions

View File

@ -21,42 +21,51 @@ namespace OCA\SideMenu\Appinfo;
use OC\Security\CSP\ContentSecurityPolicy; use OC\Security\CSP\ContentSecurityPolicy;
use OCP\Util; use OCP\Util;
use OCP\IUserSession;
$config = \OC::$server->getConfig(); $config = \OC::$server->getConfig();
$cspnm = \OC::$server->getContentSecurityPolicyNonceManager(); $cspnm = \OC::$server->getContentSecurityPolicyNonceManager();
$user = \OC::$server[IUserSession::class]->getUser();
$enabled = true;
Util::addScript('side_menu', 'sideMenu'); if ($user !== null) {
Util::addStyle('side_menu', 'sideMenu'); $enabled = (bool) $config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1');
}
$stylesheet = \OC::$server->getURLGenerator()->linkToRoute( if ($enabled) {
'side_menu.Css.stylesheet', Util::addScript('side_menu', 'sideMenu');
[ Util::addStyle('side_menu', 'sideMenu');
'v' => $config->getAppValue('side_menu', 'cache', '0'),
]
);
$script = \OC::$server->getURLGenerator()->linkToRoute( $stylesheet = \OC::$server->getURLGenerator()->linkToRoute(
'side_menu.Js.script', 'side_menu.Css.stylesheet',
[ [
'v' => $config->getAppValue('side_menu', 'cache', '0'), 'v' => $config->getAppValue('side_menu', 'cache', '0'),
] ]
); );
Util::addHeader( $script = \OC::$server->getURLGenerator()->linkToRoute(
'link', 'side_menu.Js.script',
[ [
'href' => $stylesheet, 'v' => $config->getAppValue('side_menu', 'cache', '0'),
'rel' => 'stylesheet' ]
], );
''
);
Util::addHeader( Util::addHeader(
'script', 'link',
[ [
'src' => $script, 'href' => $stylesheet,
'nonce' => $cspnm->getNonce(), 'rel' => 'stylesheet'
], ],
'' ''
); );
Util::addHeader(
'script',
[
'src' => $script,
'nonce' => $cspnm->getNonce(),
],
''
);
}

View File

@ -28,6 +28,8 @@ You can report a bug or request a feature by opening an issue.
</dependencies> </dependencies>
<settings> <settings>
<admin>OCA\SideMenu\Settings\Admin</admin> <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> </settings>
</info> </info>

View File

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

View File

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

View File

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

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 [];
}
}

View File

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

View File

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

91
lib/Settings/Personal.php Normal file
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;
}
}

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');
}
}

View File

@ -15,37 +15,33 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
const elements = [ let 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',
];
const selector = '#side-menu-message'; 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 saveSettings = (key) => {
const element = elements[key] const element = elements.get(key)
const name = $('#' + element).attr('name') const name = $(element).attr('name')
let value = $('#' + element).val() let value = $(element).val()
const size = elements.length const size = elements.length
if (element === 'side-menu-cache') { if (element === 'side-menu-cache') {
value++ value++
} }
OCP.AppConfig.setValue('side_menu', name, value, { const callbacks = {
success: () => { success: () => {
OC.msg.finishedSuccess( OC.msg.finishedSuccess(
selector, selector,
@ -61,10 +57,18 @@ const saveSettings = (key) => {
error: () => { error: () => {
OC.msg.finishedError(selector, t('side_menu', 'Error while saving "' + element + '"')) 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(() => { $(document).ready(() => {
elements = $('.side-menu-setting')
$('#side-menu-save').on('click', (event) => { $('#side-menu-save').on('click', (event) => {
event.preventDefault() event.preventDefault()
OC.msg.startSaving(selector) OC.msg.startSaving(selector)

View File

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

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>