From 3b4579c19cf726a05214f1bdec591ae5dadceadc Mon Sep 17 00:00:00 2001 From: dhrn <14145706+dhrn@users.noreply.github.com> Date: Tue, 19 May 2020 22:16:11 +0530 Subject: [PATCH] [ACA-3257] Add actions extension capability to info drawer (#1471) * info drawer action added * actions added * * improved docs * * added unit test * fixed e2e * * rename actions to toolbar * * minor changes * Update application-features.md Co-authored-by: Eugenio Romano --- docs/extending/application-features.md | 41 ++++++---- docs/ja/extending/application-features.md | 30 +++---- .../context-submenus-ext.json | 44 ++++++----- .../document-presets-ext.json | 44 ++++++----- .../extensions-default.json | 44 ++++++----- .../extensibility-configs/header-ext.json | 44 ++++++----- .../info-drawer-ext.json | 22 +++--- .../extensibility-configs/metadata-ext.json | 44 ++++++----- .../extensibility-configs/viewer-ext.json | 78 ++++++++++--------- extension.schema.json | 17 +++- .../info-drawer/info-drawer.component.html | 6 ++ .../info-drawer/info-drawer.component.spec.ts | 37 +++++++-- .../info-drawer/info-drawer.component.ts | 19 ++++- .../info-drawer/shared-info-drawer.module.ts | 7 +- .../src/lib/services/app.extension.service.ts | 17 +++- src/assets/app.extensions.json | 78 ++++++++++--------- 16 files changed, 336 insertions(+), 236 deletions(-) diff --git a/docs/extending/application-features.md b/docs/extending/application-features.md index 1868862ac..c32edd784 100644 --- a/docs/extending/application-features.md +++ b/docs/extending/application-features.md @@ -200,6 +200,7 @@ You can provide the following customizations for the Sidebar (aka Info Drawer) c - Add extra tabs with custom components - Disable tabs from the main application or extensions - Replace content or properties of existing tabs +- Add toolbar buttons ```json { @@ -208,25 +209,35 @@ You can provide the following customizations for the Sidebar (aka Info Drawer) c "$name": "plugin1", "features": { - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "Properties", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "Comments", - "component": "app.components.tabs.comments" - } - ] + "sidebar": { + "toolbar": [ + { + "id": "app.sidebar.close", + "order": 100, + "title": "close", + "icon": "highlight_off" + } + ], + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "Properties", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "Comments", + "component": "app.components.tabs.comments" + } + ] + } } } ``` -The example above renders two tabs: +The example above renders two tabs with `close` icon: - `Properties` tab that references the `app.components.tabs.metadata` component - `Comments` tab that references the `app.components.tabs.comments` component diff --git a/docs/ja/extending/application-features.md b/docs/ja/extending/application-features.md index cbb443d20..3cc8d5528 100644 --- a/docs/ja/extending/application-features.md +++ b/docs/ja/extending/application-features.md @@ -209,20 +209,22 @@ export interface NavBarLinkRef { "$name": "plugin1", "features": { - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "Properties", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "Comments", - "component": "app.components.tabs.comments" - } - ] + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "Properties", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "Comments", + "component": "app.components.tabs.comments" + } + ] + } } } ``` diff --git a/e2e/resources/extensibility-configs/context-submenus-ext.json b/e2e/resources/extensibility-configs/context-submenus-ext.json index 4d541388f..403443cce 100644 --- a/e2e/resources/extensibility-configs/context-submenus-ext.json +++ b/e2e/resources/extensibility-configs/context-submenus-ext.json @@ -903,27 +903,29 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments" - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions" - } - ], + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments" + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions" + } + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom", diff --git a/e2e/resources/extensibility-configs/document-presets-ext.json b/e2e/resources/extensibility-configs/document-presets-ext.json index 027d1458a..c5a4008f8 100644 --- a/e2e/resources/extensibility-configs/document-presets-ext.json +++ b/e2e/resources/extensibility-configs/document-presets-ext.json @@ -821,27 +821,29 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments" - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions" - } - ], + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments" + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions" + } + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom", diff --git a/e2e/resources/extensibility-configs/extensions-default.json b/e2e/resources/extensibility-configs/extensions-default.json index 348d85289..16d6d7d48 100644 --- a/e2e/resources/extensibility-configs/extensions-default.json +++ b/e2e/resources/extensibility-configs/extensions-default.json @@ -806,26 +806,28 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments" - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions" - } - ] + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments" + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions" + } + ] + } } } diff --git a/e2e/resources/extensibility-configs/header-ext.json b/e2e/resources/extensibility-configs/header-ext.json index 3e0f7da03..27f8f6cba 100644 --- a/e2e/resources/extensibility-configs/header-ext.json +++ b/e2e/resources/extensibility-configs/header-ext.json @@ -842,27 +842,29 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments" - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions" - } - ], + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments" + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions" + } + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom", diff --git a/e2e/resources/extensibility-configs/info-drawer-ext.json b/e2e/resources/extensibility-configs/info-drawer-ext.json index ab2631b3e..0269a7246 100644 --- a/e2e/resources/extensibility-configs/info-drawer-ext.json +++ b/e2e/resources/extensibility-configs/info-drawer-ext.json @@ -1220,34 +1220,36 @@ } ] }, - "sidebar": [ - { + "sidebar": { + "tabs": [ + { "id": "app.sidebar.properties", "order": 1, "title": "MY PROPERTIES", "component": "app.components.tabs.metadata" - }, - { + }, + { "id": "app.sidebar.custom", "order": 2, "icon": "mood", "title": "MY CUSTOM TITLE", "component": "app.toolbar.toggleFavorite" - }, - { + }, + { "id": "app.sidebar.no_title", "order": 3, "icon": "check_circle", "component": "app.components.tabs.metadata" - }, - { + }, + { "id": "app.sidebar.comments", "order": 4, "disabled": true, "title": "APP.INFO_DRAWER.TABS.COMMENTS", "component": "app.components.tabs.comments" - } - ], + } + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom", diff --git a/e2e/resources/extensibility-configs/metadata-ext.json b/e2e/resources/extensibility-configs/metadata-ext.json index a93b3d156..17c79c588 100644 --- a/e2e/resources/extensibility-configs/metadata-ext.json +++ b/e2e/resources/extensibility-configs/metadata-ext.json @@ -841,27 +841,29 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata" - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments" - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions" - } - ], + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata" + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments" + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions" + } + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom", diff --git a/e2e/resources/extensibility-configs/viewer-ext.json b/e2e/resources/extensibility-configs/viewer-ext.json index 0b3ccc2a6..8f4a607a6 100644 --- a/e2e/resources/extensibility-configs/viewer-ext.json +++ b/e2e/resources/extensibility-configs/viewer-ext.json @@ -1244,45 +1244,47 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata", - "rules": { - "visible": "app.navigation.isNotLibraries" + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata", + "rules": { + "visible": "app.navigation.isNotLibraries" + } + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments", + "rules": { + "visible": "app.navigation.isNotLibraries" + } + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions", + "rules": { + "visible": "app.navigation.isNotLibraries" + } + }, + { + "id": "app.sidebar.library.properties", + "order": 500, + "title": "APP.INFO_DRAWER.TABS.LIBRARY_PROPERTIES", + "component": "app.components.tabs.library.metadata", + "rules": { + "visible": "app.libraries.toolbar" + } } - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments", - "rules": { - "visible": "app.navigation.isNotLibraries" - } - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions", - "rules": { - "visible": "app.navigation.isNotLibraries" - } - }, - { - "id": "app.sidebar.library.properties", - "order": 500, - "title": "APP.INFO_DRAWER.TABS.LIBRARY_PROPERTIES", - "component": "app.components.tabs.library.metadata", - "rules": { - "visible": "app.libraries.toolbar" - } - } - ], + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom", diff --git a/extension.schema.json b/extension.schema.json index 491bfacf4..eadcf29f5 100644 --- a/extension.schema.json +++ b/extension.schema.json @@ -803,9 +803,20 @@ }, "sidebar": { "description": "Sidebar extensions", - "type": "array", - "items": { "$ref": "#/definitions/sidebarTabRef" }, - "minItems": 1 + "type": "object", + "properties": { + "toolbar": { + "description": "Toolbar entries", + "type": "array", + "items": { "$ref": "#/definitions/contentActionRef" } + }, + "tabs": { + "description": "Tabs entries", + "type": "array", + "items": { "$ref": "#/definitions/sidebarTabRef" }, + "minItems": 1 + } + } }, "toolbar": { "description": "Toolbar entries", diff --git a/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.html b/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.html index 9a57ca301..47e911092 100644 --- a/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.html +++ b/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.html @@ -7,6 +7,12 @@ cdkTrapFocus cdkTrapFocusAutoCapture > + + + + + + . */ +import { ContentActionRef } from '@alfresco/adf-extensions'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { InfoDrawerComponent } from './info-drawer.component'; -import { TestBed, ComponentFixture, async } from '@angular/core/testing'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { Store } from '@ngrx/store'; import { SetInfoDrawerStateAction, ToggleInfoDrawerAction } from '@alfresco/aca-shared/store'; +import { of, Subject } from 'rxjs'; +import { InfoDrawerComponent } from './info-drawer.component'; import { LibTestingModule } from '../../testing/lib-testing-module'; import { AppExtensionService } from '../../services/app.extension.service'; import { ContentApiService } from '../../services/content-api.service'; -import { of } from 'rxjs'; +import { SharedToolbarModule } from '../tool-bar/shared-toolbar.module'; describe('InfoDrawerComponent', () => { let fixture: ComponentFixture; @@ -41,16 +43,26 @@ describe('InfoDrawerComponent', () => { let contentApiService: ContentApiService; let tab; let appExtensionService: AppExtensionService; + const mockStream = new Subject(); const storeMock = { - dispatch: jasmine.createSpy('dispatch') + dispatch: jasmine.createSpy('dispatch'), + select: () => mockStream }; const extensionServiceMock = { - getSidebarTabs: () => {} + getSidebarTabs: () => {}, + getAllowedSidebarActions: () => [ + { + id: 'app.sidebar.close', + order: 100, + title: 'close', + icon: 'highlight_off' + } + ] }; beforeEach(() => { TestBed.configureTestingModule({ - imports: [LibTestingModule], + imports: [LibTestingModule, SharedToolbarModule], declarations: [InfoDrawerComponent], providers: [ ContentApiService, @@ -166,4 +178,17 @@ describe('InfoDrawerComponent', () => { new ToggleInfoDrawerAction() ); }); + + it('should show the icons from extension', () => { + fixture.detectChanges(); + mockStream.next(); + expect(component.actions).toEqual([ + { + id: 'app.sidebar.close', + order: 100, + title: 'close', + icon: 'highlight_off' + } as ContentActionRef + ]); + }); }); diff --git a/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.ts b/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.ts index 51020ef70..e71f897a4 100644 --- a/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.ts +++ b/projects/aca-shared/src/lib/components/info-drawer/info-drawer.component.ts @@ -36,14 +36,17 @@ import { MinimalNodeEntryEntity, SiteEntry } from '@alfresco/js-api'; -import { SidebarTabRef } from '@alfresco/adf-extensions'; +import { ContentActionRef, SidebarTabRef } from '@alfresco/adf-extensions'; import { Store } from '@ngrx/store'; import { + getAppSelection, SetInfoDrawerStateAction, ToggleInfoDrawerAction } from '@alfresco/aca-shared/store'; import { AppExtensionService } from '../../services/app.extension.service'; import { ContentApiService } from '../../services/content-api.service'; +import { takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; @Component({ selector: 'aca-info-drawer', @@ -58,6 +61,8 @@ export class InfoDrawerComponent implements OnChanges, OnInit, OnDestroy { isLoading = false; displayNode: MinimalNodeEntryEntity | SiteEntry; tabs: Array = []; + actions: Array = []; + onDestroy$ = new Subject(); @HostListener('keydown.escape') onEscapeKeyboardEvent(): void { @@ -72,9 +77,17 @@ export class InfoDrawerComponent implements OnChanges, OnInit, OnDestroy { ngOnInit() { this.tabs = this.extensions.getSidebarTabs(); + this.store + .select(getAppSelection) + .pipe(takeUntil(this.onDestroy$)) + .subscribe(() => { + this.actions = this.extensions.getAllowedSidebarActions(); + }); } ngOnDestroy() { + this.onDestroy$.next(true); + this.onDestroy$.complete(); this.store.dispatch(new SetInfoDrawerStateAction(false)); } @@ -91,6 +104,10 @@ export class InfoDrawerComponent implements OnChanges, OnInit, OnDestroy { } } + trackByActionId(_: number, action: ContentActionRef) { + return action.id; + } + private close() { this.store.dispatch(new ToggleInfoDrawerAction()); } diff --git a/projects/aca-shared/src/lib/components/info-drawer/shared-info-drawer.module.ts b/projects/aca-shared/src/lib/components/info-drawer/shared-info-drawer.module.ts index 737397f98..579a3ad85 100644 --- a/projects/aca-shared/src/lib/components/info-drawer/shared-info-drawer.module.ts +++ b/projects/aca-shared/src/lib/components/info-drawer/shared-info-drawer.module.ts @@ -26,16 +26,19 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { InfoDrawerComponent } from './info-drawer.component'; -import { InfoDrawerModule } from '@alfresco/adf-core'; +import { InfoDrawerModule, ToolbarModule } from '@alfresco/adf-core'; import { ExtensionsModule } from '@alfresco/adf-extensions'; import { MatProgressBarModule } from '@angular/material'; +import { SharedToolbarModule } from '../tool-bar/shared-toolbar.module'; @NgModule({ imports: [ CommonModule, InfoDrawerModule, MatProgressBarModule, - ExtensionsModule + ExtensionsModule, + ToolbarModule, + SharedToolbarModule ], declarations: [InfoDrawerComponent], exports: [InfoDrawerComponent] diff --git a/projects/aca-shared/src/lib/services/app.extension.service.ts b/projects/aca-shared/src/lib/services/app.extension.service.ts index d6aea8053..6b69b22ce 100644 --- a/projects/aca-shared/src/lib/services/app.extension.service.ts +++ b/projects/aca-shared/src/lib/services/app.extension.service.ts @@ -83,7 +83,8 @@ export class AppExtensionService implements RuleContext { openWithActions: Array = []; createActions: Array = []; navbar: Array = []; - sidebar: Array = []; + sidebarTabs: Array = []; + sidebarActions: Array = []; contentMetadata: any; viewerRules: ViewerRules = {}; userActions: Array = []; @@ -163,6 +164,10 @@ export class AppExtensionService implements RuleContext { config, 'features.header' ); + this.sidebarActions = this.loader.getContentActions( + config, + 'features.sidebar.toolbar' + ); this.toolbarActions = this.loader.getContentActions( config, 'features.toolbar' @@ -189,9 +194,9 @@ export class AppExtensionService implements RuleContext { 'features.create' ); this.navbar = this.loadNavBar(config); - this.sidebar = this.loader.getElements( + this.sidebarTabs = this.loader.getElements( config, - 'features.sidebar' + 'features.sidebar.tabs' ); this.userActions = this.loader.getContentActions( config, @@ -382,7 +387,7 @@ export class AppExtensionService implements RuleContext { } getSidebarTabs(): Array { - return this.sidebar.filter(action => this.filterVisible(action)); + return this.sidebarTabs.filter(action => this.filterVisible(action)); } getComponentById(id: string): Type<{}> { @@ -486,6 +491,10 @@ export class AppExtensionService implements RuleContext { .reduce(reduceSeparators, []); } + getAllowedSidebarActions(): Array { + return this.getAllowedActions(this.sidebarActions); + } + getAllowedToolbarActions(): Array { return this.getAllowedActions(this.toolbarActions); } diff --git a/src/assets/app.extensions.json b/src/assets/app.extensions.json index c78955ecc..3dcab100b 100644 --- a/src/assets/app.extensions.json +++ b/src/assets/app.extensions.json @@ -1007,45 +1007,47 @@ } ] }, - "sidebar": [ - { - "id": "app.sidebar.properties", - "order": 100, - "title": "APP.INFO_DRAWER.TABS.PROPERTIES", - "component": "app.components.tabs.metadata", - "rules": { - "visible": "app.navigation.isNotLibraries" + "sidebar": { + "tabs": [ + { + "id": "app.sidebar.properties", + "order": 100, + "title": "APP.INFO_DRAWER.TABS.PROPERTIES", + "component": "app.components.tabs.metadata", + "rules": { + "visible": "app.navigation.isNotLibraries" + } + }, + { + "id": "app.sidebar.comments", + "order": 200, + "title": "APP.INFO_DRAWER.TABS.COMMENTS", + "component": "app.components.tabs.comments", + "rules": { + "visible": "app.navigation.isNotLibraries" + } + }, + { + "id": "app.sidebar.versions", + "order": 300, + "disabled": true, + "title": "APP.INFO_DRAWER.TABS.VERSIONS", + "component": "app.components.tabs.versions", + "rules": { + "visible": "app.navigation.isNotLibraries" + } + }, + { + "id": "app.sidebar.library.properties", + "order": 500, + "title": "APP.INFO_DRAWER.TABS.LIBRARY_PROPERTIES", + "component": "app.components.tabs.library.metadata", + "rules": { + "visible": "app.selection.library" + } } - }, - { - "id": "app.sidebar.comments", - "order": 200, - "title": "APP.INFO_DRAWER.TABS.COMMENTS", - "component": "app.components.tabs.comments", - "rules": { - "visible": "app.navigation.isNotLibraries" - } - }, - { - "id": "app.sidebar.versions", - "order": 300, - "disabled": true, - "title": "APP.INFO_DRAWER.TABS.VERSIONS", - "component": "app.components.tabs.versions", - "rules": { - "visible": "app.navigation.isNotLibraries" - } - }, - { - "id": "app.sidebar.library.properties", - "order": 500, - "title": "APP.INFO_DRAWER.TABS.LIBRARY_PROPERTIES", - "component": "app.components.tabs.library.metadata", - "rules": { - "visible": "app.selection.library" - } - } - ], + ] + }, "content-metadata-presets": [ { "id": "app.content.metadata.custom",