feat(admin): emphasize unprivileged items in sidebar with "prohibited" icon

This commit is contained in:
Ewen Korr 2024-01-08 16:25:39 +00:00 committed by Yassine Doghri
parent 68a599fee0
commit 0bd7ddea58
5 changed files with 109 additions and 24 deletions

View File

@ -15,6 +15,8 @@ module.exports = {
content: {
chevronRightIcon:
"url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 24 24'%3E%3Cpath d='M13.17 12 8.22 7.05l1.42-1.41L16 12l-6.36 6.36-1.42-1.41L13.17 12Z'/%3E%3C/svg%3E%0A\")",
prohibitedIcon:
"url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 24 24'%3E%3Cpath d='M7.0943 5.68009L18.3199 16.9057C19.3736 15.5506 20 13.8491 20 12C20 7.58172 16.4183 4 12 4C10.1509 4 8.44939 4.62644 7.0943 5.68009ZM16.9057 18.3199L5.68009 7.0943C4.62644 8.44939 4 10.1509 4 12C4 16.4183 7.58172 20 12 20C13.8491 20 15.5506 19.3736 16.9057 18.3199ZM4.92893 4.92893C6.73748 3.12038 9.23885 2 12 2C17.5228 2 22 6.47715 22 12C22 14.7611 20.8796 17.2625 19.0711 19.0711C17.2625 20.8796 14.7611 22 12 22C6.47715 22 2 17.5228 2 12C2 9.23885 3.12038 6.73748 4.92893 4.92893Z'/%3E%3C/svg%3E%0A\")",
},
fontFamily: {
sans: ["Inter", ...defaultTheme.fontFamily.sans],

View File

@ -27,11 +27,22 @@
<ul class="flex flex-col pb-4">
<?php foreach ($data['items'] as $item):
$isActive = $item === $activeItem;
$isAllowed = true;
if (array_key_exists('items-permissions', $data) && array_key_exists($item, $data['items-permissions'])) {
if (isset($podcastId)) {
$isAllowed = can_podcast(auth()->user(), $podcastId, $data['items-permissions'][$item]);
} else {
$isAllowed = auth()->user()->can($data['items-permissions'][$item]);
}
}
?>
<li class="inline-flex">
<a class="relative w-full py-3 pl-14 pr-2 text-sm hover:opacity-100 before:content-chevronRightIcon before:absolute before:-ml-5 before:opacity-0 before:w-5 before:h-5 hover:bg-navigation-active focus:ring-inset focus:ring-accent<?= $isActive
<a class="relative w-full py-3 pl-14 pr-2 text-sm hover:opacity-100 before:absolute before:opacity-0 before:w-5 before:h-5 hover:bg-navigation-active focus:ring-inset focus:ring-accent<?= $isActive
? ' before:opacity-100 font-semibold inline-flex items-center'
: ' hover:before:opacity-60 focus:before:opacity-60' ?>" href="<?= route_to($item, $podcastId ?? null, $episodeId ?? null) ?>"><?= lang(
: ' hover:before:opacity-60 focus:before:opacity-60' ?><?= $isAllowed
? ' before:content-chevronRightIcon before:-ml-5'
: ' before:content-prohibitedIcon before:-ml-6 before:opacity-60 pointer-events-none' ?>" href="<?= route_to($item, $podcastId ?? null, $episodeId ?? null) ?>"><?= lang(
$langKey . '.' . $item,
) ?></a>
</li>

View File

@ -11,39 +11,65 @@ $navigation = [
'items' => ['admin'],
],
'podcasts' => [
'icon' => 'mic',
'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'],
'icon' => 'mic',
'items' => ['podcast-list', 'podcast-create', 'all-podcast-imports', 'podcast-imports-add'],
'items-permissions' => [
'podcast-create' => 'podcasts.create',
'all-podcast-imports' => 'podcasts.import',
'podcast-imports-add' => 'podcasts.import',
],
'add-cta' => 'podcast-create',
'count-route' => 'podcast-list',
],
'persons' => [
'icon' => 'folder-user',
'items' => ['person-list', 'person-create'],
'icon' => 'folder-user',
'items' => ['person-list', 'person-create'],
'items-permissions' => [
'person-list' => 'persons.manage',
'person-create' => 'persons.manage',
],
'add-cta' => 'person-create',
'count' => (new PersonModel())->countAllResults(),
'count-route' => 'person-list',
],
'fediverse' => [
'icon' => 'rocket-tilted',
'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'],
'icon' => 'rocket-tilted',
'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'],
'items-permissions' => [
'fediverse-blocked-actors' => 'fediverse.manage-blocks',
'fediverse-blocked-domains' => 'fediverse.manage-blocks',
],
],
'users' => [
'icon' => 'group',
'items' => ['user-list', 'user-create'],
'icon' => 'group',
'items' => ['user-list', 'user-create'],
'items-permissions' => [
'user-list' => 'users.manage',
'user-create' => 'users.manage',
],
'add-cta' => 'user-create',
'count' => (new UserModel())->countAllResults(),
'count-route' => 'user-list',
],
'pages' => [
'icon' => 'pages',
'items' => ['page-list', 'page-create'],
'icon' => 'pages',
'items' => ['page-list', 'page-create'],
'items-permissions' => [
'page-list' => 'pages.manage',
'page-create' => 'pages.manage',
],
'add-cta' => 'page-create',
'count' => (new PageModel())->countAllResults(),
'count-route' => 'page-list',
],
'settings' => [
'icon' => 'settings',
'items' => ['settings-general', 'settings-theme', 'admin-about'],
'icon' => 'settings',
'items' => ['settings-general', 'settings-theme', 'admin-about'],
'items-permissions' => [
'settings-general' => 'admin.settings',
'settings-theme' => 'admin.settings',
'admin-about' => 'admin.settings',
],
],
];

View File

@ -2,12 +2,24 @@
$episodeNavigation = [
'dashboard' => [
'icon' => 'dashboard',
'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'],
'icon' => 'dashboard',
'items' => ['episode-view', 'episode-edit', 'episode-persons-manage', 'embed-add'],
'items-permissions' => [
'episode-view' => 'episodes.view',
'episode-edit' => 'episodes.edit',
'episode-persons-manage' => 'episodes.manage-persons',
'embed-add' => 'episodes.edit',
],
],
'clips' => [
'icon' => 'clapperboard',
'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'],
'icon' => 'clapperboard',
'items' => ['video-clips-list', 'video-clips-create', 'soundbites-list', 'soundbites-create'],
'items-permissions' => [
'video-clips-list' => 'episodes.manage-clips',
'video-clips-create' => 'episodes.manage-clips',
'soundbites-list' => 'episodes.manage-clips',
'soundbites-create' => 'episodes.manage-clips',
],
'count' => $episode->getClipCount(),
'count-route' => 'video-clips-list',
'add-cta' => 'video-clips-create',

View File

@ -2,12 +2,23 @@
$podcastNavigation = [
'dashboard' => [
'icon' => 'dashboard',
'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'],
'icon' => 'dashboard',
'items' => ['podcast-view', 'podcast-edit', 'podcast-persons-manage', 'podcast-imports', 'podcast-imports-sync'],
'items-permissions' => [
'podcast-view' => 'view',
'podcast-edit' => 'edit',
'podcast-persons-manage' => 'manage-persons',
'podcast-imports' => 'manage-import',
'podcast-imports-sync' => 'manage-import',
],
],
'episodes' => [
'icon' => 'play-circle',
'items' => ['episode-list', 'episode-create'],
'icon' => 'play-circle',
'items' => ['episode-list', 'episode-create'],
'items-permissions' => [
'episode-list' => 'episodes.view',
'episode-create' => 'episodes.create',
],
'add-cta' => 'episode-create',
'count' => $podcast->getEpisodesCount(),
'count-route' => 'episode-list',
@ -23,6 +34,15 @@ $podcastNavigation = [
'podcast-analytics-time-periods',
'podcast-analytics-webpages',
],
'items-permissions' => [
'podcast-analytics' => 'view',
'podcast-analytics-unique-listeners' => 'view',
'podcast-analytics-listening-time' => 'view',
'podcast-analytics-players' => 'view',
'podcast-analytics-locations' => 'view',
'podcast-analytics-time-periods' => 'view',
'podcast-analytics-webpages' => 'view',
],
],
'broadcast' => [
'icon' => 'broadcast',
@ -30,6 +50,10 @@ $podcastNavigation = [
'platforms-podcasting',
'platforms-social',
],
'items-permissions' => [
'platforms-podcasting' => 'manage-platforms',
'platforms-social' => 'manage-platforms',
],
],
'monetization' => [
'icon' => 'money-dollar-circle',
@ -39,10 +63,20 @@ $podcastNavigation = [
'platforms-funding',
'podcast-monetization-other',
],
'items-permissions' => [
'subscription-list' => 'manage-subscriptions',
'subscription-create' => 'manage-subscriptions',
'platforms-funding' => 'manage-platforms',
'podcast-monetization-other' => 'edit',
],
],
'contributors' => [
'icon' => 'group',
'items' => ['contributor-list', 'contributor-add'],
'icon' => 'group',
'items' => ['contributor-list', 'contributor-add'],
'items-permissions' => [
'contributor-list' => 'manage-contributors',
'contributor-add' => 'manage-contributors',
],
'add-cta' => 'contributor-add',
'count' => count($podcast->contributors),
'count-route' => 'contributor-list',