Files
Umbraco-CMS/templates/UmbracoExtension/Client/src/dashboards/dashboard.element.ts
Richard Ockerby ba6a0fcfe0 Update references to Umbraco User model (Extension Template) (#19349)
Update references to Umbraco User model

In the template dashboard, update the type reference for the umbraco user
2025-05-30 14:31:17 +02:00

219 lines
6.0 KiB
TypeScript

import {
LitElement,
css,
html,
customElement,
state,
} from "@umbraco-cms/backoffice/external/lit";
import { UmbElementMixin } from "@umbraco-cms/backoffice/element-api";
import { UUIButtonElement } from "@umbraco-cms/backoffice/external/uui";
import { UMB_NOTIFICATION_CONTEXT } from "@umbraco-cms/backoffice/notification";
import { UMB_CURRENT_USER_CONTEXT, UmbCurrentUserModel } from "@umbraco-cms/backoffice/current-user";
import { UmbracoExtensionService, UserModel } from "../api/index.js";
@customElement("example-dashboard")
export class ExampleDashboardElement extends UmbElementMixin(LitElement) {
@state()
private _yourName?: string = "Press the button!";
@state()
private _timeFromMrWolf?: Date;
@state()
private _serverUserData?: UserModel;
@state()
private _contextCurrentUser?: UmbCurrentUserModel;
#notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE;
constructor() {
super();
this.consumeContext(UMB_NOTIFICATION_CONTEXT, (notificationContext) => {
this.#notificationContext = notificationContext;
});
this.consumeContext(UMB_CURRENT_USER_CONTEXT, (currentUserContext) => {
// When we have the current user context
// We can observe properties from it, such as the current user or perhaps just individual properties
// When the currentUser object changes we will get notified and can reset the @state properrty
this.observe(
currentUserContext?.currentUser,
(currentUser) => {
this._contextCurrentUser = currentUser;
},
"_contextCurrentUser"
);
});
}
#onClickWhoAmI = async (ev: Event) => {
const buttonElement = ev.target as UUIButtonElement;
buttonElement.state = "waiting";
const { data, error } = await UmbracoExtensionService.whoAmI();
if (error) {
buttonElement.state = "failed";
console.error(error);
return;
}
if (data !== undefined) {
this._serverUserData = data;
buttonElement.state = "success";
}
if (this.#notificationContext) {
this.#notificationContext.peek("warning", {
data: {
headline: `You are ${this._serverUserData?.name}`,
message: `Your email is ${this._serverUserData?.email}`,
},
});
}
};
#onClickWhatsTheTimeMrWolf = async (ev: Event) => {
const buttonElement = ev.target as UUIButtonElement;
buttonElement.state = "waiting";
// Getting a string - should I expect a datetime?!
const { data, error } = await UmbracoExtensionService.whatsTheTimeMrWolf();
if (error) {
buttonElement.state = "failed";
console.error(error);
return;
}
if (data !== undefined) {
this._timeFromMrWolf = new Date(data);
buttonElement.state = "success";
}
};
#onClickWhatsMyName = async (ev: Event) => {
const buttonElement = ev.target as UUIButtonElement;
buttonElement.state = "waiting";
const { data, error } = await UmbracoExtensionService.whatsMyName();
if (error) {
buttonElement.state = "failed";
console.error(error);
return;
}
this._yourName = data;
buttonElement.state = "success";
};
render() {
return html`
<uui-box headline="Who am I?">
<div slot="header">[Server]</div>
<h2>
<uui-icon name="icon-user"></uui-icon>${this._serverUserData?.email
? this._serverUserData.email
: "Press the button!"}
</h2>
<ul>
${this._serverUserData?.groups.map(
(group) => html`<li>${group.name}</li>`
)}
</ul>
<uui-button
color="default"
look="primary"
@click="${this.#onClickWhoAmI}"
>
Who am I?
</uui-button>
<p>
This endpoint gets your current user from the server and displays your
email and list of user groups. It also displays a Notification with
your details.
</p>
</uui-box>
<uui-box headline="What's my Name?">
<div slot="header">[Server]</div>
<h2><uui-icon name="icon-user"></uui-icon> ${this._yourName}</h2>
<uui-button
color="default"
look="primary"
@click="${this.#onClickWhatsMyName}"
>
Whats my name?
</uui-button>
<p>
This endpoint has a forced delay to show the button 'waiting' state
for a few seconds before completing the request.
</p>
</uui-box>
<uui-box headline="What's the Time?">
<div slot="header">[Server]</div>
<h2>
<uui-icon name="icon-alarm-clock"></uui-icon> ${this._timeFromMrWolf
? this._timeFromMrWolf.toLocaleString()
: "Press the button!"}
</h2>
<uui-button
color="default"
look="primary"
@click="${this.#onClickWhatsTheTimeMrWolf}"
>
Whats the time Mr Wolf?
</uui-button>
<p>This endpoint gets the current date and time from the server.</p>
</uui-box>
<uui-box headline="Who am I?" class="wide">
<div slot="header">[Context]</div>
<p>Current user email: <b>${this._contextCurrentUser?.email}</b></p>
<p>
This is the JSON object available by consuming the
'UMB_CURRENT_USER_CONTEXT' context:
</p>
<umb-code-block language="json" copy
>${JSON.stringify(this._contextCurrentUser, null, 2)}</umb-code-block
>
</uui-box>
`;
}
static styles = [
css`
:host {
display: grid;
gap: var(--uui-size-layout-1);
padding: var(--uui-size-layout-1);
grid-template-columns: 1fr 1fr 1fr;
}
uui-box {
margin-bottom: var(--uui-size-layout-1);
}
h2 {
margin-top: 0;
}
.wide {
grid-column: span 3;
}
`,
];
}
export default ExampleDashboardElement;
declare global {
interface HTMLElementTagNameMap {
"example-dashboard": ExampleDashboardElement;
}
}