Merge branch 'v15/dev' into v15/feature/member-sidebar-menu

This commit is contained in:
Mads Rasmussen
2024-09-13 18:04:08 +02:00
239 changed files with 2615 additions and 10696 deletions

View File

@@ -2,7 +2,7 @@ import { defineConfig } from '@hey-api/openapi-ts';
export default defineConfig({
client: 'fetch',
input: 'https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json',
input: 'https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v15/dev/src/Umbraco.Cms.Api.Management/OpenApi.json',
output: {
path: 'src/external/backend-api/src',
format: 'prettier',

File diff suppressed because it is too large Load Diff

View File

@@ -190,8 +190,8 @@
"@types/diff": "^5.2.1",
"@types/dompurify": "^3.0.5",
"@types/uuid": "^10.0.0",
"@umbraco-ui/uui": "^1.9.0",
"@umbraco-ui/uui-css": "^1.9.0",
"@umbraco-ui/uui": "^v1.10.0-rc.0",
"@umbraco-ui/uui-css": "^v1.10.0-rc.0",
"base64-js": "^1.5.1",
"diff": "^5.2.0",
"dompurify": "^3.1.6",

View File

@@ -10,6 +10,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api';
import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';
import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user';
import { UmbSysinfoRepository } from '@umbraco-cms/backoffice/sysinfo';
export class UmbBackofficeContext extends UmbContextBase<UmbBackofficeContext> {
#activeSectionAlias = new UmbStringState(undefined);
@@ -76,6 +77,12 @@ export class UmbBackofficeContext extends UmbContextBase<UmbBackofficeContext> {
public setActiveSectionAlias(alias: string) {
this.#activeSectionAlias.setValue(alias);
}
public async serverUpgradeCheck(): Promise<boolean> {
const repository = new UmbSysinfoRepository(this);
const check = await repository.serverUpgradeCheck();
return !!check;
}
}
export const UMB_BACKOFFICE_CONTEXT = new UmbContextToken<UmbBackofficeContext>('UmbBackofficeContext');

View File

@@ -17,6 +17,7 @@ const CORE_PACKAGES = [
import('../../packages/data-type/umbraco-package.js'),
import('../../packages/dictionary/umbraco-package.js'),
import('../../packages/documents/umbraco-package.js'),
import('../../packages/extension-insights/umbraco-package.js'),
import('../../packages/health-check/umbraco-package.js'),
import('../../packages/help/umbraco-package.js'),
import('../../packages/language/umbraco-package.js'),

View File

@@ -1,10 +1,10 @@
import { isCurrentUserAnAdmin } from '@umbraco-cms/backoffice/current-user';
import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js';
import { isCurrentUserAnAdmin } from '@umbraco-cms/backoffice/current-user';
import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
import { UMB_SYSINFO_MODAL } from '@umbraco-cms/backoffice/sysinfo';
import { UMB_NEWVERSION_MODAL, UMB_SYSINFO_MODAL } from '@umbraco-cms/backoffice/sysinfo';
@customElement('umb-backoffice-header-logo')
export class UmbBackofficeHeaderLogoElement extends UmbLitElement {
@@ -14,6 +14,11 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement {
@state()
private _isUserAdmin = false;
@state()
private _serverUpgradeCheck = false;
#backofficeContext?: typeof UMB_BACKOFFICE_CONTEXT.TYPE;
constructor() {
super();
@@ -26,6 +31,8 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement {
},
'_observeVersion',
);
this.#backofficeContext = context;
});
this.#isAdmin();
@@ -33,6 +40,10 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement {
async #isAdmin() {
this._isUserAdmin = await isCurrentUserAnAdmin(this);
if (this._isUserAdmin) {
this._serverUpgradeCheck = this.#backofficeContext ? await this.#backofficeContext.serverUpgradeCheck() : false;
}
}
override render() {
@@ -50,6 +61,14 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement {
height="82"
loading="lazy" />
<span>${this._version}</span>
${this._serverUpgradeCheck
? html`<uui-button
@click=${this.#openNewVersion}
color="danger"
label=${this.localize.term('general_newVersionAvailable')}></uui-button>`
: ''}
<a href="https://umbraco.com" target="_blank" rel="noopener">Umbraco.com</a>
${this._isUserAdmin
@@ -72,6 +91,14 @@ export class UmbBackofficeHeaderLogoElement extends UmbLitElement {
.catch(() => {});
}
async #openNewVersion() {
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
modalManager
.open(this, UMB_NEWVERSION_MODAL)
.onSubmit()
.catch(() => {});
}
static override styles = [
UmbTextStyles,
css`

View File

@@ -910,6 +910,7 @@ export default {
lastUpdated: 'Last Updated',
skipToMenu: 'Skip to menu',
skipToContent: 'Skip to content',
newVersionAvailable: 'Ny version tilgængelig',
},
colors: {
blue: 'Blå',

View File

@@ -879,6 +879,7 @@ export default {
header: 'Kopf',
systemField: 'System Feld',
lastUpdated: 'Zuletzt geändert',
newVersionAvailable: 'Neue Version verfügbar',
},
colors: {
blue: 'Blau',

View File

@@ -921,6 +921,7 @@ export default {
skipToMenu: 'Skip to menu',
skipToContent: 'Skip to content',
restore: 'Restore',
newVersionAvailable: 'New version available',
},
colors: {
blue: 'Blue',

View File

@@ -934,6 +934,7 @@ export default {
media: 'Media',
revert: 'Revert',
validate: 'Validate',
newVersionAvailable: 'New version available',
},
colors: {
blue: 'Blue',

View File

@@ -1,14 +1,21 @@
export type ApiRequestOptions<T = unknown> = {
readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
readonly url: string;
readonly path?: Record<string, unknown>;
readonly cookies?: Record<string, unknown>;
readonly headers?: Record<string, unknown>;
readonly query?: Record<string, unknown>;
readonly formData?: Record<string, unknown>;
readonly body?: any;
readonly cookies?: Record<string, unknown>;
readonly errors?: Record<number | string, string>;
readonly formData?: Record<string, unknown> | any[] | Blob | File;
readonly headers?: Record<string, unknown>;
readonly mediaType?: string;
readonly method:
| 'DELETE'
| 'GET'
| 'HEAD'
| 'OPTIONS'
| 'PATCH'
| 'POST'
| 'PUT';
readonly path?: Record<string, unknown>;
readonly query?: Record<string, unknown>;
readonly responseHeader?: string;
readonly responseTransformer?: (data: unknown) => Promise<T>;
readonly errors?: Record<number | string, string>;
readonly url: string;
};

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -62,7 +62,7 @@ export class UmbMockEntityTreeManager<T extends { id: string; parent?: { id: str
const destinationItem = this.#db.read(destinationId);
if (!destinationItem) throw new Error(`Destination item with id ${destinationId} not found`);
// TODO: Notice we don't add numbers to the 'copy' name.
// Notice we don't add numbers to the 'copy' name.
const items: Array<any> = [];
ids.forEach((id) => {

View File

@@ -1,10 +1,12 @@
const { rest } = window.MockServiceWorker;
import {
type ServerStatusResponseModel,
type ServerInformationResponseModel,
type ServerTroubleshootingResponseModel,
RuntimeLevelModel,
RuntimeModeModel,
type GetServerUpgradeCheckResponse,
type GetServerTroubleshootingResponse,
type GetServerInformationResponse,
type GetServerConfigurationResponse,
type GetServerStatusResponse,
} from '@umbraco-cms/backoffice/external/backend-api';
import { umbracoPath } from '@umbraco-cms/backoffice/utils';
@@ -12,7 +14,7 @@ export const serverRunningHandler = rest.get(umbracoPath('/server/status'), (_re
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<ServerStatusResponseModel>({
ctx.json<GetServerStatusResponse>({
serverStatus: RuntimeLevelModel.RUN,
}),
);
@@ -22,7 +24,7 @@ export const serverMustInstallHandler = rest.get(umbracoPath('/server/status'),
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<ServerStatusResponseModel>({
ctx.json<GetServerStatusResponse>({
serverStatus: RuntimeLevelModel.INSTALL,
}),
);
@@ -32,20 +34,41 @@ export const serverMustUpgradeHandler = rest.get(umbracoPath('/server/status'),
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<ServerStatusResponseModel>({
ctx.json<GetServerStatusResponse>({
serverStatus: RuntimeLevelModel.UPGRADE,
}),
);
});
export const serverInformationHandlers = [
rest.get(umbracoPath('/server/configuration'), (_req, res, ctx) => {
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<GetServerConfigurationResponse>({
allowPasswordReset: true,
versionCheckPeriod: 7, // days
}),
);
}),
rest.get(umbracoPath('/server/upgrade-check'), (_req, res, ctx) => {
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<GetServerUpgradeCheckResponse>({
type: 'Minor',
comment: "14.2.0.0 is released. Upgrade today - it's free!",
url: 'https://our.umbraco.com/download/releases/1420',
}),
);
}),
rest.get(umbracoPath('/server/information'), (_req, res, ctx) => {
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<ServerInformationResponseModel>({
version: '14.0.0-preview004',
assemblyVersion: '14.0.0-preview004',
ctx.json<GetServerInformationResponse>({
version: '14.0.0',
assemblyVersion: '14.0.0',
baseUtcOffset: '01:00:00',
runtimeMode: RuntimeModeModel.BACKOFFICE_DEVELOPMENT,
}),
@@ -55,7 +78,7 @@ export const serverInformationHandlers = [
return res(
// Respond with a 200 status code
ctx.status(200),
ctx.json<ServerTroubleshootingResponseModel>({
ctx.json<GetServerTroubleshootingResponse>({
items: [
{ name: 'Umbraco base url', data: location.origin },
{ name: 'Mocked server', data: 'true' },

View File

@@ -21,6 +21,6 @@ export interface ManifestBlockEditorCustomView extends ManifestElement<UmbBlockE
declare global {
interface UmbExtensionManifestMap {
blockEditorCustomView: ManifestBlockEditorCustomView;
umbBlockEditorCustomView: ManifestBlockEditorCustomView;
}
}

View File

@@ -47,11 +47,10 @@ export class UmbRefListBlockElement extends UmbLitElement {
}
override render() {
// TODO: apply `slot="name"` to the `umb-ufm-render` element, when UUI supports it. [NL]
return html`
<uui-ref-node standalone href=${this._workspaceEditPath ?? '#'}>
<umb-icon slot="icon" .name=${this.icon}></umb-icon>
<umb-ufm-render inline .markdown=${this.label} .value=${this._content}></umb-ufm-render>
<umb-ufm-render slot="name" inline .markdown=${this.label} .value=${this._content}></umb-ufm-render>
</uui-ref-node>
`;
}

View File

@@ -0,0 +1,13 @@
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
export type BlockWorkspaceHasSettingsConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>;
export type BlockEntryShowContentEditConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockEntryShowContentEdit'>;
declare global {
interface UmbExtensionConditionMap {
umbBlock: BlockEntryShowContentEditConditionConfig | BlockWorkspaceHasSettingsConditionConfig;
}
}

View File

@@ -4,10 +4,11 @@ import { html, customElement, property, state, ifDefined } from '@umbraco-cms/ba
import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbBackofficeManifestKind, ManifestCollectionAction } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestCollectionAction } from '@umbraco-cms/backoffice/collection';
import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api';
const manifest: UmbBackofficeManifestKind = {
const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.CollectionAction.Button',
matchKind: 'button',

View File

@@ -1,4 +1,4 @@
import type { ManifestCollectionView } from '../extension-registry/models/index.js';
import type { ManifestCollectionView } from './extensions/index.js';
import { umbExtensionsRegistry } from '../extension-registry/index.js';
import { UmbCollectionViewManager } from './collection-view.manager.js';
import { expect } from '@open-wc/testing';

View File

@@ -1,8 +1,8 @@
import type { ManifestCollectionView } from './extensions/index.js';
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import { UmbExtensionsManifestInitializer, createExtensionElement } from '@umbraco-cms/backoffice/extension-api';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { UmbArrayState, UmbObjectState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';
import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type { UmbRoute } from '@umbraco-cms/backoffice/router';

View File

@@ -1,7 +1,7 @@
import type { UmbCollectionConfiguration } from './types.js';
import type { ManifestCollection } from './extensions/index.js';
import { customElement, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbExtensionElementAndApiSlotElementBase } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestCollection } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
const elementName = 'umb-collection';

View File

@@ -1,12 +1,12 @@
import type { UmbDefaultCollectionContext } from '../default/index.js';
import { UMB_COLLECTION_CONTEXT } from '../default/index.js';
import type { UmbCollectionLayoutConfiguration } from '../types.js';
import type { ManifestCollectionView } from '../extensions/index.js';
import { css, html, customElement, state, nothing, repeat, query } from '@umbraco-cms/backoffice/external/lit';
import { observeMultiple } from '@umbraco-cms/backoffice/observable-api';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace';
import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extension-registry';
import type { UUIPopoverContainerElement } from '@umbraco-cms/backoffice/external/uui';
interface UmbCollectionViewLayout {

View File

@@ -8,6 +8,7 @@ import type {
} from '../types.js';
import type { UmbCollectionFilterModel } from '../collection-filter-model.interface.js';
import type { UmbCollectionRepository } from '../repository/collection-repository.interface.js';
import type { ManifestCollection } from '../extensions/index.js';
import { UMB_COLLECTION_CONTEXT } from './collection-default.context-token.js';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { UmbArrayState, UmbNumberState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
@@ -15,7 +16,7 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
import { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api';
import { UmbSelectionManager, UmbPaginationManager } from '@umbraco-cms/backoffice/utils';
import type { ManifestCollection, ManifestRepository } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import {

View File

@@ -4,10 +4,10 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/externa
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbRoute } from '@umbraco-cms/backoffice/router';
const manifest: UmbBackofficeManifestKind = {
const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.Collection.Default',
matchKind: 'default',

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
/**
@@ -6,7 +5,9 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr
* For example for content you may wish to create a new document etc
*/
// TODO: create interface for API
export interface ManifestCollectionAction extends ManifestElementAndApi, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestCollectionAction
extends ManifestElementAndApi,
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'collectionAction';
meta: MetaCollectionAction;
}
@@ -15,3 +16,9 @@ export interface MetaCollectionAction {
label: string;
href?: string;
}
declare global {
interface UmbExtensionManifestMap {
umbCollectionAction: ManifestCollectionAction;
}
}

View File

@@ -1,7 +1,6 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestCollectionView extends ManifestElement, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestCollectionView extends ManifestElement, ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'collectionView';
meta: MetaCollectionView;
}
@@ -37,3 +36,9 @@ export interface ConditionsCollectionView {
*/
entityType: string;
}
declare global {
interface UmbExtensionManifestMap {
umbCollectionView: ManifestCollectionView;
}
}

View File

@@ -1,7 +1,8 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestCollection extends ManifestElementAndApi, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestCollection
extends ManifestElementAndApi,
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'collection';
meta: MetaCollection;
}
@@ -9,3 +10,9 @@ export interface ManifestCollection extends ManifestElementAndApi, ManifestWithD
export interface MetaCollection {
repositoryAlias: string;
}
declare global {
interface UmbExtensionManifestMap {
umbCollection: ManifestCollection;
}
}

View File

@@ -0,0 +1,3 @@
export * from './collection-action.extension.js';
export * from './collection-view.extension.js';
export * from './collection.extension.js';

View File

@@ -10,14 +10,10 @@ export * from './collection-item-picker-modal/index.js';
export * from './default/collection-default.context.js';
export * from './default/collection-default.context-token.js';
export * from './collection-filter-model.interface.js';
export * from './types.js';
export { UMB_COLLECTION_ALIAS_CONDITION } from './collection-alias.manifest.js';
export { UMB_COLLECTION_BULK_ACTION_PERMISSION_CONDITION } from './collection-bulk-action-permission.manifest.js';
export { UmbCollectionActionElement, UmbCollectionActionBase } from './action/index.js';
export type { UmbCollectionDataSource, UmbCollectionRepository } from './repository/index.js';
export type {
UmbCollectionBulkActionPermissions,
UmbCollectionConfiguration,
UmbCollectionColumnConfiguration,
} from './types.js';

View File

@@ -1,5 +1,5 @@
import type { ManifestCollection } from './extensions/index.js';
import type { Observable } from '@umbraco-cms/backoffice/external/rxjs';
import type { ManifestCollection } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbPaginationManager } from '@umbraco-cms/backoffice/utils';
export interface UmbCollectionBulkActionPermissions {
@@ -47,3 +47,5 @@ export interface UmbCollectionContext {
items: Observable<any[]>;
totalItems: Observable<number>;
}
export * from './extensions/index.js';

View File

@@ -1,14 +1,11 @@
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit';
import { css, html, customElement, ifDefined } from '@umbraco-cms/backoffice/external/lit';
import type {
ManifestHeaderAppButtonKind,
UmbBackofficeManifestKind,
} from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestHeaderAppButtonKind, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
const manifest: UmbBackofficeManifestKind = {
const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.Button',
matchKind: 'button',

View File

@@ -46,8 +46,20 @@ export class UmbContentTypeStructureManager<
(x) => x.find((y) => y.unique === this.#ownerContentTypeUnique)?.compositions,
);
readonly #contentTypeContainers = this.#contentTypes.asObservablePart(() => {
return this.#contentTypes.getValue().flatMap((x) => x.containers ?? []);
readonly #contentTypeContainers = this.#contentTypes.asObservablePart((contentTypes) => {
// Notice this may need to use getValue to avoid resetting it self. [NL]
return contentTypes.flatMap((x) => x.containers ?? []);
});
readonly contentTypeProperties = this.#contentTypes.asObservablePart((contentTypes) => {
// Notice this may need to use getValue to avoid resetting it self. [NL]
return contentTypes.flatMap((x) => x.properties ?? []);
});
readonly contentTypeHasProperties = this.#contentTypes.asObservablePart((contentTypes) => {
// Notice this may need to use getValue to avoid resetting it self. [NL]
return contentTypes.some((x) => x.properties.length > 0);
});
readonly contentTypePropertyAliases = this.#contentTypes.asObservablePart((contentTypes) => {
return contentTypes.flatMap((x) => x.properties ?? []).map((x) => x.alias);
});
readonly contentTypeUniques = this.#contentTypes.asObservablePart((x) => x.map((y) => y.unique));
readonly contentTypeAliases = this.#contentTypes.asObservablePart((x) => x.map((y) => y.alias));
@@ -77,7 +89,8 @@ export class UmbContentTypeStructureManager<
/**
* loadType will load the ContentType and all inherited and composed ContentTypes.
* This will give us all the structure for properties and containers.
* @param unique
* @param {string} unique - The unique of the ContentType to load.
* @returns {Promise} - Promise resolved
*/
public async loadType(unique?: string) {
this._reset();
@@ -219,6 +232,14 @@ export class UmbContentTypeStructureManager<
return this.#ownerContentTypeUnique;
}
/**
* Figure out if any of the Content Types has a Property.
* @returns {boolean} - true if any of the Content Type in this composition has a Property.
*/
getHasProperties() {
return this.#contentTypes.getValue().some((y) => y.properties.length > 0);
}
updateOwnerContentType(entry: Partial<T>) {
this.#contentTypes.updateOne(this.#ownerContentTypeUnique, entry);
}

View File

@@ -1,6 +1,6 @@
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const contentTypeDesignEditorManifest: UmbBackofficeManifestKind = {
export const contentTypeDesignEditorManifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.WorkspaceView.ContentTypeDesignEditor',
matchKind: 'contentTypeDesignEditor',

View File

@@ -16,12 +16,11 @@ export class UmbContentHasPropertiesWorkspaceCondition
this.consumeContext(UMB_CONTENT_WORKSPACE_CONTEXT, (context) => {
this.observe(
context.structure.contentTypes,
(contentTypes) => {
const hasProperties = contentTypes.some((contentType) => contentType.properties.length > 0);
context.structure.contentTypeHasProperties,
(hasProperties) => {
this.permitted = hasProperties;
},
'contentTypesObserver',
'hasPropertiesObserver',
);
});
}

View File

@@ -1,7 +1,7 @@
import { manifests as conditionsManifests } from './conditions/manifests.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
const contentEditorManifest: UmbBackofficeManifestKind = {
const contentEditorManifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.WorkspaceView.ContentEditor',
matchKind: 'contentEditor',

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityAction.Delete',
matchKind: 'delete',

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityAction.Duplicate',
matchKind: 'duplicate',

View File

@@ -1,4 +1,4 @@
import { manifest as duplicateKindManifest } from './duplicate.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [duplicateKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [duplicateKindManifest];

View File

@@ -1,6 +1,6 @@
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST: UmbBackofficeManifestKind = {
export const UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityAction.Default',
matchKind: 'default',

View File

@@ -1,4 +1,4 @@
import { manifest as defaultKindManifest } from './default.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [defaultKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [defaultKindManifest];

View File

@@ -1,9 +1,9 @@
import { manifests as defaultEntityActionManifests } from './default/manifests.js';
import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js';
import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
...defaultEntityActionManifests,
...deleteEntityActionManifests,
...duplicateEntityActionManifests,

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_BULK_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityBulkAction.DuplicateTo',
matchKind: 'duplicateTo',

View File

@@ -1,4 +1,4 @@
import { manifest as duplicateToKindManifest } from './duplicate-to.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [duplicateToKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [duplicateToKindManifest];

View File

@@ -1,4 +1,4 @@
import { manifest as moveToKindManifest } from './move-to.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [moveToKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [moveToKindManifest];

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_BULK_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityBulkAction.MoveTo',
matchKind: 'moveTo',

View File

@@ -1,4 +1,4 @@
import { manifest as trashKindManifest } from './trash.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [trashKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [trashKindManifest];

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_BULK_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityBulkAction.Trash',
matchKind: 'trash',

View File

@@ -1,6 +1,6 @@
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const UMB_ENTITY_BULK_ACTION_DEFAULT_KIND_MANIFEST: UmbBackofficeManifestKind = {
export const UMB_ENTITY_BULK_ACTION_DEFAULT_KIND_MANIFEST: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityBulkAction.Default',
matchKind: 'default',

View File

@@ -1,4 +1,4 @@
import { manifest as defaultKindManifest } from './default.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [defaultKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [defaultKindManifest];

View File

@@ -2,9 +2,9 @@ import { manifests as defaultEntityBulkActionManifests } from './default/manifes
import { manifests as duplicateEntityBulkActionManifests } from './common/duplicate-to/manifests.js';
import { manifests as moveToEntityBulkActionManifests } from './common/move-to/manifests.js';
import { manifests as trashEntityBulkActionManifests } from './common/trash/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
...defaultEntityBulkActionManifests,
...duplicateEntityBulkActionManifests,
...moveToEntityBulkActionManifests,

View File

@@ -1,23 +0,0 @@
import { UMB_EXTENSION_COLLECTION_REPOSITORY_ALIAS } from './repository/index.js';
import { manifests as collectionRepositoryManifests } from './repository/manifests.js';
import { manifests as collectionViewManifests } from './views/manifests.js';
import type { ManifestCollection, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const UMB_EXTENSION_COLLECTION_ALIAS = 'Umb.Collection.Extension';
const collectionManifest: ManifestCollection = {
type: 'collection',
kind: 'default',
alias: UMB_EXTENSION_COLLECTION_ALIAS,
name: 'Extension Collection',
element: () => import('./extension-collection.element.js'),
meta: {
repositoryAlias: UMB_EXTENSION_COLLECTION_REPOSITORY_ALIAS,
},
};
export const manifests: Array<ManifestTypes> = [
collectionManifest,
...collectionRepositoryManifests,
...collectionViewManifests,
];

View File

@@ -1,24 +0,0 @@
import { UMB_COLLECTION_ALIAS_CONDITION } from '@umbraco-cms/backoffice/collection';
import type { ManifestCollectionView, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const UMB_EXTENSION_TABLE_COLLECTION_VIEW_ALIAS = 'Umb.CollectionView.Extension.Table';
const tableCollectionView: ManifestCollectionView = {
type: 'collectionView',
alias: UMB_EXTENSION_TABLE_COLLECTION_VIEW_ALIAS,
name: 'Extension Table Collection View',
element: () => import('./table/extension-table-collection-view.element.js'),
meta: {
label: 'Table',
icon: 'icon-list',
pathName: 'table',
},
conditions: [
{
alias: UMB_COLLECTION_ALIAS_CONDITION,
match: 'Umb.Collection.Extension',
},
],
};
export const manifests: Array<ManifestTypes> = [tableCollectionView];

View File

@@ -1,4 +1,8 @@
export { UmbSwitchCondition } from './switch.condition.js';
export { UmbConditionBase } from './condition-base.controller.js';
export type { BlockEntryShowContentEditConditionConfig, BlockWorkspaceHasSettingsConditionConfig } from './types.js';
export type {
BlockEntryShowContentEditConditionConfig,
BlockWorkspaceHasSettingsConditionConfig,
ConditionTypes,
} from './types.js';

View File

@@ -1,11 +1,9 @@
import type { ManifestTypes } from '../models/index.js';
import { manifest as menuAliasConditionManifest } from './menu-alias.condition.js';
import { manifest as multipleAppLanguagesConditionManifest } from './multiple-app-languages.condition.js';
import { manifest as sectionAliasConditionManifest } from './section-alias.condition.js';
import { manifest as switchConditionManifest } from './switch.condition.js';
export const manifests: Array<ManifestTypes> = [
menuAliasConditionManifest,
multipleAppLanguagesConditionManifest,
sectionAliasConditionManifest,
switchConditionManifest,

View File

@@ -4,19 +4,9 @@ import type { UmbSectionUserPermissionConditionConfig } from '../../section/cond
import type { SectionAliasConditionConfig } from './section-alias.condition.js';
import type { SwitchConditionConfig } from './switch.condition.js';
import type { UmbMultipleAppLanguageConditionConfig } from './multiple-app-languages.condition.js';
import type {
WorkspaceAliasConditionConfig,
WorkspaceEntityTypeConditionConfig,
WorkspaceContentTypeAliasConditionConfig,
} from '@umbraco-cms/backoffice/workspace';
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
import type { UmbDocumentUserPermissionConditionConfig } from '@umbraco-cms/backoffice/document';
/* TODO: in theory should't the core package import from other packages.
Are there any other way we can do this?
Niels: Sadly I don't see any other solutions currently. But are very open for ideas :-) now that I think about it maybe there is some ability to extend a global type, similar to the 'declare global' trick we use on Elements.
*/
// temp location to avoid circular dependencies
export type BlockWorkspaceHasSettingsConditionConfig =
UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>;
@@ -34,7 +24,37 @@ export type ConditionTypes =
| UmbConditionConfigBase
| UmbDocumentUserPermissionConditionConfig
| UmbMultipleAppLanguageConditionConfig
| UmbSectionUserPermissionConditionConfig
| WorkspaceAliasConditionConfig
| WorkspaceContentTypeAliasConditionConfig
| WorkspaceEntityTypeConditionConfig;
| UmbSectionUserPermissionConditionConfig;
type UnionOfProperties<T> = T extends object ? T[keyof T] : never;
declare global {
/**
* This global type allows to declare condition types from its own module.
* @example
```js
declare global {
interface UmbExtensionConditionMap {
My_UNIQUE_CONDITION_NAME: MyExtensionConditionType;
}
}
```
If you have multiple types, you can declare them in this way:
```js
declare global {
interface UmbExtensionConditionMap {
My_UNIQUE_CONDITION_NAME: MyExtensionConditionTypeA | MyExtensionConditionTypeB;
}
}
```
*/
interface UmbExtensionConditionMap {
UMB_CORE: ConditionTypes;
}
/**
* This global type provides a union of all declared manifest types.
* If this is a local package that declares additional Manifest Types, then these will also be included in this union.
*/
type UmbExtensionCondition = UnionOfProperties<UmbExtensionConditionMap>;
}

View File

@@ -1,14 +1,4 @@
import { manifests as conditionManifests } from './conditions/manifests.js';
import { manifests as menuItemManifests } from './menu-item/manifests.js';
import { manifests as workspaceManifests } from './workspace/manifests.js';
import { manifests as collectionManifests } from './collection/manifests.js';
import { manifests as entityActionManifests } from './entity-actions/manifests.js';
import type { ManifestTypes } from './models/index.js';
export const manifests: Array<ManifestTypes> = [
...conditionManifests,
...menuItemManifests,
...workspaceManifests,
...collectionManifests,
...entityActionManifests,
];
export const manifests: Array<ManifestTypes> = [...conditionManifests];

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbAction } from '../../action/action.interface.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
@@ -24,7 +23,7 @@ export interface UmbCurrentUserAction<ArgsMetaType = never> extends UmbAction<Um
export interface ManifestCurrentUserAction<MetaType extends MetaCurrentUserAction = MetaCurrentUserAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbCurrentUserAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'currentUserAction';
meta: MetaType;
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbDashboardElement } from '../interfaces/index.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestDashboard
extends ManifestElement<UmbDashboardElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'dashboard';
meta: MetaDashboard;
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
import type { UmbEntityAction, UmbEntityActionElement } from '@umbraco-cms/backoffice/entity-action';
import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal';
@@ -9,7 +8,7 @@ import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@um
*/
export interface ManifestEntityAction<MetaType extends MetaEntityAction = MetaEntityAction>
extends ManifestElementAndApi<UmbEntityActionElement, UmbEntityAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'entityAction';
forEntityTypes: Array<string>;
meta: MetaType;

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbEntityBulkActionElement } from '../../entity-bulk-action/entity-bulk-action-element.interface.js';
import type { UmbEntityBulkAction } from '@umbraco-cms/backoffice/entity-bulk-action';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
@@ -9,7 +8,7 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr
*/
export interface ManifestEntityBulkAction<MetaType extends MetaEntityBulkAction = MetaEntityBulkAction>
extends ManifestElementAndApi<UmbEntityBulkActionElement, UmbEntityBulkAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'entityBulkAction';
forEntityTypes: Array<string>;
meta: MetaType;

View File

@@ -1,6 +1,4 @@
import type { ManifestAuthProvider } from './auth-provider.model.js';
import type { ManifestCollection } from './collection.models.js';
import type { ManifestCollectionView } from './collection-view.model.js';
import type { ManifestCurrentUserAction, ManifestCurrentUserActionDefaultKind } from './current-user-action.model.js';
import type { ManifestDashboard } from './dashboard.model.js';
import type { ManifestDashboardCollection } from './dashboard-collection.model.js';
@@ -62,7 +60,6 @@ import type {
} from './workspace-view.model.js';
import type { ManifestEntityUserPermission } from './entity-user-permission.model.js';
import type { ManifestGranularUserPermission } from './user-granular-permission.model.js';
import type { ManifestCollectionAction } from './collection-action.model.js';
import type { ManifestMfaLoginProvider } from './mfa-login-provider.model.js';
import type { ManifestSearchProvider } from './search-provider.model.js';
import type { ManifestSearchResultItem } from './search-result-item.model.js';
@@ -77,9 +74,6 @@ import type { ManifestBase, ManifestBundle, ManifestCondition } from '@umbraco-c
export type * from './app-entry-point.model.js';
export type * from './auth-provider.model.js';
export type * from './backoffice-entry-point.model.js';
export type * from './collection-action.model.js';
export type * from './collection-view.model.js';
export type * from './collection.models.js';
export type * from './current-user-action.model.js';
export type * from './dashboard-collection.model.js';
export type * from './dashboard.model.js';
@@ -159,9 +153,6 @@ export type ManifestTypes =
| ManifestAuthProvider
| ManifestBackofficeEntryPoint
| ManifestBundle<ManifestTypes>
| ManifestCollection
| ManifestCollectionAction
| ManifestCollectionView
| ManifestCondition
| ManifestCurrentUserAction
| ManifestCurrentUserActionDefaultKind

View File

@@ -1,10 +1,9 @@
import type { UmbMenuItemElement } from '../interfaces/menu-item-element.interface.js';
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestWithDynamicConditions, ManifestElement } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestMenuItem
extends ManifestElement<UmbMenuItemElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'menuItem';
meta: MetaMenuItem;
}

View File

@@ -1,11 +1,10 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbPropertyAction } from '../../property-action/components/property-action/property-action.interface.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestPropertyAction<MetaType extends MetaPropertyAction = MetaPropertyAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbPropertyAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'propertyAction';
forPropertyEditorUis: string[];
meta: MetaType;

View File

@@ -1,8 +1,7 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbApi, ManifestApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
// TODO: Consider adding a ClassType for this manifest. (Currently we cannot know the scope of a repository, therefor we are going with ExtensionApi for now.)
export interface ManifestRepository<ApiType extends UmbApi = UmbApi>
extends ManifestApi<ApiType>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'repository';
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbSectionSidebarAppElement } from '../interfaces/section-sidebar-app-element.interface.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestSectionSidebarApp
extends ManifestElement<UmbSectionSidebarAppElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'sectionSidebarApp';
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbSectionViewElement } from '../interfaces/section-view-element.interface.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestSectionView
extends ManifestElement<UmbSectionViewElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'sectionView';
meta: MetaSectionView;
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbSectionElement } from '../interfaces/index.js';
import type { ManifestElement, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestSection
extends ManifestElement<UmbSectionElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'section';
meta: MetaSection;
}

View File

@@ -1,7 +1,6 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestTree extends ManifestElementAndApi, ManifestWithDynamicConditions<ConditionTypes> {
export interface ManifestTree extends ManifestElementAndApi, ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'tree';
meta: MetaTree;
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbWorkspaceActionMenuItem } from '../../workspace/components/workspace-action-menu-item/workspace-action-menu-item.interface.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
@@ -6,7 +5,7 @@ import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbr
export interface ManifestWorkspaceActionMenuItem<
MetaType extends MetaWorkspaceActionMenuItem = MetaWorkspaceActionMenuItem,
> extends ManifestElementAndApi<UmbControllerHostElement, UmbWorkspaceActionMenuItem<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceActionMenuItem';
/**
* Define which workspace actions this menu item should be shown for.

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
import type { UmbWorkspaceAction } from '@umbraco-cms/backoffice/workspace';
@@ -6,7 +5,7 @@ import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controlle
export interface ManifestWorkspaceAction<MetaType extends MetaWorkspaceAction = MetaWorkspaceAction>
extends ManifestElementAndApi<UmbControllerHostElement, UmbWorkspaceAction<MetaType>>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceAction';
meta: MetaType;
}

View File

@@ -1,6 +1,7 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { ManifestApi, ManifestWithDynamicConditions, UmbApi } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestWorkspaceContext extends ManifestWithDynamicConditions<ConditionTypes>, ManifestApi<UmbApi> {
export interface ManifestWorkspaceContext
extends ManifestWithDynamicConditions<UmbExtensionCondition>,
ManifestApi<UmbApi> {
type: 'workspaceContext';
}

View File

@@ -1,10 +1,9 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api';
import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api';
export interface ManifestWorkspaceFooterApp
extends ManifestElementAndApi<UmbControllerHostElement, any>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceFooterApp';
}

View File

@@ -1,4 +1,3 @@
import type { ConditionTypes } from '../conditions/types.js';
import type { UmbWorkspaceViewElement } from '../interfaces/workspace-view-element.interface.js';
import type {
ManifestWithDynamicConditions,
@@ -8,7 +7,7 @@ import type {
export interface ManifestWorkspaceView<MetaType extends MetaWorkspaceView = MetaWorkspaceView>
extends ManifestWithView<UmbWorkspaceViewElement>,
ManifestWithDynamicConditions<ConditionTypes> {
ManifestWithDynamicConditions<UmbExtensionCondition> {
type: 'workspaceView';
meta: MetaType;
}

View File

@@ -1,7 +1,12 @@
import type { ManifestKind } from '@umbraco-cms/backoffice/extension-api';
import { UmbExtensionRegistry } from '@umbraco-cms/backoffice/extension-api';
export type UmbBackofficeManifestKind = ManifestKind<UmbExtensionManifest>;
export type UmbExtensionManifestKind = ManifestKind<UmbExtensionManifest>;
export type UmbBackofficeExtensionRegistry = UmbExtensionRegistry<UmbExtensionManifest>;
export const umbExtensionsRegistry = new UmbExtensionRegistry<UmbExtensionManifest>() as UmbBackofficeExtensionRegistry;
/**
* @deprecated Use `UmbExtensionManifestKind` instead.
*/
export type UmbBackofficeManifestKind = ManifestKind<UmbExtensionManifest>;

View File

@@ -1,6 +1,6 @@
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
import { css, html, customElement, query, state, property } from '@umbraco-cms/backoffice/external/lit';
import type { UUIComboboxElement, UUIComboboxEvent } from '@umbraco-cms/backoffice/external/uui';
import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui';
import { UUIFormControlMixin } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type { ManifestLocalization } from '@umbraco-cms/backoffice/extension-registry';
@@ -59,24 +59,22 @@ export class UmbUiCultureInputElement extends UUIFormControlMixin(UmbLitElement,
return this._selectElement;
}
#onChange(event: UUIComboboxEvent) {
event.stopPropagation();
const target = event.target as UUIComboboxElement;
if (typeof target?.value === 'string') {
this.value = target.value;
this.dispatchEvent(new UmbChangeEvent());
}
#onCustomValidationChange(event: UUISelectEvent) {
this.value = event.target.value.toString();
this.dispatchEvent(new UmbChangeEvent());
}
override render() {
return html` <uui-combobox value="${this.value}" @change=${this.#onChange}>
<uui-combobox-list>
${this._options.map(
(option) => html`<uui-combobox-list-option value="${option.value}">${option.name}</uui-combobox-list-option>`,
)}
</uui-combobox-list>
</uui-combobox>`;
return html`
<uui-select
style="margin-top: var(--uui-size-space-1)"
@change=${this.#onCustomValidationChange}
.options=${this._options.map((e) => ({
name: e.name,
value: e.value,
selected: e.value == this.value,
}))}></uui-select>
`;
}
static override styles = [

View File

@@ -22,9 +22,9 @@ import { manifests as themeManifests } from './themes/manifests.js';
import { manifests as treeManifests } from './tree/manifests.js';
import { manifests as workspaceManifests } from './workspace/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from './extension-registry/index.js';
import type { ManifestTypes, UmbExtensionManifestKind } from './extension-registry/index.js';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
...authManifests,
...collectionManifests,
...contentManifests,

View File

@@ -1,6 +1,6 @@
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'kind',
alias: 'Umb.Kind.MenuItem.Link',

View File

@@ -1,4 +1,4 @@
import { manifests as linkManifests } from './link/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [...linkManifests];
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [...linkManifests];

View File

@@ -1,17 +1,13 @@
import { UMB_MENU_CONTEXT } from '../../menu/components/menu/menu.context.js';
import { UmbConditionBase } from './condition-base.controller.js';
import { UMB_MENU_CONTEXT } from '../components/menu/menu.context.js';
import { UmbConditionBase } from '../../extension-registry/conditions/condition-base.controller.js';
import type { MenuAliasConditionConfig } from './types.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type {
ManifestCondition,
UmbConditionConfigBase,
UmbConditionControllerArguments,
UmbExtensionCondition,
} from '@umbraco-cms/backoffice/extension-api';
export type MenuAliasConditionConfig = UmbConditionConfigBase & {
match: string;
};
export class UmbMenuAliasCondition extends UmbConditionBase<MenuAliasConditionConfig> implements UmbExtensionCondition {
constructor(host: UmbControllerHost, args: UmbConditionControllerArguments<MenuAliasConditionConfig>) {
super(host, args);

View File

@@ -0,0 +1,5 @@
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
export type MenuAliasConditionConfig = UmbConditionConfigBase & {
match: string;
};

View File

@@ -1,4 +1,8 @@
import { manifests as menuItemManifests } from './components/menu-item/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import { manifest as menuAliasConditionManifest } from './conditions/menu-alias.condition.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [...menuItemManifests];
export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
...menuItemManifests,
menuAliasConditionManifest,
];

View File

@@ -1,4 +1,5 @@
import type { UmbEntityModel } from '@umbraco-cms/backoffice/entity';
export type * from './conditions/types.js';
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
export interface UmbStructureItemModelBase extends UmbEntityModel {}

View File

@@ -1,4 +1,4 @@
import { manifests as searchManifests } from './search/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [...searchManifests];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [...searchManifests];

View File

@@ -1,4 +1,4 @@
import { manifests as resultItemManifests } from './result-item/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [...resultItemManifests];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [...resultItemManifests];

View File

@@ -1,6 +1,6 @@
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
{
type: 'kind',
alias: 'Umb.Kind.PickerSearchResultItem.Default',

View File

@@ -1,4 +1,4 @@
import { manifests as defaultManifests } from './default/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [...defaultManifests];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [...defaultManifests];

View File

@@ -1,6 +1,6 @@
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.PropertyAction.Default',
matchKind: 'default',

View File

@@ -1,4 +1,4 @@
import { manifest as defaultKindManifest } from './default.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [defaultKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [defaultKindManifest];

View File

@@ -1,4 +1,4 @@
import { manifests as defaultWorkspaceActionManifests } from './default/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [...defaultWorkspaceActionManifests];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [...defaultWorkspaceActionManifests];

View File

@@ -2,7 +2,7 @@ import { manifests as defaultManifests } from './components/property-action/mani
import type {
ManifestPropertyActions,
ManifestTypes,
UmbBackofficeManifestKind,
UmbExtensionManifestKind,
} from '@umbraco-cms/backoffice/extension-registry';
import { UMB_WRITABLE_PROPERTY_CONDITION_ALIAS } from '@umbraco-cms/backoffice/property';
@@ -44,7 +44,7 @@ export const propertyActionManifests: Array<ManifestPropertyActions> = [
},
];
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
...defaultManifests,
...propertyActionManifests,
];

View File

@@ -16,10 +16,10 @@ export class UmbPropertyDatasetElement extends UmbLitElement {
public readonly context: UmbPropertyDatasetContextBase;
@property({ attribute: false })
/**
* The value of the dataset.
* @returns {Array<UmbPropertyValueData>}
* @memberof UmbBasicVariantElement
* @returns {Array<UmbPropertyValueData>} - The value of the dataset
* @example
* ```ts
* const dataSet = [
@@ -46,7 +46,6 @@ export class UmbPropertyDatasetElement extends UmbLitElement {
* `
* ```
*/
@property({ attribute: false })
public set value(value: Array<UmbPropertyValueData>) {
this.#allowChangeEvent = false;
this.context.setValues(value);
@@ -57,11 +56,12 @@ export class UmbPropertyDatasetElement extends UmbLitElement {
return this.context.getValues();
}
@property({ attribute: false })
/**
* The name of the dataset, this name varies depending on the use-case. But this is either
* @property name
* @type {string}
* @returns {string}
* @memberof UmbBasicVariantElement
* @example
* ```ts
* html`
@@ -70,7 +70,6 @@ export class UmbPropertyDatasetElement extends UmbLitElement {
* </umb-property-dataset>
* `
*/
@property({ attribute: false })
public set name(value: string | undefined) {
this.#allowChangeEvent = false;
this.context.setName(value);

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../../entity-action/default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityAction.RecycleBin.Empty',
matchKind: 'emptyRecycleBin',

View File

@@ -1,4 +1,4 @@
import { manifest as emptyRecycleBinKindManifest } from './empty-recycle-bin.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [emptyRecycleBinKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [emptyRecycleBinKindManifest];

View File

@@ -1,7 +1,7 @@
import { manifest as kindManifest } from './restore-from-recycle-bin.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
kindManifest,
{
type: 'modal',

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../../entity-action/default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityAction.RecycleBin.Restore',
matchKind: 'restoreFromRecycleBin',

View File

@@ -1,4 +1,4 @@
import { manifest as trashKindManifest } from './trash.action.kind.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [trashKindManifest];
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [trashKindManifest];

View File

@@ -1,7 +1,7 @@
import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../../entity-action/default/default.action.kind.js';
import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifest: UmbBackofficeManifestKind = {
export const manifest: UmbExtensionManifestKind = {
type: 'kind',
alias: 'Umb.Kind.EntityAction.Trash',
matchKind: 'trash',

View File

@@ -2,9 +2,9 @@ import { manifests as trashEntityActionManifests } from './entity-action/trash/m
import { manifests as restoreFromRecycleBinEntityActionManifests } from './entity-action/restore-from-recycle-bin/manifests.js';
import { manifests as emptyRecycleBinEntityActionManifests } from './entity-action/empty-recycle-bin/manifests.js';
import { manifests as conditionManifests } from './conditions/manifests.js';
import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry';
import type { ManifestTypes, UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes | UmbBackofficeManifestKind> = [
export const manifests: Array<ManifestTypes | UmbExtensionManifestKind> = [
...conditionManifests,
...emptyRecycleBinEntityActionManifests,
...restoreFromRecycleBinEntityActionManifests,

View File

@@ -12,7 +12,6 @@ import { UmbExtensionsManifestInitializer, createExtensionElement } from '@umbra
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import { pathFolderName } from '@umbraco-cms/backoffice/utils';
// TODO: this might need a new name, since it's both views and dashboards
@customElement('umb-section-main-views')
export class UmbSectionMainViewElement extends UmbLitElement {
@property({ type: String, attribute: 'section-alias' })
@@ -48,12 +47,12 @@ export class UmbSectionMainViewElement extends UmbLitElement {
}
#constructDashboardPath(manifest: ManifestDashboard) {
const dashboardName = manifest.meta.label ?? manifest.name;
const dashboardName = manifest.meta.label ?? manifest.name ?? manifest.alias;
return 'dashboard/' + (manifest.meta.pathname ? manifest.meta.pathname : pathFolderName(dashboardName));
}
#constructViewPath(manifest: ManifestSectionView) {
const viewName = manifest.meta.label ?? manifest.name;
const viewName = manifest.meta.label ?? manifest.name ?? manifest.alias;
return 'view/' + (manifest.meta.pathname ? manifest.meta.pathname : pathFolderName(viewName));
}
@@ -119,7 +118,9 @@ export class UmbSectionMainViewElement extends UmbLitElement {
return html`
<uui-tab
href="${this._routerPath}/${dashboardPath}"
label="${dashboard.meta.label ? this.localize.string(dashboard.meta.label) : dashboard.name}"
label="${dashboard.meta.label
? this.localize.string(dashboard.meta.label)
: (dashboard.name ?? dashboard.alias)}"
?active="${this._activePath === dashboardPath}"></uui-tab>
`;
})}
@@ -134,7 +135,7 @@ export class UmbSectionMainViewElement extends UmbLitElement {
? html`
<uui-tab-group slot="navigation" id="views">
${this._views.map((view) => {
const viewName = view.meta.label ? this.localize.string(view.meta.label) : view.name;
const viewName = view.meta.label ? this.localize.string(view.meta.label) : (view.name ?? view.alias);
const viewPath = this.#constructViewPath(view);
return html`
<uui-tab

Some files were not shown because too many files have changed in this diff Show More