`);
+ }
+
+ for (const key in instance) {
+ if (key.startsWith('_')) {
+ continue;
+ }
// Goes KABOOM - if try to loop over the class/object
// instanceKeys.push(html`
${key} = ${instance[key]}
`);
// console.log(`key: ${key} = ${value} TYPEOF: ${typeof value}`);
const value = instance[key];
- if(typeof value === 'string'){
- instanceKeys.push(html`
${key} = ${instance[key]}
`);
- }
- else {
+ if (typeof value === 'string') {
+ instanceKeys.push(html`
`);
}
for (const key in instance) {
@@ -132,7 +132,7 @@ export class UmbDebug extends LitElement {
if (typeof value === 'string') {
instanceKeys.push(html`
${key} = ${value}
`);
} else {
- instanceKeys.push(html`
${key}
`);
+ instanceKeys.push(html`
${key} (${typeof value})
`);
}
}
From c1ae1aae6b778c40664e72ee55f1db92a8aa067b Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 15 Feb 2023 10:34:30 +0100
Subject: [PATCH 012/116] use typeof instead as it works with simple types
---
.../src/backoffice/shared/components/debug/debug.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index 10e2f55e8c..ad695d592a 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -96,7 +96,7 @@ export class UmbDebug extends LitElement {
aliases.push(
html`
`);
}
- // Goes KABOOM - if try to loop over the class/object
- // instanceKeys.push(html`
${key} = ${instance[key]}
`);
- // console.log(`key: ${key} = ${value} TYPEOF: ${typeof value}`);
+ for (const key in instance) {
+ if (key.startsWith('_')) {
+ continue;
+ }
+ // Goes KABOOM - if try to loop over the class/object
+ // instanceKeys.push(html`
${key} = ${instance[key]}
`);
- const value = instance[key];
- if (typeof value === 'string') {
- instanceKeys.push(html`
${key} = ${value}
`);
- } else {
- instanceKeys.push(html`
${key} (${typeof value})
`);
+ // console.log(`key: ${key} = ${value} TYPEOF: ${typeof value}`);
+
+ const value = instance[key];
+ if (typeof value === 'string') {
+ instanceKeys.push(html`
${key} = ${value}
`);
+ } else {
+ instanceKeys.push(html`
${key} (${typeof value})
`);
+ }
}
+ } else {
+ instanceKeys.push(html`
Context is a primitive with value: ${instance}
`);
}
return instanceKeys;
From 1be4da9f3b802cf4b8f5050c5ee58b4d288e8cd6 Mon Sep 17 00:00:00 2001
From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
Date: Wed, 15 Feb 2023 10:56:32 +0100
Subject: [PATCH 014/116] fix height transition + add scroll
---
.../backoffice/shared/components/debug/debug.element.ts | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index 3648a424bb..9208c35073 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -21,12 +21,14 @@ export class UmbDebug extends LitElement {
.events {
background-color: var(--uui-color-danger);
color: var(--uui-color-selected-contrast);
- height: 0;
- transition: height 0.3s ease-out;
+ max-height: 0;
+ transition: max-height 0.15s ease-out;
+ overflow: hidden;
}
.events.open {
- height: auto;
+ max-height: 500px;
+ overflow: auto;
}
.events > div {
From 0a110c828a4f633ddb4befd8a2586c900a2185c0 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Wed, 15 Feb 2023 15:33:08 +0100
Subject: [PATCH 015/116] wip migrate languages to repositories
---
...repository-detail-data-source.interface.ts | 2 +-
.../src/backoffice/backoffice.element.ts | 2 +-
.../documents/repository/sources/index.ts | 7 ++
.../backoffice/settings/cultures/manifests.ts | 3 +
.../cultures/repository/culture.repository.ts | 29 +++++
.../settings/cultures/repository/manifests.ts | 13 ++
.../repository/sources/culture.server.data.ts | 32 +++++
.../cultures/repository/sources/index.ts | 12 ++
.../src/backoffice/settings/index.ts | 2 +
.../settings/languages/language.store.ts | 87 -------------
.../repository/language.repository.ts | 68 ++++++++++
.../languages/repository/language.store.ts | 30 +++++
.../languages/repository/sources/index.ts | 16 +++
.../sources/language.server.data.ts | 116 ++++++++++++++++++
...root-table-delete-column-layout.element.ts | 6 +-
.../language-root-workspace.element.ts | 30 +++--
.../language/language-workspace.context.ts | 85 +++++--------
.../language/language-workspace.element.ts | 8 +-
.../workspace-view-language-edit.element.ts | 8 +-
.../src/core/mocks/data/languages.data.ts | 2 +-
20 files changed, 388 insertions(+), 170 deletions(-)
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/manifests.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/index.ts
delete mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/language.store.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/index.ts
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts
diff --git a/src/Umbraco.Web.UI.Client/libs/repository/repository-detail-data-source.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/repository-detail-data-source.interface.ts
index 04f2894b39..7715d5a61e 100644
--- a/src/Umbraco.Web.UI.Client/libs/repository/repository-detail-data-source.interface.ts
+++ b/src/Umbraco.Web.UI.Client/libs/repository/repository-detail-data-source.interface.ts
@@ -5,5 +5,5 @@ export interface RepositoryDetailDataSource {
get(key: string): Promise>;
insert(data: DetailType): Promise>;
update(data: DetailType): Promise>;
- trash(key: string): Promise>;
+ delete(key: string): Promise>;
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts
index dae0f7ba21..53474073fb 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts
@@ -38,7 +38,7 @@ import { UmbDataTypeTreeStore } from './settings/data-types/repository/data-type
import { UmbTemplateTreeStore } from './templating/templates/tree/data/template.tree.store';
import { UmbTemplateDetailStore } from './templating/templates/workspace/data/template.detail.store';
import { UmbThemeContext } from './themes/theme.context';
-import { UmbLanguageStore } from './settings/languages/language.store';
+import { UmbLanguageStore } from './settings/languages/repository/language.store';
import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
import '@umbraco-cms/router';
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts
new file mode 100644
index 0000000000..c7cc44fc92
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts
@@ -0,0 +1,7 @@
+import { DocumentModel } from '@umbraco-cms/backend-api';
+import type { DataSourceResponse } from '@umbraco-cms/models';
+import { RepositoryDetailDataSource } from '@umbraco-cms/repository';
+
+export interface UmbDocumentDataSource extends RepositoryDetailDataSource {
+ trash(key: string): Promise>;
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/manifests.ts
new file mode 100644
index 0000000000..2bd802ce9c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/manifests.ts
@@ -0,0 +1,3 @@
+import { manifests as repositoryManifests } from './repository/manifests';
+
+export const manifests = [...repositoryManifests];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts
new file mode 100644
index 0000000000..abdd4e6e72
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/culture.repository.ts
@@ -0,0 +1,29 @@
+import { UmbCultureServerDataSource } from './sources/culture.server.data';
+import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+import { UmbContextConsumerController } from '@umbraco-cms/context-api';
+import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+
+export class UmbCultureRepository {
+ #init!: Promise;
+ #host: UmbControllerHostInterface;
+
+ #dataSource: UmbCultureServerDataSource;
+
+ #notificationService?: UmbNotificationService;
+
+ constructor(host: UmbControllerHostInterface) {
+ this.#host = host;
+
+ this.#dataSource = new UmbCultureServerDataSource(this.#host);
+
+ this.#init = Promise.all([
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
+ this.#notificationService = instance;
+ }),
+ ]);
+ }
+
+ requestCultures({ skip, take } = { skip: 0, take: 1000 }) {
+ return this.#dataSource.getCollection({ skip, take });
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts
new file mode 100644
index 0000000000..0bc2ae18bd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/manifests.ts
@@ -0,0 +1,13 @@
+import { UmbCultureRepository } from '../repository/culture.repository';
+import { ManifestRepository } from 'libs/extensions-registry/repository.models';
+
+export const CULTURE_REPOSITORY_ALIAS = 'Umb.Repository.Cultures';
+
+const repository: ManifestRepository = {
+ type: 'repository',
+ alias: CULTURE_REPOSITORY_ALIAS,
+ name: 'Cultures Repository',
+ class: UmbCultureRepository,
+};
+
+export const manifests = [repository];
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts
new file mode 100644
index 0000000000..02ac62a9bb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/culture.server.data.ts
@@ -0,0 +1,32 @@
+import { UmbCultureDataSource } from '.';
+import { CultureResource } from '@umbraco-cms/backend-api';
+import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+import { tryExecuteAndNotify } from '@umbraco-cms/resources';
+
+/**
+ * A data source for the Language that fetches data from the server
+ * @export
+ * @class UmbLanguageServerDataSource
+ * @implements {RepositoryDetailDataSource}
+ */
+export class UmbCultureServerDataSource implements UmbCultureDataSource {
+ #host: UmbControllerHostInterface;
+
+ /**
+ * Creates an instance of UmbLanguageServerDataSource.
+ * @param {UmbControllerHostInterface} host
+ * @memberof UmbLanguageServerDataSource
+ */
+ constructor(host: UmbControllerHostInterface) {
+ this.#host = host;
+ }
+
+ /**
+ * Get a list of cultures on the server
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async getCollection({ skip, take }: { skip: number; take: number }) {
+ return tryExecuteAndNotify(this.#host, CultureResource.getCulture({ skip, take }));
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/index.ts
new file mode 100644
index 0000000000..8b3555ed3f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/cultures/repository/sources/index.ts
@@ -0,0 +1,12 @@
+import { PagedCultureModel } from '@umbraco-cms/backend-api';
+import type { DataSourceResponse } from '@umbraco-cms/models';
+
+// TODO: This is a temporary solution until we have a proper paging interface
+type paging = {
+ skip: number;
+ take: number;
+};
+
+export interface UmbCultureDataSource {
+ getCollection(paging: paging): Promise>;
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts
index de60d18c58..43ef6bfa40 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/index.ts
@@ -2,6 +2,7 @@ import { manifests as settingsSectionManifests } from './section.manifests';
import { manifests as dashboardManifests } from './dashboards/manifests';
import { manifests as dataTypeManifests } from './data-types/manifests';
import { manifests as extensionManifests } from './extensions/manifests';
+import { manifests as cultureManifests } from './cultures/manifests';
import { manifests as languageManifests } from './languages/manifests';
import { manifests as logviewerManifests } from './logviewer/manifests';
@@ -20,6 +21,7 @@ registerExtensions([
...dashboardManifests,
...dataTypeManifests,
...extensionManifests,
+ ...cultureManifests,
...languageManifests,
...logviewerManifests,
]);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/language.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/language.store.ts
deleted file mode 100644
index ffc3f178ba..0000000000
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/language.store.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { Observable } from 'rxjs';
-import { CultureModel, CultureResource, LanguageModel, LanguageResource } from '@umbraco-cms/backend-api';
-import { tryExecuteAndNotify } from '@umbraco-cms/resources';
-import { UmbContextToken } from '@umbraco-cms/context-api';
-import { UmbStoreBase } from '@umbraco-cms/store';
-import { ArrayState } from '@umbraco-cms/observable-api';
-import { UmbControllerHostInterface } from '@umbraco-cms/controller';
-
-export type UmbLanguageStoreItemType = LanguageModel;
-export const UMB_LANGUAGE_STORE_CONTEXT_TOKEN = new UmbContextToken('umbLanguageStore');
-
-/**
- * @export
- * @class UmbLanguageStore
- * @extends {UmbStoreBase}
- * @description - Data Store for languages
- */
-export class UmbLanguageStore extends UmbStoreBase {
- #data = new ArrayState([], (x) => x.isoCode);
- #availableLanguages = new ArrayState([], (x) => x.name);
-
- public readonly availableLanguages = this.#availableLanguages.asObservable();
-
- constructor(host: UmbControllerHostInterface) {
- super(host, UMB_LANGUAGE_STORE_CONTEXT_TOKEN.toString());
- }
-
- getByIsoCode(isoCode: string) {
- tryExecuteAndNotify(this._host, LanguageResource.getLanguageByIsoCode({ isoCode })).then(({ data }) => {
- if (data) {
- this.#data.appendOne(data);
- }
- });
-
- return this.#data.getObservablePart((items) => items.find((item) => item.isoCode === isoCode));
- }
-
- getAll(): Observable> {
- tryExecuteAndNotify(this._host, LanguageResource.getLanguage({ skip: 0, take: 1000 })).then(({ data }) => {
- this.#data.append(data?.items ?? []);
- });
-
- return this.#data;
- }
-
- getAvailableCultures() {
- tryExecuteAndNotify(this._host, CultureResource.getCulture({ skip: 0, take: 1000 })).then(({ data }) => {
- if (!data) return;
- this.#availableLanguages.append(data.items);
- });
-
- return this.availableLanguages;
- }
-
- async save(language: UmbLanguageStoreItemType): Promise {
- if (language.isoCode) {
- const { data: updatedLanguage } = await tryExecuteAndNotify(
- this._host,
- LanguageResource.putLanguageByIsoCode({ isoCode: language.isoCode, requestBody: language })
- );
- if (updatedLanguage) {
- this.#data.appendOne(updatedLanguage);
- }
- } else {
- const { data: newLanguage } = await tryExecuteAndNotify(
- this._host,
- LanguageResource.postLanguage({ requestBody: language })
- );
- if (newLanguage) {
- this.#data.appendOne(newLanguage);
- }
- }
- }
-
- async delete(isoCodes: Array) {
- // TODO: revisit this. It looks a bit weird with the nested tryExecuteAndNotify
- const queue = isoCodes.map((isoCode) =>
- tryExecuteAndNotify(
- this._host,
- tryExecuteAndNotify(this._host, LanguageResource.deleteLanguageByIsoCode({ isoCode })).then(() => isoCode)
- )
- );
- const results = await Promise.all(queue);
- const filtered = results.filter((x) => !!x).map((result) => result.data);
- this.#data.remove(filtered);
- }
-}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts
new file mode 100644
index 0000000000..ee727facb9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts
@@ -0,0 +1,68 @@
+import { UmbLanguageServerDataSource } from './sources/language.server.data';
+import { UmbLanguageStore, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from './language.store';
+import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+import { UmbContextConsumerController } from '@umbraco-cms/context-api';
+import { UmbNotificationService, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/notification';
+import { ProblemDetailsModel } from '@umbraco-cms/backend-api';
+
+export class UmbLanguageRepository {
+ #init!: Promise;
+
+ #host: UmbControllerHostInterface;
+
+ #detailDataSource: UmbLanguageServerDataSource;
+ #languageStore?: UmbLanguageStore;
+
+ #notificationService?: UmbNotificationService;
+
+ constructor(host: UmbControllerHostInterface) {
+ this.#host = host;
+
+ // TODO: figure out how spin up get the correct data source
+ this.#detailDataSource = new UmbLanguageServerDataSource(this.#host);
+
+ this.#init = Promise.all([
+ new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_SERVICE_CONTEXT_TOKEN, (instance) => {
+ this.#notificationService = instance;
+ }),
+
+ new UmbContextConsumerController(this.#host, UMB_LANGUAGE_STORE_CONTEXT_TOKEN, (instance) => {
+ this.#languageStore = instance;
+ }),
+ ]);
+ }
+
+ /**
+ * Creates a new Language scaffold
+ * @param
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async createDetailsScaffold() {
+ return this.#detailDataSource.createScaffold();
+ }
+
+ async requestByIsoCode(isoCode: string) {
+ await this.#init;
+
+ if (!isoCode) {
+ const error: ProblemDetailsModel = { title: 'Iso code is missing' };
+ return { error };
+ }
+
+ return this.#detailDataSource.get(isoCode);
+ }
+
+ async requestLanguages({ skip, take } = { skip: 0, take: 1000 }) {
+ await this.#init;
+
+ const { data, error } = await this.#detailDataSource.getCollection({ skip, take });
+
+ if (data) {
+ // TODO: allow to append an array of items to the store
+ data.items.forEach((x) => this.#languageStore?.append(x));
+ }
+
+ return { data, error, asObservable: () => this.#languageStore!.data };
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts
new file mode 100644
index 0000000000..eb5e1c3163
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.store.ts
@@ -0,0 +1,30 @@
+import { UmbContextToken } from '@umbraco-cms/context-api';
+import { UmbStoreBase } from '@umbraco-cms/store';
+import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+import { ArrayState } from '@umbraco-cms/observable-api';
+import { LanguageModel } from '@umbraco-cms/backend-api';
+
+/**
+ * @export
+ * @class UmbLanguageStore
+ * @extends {UmbStoreBase}
+ * @description - Details Data Store for Languages
+ */
+export class UmbLanguageStore extends UmbStoreBase {
+ #data = new ArrayState([], (x) => x.isoCode);
+ data = this.#data.asObservable();
+
+ constructor(host: UmbControllerHostInterface) {
+ super(host, UmbLanguageStore.name);
+ }
+
+ append(language: LanguageModel) {
+ this.#data.append([language]);
+ }
+
+ remove(uniques: string[]) {
+ this.#data.remove(uniques);
+ }
+}
+
+export const UMB_LANGUAGE_STORE_CONTEXT_TOKEN = new UmbContextToken(UmbLanguageStore.name);
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/index.ts
new file mode 100644
index 0000000000..81efc0303f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/index.ts
@@ -0,0 +1,16 @@
+import { LanguageModel, PagedLanguageModel } from '@umbraco-cms/backend-api';
+import type { DataSourceResponse } from '@umbraco-cms/models';
+import { RepositoryDetailDataSource } from '@umbraco-cms/repository';
+
+// TODO: This is a temporary solution until we have a proper paging interface
+type paging = {
+ skip: number;
+ take: number;
+};
+
+export interface UmbLanguageDataSource extends RepositoryDetailDataSource {
+ createScaffold(): Promise>;
+ get(isoCode: string): Promise>;
+ delete(isoCode: string): Promise>;
+ getCollection(paging: paging): Promise>;
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts
new file mode 100644
index 0000000000..6cc694ba15
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/sources/language.server.data.ts
@@ -0,0 +1,116 @@
+import { ProblemDetailsModel, LanguageResource, LanguageModel } from '@umbraco-cms/backend-api';
+import { UmbControllerHostInterface } from '@umbraco-cms/controller';
+import { tryExecuteAndNotify } from '@umbraco-cms/resources';
+
+/**
+ * A data source for the Language that fetches data from the server
+ * @export
+ * @class UmbLanguageServerDataSource
+ * @implements {RepositoryDetailDataSource}
+ */
+export class UmbLanguageServerDataSource implements UmbLanguageServerDataSource {
+ #host: UmbControllerHostInterface;
+
+ /**
+ * Creates an instance of UmbLanguageServerDataSource.
+ * @param {UmbControllerHostInterface} host
+ * @memberof UmbLanguageServerDataSource
+ */
+ constructor(host: UmbControllerHostInterface) {
+ this.#host = host;
+ }
+
+ /**
+ * Fetches a Language with the given iso code from the server
+ * @param {string} isoCode
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async get(isoCode: string) {
+ if (!isoCode) {
+ const error: ProblemDetailsModel = { title: 'Iso Code is missing' };
+ return { error };
+ }
+
+ return tryExecuteAndNotify(
+ this.#host,
+ LanguageResource.getLanguageByIsoCode({
+ isoCode,
+ })
+ );
+ }
+
+ /**
+ * Creates a new Language scaffold
+ * @param
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async createScaffold() {
+ const data: LanguageModel = {
+ isoCode: '',
+ };
+
+ return { data };
+ }
+
+ /**
+ * Inserts a new Language on the server
+ * @param {LanguageModel} language
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async insert(language: LanguageModel) {
+ if (!language.isoCode) {
+ const error: ProblemDetailsModel = { title: 'Language iso code is missing' };
+ return { error };
+ }
+
+ return tryExecuteAndNotify(this.#host, LanguageResource.postLanguage({ requestBody: language }));
+ }
+
+ /**
+ * Updates a Language on the server
+ * @param {LanguageModel} language
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async update(language: LanguageModel) {
+ if (!language.isoCode) {
+ const error: ProblemDetailsModel = { title: 'Language iso code is missing' };
+ return { error };
+ }
+
+ return tryExecuteAndNotify(
+ this.#host,
+ LanguageResource.putLanguageByIsoCode({ isoCode: language.isoCode, requestBody: language })
+ );
+ }
+
+ /**
+ * Deletes a Language on the server
+ * @param {string} isoCode
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async delete(isoCode: string) {
+ if (!isoCode) {
+ const error: ProblemDetailsModel = { title: 'Iso code is missing' };
+ return { error };
+ }
+
+ return tryExecuteAndNotify(
+ this.#host,
+ tryExecuteAndNotify(this.#host, LanguageResource.deleteLanguageByIsoCode({ isoCode })).then(() => isoCode)
+ );
+ }
+
+ /**
+ * Get a list of Languages on the server
+ * @return {*}
+ * @memberof UmbLanguageServerDataSource
+ */
+ async getCollection({ skip, take }: { skip: number; take: number }) {
+ return tryExecuteAndNotify(this.#host, LanguageResource.getLanguage({ skip, take }));
+ }
+}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-table-delete-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-table-delete-column-layout.element.ts
index ac3b22a1f4..6ed6993d44 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-table-delete-column-layout.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-table-delete-column-layout.element.ts
@@ -1,7 +1,11 @@
import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html, nothing } from 'lit';
import { customElement, property } from 'lit/decorators.js';
-import { UmbLanguageStore, UmbLanguageStoreItemType, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from '../../language.store';
+import {
+ UmbLanguageStore,
+ UmbLanguageStoreItemType,
+ UMB_LANGUAGE_STORE_CONTEXT_TOKEN,
+} from '../../repository/language.store';
import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '../../../../../core/modal';
import { UmbLitElement } from '@umbraco-cms/element';
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-workspace.element.ts
index 28e918ee79..de838499d4 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-workspace.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/language-root-workspace.element.ts
@@ -1,7 +1,11 @@
import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html } from 'lit';
import { customElement, state } from 'lit/decorators.js';
-import { UmbLanguageStore, UmbLanguageStoreItemType, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from '../../language.store';
+import {
+ UmbLanguageStore,
+ UmbLanguageStoreItemType,
+ UMB_LANGUAGE_STORE_CONTEXT_TOKEN,
+} from '../../repository/language.store';
import { UmbTableColumn, UmbTableConfig, UmbTableItem } from '../../../../shared/components/table';
import { UmbWorkspaceEntityElement } from '../../../../shared/components/workspace/workspace-entity-element.interface';
import { UmbLitElement } from '@umbraco-cms/element';
@@ -9,6 +13,7 @@ import { UmbLitElement } from '@umbraco-cms/element';
import '../language/language-workspace.element';
import './language-root-table-delete-column-layout.element';
import './language-root-table-name-column-layout.element';
+import { UmbLanguageRepository } from '../../repository/language.repository';
@customElement('umb-language-root-workspace')
export class UmbLanguageRootWorkspaceElement extends UmbLitElement implements UmbWorkspaceEntityElement {
@@ -65,29 +70,22 @@ export class UmbLanguageRootWorkspaceElement extends UmbLitElement implements Um
@state()
private _tableItems: Array = [];
- #languageStore?: UmbLanguageStore;
-
- constructor() {
- super();
-
- this.consumeContext(UMB_LANGUAGE_STORE_CONTEXT_TOKEN, (instance) => {
- this.#languageStore = instance;
- this.#observeLanguages();
- });
- }
+ #languageRepository = new UmbLanguageRepository(this);
load(): void {
- // Not relevant for this workspace
+ this.#observeLanguages();
}
create(): void {
// Not relevant for this workspace
}
- #observeLanguages() {
- this.#languageStore?.getAll().subscribe((languages) => {
- this.#createTableItems(languages);
- });
+ async #observeLanguages() {
+ const { asObservable } = await this.#languageRepository.requestLanguages();
+
+ if (asObservable) {
+ this.observe(asObservable(), (languages) => this.#createTableItems(languages));
+ }
}
#createTableItems(languages: Array) {
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts
index abd98b217b..a5a6502a7a 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts
@@ -1,70 +1,45 @@
-import { UmbLanguageStore, UmbLanguageStoreItemType, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from '../../language.store';
+import { UmbLanguageRepository } from '../../repository/language.repository';
+import type { LanguageModel } from '@umbraco-cms/backend-api';
+import { ObjectState } from '@umbraco-cms/observable-api';
import { UmbControllerHostInterface } from '@umbraco-cms/controller';
-import { ObjectState, UmbObserverController } from '@umbraco-cms/observable-api';
-import { UmbContextConsumerController } from '@umbraco-cms/context-api';
+import { UmbWorkspaceContext } from 'src/backoffice/shared/components/workspace/workspace-context/workspace-context';
-const DefaultLanguageData: UmbLanguageStoreItemType = {
- name: '',
- isoCode: '',
- isDefault: false,
- isMandatory: false,
-};
+export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext {
+ #host: UmbControllerHostInterface;
+ #data = new ObjectState(undefined);
+ #languageRepository: UmbLanguageRepository;
+ #isNew = false;
-export class UmbWorkspaceLanguageContext {
- public host: UmbControllerHostInterface;
-
- #entityKey: string | null;
-
- #data;
- public readonly data;
-
- #store: UmbLanguageStore | null = null;
- protected _storeObserver?: UmbObserverController;
-
- constructor(host: UmbControllerHostInterface, entityKey: string | null) {
- this.host = host;
- this.#entityKey = entityKey;
-
- this.#data = new ObjectState(DefaultLanguageData);
- this.data = this.#data.asObservable();
-
- new UmbContextConsumerController(host, UMB_LANGUAGE_STORE_CONTEXT_TOKEN, (_instance: UmbLanguageStore) => {
- this.#store = _instance;
- this.#observeStore();
- });
+ constructor(host: UmbControllerHostInterface) {
+ super(host);
+ this.#host = host;
+ this.#languageRepository = new UmbLanguageRepository(this.#host);
}
- #observeStore(): void {
- if (!this.#store || this.#entityKey === null) {
- return;
+ async load(isoCode: string) {
+ const { data } = await this.#languageRepository.requestByIsoCode(isoCode);
+ if (data) {
+ this.#isNew = false;
+ this.#data.update(data);
}
-
- this._storeObserver?.destroy();
- this._storeObserver = new UmbObserverController(this.host, this.#store.getByIsoCode(this.#entityKey), (content) => {
- if (!content) return; // TODO: Handle nicely if there is no content data.
- this.update(content);
- });
}
- public getData() {
+ async createScaffold() {
+ const { data } = await this.#languageRepository.createDetailsScaffold();
+ if (!data) return;
+ this.#isNew = true;
+ this.#data.update(data);
+ }
+
+ getData() {
return this.#data.getValue();
}
- public getAvailableCultures() {
- //TODO: Don't use !, however this will be changed with the introduction of repositories.
- return this.#store!.getAvailableCultures();
+ getEntityType() {
+ return 'language';
}
- public update(data: Partial) {
- this.#data.next({ ...this.getData(), ...data });
- }
-
- public save(): Promise {
- if (!this.#store) {
- // TODO: more beautiful error:
- console.error('Could not save cause workspace context has no store.');
- return Promise.resolve();
- }
- return this.#store.save(this.getData());
+ public destroy(): void {
+ this.#data.complete();
}
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts
index 7bf01a12ef..28a2ccc6db 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts
@@ -2,9 +2,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html, nothing } from 'lit';
import { customElement, property } from 'lit/decorators.js';
import { UUIInputElement, UUIInputEvent } from '@umbraco-ui/uui';
-import { UmbLanguageStoreItemType } from '../../language.store';
+import { UmbLanguageStoreItemType } from '../../repository/language.store';
import { UmbWorkspaceEntityElement } from '../../../../shared/components/workspace/workspace-entity-element.interface';
-import { UmbWorkspaceLanguageContext } from './language-workspace.context';
+import { UmbLanguageWorkspaceContext } from './language-workspace.context';
import { UmbLitElement } from '@umbraco-cms/element';
import '../../../../shared/components/workspace/workspace-action/save/workspace-action-node-save.element.ts';
@@ -28,7 +28,7 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement implements UmbWor
@property()
language?: UmbLanguageStoreItemType;
- #languageWorkspaceContext?: UmbWorkspaceLanguageContext;
+ #languageWorkspaceContext?: UmbLanguageWorkspaceContext;
load(key: string): void {
this.provideLanguageWorkspaceContext(key);
@@ -39,7 +39,7 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement implements UmbWor
}
public provideLanguageWorkspaceContext(entityKey: string | null) {
- this.#languageWorkspaceContext = new UmbWorkspaceLanguageContext(this, entityKey);
+ this.#languageWorkspaceContext = new UmbLanguageWorkspaceContext(this, entityKey);
this.provideContext('umbWorkspaceContext', this.#languageWorkspaceContext);
this.#languageWorkspaceContext.data.subscribe((language) => {
this.language = language;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/edit/workspace-view-language-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/edit/workspace-view-language-edit.element.ts
index 831f403ca0..0b134088ec 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/edit/workspace-view-language-edit.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/edit/workspace-view-language-edit.element.ts
@@ -4,12 +4,12 @@ import { css, html, nothing } from 'lit';
import { repeat } from 'lit/directives/repeat.js';
import { customElement, property, state } from 'lit/decorators.js';
import { ifDefined } from 'lit/directives/if-defined.js';
-import { UmbWorkspaceLanguageContext } from '../../language-workspace.context';
+import { UmbLanguageWorkspaceContext } from '../../language-workspace.context';
import {
UmbLanguageStore,
UmbLanguageStoreItemType,
UMB_LANGUAGE_STORE_CONTEXT_TOKEN,
-} from '../../../../language.store';
+} from '../../../../repository/language.store';
import { UmbLitElement } from '@umbraco-cms/element';
import { CultureModel, LanguageModel } from '@umbraco-cms/backend-api';
@@ -64,12 +64,12 @@ export class UmbWorkspaceViewLanguageEditElement extends UmbLitElement {
@state()
private _startData: LanguageModel | null = null;
- #languageWorkspaceContext?: UmbWorkspaceLanguageContext;
+ #languageWorkspaceContext?: UmbLanguageWorkspaceContext;
constructor() {
super();
- this.consumeContext('umbWorkspaceContext', (instance) => {
+ this.consumeContext('umbWorkspaceContext', (instance) => {
this.#languageWorkspaceContext = instance;
if (!this.#languageWorkspaceContext) return;
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/languages.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/languages.data.ts
index f693df0fee..2b1f16d2b1 100644
--- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/languages.data.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/languages.data.ts
@@ -1,4 +1,4 @@
-import { UmbLanguageStoreItemType } from '../../../backoffice/settings/languages/language.store';
+import { UmbLanguageStoreItemType } from '../../../backoffice/settings/languages/repository/language.store';
import { UmbData } from './data';
// Temp mocked database
From c38a533c4e60f7a310fe9dc51eeaff4b892cfe70 Mon Sep 17 00:00:00 2001
From: Mads Rasmussen
Date: Wed, 15 Feb 2023 16:28:41 +0100
Subject: [PATCH 016/116] load language and subscribe to draft data
---
.../language/language-workspace.context.ts | 4 ++-
.../language/language-workspace.element.ts | 32 +++++++++----------
2 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts
index a5a6502a7a..0a3c3ed935 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts
@@ -6,10 +6,12 @@ import { UmbWorkspaceContext } from 'src/backoffice/shared/components/workspace/
export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext {
#host: UmbControllerHostInterface;
- #data = new ObjectState(undefined);
#languageRepository: UmbLanguageRepository;
#isNew = false;
+ #data = new ObjectState(undefined);
+ data = this.#data.asObservable();
+
constructor(host: UmbControllerHostInterface) {
super(host);
this.#host = host;
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts
index 28a2ccc6db..4ad4c78bb7 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts
@@ -1,12 +1,12 @@
import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html, nothing } from 'lit';
-import { customElement, property } from 'lit/decorators.js';
+import { customElement, state } from 'lit/decorators.js';
import { UUIInputElement, UUIInputEvent } from '@umbraco-ui/uui';
-import { UmbLanguageStoreItemType } from '../../repository/language.store';
import { UmbWorkspaceEntityElement } from '../../../../shared/components/workspace/workspace-entity-element.interface';
import { UmbLanguageWorkspaceContext } from './language-workspace.context';
import { UmbLitElement } from '@umbraco-cms/element';
import '../../../../shared/components/workspace/workspace-action/save/workspace-action-node-save.element.ts';
+import { LanguageModel } from '@umbraco-cms/backend-api';
@customElement('umb-language-workspace')
export class UmbLanguageWorkspaceElement extends UmbLitElement implements UmbWorkspaceEntityElement {
@@ -25,24 +25,24 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement implements UmbWor
`,
];
- @property()
- language?: UmbLanguageStoreItemType;
+ @state()
+ _language?: LanguageModel;
- #languageWorkspaceContext?: UmbLanguageWorkspaceContext;
+ #languageWorkspaceContext = new UmbLanguageWorkspaceContext(this);
load(key: string): void {
- this.provideLanguageWorkspaceContext(key);
+ this.#languageWorkspaceContext.load(key);
}
- create(parentKey: string | null): void {
- this.provideLanguageWorkspaceContext(parentKey);
+ create(): void {
+ this.#languageWorkspaceContext.createScaffold();
}
- public provideLanguageWorkspaceContext(entityKey: string | null) {
- this.#languageWorkspaceContext = new UmbLanguageWorkspaceContext(this, entityKey);
- this.provideContext('umbWorkspaceContext', this.#languageWorkspaceContext);
- this.#languageWorkspaceContext.data.subscribe((language) => {
- this.language = language;
+ async connectedCallback() {
+ super.connectedCallback();
+
+ this.observe(this.#languageWorkspaceContext.data, (data) => {
+ this._language = data;
});
}
@@ -51,13 +51,13 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement implements UmbWor
const target = event.composedPath()[0] as UUIInputElement;
if (typeof target?.value === 'string') {
- this.#languageWorkspaceContext?.update({ name: target.value });
+ this.#languageWorkspaceContext?.setName(target.value);
}
}
}
render() {
- if (!this.language) return nothing;
+ if (!this._language) return nothing;
return html`
@@ -65,7 +65,7 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement implements UmbWor
-
+
`;
From c2fab69600a7424a86a7f56c494aaefaffd63d3b Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Wed, 15 Feb 2023 16:42:50 +0000
Subject: [PATCH 017/116] Adds way to open debug info in a dialog
* UI needs tidying up - spacing
* Consider dropping the other UI approach and use dialog only
* Need to ensure all typed
* Neaten/refactor code if needed
* Lint code
---
.../modal-views/fields-viewer.element.ts | 6 +-
.../dashboard-published-status.element.ts | 2 +-
.../shared/components/debug/debug.element.ts | 115 ++++++++----
.../components/debug/debug.modal.element.ts | 163 ++++++++++++++++++
.../src/backoffice/shared/components/index.ts | 3 +-
5 files changed, 248 insertions(+), 41 deletions(-)
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-viewer.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-viewer.element.ts
index 6e81567c79..e55b6b4b22 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-viewer.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/views/modal-views/fields-viewer.element.ts
@@ -16,11 +16,7 @@ export class UmbModalLayoutFieldsViewerElement extends UmbModalLayoutElement
+
${this._publishedStatusText}
{
+ this._modalService = modalService;
+ });
+ }
+
connectedCallback(): void {
super.connectedCallback();
// Dispatch it
this.dispatchEvent(
- new UmbContextDebugRequest((instances: Map) => {
- console.log('I have contexts now', instances);
+ new UmbContextDebugRequest((contexts: Map) => {
- this.contextAliases = instances;
+ // The Contexts are collected
+ // When travelling up through the DOM from this element
+ // to the root of which then uses the callback prop
+ // of the this event tha has been raised to assign the contexts
+ // back to this property of the WebComponent
+ this.contexts = contexts;
})
);
}
render() {
- if (this.enabled) {
- return html`
-
Date: Thu, 16 Feb 2023 20:26:36 +0000
Subject: [PATCH 058/116] Remove modalHandler as its in the base class
---
.../backoffice/shared/components/debug/debug.modal.element.ts | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
index d8e85fa64f..8b93a125d9 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
@@ -55,10 +55,6 @@ export class UmbDebugModalLayout extends UmbModalLayoutElement {
];
- // the modal handler will be injected into the element when the modal is opened.
- @property({ attribute: false })
- modalHandler?: UmbModalHandler;
-
private _handleClose() {
/* Optional data of any type can be applied to the close method to pass it
to the modal parent through the onClose promise. */
From 4e41078d46c713ac45c088bb248eafd68af36722 Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Thu, 16 Feb 2023 20:26:58 +0000
Subject: [PATCH 059/116] Remove comment copied from example code in Storybook
docs
---
.../backoffice/shared/components/debug/debug.modal.element.ts | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
index 8b93a125d9..b47b026e6c 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
@@ -54,11 +54,7 @@ export class UmbDebugModalLayout extends UmbModalLayoutElement {
`,
];
-
private _handleClose() {
- /* Optional data of any type can be applied to the close method to pass it
- to the modal parent through the onClose promise. */
- //this.modalHandler?.close('MY DATA');
this.modalHandler?.close();
}
From 5374215856eb3cdda15dd6aa0092aa927cc9b9a2 Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Thu, 16 Feb 2023 20:27:35 +0000
Subject: [PATCH 060/116] Move import for dialog into the main debug component
TODO: Ask Jacob on how to lazily load it
---
.../src/backoffice/shared/components/debug/debug.element.ts | 3 +++
.../src/backoffice/shared/components/index.ts | 3 +--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index 76c4c34c89..f05c0bf8f1 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -5,6 +5,9 @@ import { UmbContextDebugRequest } from '@umbraco-cms/context-api';
import { UmbLitElement } from '@umbraco-cms/element';
import { UmbModalService, UMB_MODAL_SERVICE_CONTEXT_TOKEN } from '@umbraco-cms/modal';
+// TODO: Ask Jacob how to lazily load this depending on a property
+import './debug.modal.element';
+
@customElement('umb-debug')
export class UmbDebug extends UmbLitElement {
static styles = [
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 b09a13320e..c9602d9759 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
@@ -31,5 +31,4 @@ import './input-document-picker/input-document-picker.element';
import './empty-state/empty-state.element';
import './color-picker/color-picker.element';
-import './debug/debug.element';
-import './debug/debug.modal.element';
\ No newline at end of file
+import './debug/debug.element';
\ No newline at end of file
From afd5b6ad40ca0d603f5f63d2208b75389984830a Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Thu, 16 Feb 2023 21:11:50 +0000
Subject: [PATCH 061/116] Make modal small - looks weird with too much
whitespace
Remove assigning to const as we don't need the onClose callback - nothing happens in the open dialog to be notified about
---
.../shared/components/debug/debug.element.ts | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index f05c0bf8f1..6f845983d5 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -107,11 +107,13 @@ export class UmbDebug extends UmbLitElement {
}
private _openDialog() {
- const modalHandler = this._modalService?.open('umb-debug-modal-layout', { size: 'medium', type: 'sidebar', data:{ contexts: this.contexts }});
-
- modalHandler?.onClose().then((data) => {
- // if any data is supplied on close, it will be available here.
- console.log('modal closed data', data);
+ // Open a modal that uses the HTML component called 'umb-debug-modal-layout'
+ this._modalService?.open('umb-debug-modal-layout', {
+ size: 'small',
+ type: 'sidebar',
+ data:{
+ content: this._renderContextAliases()
+ }
});
}
From a058ce01b801ff25e024611efd144509c999b66e Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Thu, 16 Feb 2023 21:19:58 +0000
Subject: [PATCH 062/116] Rename a few variables and try to improve the markup
for use in dialog & non dialog mode as its now shared
---
.../shared/components/debug/debug.element.ts | 37 ++++++++++++-------
1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index 6f845983d5..324d7b84d9 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -138,7 +138,6 @@ export class UmbDebug extends UmbLitElement {
`);
} else if (typeof instance === 'object') {
const methodNames = this.getClassMethodNames(instance);
if (methodNames.length) {
- instanceKeys.push(html`
Methods - ${methodNames.join(', ')}
`);
+ instanceTemplates.push(
+ html`
+
+ Methods
+
+ ${methodNames.map((methodName) => html`
${methodName}
`)}
+
+
+ `);
}
+ instanceTemplates.push(html`
Properties
`);
+
for (const key in instance) {
if (key.startsWith('_')) {
continue;
@@ -183,16 +194,16 @@ export class UmbDebug extends UmbLitElement {
const value = instance[key];
if (typeof value === 'string') {
- instanceKeys.push(html`
${key} = ${value}
`);
+ instanceTemplates.push(html`
${key} = ${value}
`);
} else {
- instanceKeys.push(html`
${key} (${typeof value})
`);
+ instanceTemplates.push(html`
${key} (${typeof value})
`);
}
}
} else {
- instanceKeys.push(html`
Context is a primitive with value: ${instance}
`);
+ instanceTemplates.push(html`
Context is a primitive with value: ${instance}
`);
}
- return instanceKeys;
+ return instanceTemplates;
}
private getClassMethodNames(klass: any) {
From fb54bd7ddd4bafa4d7f2e1373a2b227ba8e31aec Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Thu, 16 Feb 2023 21:20:16 +0000
Subject: [PATCH 063/116] Remove uneeded code now
---
.../components/debug/debug.modal.element.ts | 83 +------------------
1 file changed, 4 insertions(+), 79 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
index b47b026e6c..eed378d006 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.modal.element.ts
@@ -1,7 +1,7 @@
-import { css, html, nothing, TemplateResult } from 'lit';
-import { customElement, property } from 'lit/decorators.js';
+import { css, html } from 'lit';
+import { customElement } from 'lit/decorators.js';
import { UUITextStyles } from '@umbraco-ui/uui-css';
-import { UmbModalHandler, UmbModalLayoutElement } from '@umbraco-cms/modal';
+import { UmbModalLayoutElement } from '@umbraco-cms/modal';
@customElement('umb-debug-modal-layout')
export class UmbDebugModalLayout extends UmbModalLayoutElement {
@@ -65,87 +65,12 @@ export class UmbDebugModalLayout extends UmbModalLayoutElement {
Debug: Contexts
- ${this._renderContextAliases()}
+ ${this.data.content}
Close
`;
}
-
- private _renderContextAliases() {
- if(!this.data) {
- return nothing;
- }
-
- const aliases = [];
- for (const [alias, instance] of this.data.contexts) {
- aliases.push(
- html`
-
`;
}
private _renderContextAliases() {
@@ -151,8 +143,7 @@ export class UmbDebug extends UmbLitElement {
for (const [alias, instance] of this.contexts) {
contextsTemplates.push(
- html`
-
+ html`
Context: ${alias}(${typeof instance})
From f53eff66013a5d6c07f7e4db01b2898a4b181fc1 Mon Sep 17 00:00:00 2001
From: Lone Iversen <108085781+loivsen@users.noreply.github.com>
Date: Fri, 17 Feb 2023 09:56:46 +0100
Subject: [PATCH 068/116] update
---
.../input-multi-url-picker/input-multi-url-picker.element.ts | 4 +++-
.../property-editor-ui-multi-url-picker.element.ts | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts
index bc65dcb756..7512bcde08 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-multi-url-picker/input-multi-url-picker.element.ts
@@ -83,7 +83,7 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen
@property()
overlaySize?: 'small' | 'medium' | 'large' | 'full';
- @property()
+ @property({ attribute: 'urls' })
multiUrls: Array = [];
private _modalService?: UmbModalService;
@@ -133,7 +133,9 @@ export class UmbInputMultiUrlPickerElement extends FormControlMixin(UmbLitElemen
if (index !== undefined && index >= 0) this.multiUrls[index] = newUrl;
else this.multiUrls.push(newUrl);
+
this.requestUpdate();
+ //TODO: onChange event?
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts
index 41163b19bb..fa0e27135f 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts
@@ -64,7 +64,7 @@ export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement {
.ignoreUserStartNodes=${this._ignoreUserStartNodes}
.max=${this._maxNumber}
.min=${this._minNumber}
- .links="${this.value}">`;
+ .urls="${this.value}">`;
}
}
From 598be3dbbed32f06b64807ec515b2301c547c406 Mon Sep 17 00:00:00 2001
From: Lone Iversen <108085781+loivsen@users.noreply.github.com>
Date: Fri, 17 Feb 2023 10:44:26 +0100
Subject: [PATCH 069/116] color picker remove sortorder
---
.../property-editor-ui-color-picker.element.ts | 3 +--
.../src/core/mocks/data/data-type.data.ts | 9 ---------
2 files changed, 1 insertion(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts
index 802e71ec50..695a59bd5d 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts
@@ -27,8 +27,7 @@ export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement {
if (includeLabels) this._includeLabels = includeLabels.value;
const colorSwatches = config.find((x) => x.alias === 'items');
- if (colorSwatches)
- this._swatches = (colorSwatches.value as any[]).slice().sort((a, b) => a.sortOrder - b.sortOrder);
+ if (colorSwatches) this._swatches = colorSwatches.value as any[];
}
private _onChange(event: UUIColorSwatchesEvent) {
diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts
index c851beb0e4..09134662ed 100644
--- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts
@@ -63,47 +63,38 @@ export const data: Array = [
{
value: '#000000',
label: 'Black',
- sortOrder: 0,
},
{
value: '#373737',
label: 'Dark',
- sortOrder: 1,
},
{
value: '#9e9e9e',
label: 'Light',
- sortOrder: 2,
},
{
value: '#607d8b',
label: 'Sage',
- sortOrder: 3,
},
{
value: '#2196f3',
label: 'Sapphire',
- sortOrder: 4,
},
{
value: '#03a9f4',
label: 'Sky',
- sortOrder: 5,
},
{
value: '#3f51b5',
label: 'Blue',
- sortOrder: 6,
},
{
value: '#9c27b0',
label: 'Magenta',
- sortOrder: 8,
},
{
value: '#673ab7',
label: 'Purps',
- sortOrder: 7,
},
],
},
From c0dc1a41da8b48347280ed3e428b1af62f5ba60d Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Fri, 17 Feb 2023 10:02:24 +0000
Subject: [PATCH 070/116] Suggest the MDX VSCode extension to help with the
.MDX stories
---
src/Umbraco.Web.UI.Client/.vscode/extensions.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/.vscode/extensions.json b/src/Umbraco.Web.UI.Client/.vscode/extensions.json
index 5c7db24a59..3e18e13dc4 100644
--- a/src/Umbraco.Web.UI.Client/.vscode/extensions.json
+++ b/src/Umbraco.Web.UI.Client/.vscode/extensions.json
@@ -7,6 +7,7 @@
"runem.lit-plugin",
"esbenp.prettier-vscode",
"hbenl.vscode-test-explorer",
- "vunguyentuan.vscode-css-variables"
+ "vunguyentuan.vscode-css-variables",
+ "unifiedjs.vscode-mdx"
]
}
From 40c59003882549e81cae51407c7a84cdb6650093 Mon Sep 17 00:00:00 2001
From: Lone Iversen <108085781+loivsen@users.noreply.github.com>
Date: Fri, 17 Feb 2023 11:22:11 +0100
Subject: [PATCH 071/116] udi service
---
src/Umbraco.Web.UI.Client/libs/utils/index.ts | 1 +
.../libs/utils/udi-service.ts | 3 +++
.../modal-layout-link-picker.element.ts | 23 ++++++++++++-------
3 files changed, 19 insertions(+), 8 deletions(-)
create mode 100644 src/Umbraco.Web.UI.Client/libs/utils/udi-service.ts
diff --git a/src/Umbraco.Web.UI.Client/libs/utils/index.ts b/src/Umbraco.Web.UI.Client/libs/utils/index.ts
index 22bcaeabb7..b7439f0c3a 100644
--- a/src/Umbraco.Web.UI.Client/libs/utils/index.ts
+++ b/src/Umbraco.Web.UI.Client/libs/utils/index.ts
@@ -1,2 +1,3 @@
export * from './utils';
export * from './umbraco-path';
+export * from './udi-service';
diff --git a/src/Umbraco.Web.UI.Client/libs/utils/udi-service.ts b/src/Umbraco.Web.UI.Client/libs/utils/udi-service.ts
new file mode 100644
index 0000000000..eafc6c6c0e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/libs/utils/udi-service.ts
@@ -0,0 +1,3 @@
+export function buildUdi(entityType: string, guid: string) {
+ return 'umb://' + entityType + '/' + guid.replace(/-/g, '');
+}
diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/layouts/link-picker/modal-layout-link-picker.element.ts b/src/Umbraco.Web.UI.Client/src/core/modal/layouts/link-picker/modal-layout-link-picker.element.ts
index 8bbeee8016..843521b6c3 100644
--- a/src/Umbraco.Web.UI.Client/src/core/modal/layouts/link-picker/modal-layout-link-picker.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/core/modal/layouts/link-picker/modal-layout-link-picker.element.ts
@@ -4,6 +4,7 @@ import { customElement, query, state } from 'lit/decorators.js';
import { UUIBooleanInputEvent, UUIInputElement } from '@umbraco-ui/uui';
import { UmbModalLayoutElement } from '../modal-layout.element';
import { UmbTreeElement } from '../../../../backoffice/shared/components/tree/tree.element';
+import { buildUdi } from '@umbraco-cms/utils';
export interface UmbModalLinkPickerData {
icon?: string;
@@ -59,6 +60,9 @@ export class UmbModalLayoutLinkPickerElement extends UmbModalLayoutElement<
`,
];
+ @state()
+ _selectedKey?: string;
+
@state()
_link: UmbModalLinkPickerData = {
icon: undefined,
@@ -108,13 +112,16 @@ export class UmbModalLayoutLinkPickerElement extends UmbModalLayoutElement<
this._link.queryString = query;
}
- private _handleSelectionChange(e: CustomEvent) {
+ private _handleSelectionChange(e: CustomEvent, entityType: string) {
+ //TODO: Update icon, published, trashed
e.stopPropagation();
const element = e.target as UmbTreeElement;
- const udi = element.selection[element.selection.length - 1];
+ const selectedKey = element.selection[element.selection.length - 1];
+ const udi = buildUdi(entityType, selectedKey);
+
+ this._selectedKey = selectedKey;
this._link.udi = udi;
- //TODO: Update icon, if published, if trashed, url
- this._link.url = udi;
+ this._link.url = udi; // TODO
this.requestUpdate();
}
@@ -193,8 +200,8 @@ export class UmbModalLayoutLinkPickerElement extends UmbModalLayoutElement<
this._handleSelectionChange(event, 'document')}
+ .selection=${[this._selectedKey ?? '']}
selectable>
@@ -203,8 +210,8 @@ export class UmbModalLayoutLinkPickerElement extends UmbModalLayoutElement<
this._handleSelectionChange(event, 'media')}
+ .selection=${[this._selectedKey ?? '']}
selectable>`;
}
}
From 5e0a2e93b2e44478de781137ba841f855ad91fc3 Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Fri, 17 Feb 2023 10:32:14 +0000
Subject: [PATCH 072/116] Document umb-debug in a story.mdx
---
.../shared/components/debug/debug.stories.mdx | 38 +++++++++++++++++++
1 file changed, 38 insertions(+)
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
new file mode 100644
index 0000000000..634d578d4e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
@@ -0,0 +1,38 @@
+import { Canvas, Meta, Story } from '@storybook/addon-docs';
+
+
+
+
+
+# Debugging
+
+## Debugging Contexts
+
+The component `` allows you to discover the available contexts from the current DOM element, that you are able to consume and use.
+
+For example it will help you as a package developer or implementor to know you are able to consume the `DigalogService` and quickly see what properties and methods are available to use.
+
+This can help with the developer experience to quickly see what is available to use and how to use it.
+
+### Usage
+The `` component can be used in two different ways
+
+
+```typescript
+// This will add
+
+```
+
+This example uses an additional property/attribute `dialog` which adds a smaller badge to the UI as opposed to a button and will open the information in a small dialog/modal from the right hand side.
+
+```typescript
+// This will open the debug information in a small dialog/modal from the right hand side
+
+```
+
+You may wish to temporarily hide or disable the debug information but return to it later on in the development process.
+
+```typescript
+// To hide or remove the button ensure you remove the enabled attribute or set the enabled property to false
+
+```
From 6f2ffaa8a8193492fbb8ac36a104086b1c1c2ed4 Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Fri, 17 Feb 2023 10:36:57 +0000
Subject: [PATCH 073/116] Finish the copy
---
.../src/backoffice/shared/components/debug/debug.stories.mdx | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
index 634d578d4e..8b12b71917 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
@@ -3,7 +3,6 @@ import { Canvas, Meta, Story } from '@storybook/addon-docs';
-
# Debugging
## Debugging Contexts
@@ -19,11 +18,11 @@ The `` component can be used in two different ways
```typescript
-// This will add
+// This will add a Debug button to the UI and once clicked the information about avilable contextes will slide down
```
-This example uses an additional property/attribute `dialog` which adds a smaller badge to the UI as opposed to a button and will open the information in a small dialog/modal from the right hand side.
+This example uses an additional property/attribute `dialog` which adds a smaller badge to the UI as opposed to a button and will open the information in a small dialog/modal from the right hand side, this may be more useful to use when space is limited in the UI to add a button and pane of information directly to where the element is placed.
```typescript
// This will open the debug information in a small dialog/modal from the right hand side
From c012dbd65493403a7442af8fc6b7221a0173ed10 Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Fri, 17 Feb 2023 12:31:15 +0000
Subject: [PATCH 074/116] Make dialog small
---
.../src/backoffice/shared/components/debug/debug.element.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
index 84aff299aa..c3567dd204 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.element.ts
@@ -105,7 +105,7 @@ export class UmbDebug extends UmbLitElement {
// Open a modal that uses the HTML component called 'umb-debug-modal-layout'
await import('./debug.modal.element.js');
this._modalService?.open('umb-debug-modal-layout', {
- size: 'medium',
+ size: 'small',
type: 'sidebar',
data: {
content: this._renderContextAliases(),
From 3e309b31df5f7a79c755bd45ab158595b034838a Mon Sep 17 00:00:00 2001
From: Warren Buckley
Date: Fri, 17 Feb 2023 12:31:34 +0000
Subject: [PATCH 075/116] Add images/screenshot to the MDX docs/story
---
.../debug/{ => stories}/debug.stories.mdx | 11 +++++++++--
.../debug/stories/umb-debug-dialog.jpg | Bin 0 -> 231248 bytes
.../components/debug/stories/umb-debug.jpg | Bin 0 -> 177786 bytes
3 files changed, 9 insertions(+), 2 deletions(-)
rename src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/{ => stories}/debug.stories.mdx (77%)
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/umb-debug-dialog.jpg
create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/umb-debug.jpg
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/debug.stories.mdx
similarity index 77%
rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/debug.stories.mdx
index 8b12b71917..3497502ad5 100644
--- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/debug.stories.mdx
+++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/debug.stories.mdx
@@ -1,8 +1,12 @@
import { Canvas, Meta, Story } from '@storybook/addon-docs';
+import DebugDialogImage from './umb-debug-dialog.jpg';
+import DebugImage from './umb-debug.jpg';
+
+
# Debugging
## Debugging Contexts
@@ -14,21 +18,24 @@ For example it will help you as a package developer or implementor to know you a
This can help with the developer experience to quickly see what is available to use and how to use it.
### Usage
-The `` component can be used in two different ways
-
+The `` component can be used in two different ways, either as a button or as a dialog. By default it is rendered as a button and the debug information about available contexts is dissplayed inline to where the element is placed.
+
```typescript
// This will add a Debug button to the UI and once clicked the information about avilable contextes will slide down
```
+#### Dialog
This example uses an additional property/attribute `dialog` which adds a smaller badge to the UI as opposed to a button and will open the information in a small dialog/modal from the right hand side, this may be more useful to use when space is limited in the UI to add a button and pane of information directly to where the element is placed.
+
```typescript
// This will open the debug information in a small dialog/modal from the right hand side
```
+#### Disable
You may wish to temporarily hide or disable the debug information but return to it later on in the development process.
```typescript
diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/umb-debug-dialog.jpg b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/debug/stories/umb-debug-dialog.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..449ae6dc14961bb0a8fd2be84f34be755b0320c6
GIT binary patch
literal 231248
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