Compare commits

...

7 Commits

Author SHA1 Message Date
Simon Vieille aad27cd8b4 release v1.11.0 2020-09-11 13:26:01 +02:00
Simon Vieille 96fb33b80b Merge branch 'feature/issue29-tab' into develop 2020-09-11 13:25:09 +02:00
Simon Vieille e10a5f1f62 fix issue with side menu header 2020-09-11 13:23:52 +02:00
Simon Vieille f133932884 add target _blank when the option is enabled 2020-09-11 13:23:40 +02:00
Simon Vieille e287e27375 add translations 2020-09-11 13:06:43 +02:00
Simon Vieille 9ae4d7ee48 add new option: open apps in new tab 2020-09-11 13:03:37 +02:00
Simon Vieille 624bb52ec4 release v1.10.0 2020-09-04 18:14:49 +02:00
13 changed files with 78 additions and 4 deletions
+2 -2
View File
@@ -2,7 +2,7 @@
<info> <info>
<id>side_menu</id> <id>side_menu</id>
<name>Side menu</name> <name>Side menu</name>
<summary>Move the top menu to the left side.</summary> <summary>Modify the display of the menu.</summary>
<description><![CDATA[Side menu allows you to modify the position of the main menu by creating a panel on the left of the interface or with a big menu on the top. <description><![CDATA[Side menu allows you to modify the position of the main menu by creating a panel on the left of the interface or with a big menu on the top.
You can also define apps that must be displayed in the top menu. Fully customisable. You can also define apps that must be displayed in the top menu. Fully customisable.
@@ -17,7 +17,7 @@ You can report a bug or request a feature by opening an issue.
]]></description> ]]></description>
<licence>agpl</licence> <licence>agpl</licence>
<author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author> <author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author>
<version>1.9.3</version> <version>1.11.0</version>
<namespace>SideMenu</namespace> <namespace>SideMenu</namespace>
<category>customization</category> <category>customization</category>
<website>https://gitnet.fr/deblan/side_menu</website> <website>https://gitnet.fr/deblan/side_menu</website>
+4
View File
@@ -211,6 +211,10 @@
display: none; display: none;
} }
.side-menu-always-displayed #side-menu .side-menu-header {
height: 49px;
}
.side-menu-always-displayed #side-menu.open, .side-menu-always-displayed #side-menu.open,
.side-menu-always-displayed #side-menu.open .side-menu-apps-list, .side-menu-always-displayed #side-menu.open .side-menu-apps-list,
.side-menu-always-displayed #side-menu.open .side-menu-header, .side-menu-always-displayed #side-menu.open .side-menu-header,
+9
View File
@@ -54,6 +54,7 @@ class JsController extends Controller
{ {
$user = OC::$server[IUserSession::class]->getUser(); $user = OC::$server[IUserSession::class]->getUser();
$topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true); $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true);
$targetBlank = (bool) $this->config->getAppValue('side_menu', 'target-blank', '0');
if ($user) { if ($user) {
$userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true); $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true);
@@ -61,8 +62,15 @@ class JsController extends Controller
if (!empty($userTopMenuApps)) { if (!empty($userTopMenuApps)) {
$topMenuApps = $userTopMenuApps; $topMenuApps = $userTopMenuApps;
} }
$userTargetBlank = (int) $this->config->getUserValue($user->getUid(), 'side_menu', 'target-blank', '-1');
if ($userTargetBlank !== -1) {
$targetBlank = (bool) $userTargetBlank;
}
} }
$parameters = [ $parameters = [
'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'), 'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'),
'opener-hover' => (bool) $this->config->getAppValue('side_menu', 'opener-hover', '0'), 'opener-hover' => (bool) $this->config->getAppValue('side_menu', 'opener-hover', '0'),
@@ -73,6 +81,7 @@ class JsController extends Controller
'always-displayed' => (bool) $this->config->getAppValue('side_menu', 'always-displayed', '0'), 'always-displayed' => (bool) $this->config->getAppValue('side_menu', 'always-displayed', '0'),
'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'), 'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'),
'top-menu-apps' => $topMenuApps, 'top-menu-apps' => $topMenuApps,
'target-blank' => $targetBlank,
]; ];
$response = new TemplateResponse('side_menu', 'js/script', $parameters, 'blank'); $response = new TemplateResponse('side_menu', 'js/script', $parameters, 'blank');
@@ -65,6 +65,14 @@ class PersonalSettingController extends Controller
} }
} }
if ('target-blank' === $name) {
$doSave = true;
if (!in_array($value, ['-1', '0', '1'])) {
$value = '-1';
}
}
if ('top-menu-apps' === $name) { if ('top-menu-apps' === $name) {
$doSave = true; $doSave = true;
$data = json_decode($value, true); $data = json_decode($value, true);
+1
View File
@@ -75,6 +75,7 @@ class Admin implements ISettings
'cache' => $this->config->getAppValue('side_menu', 'cache', '0'), 'cache' => $this->config->getAppValue('side_menu', 'cache', '0'),
'opener' => $this->config->getAppValue('side_menu', 'opener', 'side-menu-opener'), 'opener' => $this->config->getAppValue('side_menu', 'opener', 'side-menu-opener'),
'always-displayed' => $this->config->getAppValue('side_menu', 'always-displayed', '0'), 'always-displayed' => $this->config->getAppValue('side_menu', 'always-displayed', '0'),
'target-blank' => $this->config->getAppValue('side_menu', 'target-blank', '0'),
'big-menu' => $this->config->getAppValue('side_menu', 'big-menu', '0'), 'big-menu' => $this->config->getAppValue('side_menu', 'big-menu', '0'),
'display-logo' => $this->config->getAppValue('side_menu', 'display-logo', '1'), 'display-logo' => $this->config->getAppValue('side_menu', 'display-logo', '1'),
'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'), 'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'),
+1
View File
@@ -72,6 +72,7 @@ class Personal implements ISettings
$parameters = [ $parameters = [
'enabled' => $this->config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1'), '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), 'top-menu-apps' => (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true),
'target-blank' => $this->config->getUserValue($user->getUid(), 'side_menu', 'target-blank', '-1'),
'apps' => $this->appRepository->getVisibleApps(), 'apps' => $this->appRepository->getVisibleApps(),
]; ];
+3 -1
View File
@@ -26,7 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<ul class="side-menu-apps-list"> <ul class="side-menu-apps-list">
<li v-for="app in apps" v-bind:class="{'side-menu-app': true, 'active': app.active}"> <li v-for="app in apps" v-bind:class="{'side-menu-app': true, 'active': app.active}">
<a v-bind:href="app.href" v-bind:title="app.name"> <a v-bind:href="app.href" :target="targetBlank ? '_blank' : undefined" v-bind:title="app.name">
<span class="side-menu-app-icon" v-html="app.icon"></span> <span class="side-menu-app-icon" v-html="app.icon"></span>
<span class="side-menu-app-text" v-html="app.name"></span> <span class="side-menu-app-text" v-html="app.name"></span>
</a> </a>
@@ -45,6 +45,7 @@ export default {
apps: [], apps: [],
logo: null, logo: null,
forceLightIcon: false, forceLightIcon: false,
targetBlank: false,
} }
}, },
methods: { methods: {
@@ -119,6 +120,7 @@ export default {
this.retrieveApps() this.retrieveApps()
this.retrieveLogo() this.retrieveLogo()
this.forceLightIcon = document.querySelector('#side-menu-container').getAttribute('data-forcelighticon') == 1; this.forceLightIcon = document.querySelector('#side-menu-container').getAttribute('data-forcelighticon') == 1;
this.targetBlank = document.querySelector('#side-menu-container').getAttribute('data-targetblank') == 1;
const menu = document.querySelector('#appmenu') const menu = document.querySelector('#appmenu')
+4 -1
View File
@@ -28,7 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<ul class="side-menu-apps-list"> <ul class="side-menu-apps-list">
<li v-bind:class="{'side-menu-app': true, 'active': activeApp === appId}" v-for="(app, appId) in category.apps"> <li v-bind:class="{'side-menu-app': true, 'active': activeApp === appId}" v-for="(app, appId) in category.apps">
<a v-bind:href="app.href" v-bind:title="app.name"> <a v-bind:href="app.href" :target="targetBlank ? '_blank' : undefined" v-bind:title="app.name">
<img class="side-menu-app-icon" v-bind:src="app.icon"></span> <img class="side-menu-app-icon" v-bind:src="app.icon"></span>
<span class="side-menu-app-text" v-html="app.name"></span> <span class="side-menu-app-text" v-html="app.name"></span>
</a> </a>
@@ -50,6 +50,7 @@ export default {
return { return {
items: [], items: [],
activeApp: null, activeApp: null,
targetBlank: false,
} }
}, },
methods: { methods: {
@@ -79,6 +80,8 @@ export default {
}, },
}, },
mounted() { mounted() {
this.targetBlank = document.querySelector('#side-menu-container').getAttribute('data-targetblank') == 1;
this.retrieveApps() this.retrieveApps()
this.retrieveActiveApp() this.retrieveActiveApp()
} }
+2
View File
@@ -52,3 +52,5 @@
"Not compatible with touch screens.": "Nicht kompatibel mit Touchscreens." "Not compatible with touch screens.": "Nicht kompatibel mit Touchscreens."
"Big menu": "Große Speisekarte" "Big menu": "Große Speisekarte"
"Live preview": "Live Vorschau" "Live preview": "Live Vorschau"
"Open apps in new tab": "Öffnen Sie Apps in einem neuen Tab"
"Use the global setting": "Verwenden Sie die globale Einstellung"
+2
View File
@@ -52,3 +52,5 @@
"Not compatible with touch screens.": "Incompatible avec les écrans tactiles." "Not compatible with touch screens.": "Incompatible avec les écrans tactiles."
"Big menu": "Menu large" "Big menu": "Menu large"
"Live preview": "Aperçu en direct" "Live preview": "Aperçu en direct"
"Open apps in new tab": "Ouvrir les applications dans un nouvel onglet"
"Use the global setting": "Utiliser la configuration globale"
+4
View File
@@ -14,6 +14,10 @@
sideMenuContainer.attr('data-forcelighticon', '1') sideMenuContainer.attr('data-forcelighticon', '1')
<?php endif; ?> <?php endif; ?>
<?php if ($_['target-blank']): ?>
sideMenuContainer.attr('data-targetblank', '1')
<?php endif; ?>
body.on('side-menu.apps', function(e, apps) { body.on('side-menu.apps', function(e, apps) {
<?php if ($_['hide-when-no-apps']): ?> <?php if ($_['hide-when-no-apps']): ?>
sideMenu = jQuery('#side-menu') sideMenu = jQuery('#side-menu')
+16
View File
@@ -366,6 +366,22 @@ $choicesSizes = [
</select> </select>
</div> </div>
<div>
<label for="side-menu-target-blank">
<?php p($l->t('Open apps in new tab')); ?>
</label>
</div>
<div>
<select id="side-menu-loader-enabled" name="target-blank" class="side-menu-setting">
<?php foreach ($choicesYesNo as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['target-blank']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div> <div>
<label for="side-menu-loader-enabled"> <label for="side-menu-loader-enabled">
<?php p($l->t('Loader enabled')); ?> <?php p($l->t('Loader enabled')); ?>
+22
View File
@@ -52,6 +52,28 @@ $choicesYesNo = [
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div>
<label for="side-menu-target-blank">
<?php p($l->t('Open apps in new tab')); ?>
</label>
</div>
<div>
<?php $choices = [
'Use global setting' => '-1',
'No' => '0',
'Yes' => '1',
]; ?>
<select id="side-menu-loader-enabled" name="target-blank" class="side-menu-setting" data-personal>
<?php foreach ($choices as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['target-blank']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div> </div>
<div class="section"> <div class="section">