Merge pull request 'release v3.2.0' (#149) from develop into master
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful

Reviewed-on: #149
This commit is contained in:
Simon Vieille 2022-10-27 22:07:47 +02:00
commit 0acb576995
17 changed files with 59 additions and 50 deletions

View file

@ -1,5 +1,10 @@
## [Unreleased]
## 3.2.0
### Added
* use custom app names using 'app.navigation.name' (#148)
* app sorting with all displays (#147)
## 3.1.0
### Added
* add global custom app sorting for the top menu

View file

@ -32,7 +32,7 @@ Notice
Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**.
In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/).
]]></description>
<version>3.1.0</version>
<version>3.2.0</version>
<licence>agpl</licence>
<author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author>
<namespace>SideMenu</namespace>

View file

@ -163,4 +163,15 @@
position: relative;
top: -8px;
left: 5px;
transition-duration: 0.8s;
transition-property: transform;
transform: rotate(360deg);
}
.btn-reset--down {
top: 2px;
}
.btn-reset--progress {
transform: rotate(-359deg);
}

View file

@ -162,10 +162,10 @@ class JsController extends Controller
'side-with-categories' => $this->config->getAppValueBool('side-with-categories', '0'),
'big-menu' => $this->config->getAppValueBool('big-menu', '0'),
'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'),
'apps-order' => $this->config->getAppValueArray('apps-order', '[]'),
'avatar' => $avatar,
'top-menu-apps' => $topMenuApps,
'top-side-menu-apps' => $topSideMenuApps,
'top-menu-apps-order' => $topMenuAppsOrder,
'target-blank-apps' => $targetBlankApps,
'settings' => $settings,
'logo' => $this->themingDefaults->getLogo(),

View file

@ -93,7 +93,7 @@ class NavController extends Controller
]);
}
$apps = $this->appRepository->getVisibleApps();
$apps = $this->appRepository->getOrderedApps();
$categoriesLabels = $this->categoryRepository->getOrderedCategories();
$hiddenApps = $this->config->getAppValueArray('big-menu-hidden-apps', '[]');
$isForced = $this->config->getAppValueBool('force', '0');
@ -178,10 +178,6 @@ class NavController extends Controller
foreach ($items as $category => $value) {
if (empty($items[$category]['apps'])) {
unset($items[$category]);
} else {
uasort($items[$category]['apps'], function ($a, $b) {
return ($a['name'] < $b['name']) ? -1 : 1;
});
}
}

View file

@ -36,8 +36,7 @@ class AppRepository
IFactory $l10nFactory,
ConfigProxy $config,
CategoryRepository $categoryRepository
)
{
) {
$this->ocApp = $ocApp;
$this->l10nFactory = $l10nFactory;
$this->config = $config;
@ -62,7 +61,7 @@ class AppRepository
foreach ([$app['id'], $app['id'].'_index'] as $id) {
if (isset($navigation[$id])) {
$app['name'] = $this->l10nFactory->get($id)->t($app['name']);
$app['name'] = $this->getAppName($app);
$app['href'] = $navigation[$id]['href'];
$app['icon'] = $navigation[$id]['icon'];
@ -75,7 +74,7 @@ class AppRepository
if ('external_index' === substr($app['id'], 0, 14)) {
$visibleApps[$app['id']] = [
'id' => $app['id'],
'name' => $this->l10nFactory->get($app['id'])->t($app['name']),
'name' => $this->getAppName($app),
'href' => $app['href'],
'icon' => $app['icon'],
'category' => [
@ -85,7 +84,7 @@ class AppRepository
} elseif ('files' === $app['id']) {
$visibleApps[$app['id']] = [
'id' => $app['id'],
'name' => $this->l10nFactory->get($app['id'])->t($app['name']),
'name' => $this->getAppName($app),
'href' => $app['href'],
'icon' => $app['icon'],
'category' => [],
@ -99,23 +98,28 @@ class AppRepository
}
}
usort($visibleApps, function ($a, $b) {
return ($a['name'] < $b['name']) ? -1 : 1;
});
return $visibleApps;
}
public function getTopMenuOrderedApps()
public function getAppName($app)
{
return $this->config->getAppValue(
'app.navigation.name',
$this->l10nFactory->get($app['id'])->t($app['name']),
$app['id']
);
}
public function getOrderedApps()
{
$apps = $this->getVisibleApps();
$orders = $this->config->getAppValueArray('top-menu-apps-order', '[]');
$orders = $this->config->getAppValueArray('apps-order', '[]');
usort($apps, function ($a, $b) use ($orders) {
$ak = array_keys($orders, $a['id'])[0] ?? null;
$bk = array_keys($orders, $b['id'])[0] ?? null;
if ($ak === null || $bk === null) {
if (null === $ak || null === $bk) {
return ($a['name'] < $b['name']) ? -1 : 1;
}

View file

@ -159,11 +159,11 @@ class Admin implements ISettings
'force' => $this->config->getAppValue('force', '0'),
'target-blank-apps' => $this->config->getAppValueArray('target-blank-apps', '[]'),
'top-menu-apps' => $this->config->getAppValueArray('top-menu-apps', '[]'),
'top-menu-apps-order' => $this->config->getAppValueArray('top-menu-apps-order', '[]'),
'apps-order' => $this->config->getAppValueArray('apps-order', '[]'),
'ordered-apps' => $this->appRepository->getOrderedApps(),
'top-side-menu-apps' => $this->config->getAppValueArray('top-side-menu-apps', '[]'),
'default-enabled' => $this->config->getAppValue('default-enabled', '1'),
'apps' => $this->appRepository->getVisibleApps(),
'top-menu-ordered-apps' => $this->appRepository->getTopMenuOrderedApps(),
'apps-categories-custom' => $this->config->getAppValueArray('apps-categories-custom', '[]'),
'categories-order-type' => $this->config->getAppValue('categories-order-type', 'default'),
'categories-order' => $this->config->getAppValueArray('categories-order', '[]'),

View file

@ -82,7 +82,7 @@ export default {
this.apps = {}
let orders = {}
Array.from(window.topMenuAppsOrder).forEach((app, order) => {
window.menuAppsOrder.forEach((app, order) => {
orders[app] = order + 1
})

View file

@ -86,7 +86,7 @@ export default {
let orders = {}
let finalApps = []
Array.from(window.topMenuAppsOrder).forEach((app, order) => {
window.menuAppsOrder.forEach((app, order) => {
orders[app] = order + 1
})

View file

@ -159,9 +159,15 @@ document.addEventListener('DOMContentLoaded', () => {
const target = event.target
const values = JSON.parse(target.getAttribute('data-reset'))
target.classList.toggle('btn-reset--progress', true)
for (let i in values) {
document.querySelector(`#${i}`).value = values[i]
}
window.setTimeout(() => {
target.classList.toggle('btn-reset--progress', false)
}, 800)
})
}
@ -249,7 +255,6 @@ document.addEventListener('DOMContentLoaded', () => {
let value = []
for (let item of document.querySelectorAll('#categories-list .side-menu-setting-list-item')) {
console.log(item.getAttribute('data-id'))
value.push(item.getAttribute('data-id'))
}
@ -258,20 +263,19 @@ document.addEventListener('DOMContentLoaded', () => {
} catch (e) {
}
sortable('#top-menu-apps-order-list .side-menu-setting-list', {
sortable('#apps-order-list .side-menu-setting-list', {
placeholderClass: 'side-menu-setting-list-drop'
})
try {
sortable('#top-menu-apps-order-list .side-menu-setting-list')[0].addEventListener('sortstop', (e) => {
sortable('#apps-order-list .side-menu-setting-list')[0].addEventListener('sortstop', (e) => {
let value = []
for (let item of document.querySelectorAll('#top-menu-apps-order-list .side-menu-setting-list-item')) {
console.log(item.getAttribute('data-id'))
for (let item of document.querySelectorAll('#apps-order-list .side-menu-setting-list-item')) {
value.push(item.getAttribute('data-id'))
}
document.querySelector('input[name="top-menu-apps-order"]').value = JSON.stringify(value)
document.querySelector('input[name="apps-order"]').value = JSON.stringify(value)
})
} catch (e) {
}

View file

@ -109,6 +109,3 @@
"Normal text": "Normální text"
"Big text": "Velký text"
"Applications": "Applications"
"This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays.": "This\
\ feature is not compatible with <code>big menu</code> and <code>with categories</code>\
\ displays."

View file

@ -112,6 +112,3 @@
"Normal text": "Normaler Text"
"Big text": "Großer Text"
"Applications": "Applications"
"This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays.": "This\
\ feature is not compatible with <code>big menu</code> and <code>with categories</code>\
\ displays."

View file

@ -114,6 +114,3 @@
\ et latéral"
"Reset to default": "Restaurer les valeurs par défaut"
"Applications": "Applications"
"This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays.": "Cette\
\ fonctionnalité n'est pas compatible avec les affichages <code>Menu large</code>\
\ et <code>Avec les catégories</code>."

View file

@ -93,4 +93,3 @@
"Apps visible in the top and side menus": ""
"Reset to default": ""
"Applications": ""
"This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays.": ""

View file

@ -90,4 +90,3 @@
"Normal text": "普通文本"
"Big text": "大文本"
"Applications": "Applications"
"This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays.": "This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays."

View file

@ -25,8 +25,8 @@ if ($_['always-displayed']) {
const targetBlankApps = <?php echo json_encode($_['target-blank-apps']) ?>
window.topMenuApps = <?php echo json_encode($_['top-menu-apps']), "\n"; ?>
window.topMenuAppsOrder = <?php echo json_encode($_['top-menu-apps-order']), "\n"; ?>
window.topSideMenuApps = <?php echo json_encode($_['top-side-menu-apps']); ?>
window.topSideMenuApps = <?php echo json_encode($_['top-side-menu-apps'])."\n"; ?>
window.menuAppsOrder = <?php echo json_encode($_['apps-order']), "\n"; ?>
<?php if ($display === 'big-menu'): ?>
sideMenu.setAttribute('data-bigmenu', '1')

View file

@ -839,19 +839,19 @@ $labelReset = 'Reset to default';
<div class="side-menu-setting-row">
<div class="side-menu-setting-label">
<?php p($l->t('Customize sorting')); ?>
<br>
<em>
<?php echo $l->t('This feature is not compatible with <code>big menu</code> and <code>with categories</code> displays.'); ?>
</em>
</div>
<div class="side-menu-setting-form">
<a class="side-menu-toggler" data-target="#top-menu-apps-order-list" href="#_">
<a class="side-menu-toggler" data-target="#apps-order-list" href="#_">
🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a>
<div id="top-menu-apps-order-list" style="display: none">
<div class="theme-undo icon icon-history btn-reset btn-reset--down" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-apps-order' => [],
])) ?>"></div>
<div id="apps-order-list" style="display: none">
<ul class="side-menu-setting-list">
<?php foreach ($_['top-menu-ordered-apps'] as $key => $app): ?>
<?php foreach ($_['ordered-apps'] as $key => $app): ?>
<li data-id="<?php echo $app['id']; ?>" class="side-menu-setting-list-item">
<span class="arrow">
@ -863,7 +863,7 @@ $labelReset = 'Reset to default';
</ul>
</div>
<input type="hidden" value='<?php echo json_encode(array_keys($_['top-menu-apps-order'])) ?>' name="top-menu-apps-order" class="side-menu-setting">
<input type="hidden" value='<?php echo json_encode($_['apps-order']) ?>' name="apps-order" class="side-menu-setting" id="side-menu-apps-order">
</div>
</div>
</div>