diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts index 4a6f1d59d5..71e27cdcb1 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts @@ -2,7 +2,8 @@ import type { ManifestElement } from './models'; export interface ManifestHeaderApp extends ManifestElement { type: 'headerApp'; - meta: MetaHeaderApp; + //meta: MetaHeaderApp; + meta?: unknown; } export interface MetaHeaderApp { diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts index 94b6ff6ab7..a9cb2f5eb3 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts @@ -1,4 +1,5 @@ import type { ManifestSectionSidebarAppMenuKind } from '../../src/backoffice/shared/components/section/section-sidebar-menu/section-sidebar-menu.element'; +import { ManifestHeaderAppButtonKind } from '../../src/backoffice/shared/components/header-app/header-app-button.element'; import type { ManifestCollectionView } from './collection-view.models'; import type { ManifestDashboard } from './dashboard.models'; import type { ManifestDashboardCollection } from './dashboard-collection.models'; @@ -64,6 +65,7 @@ export type ManifestTypes = | ManifestEntrypoint | ManifestExternalLoginProvider | ManifestHeaderApp + | ManifestHeaderAppButtonKind | ManifestHealthCheck | ManifestPackageView | ManifestPropertyAction @@ -101,6 +103,7 @@ export type SpecificManifestTypeOrManifestBase Promise; - //meta?: unknown; + meta?: unknown; } export interface ManifestElementCustomKind extends ManifestElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/section.manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/section.manifests.ts index 1375f7c37a..6364e93c92 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/section.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/section.manifests.ts @@ -1,5 +1,5 @@ -import type { ManifestTypes } from '@umbraco-cms/models'; import { ManifestSectionSidebarAppMenuKind } from '../shared/components/section/section-sidebar-menu/section-sidebar-menu.element'; +import type { ManifestTypes } from '@umbraco-cms/models'; const sectionAlias = 'Umb.Section.Content'; @@ -14,7 +14,7 @@ const section: ManifestTypes = { }, }; -const menuSectionSidebarApp: ManifestTypes = { +const menuSectionSidebarApp: ManifestSectionSidebarAppMenuKind = { type: 'sectionSidebarApp', kind: 'umb-menu', alias: 'Umb.SidebarMenu.Content', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/search/manifests.ts index ea025667f8..7ae2fa8d10 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/search/manifests.ts @@ -1,6 +1,6 @@ -import type { ManifestHeaderApp } from '@umbraco-cms/models'; +import type { ManifestTypes } from '@umbraco-cms/models'; -const headerApps: Array = [ +const headerApps: Array = [ { type: 'headerApp', alias: 'Umb.HeaderApp.Search', @@ -13,6 +13,19 @@ const headerApps: Array = [ pathname: 'search', }, }, + + { + type: 'headerApp', + kind: 'Umb.Kind.Button', + alias: 'Umb.HeaderApp.HackDemo', + name: 'Header App Search', + weight: 10, + meta: { + label: 'Hack Demo', + icon: 'document', + href: '/section/content/workspace/document/edit/c05da24d-7740-447b-9cdc-bd8ce2172e38/en-us/view/content/tab/Local%20blog%20tab', + }, + }, ]; export const manifests = [...headerApps]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts index db97e5a9a2..8f8ea8b747 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/extension-slot/extension-slot.element.ts @@ -71,8 +71,10 @@ export class UmbExtensionSlotElement extends UmbLitElement { if (isManifestElementableType(extension)) { component = await createExtensionElement(extension); - } else { + } else if (this.defaultElement) { component = document.createElement(this.defaultElement); + } else { + // TODO: Lets make an console.error in this case? } if (component) { (component as any).manifest = extension; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts index 2095d825fd..85470d7d0e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app-button.element.ts @@ -2,7 +2,32 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, CSSResultGroup, html, LitElement } from 'lit'; import { customElement } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; -import { ManifestHeaderApp } from '@umbraco-cms/extensions-registry'; +import { ManifestHeaderApp, ManifestKind } from '@umbraco-cms/extensions-registry'; +import { umbExtensionsRegistry } from '@umbraco-cms/extensions-api'; + +export interface ManifestHeaderAppButtonKind extends Omit { + type: 'headerApp'; + kind: 'Umb.Kind.Button'; + meta: MetaHeaderAppButtonKind; +} + +export interface MetaHeaderAppButtonKind { + href: string; + label: string; + icon: string; +} + +const manifest: ManifestKind = { + type: 'kind', + matchKind: 'Umb.Kind.Button', + matchType: 'headerApp', + manifest: { + type: 'headerApp', + kind: 'Umb.Kind.Button', + elementName: 'umb-header-app-button', + }, +}; +umbExtensionsRegistry.register(manifest); @customElement('umb-header-app-button') export class UmbHeaderAppButton extends LitElement { @@ -16,11 +41,15 @@ export class UmbHeaderAppButton extends LitElement { `, ]; - public manifest?: ManifestHeaderApp; + public manifest?: ManifestHeaderAppButtonKind; render() { return html` - + `; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts index 581f8416eb..6c42e916b9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/header-app/header-app.stories.ts @@ -3,24 +3,25 @@ import './header-app-button.element'; import type { UmbHeaderAppButton } from './header-app-button.element'; const meta: Meta = { - title: 'Components/Header App Button', - component: 'umb-header-app-button' + title: 'Components/Header App Button', + component: 'umb-header-app-button', }; - + export default meta; type Story = StoryObj; - + export const Overview: Story = { - args: { - manifest: { - name: 'Some Manifest', - alias: 'someManifestAlias', - type: 'headerApp', - meta: { - label: 'Some Header', - icon: 'umb:home', - pathname: '/some/path' - } - } - } -}; \ No newline at end of file + args: { + manifest: { + name: 'Some Manifest', + alias: 'someManifestAlias', + type: 'headerApp', + kind: 'Umb.Kind.Button', + meta: { + label: 'Some Header', + icon: 'umb:home', + href: '/some/path', + }, + }, + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts index 04c03284f7..500fffd846 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts @@ -37,6 +37,8 @@ import './tree/tree.element'; import './variantable-property/variantable-property.element'; import './workspace/workspace-action-menu/workspace-action-menu.element'; +import './header-app/header-app-button.element'; + import './history/history-list.element'; import './history/history-item.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/manifests.ts index acff072136..d79f61d61f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/manifests.ts @@ -1,5 +1,5 @@ import { manifests as modalManifests } from './modals/manifests'; -import type { ManifestHeaderApp, ManifestUserDashboard } from '@umbraco-cms/models'; +import type { ManifestHeaderApp, ManifestTypes, ManifestUserDashboard } from '@umbraco-cms/models'; export const userDashboards: Array = [ { @@ -15,7 +15,7 @@ export const userDashboards: Array = [ }, ]; -export const headerApps: Array = [ +export const headerApps: Array = [ { type: 'headerApp', alias: 'Umb.HeaderApp.CurrentUser', diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts index f239f430f7..1be131c1d2 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document.data.ts @@ -495,7 +495,7 @@ export const treeData: Array = [ parentKey: null, name: 'All property editors', type: 'document', - icon: 'icon-item-arrangement', + icon: 'document', hasChildren: true, }, { @@ -510,7 +510,7 @@ export const treeData: Array = [ parentKey: null, name: 'Article in english', type: 'document', - icon: 'icon-item-arrangement', + icon: 'document', hasChildren: true, }, { @@ -525,7 +525,7 @@ export const treeData: Array = [ parentKey: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', name: 'Blog post B', type: 'document', - icon: 'icon-item-arrangement', + icon: 'document', hasChildren: false, }, {