Skip to content

POC: Dynamic Dashboards / Dashboard apps #19575

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 25 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fc4f9bc
add default dashboard extension kind + dashboard apps extension type
madsrasmussen Jun 16, 2025
fe7372e
register for user section
madsrasmussen Jun 16, 2025
0f949b8
register for members
madsrasmussen Jun 16, 2025
8916d84
Create manifests.ts
madsrasmussen Jun 16, 2025
2cdbc6d
register pending user invites app
madsrasmussen Jun 16, 2025
001e05d
Update manifests.ts
madsrasmussen Jun 16, 2025
12b0650
rename example dashboards
madsrasmussen Jun 16, 2025
dd38157
add manifest meta types
madsrasmussen Jun 16, 2025
1c43a04
register poc dashboard apps
madsrasmussen Jun 16, 2025
8101b4d
Update section-main-views.element.ts
madsrasmussen Jun 16, 2025
9ec34ac
different sizes
madsrasmussen Jun 16, 2025
d2d54d3
manifest weights
madsrasmussen Jun 16, 2025
9202803
Update dashboard.element.ts
madsrasmussen Jun 16, 2025
6cb70db
wip dashboard app picker
madsrasmussen Jun 17, 2025
7b438e6
render picked apps
madsrasmussen Jun 17, 2025
f016ce9
Update dashboard.element.ts
madsrasmussen Jun 17, 2025
32694ca
Update collection.repository.ts
madsrasmussen Jun 18, 2025
f7284f9
Merge branch 'main' into v16/poc/dashboard-apps
madsrasmussen Jul 28, 2025
c9120e0
introduce a dashboard-app-layout element
madsrasmussen Jul 28, 2025
41f1049
fix lint error
madsrasmussen Jul 29, 2025
d1bc033
DashboardApps: Added sorting, defaults to all dashboard apps (#19734)
enkelmedia Jul 31, 2025
d1f019e
Merge branch 'main' into v16/poc/dashboard-apps
madsrasmussen Jul 31, 2025
7b8c46e
make linter happy
madsrasmussen Jul 31, 2025
6e9e394
export consts
madsrasmussen Jul 31, 2025
7f0d662
wip entity actions for dashboard apps
madsrasmussen Jul 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';
import type { UmbRoute } from '@umbraco-cms/backoffice/router';

@customElement('umb-dashboard')
export class UmbDashboardElement extends UmbElementMixin(LitElement) {
@customElement('umb-example-dashboard')
export class UmbExampleDashboardElement extends UmbElementMixin(LitElement) {
@state()
private _routes: UmbRoute[] = [
{
Expand Down Expand Up @@ -39,10 +39,10 @@ export class UmbDashboardElement extends UmbElementMixin(LitElement) {
static override styles = [UmbTextStyles, css``];
}

export default UmbDashboardElement;
export default UmbExampleDashboardElement;

declare global {
interface HTMLElementTagNameMap {
'umb-dashboard': UmbDashboardElement;
'umb-example-dashboard': UmbExampleDashboardElement;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { css, html, LitElement, customElement } from '@umbraco-cms/backoffice/ex
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';

@customElement('umb-dashboard2')
export class UmbDashboard2Element extends UmbElementMixin(LitElement) {
@customElement('umb-example-dashboard2')
export class UmbExampleDashboard2Element extends UmbElementMixin(LitElement) {
constructor() {
super();
}
Expand All @@ -25,10 +25,10 @@ export class UmbDashboard2Element extends UmbElementMixin(LitElement) {
static override styles = [UmbTextStyles, css``];
}

export default UmbDashboard2Element;
export default UmbExampleDashboard2Element;

declare global {
interface HTMLElementTagNameMap {
'umb-dashboard2': UmbDashboard2Element;
'umb-example-dashboard2': UmbExampleDashboard2Element;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The files in this folder is positioned here temporarily. They will be moved to the correct location later.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { html, customElement, css, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type {
ManifestDashboardApp,
UmbDashboardAppElement,
UmbDashboardAppSize,
} from '@umbraco-cms/backoffice/dashboard';

@customElement('umb-certification-intro-dashboard-app')
export class UmbCertificationIntroDashboardAppElement extends UmbLitElement implements UmbDashboardAppElement {
@property({ type: Object })
manifest?: ManifestDashboardApp;

@property({ type: String })
size?: UmbDashboardAppSize;

override render() {
return html`
<umb-dashboard-app-layout headline=${this.localize.string('#settingsDashboard_trainingHeader')}>
<p>
<umb-localize key="settingsDashboard_trainingDescription"></umb-localize>
</p>
<uui-button
look="outline"
href="https://umbraco.com/training/"
label=${this.localize.term('settingsDashboard_getCertified')}
target="_blank"
rel="noopener"></uui-button>
</umb-dashboard-app-layout>
`;
}

static override styles = [
UmbTextStyles,
css`
p {
margin-top: 0;
}
`,
];
}

export { UmbCertificationIntroDashboardAppElement as element };

declare global {
interface HTMLElementTagNameMap {
['umb-certification-intro-dashboard-app']: UmbCertificationIntroDashboardAppElement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';

export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'dashboardApp',
alias: 'Umb.DashboardApp.CertificationIntro',
name: 'Certification Intro Dashboard App',
weight: 100,
element: () => import('./certification-intro-dashboard-app.element.js'),
meta: {
headline: '#settingsDashboard_trainingHeader',
size: 'small',
},
},
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { html, customElement, css, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type {
ManifestDashboardApp,
UmbDashboardAppElement,
UmbDashboardAppSize,
} from '@umbraco-cms/backoffice/dashboard';

const elementName = 'umb-community-intro-dashboard-app';
@customElement(elementName)
export class UmbCommunityIntroDashboardAppElement extends UmbLitElement implements UmbDashboardAppElement {
@property({ type: Object })
manifest?: ManifestDashboardApp;

@property({ type: String })
size?: UmbDashboardAppSize;

override render() {
return html`
<umb-dashboard-app-layout headline=${this.localize.string('#settingsDashboard_communityHeader')}>
<p>
<umb-localize key="settingsDashboard_communityDescription"></umb-localize>
</p>
<uui-button
look="outline"
href="https://our.umbraco.com/forum"
label=${this.localize.term('settingsDashboard_goForum')}
target="_blank"
rel="noopener"></uui-button>
<uui-button
look="outline"
href="https://discord.umbraco.com"
label=${this.localize.term('settingsDashboard_chatWithCommunity')}
target="_blank"
rel="noopener"></uui-button>
</umb-dashboard-app-layout>
`;
}

static override styles = [
UmbTextStyles,
css`
p {
margin-top: 0;
}
`,
];
}

export { UmbCommunityIntroDashboardAppElement as element };

declare global {
interface HTMLElementTagNameMap {
[elementName]: UmbCommunityIntroDashboardAppElement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';

export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'dashboardApp',
alias: 'Umb.DashboardApp.CommunityIntro',
name: 'Community Intro Dashboard App',
weight: 200,
element: () => import('./community-intro-dashboard-app.element.js'),
meta: {
headline: '#settingsDashboard_communityHeader',
size: 'small',
},
},
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { html, customElement, css, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type {
ManifestDashboardApp,
UmbDashboardAppElement,
UmbDashboardAppSize,
} from '@umbraco-cms/backoffice/dashboard';

const elementName = 'umb-documentation-intro-dashboard-app';
@customElement(elementName)
export class UmbDocumentationIntroDashboardAppElement extends UmbLitElement implements UmbDashboardAppElement {
@property({ type: Object })
manifest?: ManifestDashboardApp;

@property({ type: String })
size?: UmbDashboardAppSize;

override render() {
return html`
<umb-dashboard-app-layout headline=${this.localize.string('#settingsDashboard_documentationHeader')}>
<p>
<umb-localize key="settingsDashboard_documentationDescription"></umb-localize>
</p>
<uui-button
look="outline"
href="https://docs.umbraco.com/umbraco-cms/umbraco-cms"
label=${this.localize.term('settingsDashboard_getHelp')}
target="_blank"
rel="noopener"></uui-button>
</umb-dashboard-app-layout>
`;
}

static override styles = [
UmbTextStyles,
css`
p {
margin-top: 0;
}
`,
];
}

export { UmbDocumentationIntroDashboardAppElement as element };

declare global {
interface HTMLElementTagNameMap {
[elementName]: UmbDocumentationIntroDashboardAppElement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';

export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'dashboardApp',
alias: 'Umb.DashboardApp.DocumentationIntro',
name: 'Documentation Intro Dashboard App',
weight: 300,
element: () => import('./documentation-intro-dashboard-app.element.js'),
meta: {
headline: '#settingsDashboard_documentationHeader',
size: 'small',
},
},
{
type: 'dashboardApp',
alias: 'Umb.DashboardApp.VideosIntro',
name: 'Videos Intro Dashboard App',
weight: 400,
element: () => import('./videos-intro-dashboard-app.element.js'),
meta: {
headline: '#settingsDashboard_videosHeader',
size: 'large',
},
},
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
import { html, customElement, css, property } from '@umbraco-cms/backoffice/external/lit';
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
import type {
ManifestDashboardApp,
UmbDashboardAppElement,
UmbDashboardAppSize,
} from '@umbraco-cms/backoffice/dashboard';

const elementName = 'umb-videos-intro-dashboard-app';
@customElement(elementName)
export class UmbVideosIntroDashboardAppElement extends UmbLitElement implements UmbDashboardAppElement {
@property({ type: Object })
manifest?: ManifestDashboardApp;

@property({ type: String })
size?: UmbDashboardAppSize;

override render() {
return html`
<umb-dashboard-app-layout headline=${this.localize.string('#settingsDashboard_videosHeader')}>
<p>
<umb-localize key="settingsDashboard_videosDescription"></umb-localize>
</p>
<uui-button
look="outline"
href="https://www.youtube.com/c/UmbracoLearningBase"
label=${this.localize.term('settingsDashboard_watchVideos')}
target="_blank"
rel="noopener"></uui-button>
</umb-dashboard-app-layout>
`;
}

static override styles = [
UmbTextStyles,
css`
p {
margin-top: 0;
}
`,
];
}

export { UmbVideosIntroDashboardAppElement as element };

declare global {
interface HTMLElementTagNameMap {
[elementName]: UmbVideosIntroDashboardAppElement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { manifests as communityManifests } from './community/manifests.js';
import { manifests as documentationManifests } from './documentation/manifests.js';
import { manifests as supportManifests } from './support/manifests.js';
import { manifests as trainingManifests } from './certification/manifests.js';
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';

export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
...communityManifests,
...documentationManifests,
...supportManifests,
...trainingManifests,
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { UmbExtensionManifestKind } from '@umbraco-cms/backoffice/extension-registry';

export const manifests: Array<UmbExtensionManifest | UmbExtensionManifestKind> = [
{
type: 'dashboardApp',
alias: 'Umb.DashboardApp.SupportIntro',
name: 'Support Intro Dashboard App',
weight: 500,
element: () => import('./support-intro-dashboard-app.element.js'),
meta: {
headline: '#settingsDashboard_supportHeader',
size: 'small',
},
},
];
Loading
Loading