Merge remote-tracking branch 'origin/main' into feature/allowed-block-types
# Conflicts: # src/packages/block/block-grid/property-editors/block-grid-area-type-permission/block-grid-area-type-permission.element.ts
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ignorePatterns": ["vite.*.ts"],
|
||||
"root": true,
|
||||
"plugins": ["eslint-plugin-local-rules"],
|
||||
"plugins": ["import", "eslint-plugin-local-rules"],
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest"
|
||||
},
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<style>
|
||||
/* Make stories able to use 100% height */
|
||||
html {
|
||||
height: 100vh;
|
||||
}
|
||||
/* Make stories able to use 100% height */
|
||||
body,
|
||||
#storybook-root,
|
||||
#root-inner {
|
||||
height: 100%;
|
||||
}
|
||||
html {
|
||||
height: 100vh;
|
||||
}
|
||||
/* Make stories able to use 100% height */
|
||||
body,
|
||||
#root,
|
||||
#root-inner {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 0px !important;
|
||||
@@ -40,3 +40,4 @@
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
|
||||
|
||||
@@ -10,11 +10,11 @@ import { setCustomElements } from '@storybook/web-components';
|
||||
import { startMockServiceWorker } from '../src/mocks';
|
||||
|
||||
import { UMB_MODAL_MANAGER_CONTEXT, UmbModalManagerContext } from '../src/packages/core/modal';
|
||||
import { UmbDataTypeTreeStore } from '../src/packages/core/data-type/tree/data-type-tree.store';
|
||||
import { UmbDataTypeTreeStore } from '../src/packages/data-type/tree/data-type-tree.store';
|
||||
import { UmbDocumentDetailStore } from '../src/packages/documents/documents/repository/detail/document-detail.store';
|
||||
import { UmbDocumentTreeStore } from '../src/packages/documents/documents/tree/document-tree.store';
|
||||
import { umbExtensionsRegistry } from '../src/packages/core/extension-registry';
|
||||
import { UmbIconRegistry } from '../src/shared/icon-registry/icon.registry';
|
||||
import { UmbIconRegistry } from '../src/packages/core/icon-registry/icon.registry';
|
||||
import { UmbLitElement } from '../src/packages/core/lit-element';
|
||||
import { umbLocalizationRegistry } from '../src/packages/core/localization';
|
||||
import customElementManifests from '../dist-cms/custom-elements.json';
|
||||
@@ -77,12 +77,7 @@ const documentTreeStoreProvider = (story) => html`
|
||||
`;
|
||||
|
||||
// Provide the MSW addon decorator globally
|
||||
export const decorators = [
|
||||
storybookProvider,
|
||||
documentStoreProvider,
|
||||
documentTreeStoreProvider,
|
||||
dataTypeStoreProvider,
|
||||
];
|
||||
export const decorators = [storybookProvider, documentStoreProvider, documentTreeStoreProvider, dataTypeStoreProvider];
|
||||
|
||||
export const parameters = {
|
||||
options: {
|
||||
|
||||
@@ -7,12 +7,14 @@
|
||||
"ctrls",
|
||||
"devs",
|
||||
"Elementable",
|
||||
"iframes",
|
||||
"invariantable",
|
||||
"lucide",
|
||||
"Niels",
|
||||
"pickable",
|
||||
"popovertarget",
|
||||
"Registrator",
|
||||
"stylesheet",
|
||||
"svgs",
|
||||
"templating",
|
||||
"tinymce",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Umbraco HQ
|
||||
Copyright (c) 2024 Umbraco HQ
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,3 +19,18 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
---
|
||||
|
||||
Third-party licenses
|
||||
|
||||
---
|
||||
|
||||
Lucide License
|
||||
ISC License
|
||||
|
||||
Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
import { kebabCase, camelCase, startCase } from 'lodash-es';
|
||||
const pascalCase = (str) => startCase(str).replace(/ /g, '');
|
||||
|
||||
const tagNamePrefix = 'umb-';
|
||||
const classNamePrefix = 'Umb';
|
||||
|
||||
const extensions = [
|
||||
{
|
||||
type: 'propertyEditorUi',
|
||||
path: '../../src/backoffice/shared/property-editors/uis',
|
||||
templatePath: './templates/property-editor-ui',
|
||||
},
|
||||
];
|
||||
|
||||
export default function (plop) {
|
||||
plop.setHelper('className', (type, name) => classNamePrefix + pascalCase(type) + pascalCase(name) + 'Element');
|
||||
plop.setHelper('displayName', (name) => startCase(camelCase(name)));
|
||||
plop.setHelper('extensionPath', (type, name) => extensions.find((e) => e.type === type).path + '/' + name);
|
||||
plop.setHelper('extensionTemplatePath', (type) => extensions.find((e) => e.type === type).templatePath);
|
||||
plop.setHelper('extensionFilename', (type, name) => kebabCase(type) + '-' + kebabCase(name));
|
||||
plop.setHelper('extensionTagName', (type, name) => tagNamePrefix + kebabCase(type) + '-' + kebabCase(name));
|
||||
|
||||
plop.setGenerator('component', {
|
||||
description: 'application controller logic',
|
||||
prompts: [
|
||||
{
|
||||
type: 'list',
|
||||
name: 'extensionType',
|
||||
message: 'Select extension type',
|
||||
choices: extensions.map((e) => e.type),
|
||||
},
|
||||
{
|
||||
type: 'input',
|
||||
name: 'name',
|
||||
message: 'Enter extension name (i.e. color-picker)',
|
||||
validate: (answer) => {
|
||||
if (answer.length < 1) {
|
||||
return 'Please enter a name for the extension';
|
||||
} else return true;
|
||||
},
|
||||
// Convert the input into kebab case if not provided as such and strip prefix
|
||||
filter: (response) => kebabCase(response.replace(/^umb-/, '')),
|
||||
},
|
||||
],
|
||||
actions: [
|
||||
{
|
||||
type: 'add',
|
||||
path: '{{ extensionPath extensionType name }}/{{extensionFilename extensionType name }}.element.ts',
|
||||
templateFile: '{{extensionTemplatePath extensionType}}/element.ts.hbs',
|
||||
},
|
||||
{
|
||||
type: 'add',
|
||||
path: '{{ extensionPath extensionType name }}/{{ extensionFilename extensionType name }}.test.ts',
|
||||
templateFile: '{{extensionTemplatePath extensionType}}/test.ts.hbs',
|
||||
},
|
||||
{
|
||||
type: 'add',
|
||||
path: '{{ extensionPath extensionType name }}/{{ extensionFilename extensionType name }}.stories.ts',
|
||||
templateFile: '{{extensionTemplatePath extensionType}}/stories.ts.hbs',
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
import { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import { html, customElement, property } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { UmbLitElement } from '@umbraco-cms/element';
|
||||
|
||||
/**
|
||||
* @element {{ extensionTagName extensionType name }}
|
||||
*/
|
||||
@customElement('{{ extensionTagName extensionType name }}')
|
||||
export class {{className extensionType name }} extends UmbLitElement implements UmbPropertyEditorUiElement {
|
||||
static styles = [UmbTextStyles];
|
||||
|
||||
@property()
|
||||
value = '';
|
||||
|
||||
@property({ type: Array, attribute: false })
|
||||
public config?: UmbPropertyEditorConfigCollection;
|
||||
|
||||
render() {
|
||||
return html`<div>{{ extensionTagName extensionType name }}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
export default {{className extensionType name}};
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'{{extensionTagName extensionType name }}': {{className extensionType name}};
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
import { Meta, Story } from '@storybook/web-components';
|
||||
import { html } from 'lit';
|
||||
|
||||
import type { {{className extensionType name}} } from './{{ extensionFilename extensionType name }}.element';
|
||||
import './{{ extensionFilename extensionType name }}.element';
|
||||
|
||||
export default {
|
||||
title: 'Property Editor UIs/{{ displayName name }}',
|
||||
component: '{{ extensionTagName extensionType name }}',
|
||||
id: '{{extensionTagName extensionType name }}',
|
||||
} as Meta;
|
||||
|
||||
export const AAAOverview: Story<{{className extensionType name}}> = () =>
|
||||
html`<{{ extensionTagName extensionType name }}></{{ extensionTagName extensionType name }}>`;
|
||||
AAAOverview.storyName = 'Overview';
|
||||
@@ -1,21 +0,0 @@
|
||||
import { expect, fixture, html } from '@open-wc/testing';
|
||||
import { {{ className extensionType name }} } from './{{ extensionFilename extensionType name }}.element';
|
||||
import { defaultA11yConfig } from '@umbraco-cms/test-utils';
|
||||
|
||||
describe('{{className extensionType name}}', () => {
|
||||
let element: {{className extensionType name}};
|
||||
|
||||
beforeEach(async () => {
|
||||
element = await fixture(
|
||||
html` <{{ extensionTagName extensionType name }}></{{ extensionTagName extensionType name }}> `
|
||||
);
|
||||
});
|
||||
|
||||
it('is defined with its own instance', () => {
|
||||
expect(element).to.be.instanceOf({{ className extensionType name }});
|
||||
});
|
||||
|
||||
it('passes the a11y audit', async () => {
|
||||
await expect(element).shadowDom.to.be.accessible(defaultA11yConfig);
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import { writeFileSync } from 'fs';
|
||||
import { format } from 'prettier';
|
||||
import { format, resolveConfig } from 'prettier';
|
||||
import { createImportMap } from '../importmap/index.js';
|
||||
|
||||
const tsconfigPath = 'tsconfig.json';
|
||||
@@ -55,8 +55,8 @@ for (const [key, value] of Object.entries(importmap.imports)) {
|
||||
tsConfigBase.compilerOptions.paths = paths;
|
||||
|
||||
const content = tsconfigComment + JSON.stringify(tsConfigBase, null, ' ');
|
||||
const formattedContent = await format(content, {
|
||||
parser: 'json',
|
||||
});
|
||||
|
||||
const config = await resolveConfig('./.prettierrc.json');
|
||||
const formattedContent = await format(content, { ...config, parser: 'json' });
|
||||
|
||||
writeFileSync(tsconfigPath, formattedContent);
|
||||
|
||||
@@ -2,9 +2,9 @@ const { rest } = window.MockServiceWorker;
|
||||
|
||||
import { umbracoPath } from '@umbraco-cms/backoffice/utils';
|
||||
import {
|
||||
ProblemDetails,
|
||||
type ProblemDetails,
|
||||
RuntimeLevelModel,
|
||||
ServerStatusResponseModel,
|
||||
type ServerStatusResponseModel,
|
||||
} from '@umbraco-cms/backoffice/external/backend-api';
|
||||
import { expect, test } from './test.js';
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
const { rest } = window.MockServiceWorker;
|
||||
import { umbracoPath } from '@umbraco-cms/backoffice/utils';
|
||||
import {
|
||||
ProblemDetails,
|
||||
type ProblemDetails,
|
||||
RuntimeLevelModel,
|
||||
ServerStatusResponseModel,
|
||||
type ServerStatusResponseModel,
|
||||
} from '@umbraco-cms/backoffice/external/backend-api';
|
||||
import { expect, test } from './test.js';
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import type { ManifestDashboard } from '@umbraco-cms/backoffice/extension-registry';
|
||||
|
||||
export const manifests: Array<ManifestTypes> = [
|
||||
export const manifests: Array<ManifestDashboard> = [
|
||||
{
|
||||
type: 'dashboard',
|
||||
name: 'Example Dataset Dashboard',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import type { ManifestDashboard } from '@umbraco-cms/backoffice/extension-registry';
|
||||
|
||||
export const manifests: Array<ManifestTypes> = [
|
||||
export const manifests: Array<ManifestDashboard> = [
|
||||
{
|
||||
type: 'dashboard',
|
||||
name: 'Example Sorter Dashboard',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import type { ManifestDashboard } from '@umbraco-cms/backoffice/extension-registry';
|
||||
|
||||
export const manifests: Array<ManifestTypes> = [
|
||||
export const manifests: Array<ManifestDashboard> = [
|
||||
{
|
||||
type: 'dashboard',
|
||||
name: 'Example Sorter Dashboard',
|
||||
|
||||
1124
src/Umbraco.Web.UI.Client/package-lock.json
generated
1124
src/Umbraco.Web.UI.Client/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@umbraco-cms/backoffice",
|
||||
"license": "MIT",
|
||||
"version": "14.0.0--preview007",
|
||||
"version": "14.0.0--preview008",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
".": null,
|
||||
@@ -13,75 +13,80 @@
|
||||
"./extension-api": "./dist-cms/libs/extension-api/index.js",
|
||||
"./localization-api": "./dist-cms/libs/localization-api/index.js",
|
||||
"./observable-api": "./dist-cms/libs/observable-api/index.js",
|
||||
"./auth": "./dist-cms/shared/auth/index.js",
|
||||
"./event": "./dist-cms/packages/core/event/index.js",
|
||||
"./lit-element": "./dist-cms/packages/core/lit-element/index.js",
|
||||
"./icon": "./dist-cms/shared/icon-registry/index.js",
|
||||
"./models": "./dist-cms/shared/models/index.js",
|
||||
"./resources": "./dist-cms/shared/resources/index.js",
|
||||
"./router": "./dist-cms/shared/router/index.js",
|
||||
"./style": "./dist-cms/shared/style/index.js",
|
||||
"./utils": "./dist-cms/shared/utils/index.js",
|
||||
"./action": "./dist-cms/packages/core/action/index.js",
|
||||
"./audit-log": "./dist-cms/packages/audit-log/index.js",
|
||||
"./auth": "./dist-cms/packages/core/auth/index.js",
|
||||
"./block-grid": "./dist-cms/packages/block/block-grid/index.js",
|
||||
"./block-list": "./dist-cms/packages/block/block-list/index.js",
|
||||
"./block-rte": "./dist-cms/packages/block/block-rte/index.js",
|
||||
"./block-type": "./dist-cms/packages/block/block-type/index.js",
|
||||
"./block": "./dist-cms/packages/block/block/index.js",
|
||||
"./code-editor": "./dist-cms/packages/templating/code-editor/index.js",
|
||||
"./collection": "./dist-cms/packages/core/collection/index.js",
|
||||
"./components": "./dist-cms/packages/core/components/index.js",
|
||||
"./content-type": "./dist-cms/packages/core/content-type/index.js",
|
||||
"./culture": "./dist-cms/packages/core/culture/index.js",
|
||||
"./data-type": "./dist-cms/packages/core/data-type/index.js",
|
||||
"./current-user": "./dist-cms/packages/user/current-user/index.js",
|
||||
"./data-type": "./dist-cms/packages/data-type/index.js",
|
||||
"./debug": "./dist-cms/packages/core/debug/index.js",
|
||||
"./entity-action": "./dist-cms/packages/core/entity-action/index.js",
|
||||
"./entity-bulk-action": "./dist-cms/packages/core/entity-bulk-action/index.js",
|
||||
"./extension-registry": "./dist-cms/packages/core/extension-registry/index.js",
|
||||
"./server-file-system": "./dist-cms/packages/core/server-file-system/index.js",
|
||||
"./id": "./dist-cms/packages/core/id/index.js",
|
||||
"./localization": "./dist-cms/packages/core/localization/index.js",
|
||||
"./menu": "./dist-cms/packages/core/menu/index.js",
|
||||
"./modal": "./dist-cms/packages/core/modal/index.js",
|
||||
"./notification": "./dist-cms/packages/core/notification/index.js",
|
||||
"./picker-input": "./dist-cms/packages/core/picker-input/index.js",
|
||||
"./property": "./dist-cms/packages/core/property/index.js",
|
||||
"./property-action": "./dist-cms/packages/core/property-action/index.js",
|
||||
"./property-editor": "./dist-cms/packages/core/property-editor/index.js",
|
||||
"./section": "./dist-cms/packages/core/section/index.js",
|
||||
"./sorter": "./dist-cms/packages/core/sorter/index.js",
|
||||
"./store": "./dist-cms/packages/core/store/index.js",
|
||||
"./themes": "./dist-cms/packages/core/themes/index.js",
|
||||
"./tree": "./dist-cms/packages/core/tree/index.js",
|
||||
"./variant": "./dist-cms/packages/core/variant/index.js",
|
||||
"./workspace": "./dist-cms/packages/core/workspace/index.js",
|
||||
"./repository": "./dist-cms/packages/core/repository/index.js",
|
||||
"./temporary-file": "./dist-cms/packages/core/temporary-file/index.js",
|
||||
"./block": "./dist-cms/packages/block/index.js",
|
||||
"./audit-log": "./dist-cms/packages/audit-log/index.js",
|
||||
"./dictionary": "./dist-cms/packages/dictionary/index.js",
|
||||
"./document": "./dist-cms/packages/documents/documents/index.js",
|
||||
"./document-blueprint": "./dist-cms/packages/documents/document-blueprints/index.js",
|
||||
"./document-type": "./dist-cms/packages/documents/document-types/index.js",
|
||||
"./media": "./dist-cms/packages/media/media/index.js",
|
||||
"./document": "./dist-cms/packages/documents/documents/index.js",
|
||||
"./dynamic-root": "./dist-cms/packages/dynamic-root/index.js",
|
||||
"./entity-action": "./dist-cms/packages/core/entity-action/index.js",
|
||||
"./entity-bulk-action": "./dist-cms/packages/core/entity-bulk-action/index.js",
|
||||
"./event": "./dist-cms/packages/core/event/index.js",
|
||||
"./extension-registry": "./dist-cms/packages/core/extension-registry/index.js",
|
||||
"./icon": "./dist-cms/packages/core/icon-registry/index.js",
|
||||
"./id": "./dist-cms/packages/core/id/index.js",
|
||||
"./language": "./dist-cms/packages/language/index.js",
|
||||
"./lit-element": "./dist-cms/packages/core/lit-element/index.js",
|
||||
"./localization": "./dist-cms/packages/core/localization/index.js",
|
||||
"./log-viewer": "./dist-cms/packages/log-viewer/index.js",
|
||||
"./media-type": "./dist-cms/packages/media/media-types/index.js",
|
||||
"./member": "./dist-cms/packages/members/member/index.js",
|
||||
"./media": "./dist-cms/packages/media/media/index.js",
|
||||
"./member-group": "./dist-cms/packages/members/member-group/index.js",
|
||||
"./member-type": "./dist-cms/packages/members/member-type/index.js",
|
||||
"./member": "./dist-cms/packages/members/member/index.js",
|
||||
"./menu": "./dist-cms/packages/core/menu/index.js",
|
||||
"./modal": "./dist-cms/packages/core/modal/index.js",
|
||||
"./models": "./dist-cms/packages/core/models/index.js",
|
||||
"./notification": "./dist-cms/packages/core/notification/index.js",
|
||||
"./object-type": "./dist-cms/packages/object-type/index.js",
|
||||
"./package": "./dist-cms/packages/packages/package/index.js",
|
||||
"./language": "./dist-cms/packages/language/index.js",
|
||||
"./dynamic-root": "./dist-cms/packages/dynamic-root/index.js",
|
||||
"./log-viewer": "./dist-cms/packages/log-viewer/index.js",
|
||||
"./partial-view": "./dist-cms/packages/templating/partial-views/index.js",
|
||||
"./picker-input": "./dist-cms/packages/core/picker-input/index.js",
|
||||
"./property-action": "./dist-cms/packages/core/property-action/index.js",
|
||||
"./property-editor": "./dist-cms/packages/core/property-editor/index.js",
|
||||
"./property": "./dist-cms/packages/core/property/index.js",
|
||||
"./relation-type": "./dist-cms/packages/relations/relation-types/index.js",
|
||||
"./relations": "./dist-cms/packages/relations/relations/index.js",
|
||||
"./tags": "./dist-cms/packages/tags/index.js",
|
||||
"./repository": "./dist-cms/packages/core/repository/index.js",
|
||||
"./resources": "./dist-cms/packages/core/resources/index.js",
|
||||
"./router": "./dist-cms/packages/core/router/index.js",
|
||||
"./section": "./dist-cms/packages/core/section/index.js",
|
||||
"./server-file-system": "./dist-cms/packages/core/server-file-system/index.js",
|
||||
"./sorter": "./dist-cms/packages/core/sorter/index.js",
|
||||
"./static-file": "./dist-cms/packages/static-file/index.js",
|
||||
"./partial-view": "./dist-cms/packages/templating/partial-views/index.js",
|
||||
"./store": "./dist-cms/packages/core/store/index.js",
|
||||
"./style": "./dist-cms/packages/core/style/index.js",
|
||||
"./stylesheet": "./dist-cms/packages/templating/stylesheets/index.js",
|
||||
"./tags": "./dist-cms/packages/tags/index.js",
|
||||
"./template": "./dist-cms/packages/templating/templates/index.js",
|
||||
"./temporary-file": "./dist-cms/packages/core/temporary-file/index.js",
|
||||
"./themes": "./dist-cms/packages/core/themes/index.js",
|
||||
"./tiny-mce": "./dist-cms/packages/tiny-mce/index.js",
|
||||
"./tree": "./dist-cms/packages/core/tree/index.js",
|
||||
"./user-group": "./dist-cms/packages/user/user-group/index.js",
|
||||
"./current-user": "./dist-cms/packages/user/current-user/index.js",
|
||||
"./user": "./dist-cms/packages/user/user/index.js",
|
||||
"./user-permission": "./dist-cms/packages/user/user-permission/index.js",
|
||||
"./code-editor": "./dist-cms/packages/templating/code-editor/index.js",
|
||||
"./user": "./dist-cms/packages/user/user/index.js",
|
||||
"./utils": "./dist-cms/packages/core/utils/index.js",
|
||||
"./variant": "./dist-cms/packages/core/variant/index.js",
|
||||
"./workspace": "./dist-cms/packages/core/workspace/index.js",
|
||||
"./external/backend-api": "./dist-cms/external/backend-api/index.js",
|
||||
"./external/dompurify": "./dist-cms/external/dompurify/index.js",
|
||||
"./external/lit": "./dist-cms/external/lit/index.js",
|
||||
"./external/lodash": "./dist-cms/external/lodash/index.js",
|
||||
"./external/marked": "./dist-cms/external/marked/index.js",
|
||||
"./external/monaco-editor": "./dist-cms/external/monaco-editor/index.js",
|
||||
"./external/openid": "./dist-cms/external/openid/index.js",
|
||||
@@ -130,7 +135,6 @@
|
||||
"lint:errors": "npm run lint -- --quiet",
|
||||
"lint:fix": "npm run lint -- --fix",
|
||||
"lint": "eslint src",
|
||||
"new-extension": "plop --plopfile ./devops/plop/plop.js",
|
||||
"prepack": "tsc-alias -f -p src/tsconfig.build.json && npm run generate:jsonschema:dist && npm run wc-analyze && npm run wc-analyze:vscode && node ./devops/publish/cleanse-pkg.js",
|
||||
"preview": "vite preview --open",
|
||||
"storybook:build": "npm run wc-analyze && storybook build",
|
||||
@@ -159,7 +163,6 @@
|
||||
"dompurify": "^3.0.8",
|
||||
"element-internals-polyfill": "^1.3.10",
|
||||
"lit": "^3.1.2",
|
||||
"lodash-es": "4.17.21",
|
||||
"marked": "^12.0.0",
|
||||
"monaco-editor": "^0.46.0",
|
||||
"rxjs": "^7.8.1",
|
||||
@@ -184,7 +187,6 @@
|
||||
"@storybook/web-components": "^7.6.15",
|
||||
"@storybook/web-components-vite": "^7.6.15",
|
||||
"@types/chai": "^4.3.5",
|
||||
"@types/lodash-es": "^4.17.8",
|
||||
"@types/mocha": "^10.0.1",
|
||||
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
||||
"@typescript-eslint/parser": "^6.14.0",
|
||||
@@ -208,7 +210,6 @@
|
||||
"msw": "^1.3.2",
|
||||
"openapi-typescript-codegen": "^0.25.0",
|
||||
"playwright-msw": "^3.0.1",
|
||||
"plop": "^4.0.0",
|
||||
"prettier": "3.0.3",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
|
||||
Binary file not shown.
@@ -15,6 +15,7 @@ const CORE_PACKAGES = [
|
||||
import('../../packages/audit-log/umbraco-package.js'),
|
||||
import('../../packages/block/umbraco-package.js'),
|
||||
import('../../packages/core/umbraco-package.js'),
|
||||
import('../../packages/data-type/umbraco-package.js'),
|
||||
import('../../packages/dictionary/umbraco-package.js'),
|
||||
import('../../packages/documents/umbraco-package.js'),
|
||||
import('../../packages/dynamic-root/umbraco-package.js'),
|
||||
@@ -24,6 +25,7 @@ const CORE_PACKAGES = [
|
||||
import('../../packages/media/umbraco-package.js'),
|
||||
import('../../packages/members/umbraco-package.js'),
|
||||
import('../../packages/models-builder/umbraco-package.js'),
|
||||
//import('../../packages/object-type/umbraco-package.js'),// This had nothing to register.
|
||||
import('../../packages/packages/umbraco-package.js'),
|
||||
import('../../packages/relations/umbraco-package.js'),
|
||||
import('../../packages/search/umbraco-package.js'),
|
||||
@@ -31,6 +33,7 @@ const CORE_PACKAGES = [
|
||||
import('../../packages/static-file/umbraco-package.js'),
|
||||
import('../../packages/tags/umbraco-package.js'),
|
||||
import('../../packages/templating/umbraco-package.js'),
|
||||
import('../../packages/tiny-mce/umbraco-package.js'),
|
||||
import('../../packages/umbraco-news/umbraco-package.js'),
|
||||
import('../../packages/user/umbraco-package.js'),
|
||||
];
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { UmbInstallerContext, UMB_INSTALLER_CONTEXT } from './installer.context.js';
|
||||
import type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
|
||||
import './consent/installer-consent.element.js';
|
||||
@@ -57,8 +56,6 @@ export class UmbInstallerElement extends UmbLitElement {
|
||||
render() {
|
||||
return html`<umb-installer-layout data-test="installer">${this._renderSection()}</umb-installer-layout> `;
|
||||
}
|
||||
|
||||
static styles: CSSResultGroup = [css``];
|
||||
}
|
||||
|
||||
export default UmbInstallerElement;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
import type { DocumentTypePropertyTypeContainerResponseModel } from './DocumentTypePropertyTypeContainerResponseModel';
|
||||
import type { DocumentTypePropertyTypeResponseModel } from './DocumentTypePropertyTypeResponseModel';
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
|
||||
export type ContentTypeForDocumentTypeResponseModel = {
|
||||
alias: string;
|
||||
@@ -14,6 +15,7 @@ export type ContentTypeForDocumentTypeResponseModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<DocumentTypePropertyTypeResponseModel>;
|
||||
containers: Array<DocumentTypePropertyTypeContainerResponseModel>;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
import type { MediaTypePropertyTypeContainerResponseModel } from './MediaTypePropertyTypeContainerResponseModel';
|
||||
import type { MediaTypePropertyTypeResponseModel } from './MediaTypePropertyTypeResponseModel';
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
|
||||
export type ContentTypeForMediaTypeResponseModel = {
|
||||
alias: string;
|
||||
@@ -14,6 +15,7 @@ export type ContentTypeForMediaTypeResponseModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<MediaTypePropertyTypeResponseModel>;
|
||||
containers: Array<MediaTypePropertyTypeContainerResponseModel>;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
import type { MemberTypePropertyTypeContainerResponseModel } from './MemberTypePropertyTypeContainerResponseModel';
|
||||
import type { MemberTypePropertyTypeResponseModel } from './MemberTypePropertyTypeResponseModel';
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
|
||||
export type ContentTypeForMemberTypeResponseModel = {
|
||||
alias: string;
|
||||
@@ -14,6 +15,7 @@ export type ContentTypeForMemberTypeResponseModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<MemberTypePropertyTypeResponseModel>;
|
||||
containers: Array<MemberTypePropertyTypeContainerResponseModel>;
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
|
||||
export type ContentTypeReferenceResponseModelBaseModel = {
|
||||
id: string;
|
||||
icon: string;
|
||||
hasListView: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
};
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ export type CreateContentTypeForDocumentTypeRequestModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<CreateDocumentTypePropertyTypeRequestModel>;
|
||||
containers: Array<CreateDocumentTypePropertyTypeContainerRequestModel>;
|
||||
|
||||
@@ -15,6 +15,7 @@ export type CreateContentTypeForMediaTypeRequestModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<CreateMediaTypePropertyTypeRequestModel>;
|
||||
containers: Array<CreateMediaTypePropertyTypeContainerRequestModel>;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
import type { CreateMemberTypePropertyTypeContainerRequestModel } from './CreateMemberTypePropertyTypeContainerRequestModel';
|
||||
import type { CreateMemberTypePropertyTypeRequestModel } from './CreateMemberTypePropertyTypeRequestModel';
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
|
||||
export type CreateContentTypeForMemberTypeRequestModel = {
|
||||
alias: string;
|
||||
@@ -14,6 +15,7 @@ export type CreateContentTypeForMemberTypeRequestModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<CreateMemberTypePropertyTypeRequestModel>;
|
||||
containers: Array<CreateMemberTypePropertyTypeContainerRequestModel>;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
import type { UpdateDocumentTypePropertyTypeContainerRequestModel } from './UpdateDocumentTypePropertyTypeContainerRequestModel';
|
||||
import type { UpdateDocumentTypePropertyTypeRequestModel } from './UpdateDocumentTypePropertyTypeRequestModel';
|
||||
|
||||
@@ -14,6 +15,7 @@ export type UpdateContentTypeForDocumentTypeRequestModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<UpdateDocumentTypePropertyTypeRequestModel>;
|
||||
containers: Array<UpdateDocumentTypePropertyTypeContainerRequestModel>;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
import type { UpdateMediaTypePropertyTypeContainerRequestModel } from './UpdateMediaTypePropertyTypeContainerRequestModel';
|
||||
import type { UpdateMediaTypePropertyTypeRequestModel } from './UpdateMediaTypePropertyTypeRequestModel';
|
||||
|
||||
@@ -14,6 +15,7 @@ export type UpdateContentTypeForMediaTypeRequestModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<UpdateMediaTypePropertyTypeRequestModel>;
|
||||
containers: Array<UpdateMediaTypePropertyTypeContainerRequestModel>;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
/* tslint:disable */
|
||||
/* eslint-disable */
|
||||
|
||||
import type { ReferenceByIdModel } from './ReferenceByIdModel';
|
||||
import type { UpdateMemberTypePropertyTypeContainerRequestModel } from './UpdateMemberTypePropertyTypeContainerRequestModel';
|
||||
import type { UpdateMemberTypePropertyTypeRequestModel } from './UpdateMemberTypePropertyTypeRequestModel';
|
||||
|
||||
@@ -14,6 +15,7 @@ export type UpdateContentTypeForMemberTypeRequestModel = {
|
||||
allowedAsRoot: boolean;
|
||||
variesByCulture: boolean;
|
||||
variesBySegment: boolean;
|
||||
collection?: ReferenceByIdModel | null;
|
||||
isElement: boolean;
|
||||
properties: Array<UpdateMemberTypePropertyTypeRequestModel>;
|
||||
containers: Array<UpdateMemberTypePropertyTypeContainerRequestModel>;
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
export { debounce, clamp, camelCase, groupBy } from 'lodash-es';
|
||||
@@ -207,7 +207,7 @@ export class RouterSlot<D = any, P = any> extends HTMLElement implements IRouter
|
||||
|
||||
// Register that the path has changed so the correct route can be loaded.
|
||||
if (navigate) {
|
||||
this.render().then();
|
||||
this.render();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,6 +259,8 @@ export class RouterSlot<D = any, P = any> extends HTMLElement implements IRouter
|
||||
*/
|
||||
protected clearChildren() {
|
||||
while (this.firstChild != null) {
|
||||
// If our route-component has a destroy method, then call it.
|
||||
(this.firstChild as any).destroy?.();
|
||||
this.firstChild.parentNode!.removeChild(this.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,15 +95,19 @@ export const UmbClassMixin = <T extends ClassConstructor>(superClass: T) => {
|
||||
this._host.addController(this);
|
||||
}
|
||||
|
||||
getHostElement() {
|
||||
getHostElement(): Element {
|
||||
return this._host.getHostElement();
|
||||
}
|
||||
|
||||
get controllerAlias() {
|
||||
get controllerAlias(): UmbControllerAlias {
|
||||
return this._controllerAlias;
|
||||
}
|
||||
|
||||
observe<T>(source: Observable<T>, callback: (_value: T) => void, controllerAlias?: UmbControllerAlias) {
|
||||
observe<T>(
|
||||
source: Observable<T>,
|
||||
callback: (_value: T) => void,
|
||||
controllerAlias?: UmbControllerAlias,
|
||||
): UmbObserverController<T> {
|
||||
return new UmbObserverController<T>(this, source, callback, controllerAlias);
|
||||
}
|
||||
|
||||
@@ -111,18 +115,21 @@ export const UmbClassMixin = <T extends ClassConstructor>(superClass: T) => {
|
||||
BaseType = unknown,
|
||||
ResultType extends BaseType = BaseType,
|
||||
InstanceType extends ResultType = ResultType,
|
||||
>(contextAlias: string | UmbContextToken<BaseType, ResultType>, instance: InstanceType) {
|
||||
>(
|
||||
contextAlias: string | UmbContextToken<BaseType, ResultType>,
|
||||
instance: InstanceType,
|
||||
): UmbContextProviderController<BaseType, ResultType, InstanceType> {
|
||||
return new UmbContextProviderController<BaseType, ResultType, InstanceType>(this, contextAlias, instance);
|
||||
}
|
||||
|
||||
consumeContext<BaseType = unknown, ResultType extends BaseType = BaseType>(
|
||||
contextAlias: string | UmbContextToken<BaseType, ResultType>,
|
||||
callback: UmbContextCallback<ResultType>,
|
||||
) {
|
||||
): UmbContextConsumerController<BaseType, ResultType> {
|
||||
return new UmbContextConsumerController(this, contextAlias, callback);
|
||||
}
|
||||
|
||||
public destroy() {
|
||||
public destroy(): void {
|
||||
if (this._host) {
|
||||
this._host.removeController(this);
|
||||
this._host = undefined as never;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import type { UmbContextToken } from '../context-api/index.js';
|
||||
import type { UmbControllerHost } from '../controller-api/index.js';
|
||||
import type { UmbContext } from './context.interface.js';
|
||||
import { UmbBaseController } from './controller-base.class.js';
|
||||
|
||||
/**
|
||||
@@ -7,10 +8,12 @@ import { UmbBaseController } from './controller-base.class.js';
|
||||
*
|
||||
*/
|
||||
export abstract class UmbContextBase<
|
||||
ContextType,
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
GivenContextToken extends UmbContextToken<any, ContextType> = UmbContextToken<any, ContextType>,
|
||||
> extends UmbBaseController {
|
||||
ContextType,
|
||||
GivenContextToken extends UmbContextToken<ContextType, ContextType> = UmbContextToken<ContextType, ContextType>,
|
||||
>
|
||||
extends UmbBaseController
|
||||
implements UmbContext
|
||||
{
|
||||
constructor(host: UmbControllerHost, contextToken: GivenContextToken | string) {
|
||||
super(host, contextToken.toString());
|
||||
this.provideContext(contextToken, this as unknown as ContextType);
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
import type { UmbController } from '../controller-api/controller.interface.js';
|
||||
|
||||
export interface UmbContext extends UmbController {}
|
||||
@@ -1,4 +1,5 @@
|
||||
export * from './class.interface.js';
|
||||
export * from './class.mixin.js';
|
||||
export * from './context.interface.js';
|
||||
export * from './context-base.class.js';
|
||||
export * from './controller-base.class.js';
|
||||
|
||||
@@ -24,7 +24,7 @@ export class UmbContextConsumerController<BaseType = unknown, ResultType extends
|
||||
host.addController(this);
|
||||
}
|
||||
|
||||
public destroy() {
|
||||
public destroy(): void {
|
||||
this.#host?.removeController(this);
|
||||
(this.#host as any) = undefined;
|
||||
super.destroy();
|
||||
|
||||
@@ -53,7 +53,7 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
* @memberof UmbContextConsumer
|
||||
* @description Skip the contexts provided by the requesting element.
|
||||
*/
|
||||
public skipOrigin() {
|
||||
public skipOrigin(): void {
|
||||
this.#skipOrigin = true;
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
* @description Pass beyond any context aliases that matches this.
|
||||
* The default behavior is to stop at first Context Alias match, this is to avoid receiving unforeseen descending contexts.
|
||||
*/
|
||||
public passContextAliasMatches() {
|
||||
public passContextAliasMatches(): void {
|
||||
this.#stopAtContextMatch = false;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
return false;
|
||||
};
|
||||
|
||||
protected setInstance(instance: ResultType) {
|
||||
protected setInstance(instance: ResultType): void {
|
||||
this.#instance = instance;
|
||||
this.#callback?.(instance);
|
||||
if (instance !== undefined) {
|
||||
@@ -98,7 +98,7 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
* @memberof UmbContextConsumer
|
||||
* @description Get the context as a promise.
|
||||
*/
|
||||
public asPromise() {
|
||||
public asPromise(): Promise<ResultType> {
|
||||
return (
|
||||
this.#promise ??
|
||||
(this.#promise = new Promise<ResultType>((resolve) => {
|
||||
@@ -112,7 +112,7 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
* @memberof UmbContextConsumer
|
||||
* @description Request the context from the host element.
|
||||
*/
|
||||
public request() {
|
||||
public request(): void {
|
||||
const event = new UmbContextRequestEventImplementation(
|
||||
this.#contextAlias,
|
||||
this.#apiAlias,
|
||||
@@ -122,20 +122,20 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
(this.#skipOrigin ? this.element.parentNode : this.element)?.dispatchEvent(event);
|
||||
}
|
||||
|
||||
public hostConnected() {
|
||||
public hostConnected(): void {
|
||||
// TODO: We need to use closets application element. We need this in order to have separate Backoffice running within or next to each other.
|
||||
window.addEventListener(UMB_CONTEXT_PROVIDE_EVENT_TYPE, this.#handleNewProvider);
|
||||
//window.addEventListener(umbContextUnprovidedEventType, this.#handleRemovedProvider);
|
||||
this.request();
|
||||
}
|
||||
|
||||
public hostDisconnected() {
|
||||
public hostDisconnected(): void {
|
||||
// TODO: We need to use closets application element. We need this in order to have separate Backoffice running within or next to each other.
|
||||
window.removeEventListener(UMB_CONTEXT_PROVIDE_EVENT_TYPE, this.#handleNewProvider);
|
||||
//window.removeEventListener(umbContextUnprovidedEventType, this.#handleRemovedProvider);
|
||||
}
|
||||
|
||||
#handleNewProvider = (event: Event) => {
|
||||
#handleNewProvider = (event: Event): void => {
|
||||
// Does seem a bit unnecessary, we could just assume the type via type casting...
|
||||
if (!isUmbContextProvideEventType(event)) return;
|
||||
|
||||
@@ -163,7 +163,7 @@ export class UmbContextConsumer<BaseType = unknown, ResultType extends BaseType
|
||||
}
|
||||
*/
|
||||
|
||||
public destroy() {
|
||||
public destroy(): void {
|
||||
this.hostDisconnected();
|
||||
this.#callback = undefined;
|
||||
this.#promise = undefined;
|
||||
|
||||
@@ -13,7 +13,7 @@ export class UmbContextProviderController<
|
||||
#host: UmbControllerHost;
|
||||
#controllerAlias: string;
|
||||
|
||||
public get controllerAlias() {
|
||||
public get controllerAlias(): string {
|
||||
return this.#controllerAlias;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ export class UmbContextProviderController<
|
||||
}
|
||||
}
|
||||
|
||||
public destroy() {
|
||||
public destroy(): void {
|
||||
if (this.#host) {
|
||||
this.#host.removeController(this);
|
||||
(this.#host as any) = undefined;
|
||||
|
||||
@@ -22,7 +22,7 @@ export class UmbContextProvider<BaseType = unknown, ResultType extends BaseType
|
||||
* Note this method should have a unique name for the provider controller, for it not to be confused with a consumer.
|
||||
* @returns {*}
|
||||
*/
|
||||
public providerInstance() {
|
||||
public providerInstance(): unknown {
|
||||
return this.#instance;
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ export class UmbContextProvider<BaseType = unknown, ResultType extends BaseType
|
||||
* @param {UmbContextRequestEvent} event
|
||||
* @memberof UmbContextProvider
|
||||
*/
|
||||
#handleContextRequest = ((event: UmbContextRequestEvent) => {
|
||||
#handleContextRequest = ((event: UmbContextRequestEvent): void => {
|
||||
if (event.contextAlias !== this.#contextAlias) return;
|
||||
|
||||
if (event.stopAtContextMatch) {
|
||||
@@ -71,7 +71,7 @@ export class UmbContextProvider<BaseType = unknown, ResultType extends BaseType
|
||||
/**
|
||||
* @memberof UmbContextProvider
|
||||
*/
|
||||
public hostConnected() {
|
||||
public hostConnected(): void {
|
||||
//this.hostElement.addEventListener(UMB_CONTENT_REQUEST_EVENT_TYPE, this.#handleContextRequest);
|
||||
this.#eventTarget.dispatchEvent(new UmbContextProvideEventImplementation(this.#contextAlias));
|
||||
|
||||
@@ -82,7 +82,7 @@ export class UmbContextProvider<BaseType = unknown, ResultType extends BaseType
|
||||
/**
|
||||
* @memberof UmbContextProvider
|
||||
*/
|
||||
public hostDisconnected() {
|
||||
public hostDisconnected(): void {
|
||||
//this.hostElement.removeEventListener(UMB_CONTENT_REQUEST_EVENT_TYPE, this.#handleContextRequest);
|
||||
// Out-commented for now, but kept if we like to reintroduce this:
|
||||
//window.dispatchEvent(new UmbContextUnprovidedEventImplementation(this._contextAlias, this.#instance));
|
||||
@@ -91,7 +91,7 @@ export class UmbContextProvider<BaseType = unknown, ResultType extends BaseType
|
||||
this.#eventTarget?.removeEventListener(UMB_DEBUG_CONTEXT_EVENT_TYPE, this._handleDebugContextRequest);
|
||||
}
|
||||
|
||||
private _handleDebugContextRequest = (event: any) => {
|
||||
private _handleDebugContextRequest = (event: any): void => {
|
||||
// If the event doesn't have an instances property, create it.
|
||||
if (!event.instances) {
|
||||
event.instances = new Map();
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import type { UmbControllerHostElement} from './controller-host-element.mixin.js';
|
||||
import type { UmbControllerHostElement } from './controller-host-element.mixin.js';
|
||||
import { UmbControllerHostElementMixin } from './controller-host-element.mixin.js';
|
||||
import { customElement } from '@umbraco-cms/backoffice/external/lit';
|
||||
|
||||
@customElement('umb-controller-host-provider')
|
||||
export class UmbControllerHostProviderElement
|
||||
extends UmbControllerHostElementMixin(HTMLElement)
|
||||
implements UmbControllerHostElement
|
||||
@@ -26,8 +28,6 @@ export class UmbControllerHostProviderElement
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define('umb-controller-host-provider', UmbControllerHostProviderElement);
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
'umb-controller-host-provider': UmbControllerHostProviderElement;
|
||||
|
||||
@@ -99,32 +99,34 @@ export const UmbControllerHostMixin = <T extends ClassConstructor>(superClass: T
|
||||
}
|
||||
}
|
||||
|
||||
hostConnected() {
|
||||
hostConnected(): void {
|
||||
this.#attached = true;
|
||||
// Note: this might not be optimal, as if hostDisconnected remove one of the controllers, then the next controller will be skipped.
|
||||
this.#controllers.forEach((ctrl: UmbController) => ctrl.hostConnected());
|
||||
}
|
||||
|
||||
hostDisconnected() {
|
||||
hostDisconnected(): void {
|
||||
this.#attached = false;
|
||||
// Note: this might not be optimal, as if hostDisconnected remove one of the controllers, then the next controller will be skipped.
|
||||
this.#controllers.forEach((ctrl: UmbController) => ctrl.hostDisconnected());
|
||||
}
|
||||
|
||||
destroy() {
|
||||
destroy(): void {
|
||||
let ctrl: UmbController | undefined;
|
||||
//let prev = null;
|
||||
let prev = null;
|
||||
// Note: A very important way of doing this loop, as foreach will skip over the next item if the current item is removed.
|
||||
while ((ctrl = this.#controllers[0])) {
|
||||
ctrl.destroy();
|
||||
/*
|
||||
//This code can help debug if there is some controller that does not destroy properly: (When a controller is destroyed it should remove it self)
|
||||
|
||||
// Help developer realize that they made a mistake in code:
|
||||
if (ctrl === prev) {
|
||||
console.log('WUPS, we have a controller that does not destroy it self');
|
||||
debugger;
|
||||
throw new Error(
|
||||
`Controller with controller alias: '${ctrl.controllerAlias?.toString()}' and class name: '${
|
||||
(ctrl as any).constructor.name
|
||||
}', does not remove it self when destroyed. This can cause memory leaks. Please fix this issue.`,
|
||||
);
|
||||
}
|
||||
prev = ctrl;
|
||||
*/
|
||||
}
|
||||
this.#controllers.length = 0;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ export const UmbElementMixin = <T extends HTMLElementConstructor>(superClass: T)
|
||||
* @return {UmbObserverController} Reference to a Observer Controller instance
|
||||
* @memberof UmbElementMixin
|
||||
*/
|
||||
observe<T>(source: Observable<T>, callback: ObserverCallback<T>, unique?: string) {
|
||||
observe<T>(source: Observable<T>, callback: ObserverCallback<T>, unique?: string): UmbObserverController<T> {
|
||||
return new UmbObserverController<T>(this, source, callback, unique);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import type { SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import { map } from '@umbraco-cms/backoffice/external/rxjs';
|
||||
import type {
|
||||
ManifestBase,
|
||||
@@ -22,7 +22,7 @@ export type PermittedControllerType<ControllerType extends { manifest: any }> =
|
||||
*/
|
||||
export abstract class UmbBaseExtensionsInitializer<
|
||||
ManifestTypes extends ManifestBase,
|
||||
ManifestTypeName extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
ManifestTypeName extends string,
|
||||
ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, ManifestTypeName>,
|
||||
ControllerType extends UmbBaseExtensionInitializer<ManifestType> = UmbBaseExtensionInitializer<ManifestType>,
|
||||
MyPermittedControllerType extends ControllerType = PermittedControllerType<ControllerType>,
|
||||
@@ -45,7 +45,7 @@ export abstract class UmbBaseExtensionsInitializer<
|
||||
|
||||
constructor(
|
||||
host: UmbControllerHost,
|
||||
extensionRegistry: UmbExtensionRegistry<ManifestType>,
|
||||
extensionRegistry: UmbExtensionRegistry<ManifestTypes>,
|
||||
type: ManifestTypeName | Array<ManifestTypeName>,
|
||||
filter: undefined | null | ((manifest: ManifestType) => boolean),
|
||||
onChange?: (permittedManifests: Array<MyPermittedControllerType>) => void,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import type { SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import {
|
||||
type PermittedControllerType,
|
||||
UmbBaseExtensionsInitializer,
|
||||
@@ -21,7 +21,7 @@ TODO: Correct this, start using builder pattern:
|
||||
*/
|
||||
export class UmbExtensionsApiInitializer<
|
||||
ManifestTypes extends ManifestApi,
|
||||
ManifestTypeName extends keyof ManifestTypeMap<ManifestTypes> | string = string,
|
||||
ManifestTypeName extends string = string,
|
||||
ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, ManifestTypeName>,
|
||||
ManifestTypeAsApi extends ManifestApi = ManifestType extends ManifestApi ? ManifestType : never,
|
||||
ControllerType extends UmbExtensionApiInitializer<ManifestTypeAsApi> = UmbExtensionApiInitializer<ManifestTypeAsApi>,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ManifestBase } from '../types/index.js';
|
||||
import type { UmbExtensionRegistry } from '../registry/extension.registry.js';
|
||||
import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import type { SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import { UmbExtensionElementInitializer } from './extension-element-initializer.controller.js';
|
||||
import {
|
||||
type PermittedControllerType,
|
||||
@@ -11,8 +11,8 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
/**
|
||||
*/
|
||||
export class UmbExtensionsElementInitializer<
|
||||
ManifestTypes extends ManifestBase,
|
||||
ManifestTypeName extends keyof ManifestTypeMap<ManifestTypes> | string = ManifestTypes['type'],
|
||||
ManifestTypes extends ManifestBase = ManifestBase,
|
||||
ManifestTypeName extends string = string,
|
||||
ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, ManifestTypeName>,
|
||||
ControllerType extends UmbExtensionElementInitializer<ManifestType> = UmbExtensionElementInitializer<ManifestType>,
|
||||
MyPermittedControllerType extends ControllerType = PermittedControllerType<ControllerType>,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import type { SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import { UmbExtensionManifestInitializer } from './extension-manifest-initializer.controller.js';
|
||||
import {
|
||||
type PermittedControllerType,
|
||||
@@ -11,7 +11,7 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
*/
|
||||
export class UmbExtensionsManifestInitializer<
|
||||
ManifestTypes extends ManifestBase,
|
||||
ManifestTypeName extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
ManifestTypeName extends string,
|
||||
ManifestType extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, ManifestTypeName>,
|
||||
ControllerType extends UmbExtensionManifestInitializer<ManifestType> = UmbExtensionManifestInitializer<ManifestType>,
|
||||
MyPermittedControllerType extends ControllerType = PermittedControllerType<ControllerType>,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { ManifestBase, ManifestKind } from '../types/index.js';
|
||||
import type { ManifestTypeMap, SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import type { SpecificManifestTypeOrManifestBase } from '../types/map.types.js';
|
||||
import { UmbBasicState } from '@umbraco-cms/backoffice/observable-api';
|
||||
import type { Observable } from '@umbraco-cms/backoffice/external/rxjs';
|
||||
import { map, distinctUntilChanged, combineLatest, of, switchMap } from '@umbraco-cms/backoffice/external/rxjs';
|
||||
@@ -67,7 +67,7 @@ function extensionAndKindMatchSingleMemoization<
|
||||
return previousValue === currentValue;
|
||||
}
|
||||
|
||||
const sortExtensions = (a: ManifestBase, b: ManifestBase) => (b.weight || 0) - (a.weight || 0);
|
||||
const sortExtensions = (a: ManifestBase, b: ManifestBase): number => (b.weight || 0) - (a.weight || 0);
|
||||
|
||||
export class UmbExtensionRegistry<
|
||||
IncomingManifestTypes extends ManifestBase,
|
||||
@@ -81,7 +81,7 @@ export class UmbExtensionRegistry<
|
||||
private _kinds = new UmbBasicState<Array<ManifestKind<ManifestTypes>>>([]);
|
||||
public readonly kinds = this._kinds.asObservable();
|
||||
|
||||
defineKind(kind: ManifestKind<ManifestTypes>) {
|
||||
defineKind(kind: ManifestKind<ManifestTypes>): void {
|
||||
const extensionsValues = this._extensions.getValue();
|
||||
const extension = extensionsValues.find(
|
||||
(extension) => extension.alias === (kind as ManifestKind<ManifestTypes>).alias,
|
||||
@@ -174,7 +174,7 @@ export class UmbExtensionRegistry<
|
||||
return true;
|
||||
}
|
||||
|
||||
#kindsOfType<Key extends keyof ManifestTypeMap<ManifestTypes> | string>(type: Key) {
|
||||
#kindsOfType<Key extends string>(type: Key): Observable<ManifestKind<ManifestTypes>[]> {
|
||||
return this.kinds.pipe(
|
||||
map((kinds) => kinds.filter((kind) => kind.matchType === type)),
|
||||
distinctUntilChanged(extensionArrayMemoization),
|
||||
@@ -182,15 +182,15 @@ export class UmbExtensionRegistry<
|
||||
}
|
||||
|
||||
#extensionsOfType<
|
||||
Key extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
Key extends string,
|
||||
T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>,
|
||||
>(type: Key) {
|
||||
>(type: Key): Observable<Array<T>> {
|
||||
return this.extensions.pipe(
|
||||
map((exts) => exts.filter((ext) => ext.type === type) as unknown as T[]),
|
||||
distinctUntilChanged(extensionArrayMemoization),
|
||||
);
|
||||
}
|
||||
#kindsOfTypes(types: string[]) {
|
||||
#kindsOfTypes(types: string[]): Observable<ManifestKind<ManifestTypes>[]> {
|
||||
return this.kinds.pipe(
|
||||
map((kinds) => kinds.filter((kind) => types.indexOf(kind.matchType) !== -1)),
|
||||
distinctUntilChanged(extensionArrayMemoization),
|
||||
@@ -252,7 +252,7 @@ export class UmbExtensionRegistry<
|
||||
* @param alias {string} - The alias of the extensions to get.
|
||||
* @returns {Observable<T | undefined>} - An observable of the extension that matches the alias.
|
||||
*/
|
||||
byAlias<T extends ManifestBase = ManifestBase>(alias: string) {
|
||||
byAlias<T extends ManifestBase = ManifestBase>(alias: string): Observable<T | undefined> {
|
||||
return this.extensions.pipe(
|
||||
map((exts) => exts.find((ext) => ext.alias === alias)),
|
||||
distinctUntilChanged(extensionSingleMemoization),
|
||||
@@ -277,10 +277,10 @@ export class UmbExtensionRegistry<
|
||||
* @param alias {string} - The alias of the extensions to get.
|
||||
* @returns {Observable<T | undefined>} - An observable of the extensions that matches the type and alias.
|
||||
*/
|
||||
byTypeAndAlias<
|
||||
Key extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>,
|
||||
>(type: Key, alias: string) {
|
||||
byTypeAndAlias<Key extends string, T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>>(
|
||||
type: Key,
|
||||
alias: string,
|
||||
): Observable<T | undefined> {
|
||||
return combineLatest([
|
||||
this.extensions.pipe(
|
||||
map((exts) => exts.find((ext) => ext.type === type && ext.alias === alias)),
|
||||
@@ -297,10 +297,10 @@ export class UmbExtensionRegistry<
|
||||
*/
|
||||
getByTypeAndAlias = this.byTypeAndAlias.bind(this);
|
||||
|
||||
byTypeAndAliases<
|
||||
Key extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>,
|
||||
>(type: Key, aliases: Array<string>) {
|
||||
byTypeAndAliases<Key extends string, T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>>(
|
||||
type: Key,
|
||||
aliases: Array<string>,
|
||||
): Observable<Array<T>> {
|
||||
return combineLatest([
|
||||
this.extensions.pipe(
|
||||
map((exts) => exts.filter((ext) => ext.type === type && aliases.indexOf(ext.alias) !== -1) as unknown as T[]),
|
||||
@@ -325,10 +325,10 @@ export class UmbExtensionRegistry<
|
||||
* @param filter {(ext: T): void} - The filter method to use to filter the extensions
|
||||
* @returns {Observable<Array<T>>} - An observable of the extensions that matches the type and filter method
|
||||
*/
|
||||
byTypeAndFilter<
|
||||
Key extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>,
|
||||
>(type: Key, filter: (ext: T) => boolean) {
|
||||
byTypeAndFilter<Key extends string, T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>>(
|
||||
type: Key,
|
||||
filter: (ext: T) => boolean,
|
||||
): Observable<Array<T>> {
|
||||
return combineLatest([
|
||||
this.extensions.pipe(
|
||||
map((exts) => exts.filter((ext) => ext.type === type && filter(ext as unknown as T)) as unknown as T[]),
|
||||
@@ -346,10 +346,9 @@ export class UmbExtensionRegistry<
|
||||
* @param type {string} - The type of the extensions to get.
|
||||
* @returns {Observable<T | undefined>} - An observable of the extensions that matches the type.
|
||||
*/
|
||||
byType<
|
||||
Key extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>,
|
||||
>(type: Key) {
|
||||
byType<Key extends string, T extends ManifestBase = SpecificManifestTypeOrManifestBase<ManifestTypes, Key>>(
|
||||
type: Key,
|
||||
): Observable<Array<T>> {
|
||||
return combineLatest([this.#extensionsOfType(type), this.#kindsOfType(type)]).pipe(
|
||||
map(this.#mergeExtensionsWithKinds),
|
||||
distinctUntilChanged(extensionAndKindMatchArrayMemoization),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ManifestBase } from './manifest-base.interface.js';
|
||||
|
||||
export type ManifestTypeMap<ManifestTypes extends ManifestBase> = {
|
||||
type ManifestTypeMapGenerator<ManifestTypes extends ManifestBase> = {
|
||||
[Manifest in ManifestTypes as Manifest['type']]: Manifest;
|
||||
} & {
|
||||
[key: string]: ManifestBase;
|
||||
@@ -8,5 +8,6 @@ export type ManifestTypeMap<ManifestTypes extends ManifestBase> = {
|
||||
|
||||
export type SpecificManifestTypeOrManifestBase<
|
||||
ManifestTypes extends ManifestBase,
|
||||
T extends keyof ManifestTypeMap<ManifestTypes> | string,
|
||||
> = T extends keyof ManifestTypeMap<ManifestTypes> ? ManifestTypeMap<ManifestTypes>[T] : ManifestBase;
|
||||
T extends string,
|
||||
ManifestTypeMapType = ManifestTypeMapGenerator<ManifestTypes>,
|
||||
> = T extends keyof ManifestTypeMapType ? ManifestTypeMapType[T] : ManifestBase;
|
||||
|
||||
@@ -65,6 +65,7 @@ export class UmbLocalizationController<LocalizationSetType extends UmbLocalizati
|
||||
destroy(): void {
|
||||
this.#host?.removeController(this);
|
||||
this.#hostEl = undefined as any;
|
||||
this.#usedKeys.length = 0;
|
||||
}
|
||||
|
||||
documentUpdate() {
|
||||
|
||||
@@ -6,7 +6,7 @@ export class UmbObserverController<T = unknown> extends UmbObserver<T> implement
|
||||
#host: UmbControllerHost;
|
||||
#alias?: UmbControllerAlias;
|
||||
|
||||
public get controllerAlias() {
|
||||
public get controllerAlias(): UmbControllerAlias {
|
||||
return this.#alias;
|
||||
}
|
||||
|
||||
|
||||
@@ -674,6 +674,8 @@ export const data: Array<UmbMockDataTypeModel> = [
|
||||
{
|
||||
label: 'Mocked Block Type for Block Grid',
|
||||
contentElementTypeKey: '4f68ba66-6fb2-4778-83b8-6ab4ca3a7c5c',
|
||||
allowAtRoot: true,
|
||||
allowInAreas: true,
|
||||
rowMinSpan: 1,
|
||||
rowMaxSpan: 2,
|
||||
columnSpanOptions: [
|
||||
@@ -720,7 +722,7 @@ export const data: Array<UmbMockDataTypeModel> = [
|
||||
iconColor: '#FFFDD0',
|
||||
backgroundColor: '#633f32',
|
||||
editorSize: 'medium',
|
||||
icon: 'icon-coffee',
|
||||
allowInAreas: true,
|
||||
},
|
||||
|
||||
{
|
||||
@@ -728,37 +730,36 @@ export const data: Array<UmbMockDataTypeModel> = [
|
||||
contentElementTypeKey: 'headline-umbraco-demo-block-id',
|
||||
backgroundColor: 'gold',
|
||||
editorSize: 'medium',
|
||||
icon: 'icon-edit',
|
||||
groupKey: 'demo-block-group-id',
|
||||
allowInAreas: true,
|
||||
},
|
||||
{
|
||||
label: 'Image',
|
||||
contentElementTypeKey: 'image-umbraco-demo-block-id',
|
||||
editorSize: 'medium',
|
||||
icon: 'icon-picture',
|
||||
|
||||
groupKey: 'demo-block-group-id',
|
||||
allowInAreas: true,
|
||||
},
|
||||
{
|
||||
label: 'Rich Text',
|
||||
contentElementTypeKey: 'rich-text-umbraco-demo-block-id',
|
||||
editorSize: 'medium',
|
||||
icon: 'icon-diploma',
|
||||
groupKey: 'demo-block-group-id',
|
||||
allowInAreas: true,
|
||||
},
|
||||
{
|
||||
label: 'Two Column Layout',
|
||||
contentElementTypeKey: 'two-column-layout-umbraco-demo-block-id',
|
||||
editorSize: 'medium',
|
||||
icon: 'icon-book-alt',
|
||||
groupKey: 'demo-block-group-id',
|
||||
allowAtRoot: false,
|
||||
},
|
||||
{
|
||||
label: 'Test broken group key',
|
||||
contentElementTypeKey: 'test-block-id',
|
||||
editorSize: 'medium',
|
||||
icon: 'icon-war',
|
||||
groupKey: 'group-id-that-does-not-exist',
|
||||
allowAtRoot: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -754,8 +754,8 @@ export const data: Array<UmbMockDocumentTypeModel> = [
|
||||
keepAllVersionsNewerThanDays: null,
|
||||
keepLatestVersionPerDayForDays: null,
|
||||
},
|
||||
collection: { id: 'dt-collectionView' },
|
||||
},
|
||||
|
||||
{
|
||||
allowedTemplates: [],
|
||||
defaultTemplate: null,
|
||||
|
||||
@@ -118,6 +118,7 @@ const documentTypeDetailMapper = (item: UmbMockDocumentTypeModel): DocumentTypeR
|
||||
compositions: item.compositions,
|
||||
allowedTemplates: item.allowedTemplates,
|
||||
cleanup: item.cleanup,
|
||||
collection: item.collection,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@ export const data: Array<UmbMockDocumentModel> = [
|
||||
documentType: {
|
||||
id: 'all-property-editors-document-type-id',
|
||||
icon: 'icon-document',
|
||||
hasListView: false,
|
||||
},
|
||||
hasChildren: false,
|
||||
noAccess: false,
|
||||
@@ -502,7 +501,6 @@ export const data: Array<UmbMockDocumentModel> = [
|
||||
documentType: {
|
||||
id: '29643452-cff9-47f2-98cd-7de4b6807681',
|
||||
icon: 'icon-document',
|
||||
hasListView: false,
|
||||
},
|
||||
hasChildren: false,
|
||||
noAccess: false,
|
||||
@@ -626,7 +624,6 @@ export const data: Array<UmbMockDocumentModel> = [
|
||||
documentType: {
|
||||
id: '29643452-cff9-47f2-98cd-7de4b6807681',
|
||||
icon: 'icon-document',
|
||||
hasListView: false,
|
||||
},
|
||||
hasChildren: false,
|
||||
noAccess: false,
|
||||
@@ -707,7 +704,7 @@ export const data: Array<UmbMockDocumentModel> = [
|
||||
documentType: {
|
||||
id: 'simple-document-type-id',
|
||||
icon: 'icon-document',
|
||||
hasListView: true,
|
||||
collection: { id: 'dt-collectionView'},
|
||||
},
|
||||
hasChildren: false,
|
||||
noAccess: false,
|
||||
|
||||
@@ -47,7 +47,6 @@ const treeItemMapper = (model: UmbMockDocumentModel): Omit<DocumentTreeItemRespo
|
||||
|
||||
return {
|
||||
documentType: {
|
||||
hasListView: false,
|
||||
icon: documentType.icon,
|
||||
id: documentType.id,
|
||||
},
|
||||
@@ -71,7 +70,7 @@ const createMockDocumentMapper = (request: CreateDocumentRequestModel): UmbMockD
|
||||
documentType: {
|
||||
id: documentType.id,
|
||||
icon: documentType.icon,
|
||||
hasListView: false, // TODO: get list from doc type when ready
|
||||
collection: undefined, // TODO: get list from doc type when ready
|
||||
},
|
||||
hasChildren: false,
|
||||
id: request.id ? request.id : UmbId.new(),
|
||||
@@ -110,7 +109,7 @@ const detailResponseMapper = (model: UmbMockDocumentModel): DocumentResponseMode
|
||||
const itemMapper = (model: UmbMockDocumentModel): DocumentItemResponseModel => {
|
||||
return {
|
||||
documentType: {
|
||||
hasListView: model.documentType.hasListView,
|
||||
collection: model.documentType.collection,
|
||||
icon: model.documentType.icon,
|
||||
id: model.documentType.id,
|
||||
},
|
||||
|
||||
@@ -67,7 +67,7 @@ export const data: Array<UmbMockMediaTypeModel> = [
|
||||
sortOrder: 0,
|
||||
},
|
||||
],
|
||||
allowedAsRoot: false,
|
||||
allowedAsRoot: true,
|
||||
variesByCulture: false,
|
||||
variesBySegment: false,
|
||||
isElement: false,
|
||||
|
||||
@@ -7,11 +7,14 @@ import type { UmbMockMediaTypeModel } from './media-type.data.js';
|
||||
import { data } from './media-type.data.js';
|
||||
import { UmbId } from '@umbraco-cms/backoffice/id';
|
||||
import type {
|
||||
AllowedMediaTypeModel,
|
||||
CreateFolderRequestModel,
|
||||
CreateMediaTypeRequestModel,
|
||||
MediaTypeItemResponseModel,
|
||||
MediaTypeResponseModel,
|
||||
MediaTypeSortModel,
|
||||
MediaTypeTreeItemResponseModel,
|
||||
PagedAllowedMediaTypeModel,
|
||||
} from '@umbraco-cms/backoffice/external/backend-api';
|
||||
|
||||
class UmbMediaTypeMockDB extends UmbEntityMockDbBase<UmbMockMediaTypeModel> {
|
||||
@@ -27,6 +30,21 @@ class UmbMediaTypeMockDB extends UmbEntityMockDbBase<UmbMockMediaTypeModel> {
|
||||
constructor(data: Array<UmbMockMediaTypeModel>) {
|
||||
super(data);
|
||||
}
|
||||
|
||||
getAllowedChildren(id: string): PagedAllowedMediaTypeModel {
|
||||
const mediaType = this.detail.read(id);
|
||||
const allowedMediaTypes = mediaType.allowedMediaTypes.map((sortModel: MediaTypeSortModel) =>
|
||||
this.detail.read(sortModel.mediaType.id),
|
||||
);
|
||||
const mappedItems = allowedMediaTypes.map((item: UmbMockMediaTypeModel) => allowedMediaTypeMapper(item));
|
||||
return { items: mappedItems, total: mappedItems.length };
|
||||
}
|
||||
|
||||
getAllowedAtRoot(): PagedAllowedMediaTypeModel {
|
||||
const mockItems = this.data.filter((item) => item.allowedAsRoot);
|
||||
const mappedItems = mockItems.map((item) => allowedMediaTypeMapper(item));
|
||||
return { items: mappedItems, total: mappedItems.length };
|
||||
}
|
||||
}
|
||||
|
||||
const createMockMediaTypeFolderMapper = (request: CreateFolderRequestModel): UmbMockMediaTypeModel => {
|
||||
@@ -108,4 +126,13 @@ const mediaTypeItemMapper = (item: UmbMockMediaTypeModel): MediaTypeItemResponse
|
||||
};
|
||||
};
|
||||
|
||||
const allowedMediaTypeMapper = (item: UmbMockMediaTypeModel): AllowedMediaTypeModel => {
|
||||
return {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
description: item.description,
|
||||
icon: item.icon,
|
||||
};
|
||||
};
|
||||
|
||||
export const umbMediaTypeMockDb = new UmbMediaTypeMockDB(data);
|
||||
|
||||
@@ -18,7 +18,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [
|
||||
{
|
||||
@@ -47,7 +46,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [
|
||||
{
|
||||
@@ -76,7 +74,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [],
|
||||
variants: [
|
||||
@@ -100,7 +97,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [],
|
||||
variants: [
|
||||
@@ -124,7 +120,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [
|
||||
{
|
||||
@@ -153,7 +148,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [
|
||||
{
|
||||
@@ -161,14 +155,16 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
value: 'Every day, a rabbit in a military costume greets me at the front door',
|
||||
},
|
||||
],
|
||||
variants: [{
|
||||
publishDate: '2023-02-06T15:31:51.354764',
|
||||
culture: 'en-us',
|
||||
segment: null,
|
||||
name: 'John Doe',
|
||||
createDate: '2023-02-06T15:31:46.876902',
|
||||
updateDate: '2023-02-06T15:31:51.354764',
|
||||
},],
|
||||
variants: [
|
||||
{
|
||||
publishDate: '2023-02-06T15:31:51.354764',
|
||||
culture: 'en-us',
|
||||
segment: null,
|
||||
name: 'John Doe',
|
||||
createDate: '2023-02-06T15:31:46.876902',
|
||||
updateDate: '2023-02-06T15:31:51.354764',
|
||||
},
|
||||
],
|
||||
urls: [],
|
||||
},
|
||||
{
|
||||
@@ -180,7 +176,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [
|
||||
{
|
||||
@@ -209,7 +204,6 @@ export const data: Array<UmbMockMediaModel> = [
|
||||
mediaType: {
|
||||
id: 'media-type-1-id',
|
||||
icon: 'icon-bug',
|
||||
hasListView: false,
|
||||
},
|
||||
values: [
|
||||
{
|
||||
|
||||
@@ -34,7 +34,7 @@ const treeItemMapper = (model: UmbMockMediaModel): Omit<MediaTreeItemResponseMod
|
||||
|
||||
return {
|
||||
mediaType: {
|
||||
hasListView: model.mediaType.hasListView,
|
||||
collection: model.mediaType.collection,
|
||||
icon: model.mediaType.icon,
|
||||
id: model.mediaType.id,
|
||||
},
|
||||
@@ -57,7 +57,7 @@ const createMockMediaMapper = (request: CreateMediaRequestModel): UmbMockMediaMo
|
||||
mediaType: {
|
||||
id: mediaType.id,
|
||||
icon: mediaType.icon,
|
||||
hasListView: false, // TODO: get list from doc type when ready
|
||||
collection: mediaType.collection,
|
||||
},
|
||||
hasChildren: false,
|
||||
id: request.id ? request.id : UmbId.new(),
|
||||
@@ -93,7 +93,7 @@ const detailResponseMapper = (model: UmbMockMediaModel): MediaResponseModel => {
|
||||
const itemMapper = (model: UmbMockMediaModel): MediaItemResponseModel => {
|
||||
return {
|
||||
mediaType: {
|
||||
hasListView: model.mediaType.hasListView,
|
||||
collection: model.mediaType.collection,
|
||||
icon: model.mediaType.icon,
|
||||
id: model.mediaType.id,
|
||||
},
|
||||
|
||||
@@ -14,7 +14,7 @@ export const data: Array<UmbMockMemberModel> = [
|
||||
lastLockoutDate: null,
|
||||
lastLoginDate: null,
|
||||
lastPasswordChangeDate: null,
|
||||
memberType: { id: 'member-type-1-id', icon: '', hasListView: false },
|
||||
memberType: { id: 'member-type-1-id', icon: '' },
|
||||
username: 'member1',
|
||||
values: [],
|
||||
variants: [
|
||||
@@ -38,7 +38,7 @@ export const data: Array<UmbMockMemberModel> = [
|
||||
lastLockoutDate: null,
|
||||
lastLoginDate: null,
|
||||
lastPasswordChangeDate: null,
|
||||
memberType: { id: 'member-type-1-id', icon: '', hasListView: false },
|
||||
memberType: { id: 'member-type-1-id', icon: '' },
|
||||
username: 'member2',
|
||||
values: [],
|
||||
variants: [
|
||||
@@ -62,7 +62,7 @@ export const data: Array<UmbMockMemberModel> = [
|
||||
lastLockoutDate: null,
|
||||
lastLoginDate: null,
|
||||
lastPasswordChangeDate: null,
|
||||
memberType: { id: 'member-type-1-id', icon: '', hasListView: false },
|
||||
memberType: { id: 'member-type-1-id', icon: '' },
|
||||
username: 'member3',
|
||||
values: [],
|
||||
variants: [
|
||||
|
||||
@@ -42,7 +42,6 @@ const createDetailMockMapper = (request: CreateMemberRequestModel): UmbMockMembe
|
||||
memberType: {
|
||||
id: memberType.id,
|
||||
icon: memberType.icon,
|
||||
hasListView: memberType.hasListView,
|
||||
},
|
||||
username: request.username,
|
||||
values: request.values,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { treeHandlers } from './tree.handlers.js';
|
||||
import { itemHandlers } from './item.handlers.js';
|
||||
import { detailHandlers } from './detail.handlers.js';
|
||||
import { itemHandlers } from './item.handlers.js';
|
||||
import { folderHandlers } from './folder.handlers.js';
|
||||
import { structureHandlers } from './structure.handlers.js';
|
||||
|
||||
export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...detailHandlers];
|
||||
export const handlers = [...treeHandlers, ...itemHandlers, ...folderHandlers, ...structureHandlers, ...detailHandlers];
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
const { rest } = window.MockServiceWorker;
|
||||
import { umbMediaTypeMockDb } from '../../data/media-type/media-type.db.js';
|
||||
import { UMB_SLUG } from './slug.js';
|
||||
import { umbracoPath } from '@umbraco-cms/backoffice/utils';
|
||||
|
||||
export const structureHandlers = [
|
||||
rest.get(umbracoPath(`${UMB_SLUG}/:id/allowed-children`), (req, res, ctx) => {
|
||||
const id = req.params.id as string;
|
||||
if (!id) return res(ctx.status(400));
|
||||
const response = umbMediaTypeMockDb.getAllowedChildren(id);
|
||||
return res(ctx.status(200), ctx.json(response));
|
||||
}),
|
||||
|
||||
rest.get(umbracoPath(`${UMB_SLUG}/allowed-at-root`), (req, res, ctx) => {
|
||||
const response = umbMediaTypeMockDb.getAllowedAtRoot();
|
||||
return res(ctx.status(200), ctx.json(response));
|
||||
}),
|
||||
];
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
} from '../../context/block-grid-scale-manager/block-grid-scale-manager.controller.js';
|
||||
import { UMB_BLOCK_GRID_AREA_TYPE_ENTRIES_CONTEXT } from '../../property-editors/block-grid-areas-config/block-grid-area-type-entries.context-token.js';
|
||||
import { UMB_BLOCK_GRID_AREA_CONFIG_ENTRY_CONTEXT } from './block-grid-area-config-entry.context-token.js';
|
||||
import type { UmbBlockGridTypeAreaType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockGridTypeAreaType } from '@umbraco-cms/backoffice/block-grid';
|
||||
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
|
||||
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from '../../context/block-grid-manager.context.js';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { UMB_BLOCK_GRID_ENTRY_CONTEXT, type UmbBlockGridTypeAreaType } from '@umbraco-cms/backoffice/block';
|
||||
import { UMB_BLOCK_GRID_ENTRY_CONTEXT, type UmbBlockGridTypeAreaType } from '@umbraco-cms/backoffice/block-grid';
|
||||
import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
|
||||
import '../block-grid-entries/index.js';
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
import {
|
||||
getAccumulatedValueOfIndex,
|
||||
getInterpolatedIndexOfPositionInWeightMap,
|
||||
isWithinRect,
|
||||
} from '@umbraco-cms/backoffice/utils';
|
||||
import { UmbBlockGridEntriesContext } from '../../context/block-grid-entries.context.js';
|
||||
import type { UmbBlockGridEntryElement } from '../block-grid-entry/index.js';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import type { UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid';
|
||||
import { html, customElement, state, repeat, css, property } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import '../block-grid-entry/index.js';
|
||||
@@ -11,51 +16,17 @@ import {
|
||||
type resolveVerticalDirectionArgs,
|
||||
} from '@umbraco-cms/backoffice/sorter';
|
||||
|
||||
// Utils:
|
||||
// TODO: Move these methods into their own files:
|
||||
|
||||
function getInterpolatedIndexOfPositionInWeightMap(target: number, weights: Array<number>) {
|
||||
const map = [0];
|
||||
weights.reduce((a, b, i) => {
|
||||
return (map[i + 1] = a + b);
|
||||
}, 0);
|
||||
const foundValue = map.reduce((a, b) => {
|
||||
const aDiff = Math.abs(a - target);
|
||||
const bDiff = Math.abs(b - target);
|
||||
|
||||
if (aDiff === bDiff) {
|
||||
return a < b ? a : b;
|
||||
} else {
|
||||
return bDiff < aDiff ? b : a;
|
||||
}
|
||||
});
|
||||
const foundIndex = map.indexOf(foundValue);
|
||||
const targetDiff = target - foundValue;
|
||||
let interpolatedIndex = foundIndex;
|
||||
if (targetDiff < 0 && foundIndex === 0) {
|
||||
// Don't adjust.
|
||||
} else if (targetDiff > 0 && foundIndex === map.length - 1) {
|
||||
// Don't adjust.
|
||||
} else {
|
||||
const foundInterpolationWeight = weights[targetDiff >= 0 ? foundIndex : foundIndex - 1];
|
||||
interpolatedIndex += foundInterpolationWeight === 0 ? interpolatedIndex : targetDiff / foundInterpolationWeight;
|
||||
}
|
||||
return interpolatedIndex;
|
||||
}
|
||||
|
||||
function getAccumulatedValueOfIndex(index: number, weights: Array<number>) {
|
||||
const len = Math.min(index, weights.length);
|
||||
let i = 0,
|
||||
calc = 0;
|
||||
while (i < len) {
|
||||
calc += weights[i++];
|
||||
}
|
||||
return calc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notice this utility method is not really shareable with others as it also takes areas into account. [NL]
|
||||
*/
|
||||
function resolveVerticalDirectionAsGrid(
|
||||
args: resolveVerticalDirectionArgs<UmbBlockGridLayoutModel, UmbBlockGridEntryElement>,
|
||||
) {
|
||||
// If this has areas, we do not want to move, unless we are at the edge
|
||||
if (args.relatedModel.areas.length > 0 && isWithinRect(args.pointerX, args.pointerY, args.relatedRect, -10)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/** We need some data about the grid to figure out if there is room to be placed next to the found element */
|
||||
const approvedContainerComputedStyles = getComputedStyle(args.containerElement);
|
||||
const gridColumnGap = Number(approvedContainerComputedStyles.columnGap.split('px')[0]) || 0;
|
||||
@@ -140,9 +111,24 @@ export class UmbBlockGridEntriesElement extends UmbLitElement {
|
||||
//
|
||||
#sorter = new UmbSorterController<UmbBlockGridLayoutModel, UmbBlockGridEntryElement>(this, {
|
||||
...SORTER_CONFIG,
|
||||
onStart: () => {
|
||||
this.#context.onDragStart();
|
||||
},
|
||||
onEnd: () => {
|
||||
this.#context.onDragEnd();
|
||||
},
|
||||
onChange: ({ model }) => {
|
||||
this.#context.setLayouts(model);
|
||||
},
|
||||
onRequestMove: ({ item }) => {
|
||||
return this.#context.allowDrop(item.contentUdi);
|
||||
},
|
||||
onDisallowed: () => {
|
||||
this.setAttribute('disallow-drop', '');
|
||||
},
|
||||
onAllowed: () => {
|
||||
this.removeAttribute('disallow-drop');
|
||||
},
|
||||
});
|
||||
|
||||
#context = new UmbBlockGridEntriesContext(this);
|
||||
@@ -200,7 +186,7 @@ export class UmbBlockGridEntriesElement extends UmbLitElement {
|
||||
render() {
|
||||
return html`
|
||||
${this._styleElement}
|
||||
<div class="umb-block-grid__layout-container">
|
||||
<div class="umb-block-grid__layout-container" data-area-length=${this._layoutEntries.length}>
|
||||
${repeat(
|
||||
this._layoutEntries,
|
||||
(x) => x.contentUdi,
|
||||
@@ -241,9 +227,29 @@ export class UmbBlockGridEntriesElement extends UmbLitElement {
|
||||
UmbTextStyles,
|
||||
css`
|
||||
:host {
|
||||
position: relative;
|
||||
display: grid;
|
||||
gap: 1px;
|
||||
}
|
||||
:host([disallow-drop])::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
inset: 0;
|
||||
border: 2px solid var(--uui-color-danger);
|
||||
border-radius: calc(var(--uui-border-radius) * 2);
|
||||
pointer-events: none;
|
||||
}
|
||||
:host([disallow-drop])::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
inset: 0;
|
||||
border-radius: calc(var(--uui-border-radius) * 2);
|
||||
background-color: var(--uui-color-danger);
|
||||
opacity: 0.2;
|
||||
pointer-events: none;
|
||||
}
|
||||
> div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -252,8 +258,17 @@ export class UmbBlockGridEntriesElement extends UmbLitElement {
|
||||
|
||||
uui-button-group {
|
||||
padding-top: 1px;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
|
||||
--umb-block-grid--is-dragging--variable: var(--umb-block-grid--is-dragging) none;
|
||||
display: var(--umb-block-grid--is-dragging--variable, grid);
|
||||
}
|
||||
|
||||
.umb-block-grid__layout-container[data-area-length='0'] {
|
||||
--umb-block-grid--is-dragging--variable: var(--umb-block-grid--is-dragging) 1;
|
||||
min-height: calc(var(--umb-block-grid--is-dragging--variable, 0) * var(--uui-size-11));
|
||||
border: calc(var(--umb-block-grid--is-dragging--variable, 0) * 1px) dashed var(--uui-color-border);
|
||||
border-radius: var(--uui-border-radius);
|
||||
}
|
||||
`,
|
||||
];
|
||||
|
||||
@@ -4,7 +4,8 @@ import { html, css, customElement, property, state } from '@umbraco-cms/backoffi
|
||||
import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import '../block-grid-block-view/index.js';
|
||||
import '../block-scale-handler/index.js';
|
||||
import type { UmbBlockGridLayoutModel, UmbBlockViewPropsType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockViewPropsType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid';
|
||||
|
||||
/**
|
||||
* @element umb-block-grid-entry
|
||||
@@ -25,7 +26,7 @@ export class UmbBlockGridEntryElement extends UmbLitElement implements UmbProper
|
||||
return this._contentUdi;
|
||||
}
|
||||
public set contentUdi(value: string | undefined) {
|
||||
if (!value) return;
|
||||
if (!value || value === this._contentUdi) return;
|
||||
this._contentUdi = value;
|
||||
this._blockViewProps.contentUdi = value;
|
||||
this.setAttribute('data-element-udi', value);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { UmbBlockDataType } from '../../block/index.js';
|
||||
import { UMB_BLOCK_CATALOGUE_MODAL, UmbBlockEntriesContext } from '../../block/index.js';
|
||||
import { UMB_BLOCK_GRID_ENTRY_CONTEXT, type UmbBlockGridWorkspaceData } from '../index.js';
|
||||
import type { UmbBlockGridLayoutModel, UmbBlockGridTypeModel } from '../types.js';
|
||||
import type { UmbBlockGridLayoutModel, UmbBlockGridTypeAreaType, UmbBlockGridTypeModel } from '../types.js';
|
||||
import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from './block-grid-manager.context.js';
|
||||
import type { UmbBlockGridScalableContainerContext } from './block-grid-scale-manager/block-grid-scale-manager.controller.js';
|
||||
import { UmbNumberState } from '@umbraco-cms/backoffice/observable-api';
|
||||
@@ -25,6 +25,8 @@ export class UmbBlockGridEntriesContext
|
||||
#layoutColumns = new UmbNumberState(undefined);
|
||||
readonly layoutColumns = this.#layoutColumns.asObservable();
|
||||
|
||||
#areaType?: UmbBlockGridTypeAreaType;
|
||||
|
||||
//#parentUnique?: string;
|
||||
#areaKey?: string | null;
|
||||
|
||||
@@ -71,8 +73,8 @@ export class UmbBlockGridEntriesContext
|
||||
const index = routingInfo.index ? parseInt(routingInfo.index) : -1;
|
||||
return {
|
||||
data: {
|
||||
blocks: [],
|
||||
blockGroups: [],
|
||||
blocks: this.#retrieveAllowedElementTypes(),
|
||||
blockGroups: this._manager?.getBlockGroups() ?? [],
|
||||
openClipboard: routingInfo.view === 'clipboard',
|
||||
blockOriginData: { index: index },
|
||||
},
|
||||
@@ -180,6 +182,7 @@ export class UmbBlockGridEntriesContext
|
||||
this.observe(
|
||||
this.#parentEntry.areaType(this.#areaKey),
|
||||
(areaType) => {
|
||||
this.#areaType = areaType;
|
||||
const hostEl = this.getHostElement() as HTMLElement | undefined;
|
||||
if (!hostEl) return;
|
||||
hostEl.setAttribute('data-area-alias', areaType?.alias ?? '');
|
||||
@@ -229,4 +232,69 @@ export class UmbBlockGridEntriesContext
|
||||
// TODO: Loop through children and delete them as well?
|
||||
await super.delete(contentUdi);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @returns an Array of ElementTypeKeys that are allowed in the current area. Or undefined if not ready jet.
|
||||
*/
|
||||
#retrieveAllowedElementTypes() {
|
||||
if (!this._manager) return [];
|
||||
|
||||
if (this.#areaKey) {
|
||||
// Area entries:
|
||||
if (!this.#areaType) return [];
|
||||
|
||||
if (this.#areaType.specifiedAllowance && this.#areaType.specifiedAllowance.length > 0) {
|
||||
return this.#areaType.specifiedAllowance
|
||||
.flatMap((permission) => {
|
||||
if (permission.groupKey) {
|
||||
return (
|
||||
this._manager
|
||||
?.getBlockTypes()
|
||||
.filter(
|
||||
(blockType) => blockType.groupKey === permission.groupKey && blockType.allowInAreas === true,
|
||||
) ?? []
|
||||
);
|
||||
} else if (permission.elementTypeKey) {
|
||||
return (
|
||||
this._manager?.getBlockTypes().filter((x) => x.contentElementTypeKey === permission.elementTypeKey) ??
|
||||
[]
|
||||
);
|
||||
}
|
||||
return [];
|
||||
})
|
||||
.filter((v, i, a) => a.find((x) => x.contentElementTypeKey === v.contentElementTypeKey) === undefined);
|
||||
}
|
||||
|
||||
return this._manager.getBlockTypes().filter((x) => x.allowInAreas);
|
||||
}
|
||||
// If no AreaKey, then we are representing the items of the root:
|
||||
|
||||
// Root entries:
|
||||
return this._manager.getBlockTypes().filter((x) => x.allowAtRoot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if given contentUdi is allowed in the current area.
|
||||
* @param contentUdi {string} - The contentUdi of the content to check.
|
||||
* @returns {boolean} - True if the content is allowed in the current area, otherwise false.
|
||||
*/
|
||||
allowDrop(contentUdi: string) {
|
||||
const content = this._manager?.getContentOf(contentUdi);
|
||||
if (!content) return false;
|
||||
|
||||
return (
|
||||
this.#retrieveAllowedElementTypes()
|
||||
.map((x) => x.contentElementTypeKey)
|
||||
.indexOf(content.contentTypeKey) !== -1
|
||||
);
|
||||
}
|
||||
|
||||
onDragStart() {
|
||||
this._manager?.onDragStart();
|
||||
}
|
||||
|
||||
onDragEnd() {
|
||||
this._manager?.onDragEnd();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import { closestColumnSpanOption } from '../utils/index.js';
|
||||
import { UMB_BLOCK_GRID_MANAGER_CONTEXT } from './block-grid-manager.context.js';
|
||||
import { UMB_BLOCK_GRID_ENTRIES_CONTEXT } from './block-grid-entries.context-token.js';
|
||||
import {
|
||||
type UmbBlockGridScalableContext,
|
||||
UmbBlockGridScaleManager,
|
||||
} from './block-grid-scale-manager/block-grid-scale-manager.controller.js';
|
||||
import {
|
||||
UmbBlockEntryContext,
|
||||
type UmbBlockGridTypeModel,
|
||||
type UmbBlockGridLayoutModel,
|
||||
} from '@umbraco-cms/backoffice/block';
|
||||
import { UmbBlockEntryContext } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockGridTypeModel, UmbBlockGridLayoutModel } from '@umbraco-cms/backoffice/block-grid';
|
||||
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
import {
|
||||
UmbArrayState,
|
||||
@@ -18,28 +16,6 @@ import {
|
||||
} from '@umbraco-cms/backoffice/observable-api';
|
||||
import { combineLatest } from '@umbraco-cms/backoffice/external/rxjs';
|
||||
|
||||
function closestColumnSpanOption(target: number, map: Array<number>, max: number) {
|
||||
if (map.length > 0) {
|
||||
const result = map.reduce((a, b) => {
|
||||
if (a > max) {
|
||||
return b;
|
||||
}
|
||||
const aDiff = Math.abs(a - target);
|
||||
const bDiff = Math.abs(b - target);
|
||||
|
||||
if (aDiff === bDiff) {
|
||||
return a < b ? a : b;
|
||||
} else {
|
||||
return bDiff < aDiff ? b : a;
|
||||
}
|
||||
});
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
export class UmbBlockGridEntryContext
|
||||
extends UmbBlockEntryContext<
|
||||
typeof UMB_BLOCK_GRID_MANAGER_CONTEXT,
|
||||
@@ -184,7 +160,6 @@ export class UmbBlockGridEntryContext
|
||||
const hasRelevantColumnSpanOptions = relevantColumnSpanOptions.length > 1;
|
||||
const hasRowSpanOptions = minMaxRowSpan[0] !== minMaxRowSpan[1];
|
||||
const canScale = hasRelevantColumnSpanOptions || hasRowSpanOptions;
|
||||
console.log('canScale calc:', canScale);
|
||||
|
||||
this.#canScale.setValue(canScale);
|
||||
},
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import type { UmbBlockGridLayoutModel, UmbBlockGridTypeModel } from '../types.js';
|
||||
import { UmbBlockManagerContext } from '../../block/context/block-manager.context.js';
|
||||
import type { UmbBlockGridWorkspaceData } from '../index.js';
|
||||
import type { UmbBlockTypeGroup } from '../../block-type/types.js';
|
||||
import type { UmbBlockDataType } from '../../block/types.js';
|
||||
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
||||
import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api';
|
||||
import { type UmbBlockDataType, UmbBlockManagerContext } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockTypeGroup } from '@umbraco-cms/backoffice/block-type';
|
||||
|
||||
export const UMB_BLOCK_GRID_DEFAULT_LAYOUT_STYLESHEET = '/umbraco/backoffice/css/umbraco-blockgridlayout.css';
|
||||
|
||||
@@ -53,6 +52,14 @@ export class UmbBlockGridManagerContext<
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
onDragStart() {
|
||||
(this.getHostElement() as HTMLElement).style.setProperty('--umb-block-grid--is-dragging', ' ');
|
||||
}
|
||||
|
||||
onDragEnd() {
|
||||
(this.getHostElement() as HTMLElement).style.removeProperty('--umb-block-grid--is-dragging');
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Make discriminator method for this:
|
||||
|
||||
@@ -1,70 +1,8 @@
|
||||
import { getAccumulatedValueOfIndex, getInterpolatedIndexOfPositionInWeightMap } from '@umbraco-cms/backoffice/utils';
|
||||
import { closestColumnSpanOption } from '../../utils/index.js';
|
||||
import { UmbBaseController } from '@umbraco-cms/backoffice/class-api';
|
||||
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
|
||||
// Utils:
|
||||
// TODO: Move these methods into their own files:
|
||||
|
||||
function getInterpolatedIndexOfPositionInWeightMap(target: number, weights: Array<number>) {
|
||||
const map = [0];
|
||||
weights.reduce((a, b, i) => {
|
||||
return (map[i + 1] = a + b);
|
||||
}, 0);
|
||||
const foundValue = map.reduce((a, b) => {
|
||||
const aDiff = Math.abs(a - target);
|
||||
const bDiff = Math.abs(b - target);
|
||||
|
||||
if (aDiff === bDiff) {
|
||||
return a < b ? a : b;
|
||||
} else {
|
||||
return bDiff < aDiff ? b : a;
|
||||
}
|
||||
});
|
||||
const foundIndex = map.indexOf(foundValue);
|
||||
const targetDiff = target - foundValue;
|
||||
let interpolatedIndex = foundIndex;
|
||||
if (targetDiff < 0 && foundIndex === 0) {
|
||||
// Don't adjust.
|
||||
} else if (targetDiff > 0 && foundIndex === map.length - 1) {
|
||||
// Don't adjust.
|
||||
} else {
|
||||
const foundInterpolationWeight = weights[targetDiff >= 0 ? foundIndex : foundIndex - 1];
|
||||
interpolatedIndex += foundInterpolationWeight === 0 ? interpolatedIndex : targetDiff / foundInterpolationWeight;
|
||||
}
|
||||
return interpolatedIndex;
|
||||
}
|
||||
|
||||
function getAccumulatedValueOfIndex(index: number, weights: Array<number>) {
|
||||
const len = Math.min(index, weights.length);
|
||||
let i = 0,
|
||||
calc = 0;
|
||||
while (i < len) {
|
||||
calc += weights[i++];
|
||||
}
|
||||
return calc;
|
||||
}
|
||||
|
||||
function closestColumnSpanOption(target: number, map: Array<number>, max: number) {
|
||||
if (map.length > 0) {
|
||||
const result = map.reduce((a, b) => {
|
||||
if (a > max) {
|
||||
return b;
|
||||
}
|
||||
const aDiff = Math.abs(a - target);
|
||||
const bDiff = Math.abs(b - target);
|
||||
|
||||
if (aDiff === bDiff) {
|
||||
return a < b ? a : b;
|
||||
} else {
|
||||
return bDiff < aDiff ? b : a;
|
||||
}
|
||||
});
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// This might be more generic than Block Grid, but this is where it belongs currently:
|
||||
export interface UmbBlockGridScalableContext extends UmbControllerHost {
|
||||
setColumnSpan: (columnSpan: number) => void;
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extensi
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { UmbPropertyValueChangeEvent } from '@umbraco-cms/backoffice/property-editor';
|
||||
import { UMB_DATA_TYPE_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/data-type';
|
||||
import type { UmbBlockTypeWithGroupKey } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockTypeWithGroupKey } from '@umbraco-cms/backoffice/block-type';
|
||||
import type { UUIComboboxElement, UUIComboboxEvent, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
|
||||
|
||||
@customElement('umb-property-editor-ui-block-grid-area-type-permission')
|
||||
|
||||
@@ -3,9 +3,8 @@ import { UMB_BLOCK_GRID_DEFAULT_LAYOUT_STYLESHEET } from '../../context/block-gr
|
||||
import { UMB_BLOCK_GRID_AREA_TYPE_WORKSPACE_MODAL } from '../../components/block-grid-area-config-entry/index.js';
|
||||
import { UmbBlockGridAreaTypeEntriesContext } from './block-grid-area-type-entries.context.js';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { html, customElement, property, css, state, repeat } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit';
|
||||
import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property';
|
||||
import {
|
||||
UmbPropertyValueChangeEvent,
|
||||
@@ -143,8 +142,6 @@ export class UmbPropertyEditorUIBlockGridAreasConfigElement
|
||||
<uui-button id="add-button" look="placeholder" label=${'Add area'} @click=${this.#addNewArea}></uui-button>`
|
||||
: '';
|
||||
}
|
||||
|
||||
static styles = [UmbTextStyles, css``];
|
||||
}
|
||||
|
||||
export default UmbPropertyEditorUIBlockGridAreasConfigElement;
|
||||
|
||||
@@ -8,7 +8,8 @@ import {
|
||||
UmbPropertyValueChangeEvent,
|
||||
type UmbPropertyEditorConfigCollection,
|
||||
} from '@umbraco-cms/backoffice/property-editor';
|
||||
import type { UmbBlockGridTypeModel, UmbBlockGridValueModel, UmbBlockTypeGroup } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockTypeGroup } from '@umbraco-cms/backoffice/block-type';
|
||||
import type { UmbBlockGridTypeModel, UmbBlockGridValueModel } from '@umbraco-cms/backoffice/block-grid';
|
||||
import type { NumberRangeValueType } from '@umbraco-cms/backoffice/models';
|
||||
import '../../components/block-grid-entries/index.js';
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { UmbId } from '@umbraco-cms/backoffice/id';
|
||||
import type { UmbBlockGridTypeGroupType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockGridTypeGroupType } from '@umbraco-cms/backoffice/block-grid';
|
||||
|
||||
@customElement('umb-property-editor-ui-block-grid-group-configuration')
|
||||
export class UmbPropertyEditorUIBlockGridGroupConfigurationElement
|
||||
|
||||
@@ -8,15 +8,15 @@ import {
|
||||
} from '@umbraco-cms/backoffice/property-editor';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import {
|
||||
UMB_BLOCK_GRID_TYPE,
|
||||
type UmbBlockGridTypeGroupType,
|
||||
type UmbBlockGridGroupTypeConfiguration,
|
||||
} from '@umbraco-cms/backoffice/block';
|
||||
import { UMB_BLOCK_GRID_TYPE, type UmbBlockGridTypeGroupType } from '@umbraco-cms/backoffice/block-grid';
|
||||
import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
|
||||
import { UMB_PROPERTY_DATASET_CONTEXT, type UmbPropertyDatasetContext } from '@umbraco-cms/backoffice/property';
|
||||
import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
interface MappedGroupWithBlockTypes extends Partial<UmbBlockGridTypeGroupType> {
|
||||
blocks: Array<UmbBlockTypeWithGroupKey>;
|
||||
}
|
||||
|
||||
/**
|
||||
* @element umb-property-editor-ui-block-grid-type-configuration
|
||||
*/
|
||||
@@ -47,7 +47,7 @@ export class UmbPropertyEditorUIBlockGridTypeConfigurationElement
|
||||
private _blockGroups: Array<UmbBlockGridTypeGroupType> = [];
|
||||
|
||||
@state()
|
||||
private _mappedValuesAndGroups: Array<UmbBlockGridGroupTypeConfiguration> = [];
|
||||
private _mappedValuesAndGroups: Array<MappedGroupWithBlockTypes> = [];
|
||||
|
||||
@state()
|
||||
private _workspacePath?: string;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import type { UmbBlockTypeBaseModel, UmbBlockTypeWithGroupKey } from '../block-type/index.js';
|
||||
import type { UmbBlockLayoutBaseModel, UmbBlockValueType } from '../index.js';
|
||||
import type { UmbBlockLayoutBaseModel, UmbBlockValueType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockTypeWithGroupKey } from '@umbraco-cms/backoffice/block-type';
|
||||
|
||||
export const UMB_BLOCK_GRID_TYPE = 'block-grid-type';
|
||||
|
||||
// Configuration models:
|
||||
export interface UmbBlockGridTypeModel extends UmbBlockTypeBaseModel {
|
||||
export interface UmbBlockGridTypeModel extends UmbBlockTypeWithGroupKey {
|
||||
columnSpanOptions: Array<UmbBlockGridTypeColumnSpanOption>;
|
||||
allowAtRoot: boolean;
|
||||
allowInAreas: boolean;
|
||||
@@ -41,10 +41,6 @@ export interface UmbBlockGridTypeGroupType {
|
||||
key: string;
|
||||
}
|
||||
|
||||
export interface UmbBlockGridGroupTypeConfiguration extends Partial<UmbBlockGridTypeGroupType> {
|
||||
blocks: Array<UmbBlockTypeWithGroupKey>;
|
||||
}
|
||||
|
||||
// Content models:
|
||||
|
||||
export interface UmbBlockGridValueModel extends UmbBlockValueType<UmbBlockGridLayoutModel> {}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
export function closestColumnSpanOption(target: number, map: Array<number>, max: number) {
|
||||
if (map.length > 0) {
|
||||
const result = map.reduce((a, b) => {
|
||||
if (a > max) {
|
||||
return b;
|
||||
}
|
||||
const aDiff = Math.abs(a - target);
|
||||
const bDiff = Math.abs(b - target);
|
||||
|
||||
if (aDiff === bDiff) {
|
||||
return a < b ? a : b;
|
||||
} else {
|
||||
return bDiff < aDiff ? b : a;
|
||||
}
|
||||
});
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { UmbBlockWorkspaceData } from '../../index.js';
|
||||
import type { UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal';
|
||||
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { UmbBlockListEntryContext } from '../../context/block-list-entry.context.js';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { html, css, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import '../ref-list-block/index.js';
|
||||
import '../inline-list-block/index.js';
|
||||
import type { UmbBlockListLayoutModel, UmbBlockViewPropsType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockViewPropsType } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockListLayoutModel } from '@umbraco-cms/backoffice/block-list';
|
||||
|
||||
/**
|
||||
* @element umb-block-list-entry
|
||||
|
||||
@@ -26,7 +26,7 @@ export class UmbBlockListEntriesContext extends UmbBlockEntriesContext<
|
||||
const index = routingInfo.index ? parseInt(routingInfo.index) : -1;
|
||||
return {
|
||||
data: {
|
||||
blocks: [],
|
||||
blocks: this._manager?.getBlockTypes() ?? [],
|
||||
blockGroups: [],
|
||||
openClipboard: routingInfo.view === 'clipboard',
|
||||
blockOriginData: { index: index },
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { UmbBlockListLayoutModel, UmbBlockListTypeModel } from '../types.js';
|
||||
import { UmbBlockManagerContext } from '../../block/context/block-manager.context.js';
|
||||
import type { UmbBlockListWorkspaceData } from '../index.js';
|
||||
import type { UmbBlockDataType } from '../../block/types.js';
|
||||
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
||||
import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api';
|
||||
import { UmbBlockManagerContext } from '@umbraco-cms/backoffice/block';
|
||||
|
||||
/**
|
||||
* A implementation of the Block Manager specifically for the Block List Editor.
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { UmbBlockListManagerContext } from '../../context/block-list-manager.context.js';
|
||||
import '../../components/block-list-entry/index.js';
|
||||
import type { UmbBlockListEntryElement } from '../../components/block-list-entry/index.js';
|
||||
import type { UmbBlockListLayoutModel, UmbBlockListValueModel } from '../../types.js';
|
||||
import { UmbBlockListEntriesContext } from '../../context/block-list-entries.context.js';
|
||||
import { UMB_BLOCK_LIST_PROPERTY_EDITOR_ALIAS } from './manifests.js';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { html, customElement, property, state, repeat, css } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor';
|
||||
import type { UmbBlockLayoutBaseModel, UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockLayoutBaseModel } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type';
|
||||
import type { NumberRangeValueType } from '@umbraco-cms/backoffice/models';
|
||||
import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/modal';
|
||||
import { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
|
||||
@@ -90,7 +91,7 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement
|
||||
const useInlineEditingAsDefault = config.getValueByAlias<boolean>('useInlineEditingAsDefault');
|
||||
this.#managerContext.setInlineEditingMode(useInlineEditingAsDefault);
|
||||
// TODO:
|
||||
//config.useSingleBlockMode, not done jey
|
||||
//config.useSingleBlockMode, not done jet
|
||||
this.style.maxWidth = config.getValueByAlias<string>('maxPropertyWidth') ?? '';
|
||||
|
||||
this.#managerContext.setEditorConfiguration(config);
|
||||
|
||||
@@ -4,7 +4,6 @@ import { UMB_BLOCK_LIST_TYPE } from '../../types.js';
|
||||
import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry';
|
||||
import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
@@ -61,8 +60,6 @@ export class UmbPropertyEditorUIBlockListBlockConfigurationElement
|
||||
this.value = (e.target as UmbInputBlockTypeElement).value;
|
||||
}}></umb-input-block-type>`;
|
||||
}
|
||||
|
||||
static styles = [UmbTextStyles];
|
||||
}
|
||||
|
||||
export default UmbPropertyEditorUIBlockListBlockConfigurationElement;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { UmbBlockTypeBaseModel } from '../block-type/index.js';
|
||||
import type { UmbBlockLayoutBaseModel, UmbBlockValueType } from '../index.js';
|
||||
import type { UmbBlockLayoutBaseModel, UmbBlockValueType } from '@umbraco-cms/backoffice/block';
|
||||
|
||||
export const UMB_BLOCK_LIST_TYPE = 'block-list-type';
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { UmbBlockWorkspaceData } from '../../index.js';
|
||||
import type { UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal';
|
||||
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import type { UmbBlockWorkspaceData } from '../../index.js';
|
||||
import type { UmbBlockWorkspaceData } from '@umbraco-cms/backoffice/block';
|
||||
import type { UmbWorkspaceData, UmbWorkspaceValue } from '@umbraco-cms/backoffice/modal';
|
||||
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
|
||||
|
||||
|
||||
@@ -2,9 +2,7 @@ import {
|
||||
DOCUMENT_TYPE_ITEM_REPOSITORY_ALIAS,
|
||||
type UmbDocumentTypeItemModel,
|
||||
} from '@umbraco-cms/backoffice/document-type';
|
||||
import { UmbDeleteEvent } from '@umbraco-cms/backoffice/event';
|
||||
import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UMB_CONFIRM_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
|
||||
import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbRepositoryItemsManager } from '@umbraco-cms/backoffice/repository';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
|
||||
@@ -18,27 +16,38 @@ export class UmbBlockTypeCardElement extends UmbLitElement {
|
||||
);
|
||||
|
||||
@property({ type: String, attribute: false })
|
||||
workspacePath?: string;
|
||||
href?: string;
|
||||
|
||||
@property({ type: String, attribute: false })
|
||||
public get key(): string | undefined {
|
||||
return this._key;
|
||||
name?: string;
|
||||
|
||||
@property({ type: String, attribute: false })
|
||||
iconColor?: string;
|
||||
|
||||
@property({ type: String, attribute: false })
|
||||
backgroundColor?: string;
|
||||
|
||||
// TODO: support custom icon/image file
|
||||
|
||||
@property({ type: String, attribute: false })
|
||||
public get contentElementTypeKey(): string | undefined {
|
||||
return this._elementTypeKey;
|
||||
}
|
||||
public set key(value: string | undefined) {
|
||||
this._key = value;
|
||||
public set contentElementTypeKey(value: string | undefined) {
|
||||
this._elementTypeKey = value;
|
||||
if (value) {
|
||||
this.#itemManager.setUniques([value]);
|
||||
} else {
|
||||
this.#itemManager.setUniques([]);
|
||||
}
|
||||
}
|
||||
private _key?: string | undefined;
|
||||
private _elementTypeKey?: string | undefined;
|
||||
|
||||
@state()
|
||||
_name?: string;
|
||||
_fallbackName?: string;
|
||||
|
||||
@state()
|
||||
_icon?: string | null;
|
||||
_fallbackIcon?: string | null;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
@@ -46,37 +55,22 @@ export class UmbBlockTypeCardElement extends UmbLitElement {
|
||||
this.observe(this.#itemManager.items, (items) => {
|
||||
const item = items[0];
|
||||
if (item) {
|
||||
this._icon = item.icon;
|
||||
this._name = item.name;
|
||||
console.log('got item', item);
|
||||
this._fallbackIcon = item.icon;
|
||||
this._fallbackName = item.name;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#onRequestDelete() {
|
||||
this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, async (modalManager) => {
|
||||
const modalContext = modalManager.open(UMB_CONFIRM_MODAL, {
|
||||
data: {
|
||||
color: 'danger',
|
||||
headline: `Remove ${this._name}?`,
|
||||
content: 'Are you sure you want to remove this block type?',
|
||||
confirmLabel: 'Remove',
|
||||
},
|
||||
});
|
||||
|
||||
await modalContext?.onSubmit();
|
||||
this.dispatchEvent(new UmbDeleteEvent());
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: Support image files instead of icons.
|
||||
render() {
|
||||
return html`
|
||||
<uui-card-block-type href="${this.workspacePath}/edit/${this.key}" .name=${this._name ?? ''}>
|
||||
<uui-icon name=${this._icon ?? ''}></uui-icon>
|
||||
<uui-action-bar slot="actions">
|
||||
<uui-button @click=${this.#onRequestDelete} label="Remove block">
|
||||
<uui-icon name="icon-trash"></uui-icon>
|
||||
</uui-button>
|
||||
</uui-action-bar>
|
||||
<uui-card-block-type
|
||||
href=${ifDefined(this.href)}
|
||||
.name=${this.name ?? this._fallbackName ?? ''}
|
||||
.background=${this.backgroundColor}>
|
||||
<uui-icon name=${this._fallbackIcon ?? ''} style="color:${this.iconColor}"></uui-icon>
|
||||
<slot name="actions" slot="actions"> </slot>
|
||||
</uui-card-block-type>
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
import type { UmbBlockTypeBaseModel } from '../../types.js';
|
||||
import { UMB_DOCUMENT_TYPE_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
|
||||
import {
|
||||
UMB_CONFIRM_MODAL,
|
||||
UMB_DOCUMENT_TYPE_PICKER_MODAL,
|
||||
UMB_MODAL_MANAGER_CONTEXT,
|
||||
} from '@umbraco-cms/backoffice/modal';
|
||||
import '../block-type-card/index.js';
|
||||
import { css, html, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
@@ -74,18 +78,41 @@ export class UmbInputBlockTypeElement<
|
||||
return undefined;
|
||||
}
|
||||
|
||||
#onRequestDelete(item: BlockType) {
|
||||
this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, async (modalManager) => {
|
||||
const modalContext = modalManager.open(UMB_CONFIRM_MODAL, {
|
||||
data: {
|
||||
color: 'danger',
|
||||
headline: `Remove [TODO: Get name]?`,
|
||||
content: 'Are you sure you want to remove this block type?',
|
||||
confirmLabel: 'Remove',
|
||||
},
|
||||
});
|
||||
|
||||
await modalContext?.onSubmit();
|
||||
this.deleteItem(item.contentElementTypeKey);
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`<div>
|
||||
${repeat(this.value, (block) => block.contentElementTypeKey, this.#renderItem)} ${this.#renderButton()}
|
||||
</div>`;
|
||||
}
|
||||
|
||||
#renderItem = (item: BlockType) => {
|
||||
#renderItem = (block: BlockType) => {
|
||||
return html`
|
||||
<umb-block-type-card
|
||||
.workspacePath=${this.workspacePath}
|
||||
.key=${item.contentElementTypeKey}
|
||||
@delete=${() => this.deleteItem(item.contentElementTypeKey)}>
|
||||
.name=${block.label}
|
||||
.iconColor=${block.iconColor}
|
||||
.backgroundColor=${block.backgroundColor}
|
||||
.href="${this.workspacePath}/edit/${block.contentElementTypeKey}"
|
||||
.contentElementTypeKey=${block.contentElementTypeKey}>
|
||||
<uui-action-bar slot="actions">
|
||||
<uui-button @click=${this.#onRequestDelete} label="Remove block">
|
||||
<uui-icon name="icon-trash"></uui-icon>
|
||||
</uui-button>
|
||||
</uui-action-bar>
|
||||
</umb-block-type-card>
|
||||
`;
|
||||
};
|
||||
|
||||
@@ -9,12 +9,11 @@ export interface UmbBlockTypeBaseModel {
|
||||
iconColor?: string;
|
||||
backgroundColor?: string;
|
||||
editorSize?: UUIModalSidebarSize;
|
||||
icon?: string; // remove later
|
||||
forceHideContentEditorInOverlay: boolean;
|
||||
}
|
||||
|
||||
export interface UmbBlockTypeGroup {
|
||||
name?: string | null;
|
||||
name?: string;
|
||||
key: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import type { UmbBlockTypeWorkspaceContext } from './block-type-workspace.context.js';
|
||||
import { UmbBlockTypeWorkspaceEditorElement } from './block-type-workspace-editor.element.js';
|
||||
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
|
||||
import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
|
||||
import type { UmbRoute } from '@umbraco-cms/backoffice/router';
|
||||
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
|
||||
@@ -71,8 +70,6 @@ export class UmbBlockTypeWorkspaceElement extends UmbLitElement {
|
||||
render() {
|
||||
return html`<umb-router-slot .routes="${this._routes}"></umb-router-slot>`;
|
||||
}
|
||||
|
||||
static styles = [UmbTextStyles];
|
||||
}
|
||||
|
||||
export default UmbBlockTypeWorkspaceElement;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { UMB_BLOCK_ENTRY_CONTEXT } from '@umbraco-cms/backoffice/block';
|
||||
import { UMB_BLOCK_ENTRY_CONTEXT } from '../context/block-entry.context-token.js';
|
||||
import { UmbBaseController } from '@umbraco-cms/backoffice/class-api';
|
||||
import type {
|
||||
ManifestCondition,
|
||||
UmbConditionConfigBase,
|
||||
UmbConditionControllerArguments,
|
||||
UmbExtensionCondition,
|
||||
@@ -30,12 +29,7 @@ export class UmbBlockEntryShowContentEditCondition extends UmbBaseController imp
|
||||
}
|
||||
}
|
||||
|
||||
export default UmbBlockEntryShowContentEditCondition;
|
||||
|
||||
export type BlockEntryShowContentEditConditionConfig =
|
||||
UmbConditionConfigBase<'Umb.Condition.BlockEntryShowContentEdit'>;
|
||||
|
||||
export const manifest: ManifestCondition = {
|
||||
type: 'condition',
|
||||
name: 'Block Show Content Edit Condition',
|
||||
alias: 'Umb.Condition.BlockEntryShowContentEdit',
|
||||
api: UmbBlockEntryShowContentEditCondition,
|
||||
};
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import { UMB_BLOCK_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/block';
|
||||
import { UMB_BLOCK_WORKSPACE_CONTEXT } from '../workspace/block-workspace.context-token.js';
|
||||
import { UmbBaseController } from '@umbraco-cms/backoffice/class-api';
|
||||
import type {
|
||||
ManifestCondition,
|
||||
UmbConditionConfigBase,
|
||||
UmbConditionControllerArguments,
|
||||
UmbExtensionCondition,
|
||||
@@ -30,12 +29,7 @@ export class UmbBlockWorkspaceHasSettingsCondition extends UmbBaseController imp
|
||||
}
|
||||
}
|
||||
|
||||
export default UmbBlockWorkspaceHasSettingsCondition;
|
||||
|
||||
export type BlockWorkspaceHasSettingsConditionConfig =
|
||||
UmbConditionConfigBase<'Umb.Condition.BlockWorkspaceHasSettings'>;
|
||||
|
||||
export const manifest: ManifestCondition = {
|
||||
type: 'condition',
|
||||
name: 'Block Has Settings Condition',
|
||||
alias: 'Umb.Condition.BlockWorkspaceHasSettings',
|
||||
api: UmbBlockWorkspaceHasSettingsCondition,
|
||||
};
|
||||
|
||||
@@ -1,4 +1,16 @@
|
||||
import { manifest as blockEntryShowContentConditionManifest } from './block-entry-show-content-edit.condition.js';
|
||||
import { manifest as blockWorkspaceHasSettingsConditionManifest } from './block-workspace-has-settings.condition.js';
|
||||
import type { ManifestCondition } from '@umbraco-cms/backoffice/extension-api';
|
||||
|
||||
export const manifests = [blockEntryShowContentConditionManifest, blockWorkspaceHasSettingsConditionManifest];
|
||||
export const manifests: Array<ManifestCondition> = [
|
||||
{
|
||||
type: 'condition',
|
||||
name: 'Block Has Settings Condition',
|
||||
alias: 'Umb.Condition.BlockWorkspaceHasSettings',
|
||||
api: () => import('./block-workspace-has-settings.condition.js'),
|
||||
},
|
||||
{
|
||||
type: 'condition',
|
||||
name: 'Block Show Content Edit Condition',
|
||||
alias: 'Umb.Condition.BlockEntryShowContentEdit',
|
||||
api: () => import('./block-entry-show-content-edit.condition.js'),
|
||||
},
|
||||
];
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { UmbBlockTypeBaseModel } from '../../block-type/types.js';
|
||||
import type { UmbBlockLayoutBaseModel } from '../types.js';
|
||||
import type { UmbBlockEntriesContext } from './block-entries.context.js';
|
||||
import type { UMB_BLOCK_MANAGER_CONTEXT } from './block-manager.context-token.js';
|
||||
import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type';
|
||||
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
||||
|
||||
export const UMB_BLOCK_ENTRIES_CONTEXT = new UmbContextToken<
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import type { UmbBlockTypeBaseModel } from '../../block-type/types.js';
|
||||
import type { UmbBlockDataType, UmbBlockLayoutBaseModel } from '../types.js';
|
||||
import { UMB_BLOCK_WORKSPACE_MODAL } from '../workspace/block-workspace.modal-token.js';
|
||||
import type { UmbBlockDataObjectModel, UmbBlockManagerContext } from './block-manager.context.js';
|
||||
import { UMB_BLOCK_ENTRIES_CONTEXT } from './block-entries.context-token.js';
|
||||
import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type';
|
||||
import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
||||
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
|
||||
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import type { UmbBlockTypeBaseModel } from '../../block-type/types.js';
|
||||
import type { UmbBlockLayoutBaseModel } from '../types.js';
|
||||
import type { UMB_BLOCK_ENTRIES_CONTEXT } from './block-entries.context-token.js';
|
||||
import type { UmbBlockEntriesContext } from './block-entries.context.js';
|
||||
import type { UmbBlockEntryContext } from './block-entry.context.js';
|
||||
import type { UMB_BLOCK_MANAGER_CONTEXT } from './block-manager.context-token.js';
|
||||
import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type';
|
||||
import { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
||||
|
||||
export const UMB_BLOCK_ENTRY_CONTEXT = new UmbContextToken<
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { UmbBlockTypeBaseModel } from '../../block-type/types.js';
|
||||
import type { UmbBlockLayoutBaseModel, UmbBlockDataType } from '../types.js';
|
||||
import type { UmbBlockManagerContext } from '../index.js';
|
||||
import type { UmbBlockEntriesContext } from './block-entries.context.js';
|
||||
import type { UmbBlockTypeBaseModel } from '@umbraco-cms/backoffice/block-type';
|
||||
import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api';
|
||||
import { UmbContextBase } from '@umbraco-cms/backoffice/class-api';
|
||||
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user