@umbraco-cms/backoffice 14.0.0-1c3e1277 → 14.0.0-1ebba150

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist-cms/custom-elements.json +94 -35
  2. package/dist-cms/external/uui/index.js +210 -702
  3. package/dist-cms/mocks/data/template.data.d.ts +5 -23
  4. package/dist-cms/mocks/data/template.data.js +44 -21
  5. package/dist-cms/mocks/handlers/template.handlers.js +4 -0
  6. package/dist-cms/packages/core/components/button-with-dropdown/button-with-dropdown.element.d.ts +2 -0
  7. package/dist-cms/packages/core/components/button-with-dropdown/button-with-dropdown.element.js +4 -4
  8. package/dist-cms/packages/core/components/code-block/code-block.element.d.ts +6 -1
  9. package/dist-cms/packages/core/components/code-block/code-block.element.js +93 -19
  10. package/dist-cms/packages/core/components/index.d.ts +1 -0
  11. package/dist-cms/packages/core/components/index.js +1 -1
  12. package/dist-cms/packages/core/modal/token/dictionary-item-picker-modal.token.d.ts +0 -1
  13. package/dist-cms/packages/core/modal/token/dictionary-item-picker-modal.token.js +1 -2
  14. package/dist-cms/packages/core/tree/tree.context.js +8 -11
  15. package/dist-cms/packages/templating/components/insert-menu/templating-insert-menu.element.js +3 -31
  16. package/dist-cms/packages/templating/modals/insert-choose-type-sidebar.element.d.ts +2 -4
  17. package/dist-cms/packages/templating/modals/insert-choose-type-sidebar.element.js +5 -27
  18. package/dist-cms/packages/templating/modals/insert-section-modal/insert-section-input.element.js +1 -0
  19. package/dist-cms/packages/templating/modals/insert-section-modal/insert-section-modal.element.js +5 -4
  20. package/dist-cms/packages/templating/modals/manifests.d.ts +0 -1
  21. package/dist-cms/packages/templating/modals/manifests.js +0 -7
  22. package/dist-cms/packages/templating/templates/components/alias-input/alias-input.js +1 -1
  23. package/dist-cms/packages/templating/templates/index.d.ts +2 -0
  24. package/dist-cms/packages/templating/templates/index.js +2 -0
  25. package/dist-cms/packages/templating/templates/manifests.d.ts +1 -1
  26. package/dist-cms/packages/templating/templates/manifests.js +2 -0
  27. package/dist-cms/packages/templating/templates/modals/manifests.d.ts +3 -0
  28. package/dist-cms/packages/templating/templates/modals/manifests.js +10 -0
  29. package/dist-cms/packages/templating/templates/modals/modal-tokens.d.ts +3 -0
  30. package/dist-cms/packages/templating/templates/modals/modal-tokens.js +6 -0
  31. package/dist-cms/packages/templating/templates/modals/query-builder/query-builder-filter.element.d.ts +24 -0
  32. package/dist-cms/packages/templating/templates/modals/query-builder/query-builder-filter.element.js +156 -0
  33. package/dist-cms/packages/templating/templates/modals/query-builder/query-builder.element.d.ts +28 -0
  34. package/dist-cms/packages/templating/templates/modals/query-builder/query-builder.element.js +277 -0
  35. package/dist-cms/packages/templating/templates/repository/sources/template.query-builder.server.data.d.ts +33 -0
  36. package/dist-cms/packages/templating/templates/repository/sources/template.query-builder.server.data.js +37 -0
  37. package/dist-cms/packages/templating/templates/repository/template.repository.d.ts +11 -7
  38. package/dist-cms/packages/templating/templates/repository/template.repository.js +28 -14
  39. package/dist-cms/packages/templating/templates/workspace/template-workspace-editor.element.js +21 -3
  40. package/dist-cms/packages/templating/templates/workspace/template-workspace.context.js +2 -1
  41. package/dist-cms/packages/templating/templates/workspace/template-workspace.element.d.ts +1 -0
  42. package/dist-cms/packages/templating/templates/workspace/template-workspace.element.js +2 -1
  43. package/dist-cms/tinymce/langs/nb_NO.js +62 -62
  44. package/dist-cms/tinymce/langs/uz.js +406 -0
  45. package/dist-cms/tsconfig.tsbuildinfo +1 -1
  46. package/dist-cms/vscode-html-custom-data.json +40 -7
  47. package/package.json +3 -3
  48. package/dist-cms/packages/templating/modals/insert-value-sidebar.element.d.ts +0 -19
  49. package/dist-cms/packages/templating/modals/insert-value-sidebar.element.js +0 -135
@@ -1,5 +1,4 @@
1
1
  import { ManifestModal } from '../../core/extension-registry/index.js';
2
2
  export declare const UMB_MODAL_TEMPLATING_INSERT_CHOOSE_TYPE_SIDEBAR_ALIAS = "Umb.Modal.Templating.Insert.ChooseType.Sidebar";
3
- export declare const UMB_MODAL_TEMPLATING_INSERT_FIELD_SIDEBAR_ALIAS = "Umb.Modal.Templating.Insert.Value.Sidebar";
4
3
  export declare const UMB_MODAL_TEMPLATING_INSERT_SECTION_SIDEBAR_ALIAS = "Umb.Modal.Templating.Insert.Section.Sidebar";
5
4
  export declare const manifests: ManifestModal[];
@@ -1,6 +1,5 @@
1
1
  import { UMB_PARTIAL_VIEW_PICKER_MODAL_ALIAS } from '../../core/modal/index.js';
2
2
  export const UMB_MODAL_TEMPLATING_INSERT_CHOOSE_TYPE_SIDEBAR_ALIAS = 'Umb.Modal.Templating.Insert.ChooseType.Sidebar';
3
- export const UMB_MODAL_TEMPLATING_INSERT_FIELD_SIDEBAR_ALIAS = 'Umb.Modal.Templating.Insert.Value.Sidebar';
4
3
  export const UMB_MODAL_TEMPLATING_INSERT_SECTION_SIDEBAR_ALIAS = 'Umb.Modal.Templating.Insert.Section.Sidebar';
5
4
  const modals = [
6
5
  {
@@ -9,12 +8,6 @@ const modals = [
9
8
  name: 'Choose insert type sidebar',
10
9
  loader: () => import('./insert-choose-type-sidebar.element.js'),
11
10
  },
12
- {
13
- type: 'modal',
14
- alias: UMB_MODAL_TEMPLATING_INSERT_FIELD_SIDEBAR_ALIAS,
15
- name: 'Insert value type sidebar',
16
- loader: () => import('./insert-value-sidebar.element.js'),
17
- },
18
11
  {
19
12
  type: 'modal',
20
13
  alias: UMB_PARTIAL_VIEW_PICKER_MODAL_ALIAS,
@@ -16,7 +16,7 @@ export let UmbTemplateAliasInputElement = class UmbTemplateAliasInputElement ext
16
16
  }
17
17
  render() {
18
18
  return html `
19
- <uui-button compact @click=${this.#handleClick}>
19
+ <uui-button compact @click=${this.#handleClick} label="unlock alias input">
20
20
  <uui-symbol-lock .open=${this.isOpen} ></uui-symbol-lock>
21
21
  </uui-button>
22
22
  <input placeholder="Enter alias..." .value=${this.value} ?disabled=${!this.isOpen} @input=${this.#setValue}></input>
@@ -1,3 +1,5 @@
1
+ import './components/index.js';
2
+ import './modals/modal-tokens.js';
1
3
  export * from './entities.js';
2
4
  export * from './repository/index.js';
3
5
  export * from './components/index.js';
@@ -1,3 +1,5 @@
1
+ import './components/index.js';
2
+ import './modals/modal-tokens.js';
1
3
  export * from './entities.js';
2
4
  export * from './repository/index.js';
3
5
  export * from './components/index.js';
@@ -1 +1 @@
1
- export declare const manifests: (import("../../core/index.js").ManifestEntityAction | import("../../core/index.js").ManifestMenuItemTreeKind | import("../../core/index.js").ManifestRepository | import("../../core/index.js").ManifestStore | import("../../core/index.js").ManifestTreeStore | import("../../core/index.js").ManifestItemStore | import("../../core/index.js").ManifestTree | import("../../core/index.js").ManifestTreeItem | import("../../core/index.js").ManifestWorkspace | import("../../core/index.js").ManifestWorkspaceAction | import("../../core/index.js").ManifestWorkspaceEditorView)[];
1
+ export declare const manifests: (import("../../core/index.js").ManifestEntityAction | import("../../core/index.js").ManifestMenuItemTreeKind | import("../../core/index.js").ManifestModal | import("../../core/index.js").ManifestRepository | import("../../core/index.js").ManifestStore | import("../../core/index.js").ManifestTreeStore | import("../../core/index.js").ManifestItemStore | import("../../core/index.js").ManifestTree | import("../../core/index.js").ManifestTreeItem | import("../../core/index.js").ManifestWorkspace | import("../../core/index.js").ManifestWorkspaceAction | import("../../core/index.js").ManifestWorkspaceEditorView)[];
@@ -3,7 +3,9 @@ import { manifests as menuItemManifests } from './menu-item/manifests.js';
3
3
  import { manifests as treeManifests } from './tree/manifests.js';
4
4
  import { manifests as entityActionsManifests } from './entity-actions/manifests.js';
5
5
  import { manifests as workspaceManifests } from './workspace/manifests.js';
6
+ import { manifests as modalManifests } from './modals/manifests.js';
6
7
  export const manifests = [
8
+ ...modalManifests,
7
9
  ...repositoryManifests,
8
10
  ...menuItemManifests,
9
11
  ...treeManifests,
@@ -0,0 +1,3 @@
1
+ import { ManifestModal } from '../../../core/extension-registry/index.js';
2
+ export declare const UMB_MODAL_TEMPLATING_QUERY_BUILDER_SIDEBAR_ALIAS = "Umb.Modal.Templating.Query.Builder.Sidebar";
3
+ export declare const manifests: ManifestModal[];
@@ -0,0 +1,10 @@
1
+ export const UMB_MODAL_TEMPLATING_QUERY_BUILDER_SIDEBAR_ALIAS = 'Umb.Modal.Templating.Query.Builder.Sidebar';
2
+ const modals = [
3
+ {
4
+ type: 'modal',
5
+ alias: UMB_MODAL_TEMPLATING_QUERY_BUILDER_SIDEBAR_ALIAS,
6
+ name: 'Template query builder',
7
+ loader: () => import('./query-builder/query-builder.element.js'),
8
+ },
9
+ ];
10
+ export const manifests = [...modals];
@@ -0,0 +1,3 @@
1
+ import { TemplateQueryBuilderModalData, TemplateQueryBuilderModalResult } from './query-builder/query-builder.element.js';
2
+ import { UmbModalToken } from '../../../core/modal/index.js';
3
+ export declare const UMB_TEMPLATE_QUERY_BUILDER_MODAL: UmbModalToken<TemplateQueryBuilderModalData, TemplateQueryBuilderModalResult>;
@@ -0,0 +1,6 @@
1
+ import { UMB_MODAL_TEMPLATING_QUERY_BUILDER_SIDEBAR_ALIAS } from './manifests.js';
2
+ import { UmbModalToken } from '../../../core/modal/index.js';
3
+ export const UMB_TEMPLATE_QUERY_BUILDER_MODAL = new UmbModalToken(UMB_MODAL_TEMPLATING_QUERY_BUILDER_SIDEBAR_ALIAS, {
4
+ type: 'sidebar',
5
+ size: 'large',
6
+ });
@@ -0,0 +1,24 @@
1
+ import { PropertyValueMap } from '../../../../../external/lit/index.js';
2
+ import { UmbLitElement } from '../../../../../shared/lit-element/index.js';
3
+ import { TemplateQueryExecuteFilterPresentationModel, TemplateQueryPropertyTypeModel, TemplateQuerySettingsResponseModel } from '../../../../../external/backend-api/index.js';
4
+ export declare class UmbQueryBuilderFilterElement extends UmbLitElement {
5
+ #private;
6
+ private _propertyAliasDropdown?;
7
+ private _operatorDropdown?;
8
+ filter: TemplateQueryExecuteFilterPresentationModel;
9
+ unremovable: boolean;
10
+ settings?: TemplateQuerySettingsResponseModel;
11
+ currentPropertyType: TemplateQueryPropertyTypeModel | null;
12
+ get isFilterValid(): boolean;
13
+ protected willUpdate(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
14
+ private _renderOperatorsDropdown;
15
+ private _renderConstraintValueInput;
16
+ render(): import("lit-html").TemplateResult<1>;
17
+ static styles: import("@lit/reactive-element/css-tag").CSSResult[];
18
+ }
19
+ export default UmbQueryBuilderFilterElement;
20
+ declare global {
21
+ interface HTMLElementTagNameMap {
22
+ 'umb-query-builder-filter': UmbQueryBuilderFilterElement;
23
+ }
24
+ }
@@ -0,0 +1,156 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { UUITextStyles } from '../../../../../external/uui/index.js';
8
+ import { css, html, customElement, property, query, state } from '../../../../../external/lit/index.js';
9
+ import { UmbLitElement } from '../../../../../shared/lit-element/index.js';
10
+ import { TemplateQueryPropertyTypeModel, } from '../../../../../external/backend-api/index.js';
11
+ export let UmbQueryBuilderFilterElement = class UmbQueryBuilderFilterElement extends UmbLitElement {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.filter = {};
15
+ this.unremovable = false;
16
+ this.currentPropertyType = null;
17
+ this.#setPropertyAlias = (e) => {
18
+ const target = e.target;
19
+ const oldCurrentPropertyType = this.currentPropertyType;
20
+ this.filter = { ...this.filter, propertyAlias: target.value };
21
+ this.currentPropertyType =
22
+ this.settings?.properties?.find((p) => p.alias === this.filter.propertyAlias)?.type ?? null;
23
+ if (oldCurrentPropertyType !== this.currentPropertyType)
24
+ this.#resetOperator();
25
+ this._propertyAliasDropdown?.closePopover();
26
+ };
27
+ this.#setConstrainValue = (e) => {
28
+ const target = e.target;
29
+ this.filter = { ...this.filter, constraintValue: target.value };
30
+ };
31
+ this.#setOperator = (e) => {
32
+ const target = e.target;
33
+ this.filter = { ...this.filter, operator: target.value };
34
+ this._operatorDropdown?.closePopover();
35
+ };
36
+ }
37
+ #setPropertyAlias;
38
+ #setConstrainValue;
39
+ #setOperator;
40
+ #resetOperator() {
41
+ this.filter = { ...this.filter, operator: undefined };
42
+ }
43
+ #resetFilter() {
44
+ this.filter = {};
45
+ }
46
+ #removeOrReset() {
47
+ if (this.unremovable)
48
+ this.#resetFilter();
49
+ else
50
+ this.dispatchEvent(new Event('remove-filter'));
51
+ }
52
+ #addFilter() {
53
+ this.dispatchEvent(new Event('add-filter'));
54
+ }
55
+ get isFilterValid() {
56
+ return Object.keys(this.filter).length === 3 && Object.values(this.filter).every((v) => !!v);
57
+ }
58
+ willUpdate(_changedProperties) {
59
+ if (_changedProperties.has('filter')) {
60
+ if (this.isFilterValid) {
61
+ this.dispatchEvent(new Event('update-query'));
62
+ }
63
+ }
64
+ }
65
+ _renderOperatorsDropdown() {
66
+ return html `<umb-button-with-dropdown look="outline" id="operator-dropdown" label="choose operator">
67
+ ${this.filter?.operator ?? ''}
68
+ <uui-combobox-list slot="dropdown" @change=${this.#setOperator} class="options-list">
69
+ ${this.settings?.operators
70
+ ?.filter((operator) => this.currentPropertyType ? operator.applicableTypes?.includes(this.currentPropertyType) : true)
71
+ .map((operator) => html `<uui-combobox-list-option .value=${operator.operator ?? ''}
72
+ >${operator.operator}</uui-combobox-list-option
73
+ >`)}</uui-combobox-list
74
+ >
75
+ </umb-button-with-dropdown>`;
76
+ }
77
+ _renderConstraintValueInput() {
78
+ switch (this.currentPropertyType) {
79
+ case TemplateQueryPropertyTypeModel.INTEGER:
80
+ return html `<uui-input type="number" @change=${this.#setConstrainValue} label="constrain value"></uui-input>`;
81
+ case TemplateQueryPropertyTypeModel.STRING:
82
+ return html `<uui-input type="text" @change=${this.#setConstrainValue} label="constrain value"></uui-input>`;
83
+ case TemplateQueryPropertyTypeModel.DATE_TIME:
84
+ return html `<uui-input type="date" @change=${this.#setConstrainValue} label="constrain value"></uui-input>`;
85
+ default:
86
+ return html `<uui-input type="text" @change=${this.#setConstrainValue} label="constrain value"></uui-input>`;
87
+ }
88
+ }
89
+ render() {
90
+ return html `
91
+ <span>${this.unremovable ? 'where' : 'and'}</span>
92
+ <umb-button-with-dropdown look="outline" id="property-alias-dropdown" label="Property alias"
93
+ >${this.filter?.propertyAlias ?? ''}
94
+ <uui-combobox-list slot="dropdown" @change=${this.#setPropertyAlias} class="options-list">
95
+ ${this.settings?.properties?.map((property) => html `<uui-combobox-list-option tabindex="0" .value=${property.alias ?? ''}
96
+ >${property.alias}</uui-combobox-list-option
97
+ >`)}
98
+ </uui-combobox-list></umb-button-with-dropdown
99
+ >
100
+ ${this.filter?.propertyAlias ? this._renderOperatorsDropdown() : ''}
101
+ ${this.filter?.operator ? this._renderConstraintValueInput() : ''}
102
+ <uui-button-group>
103
+ <uui-button title="Add filter" label="Add filter" compact @click=${this.#addFilter}
104
+ ><uui-icon name="add"></uui-icon
105
+ ></uui-button>
106
+ <uui-button title="Remove filter" label="Remove filter" compact @click=${this.#removeOrReset}
107
+ ><uui-icon name="delete"></uui-icon
108
+ ></uui-button>
109
+ </uui-button-group>
110
+ `;
111
+ }
112
+ static { this.styles = [
113
+ UUITextStyles,
114
+ css `
115
+ :host {
116
+ display: flex;
117
+ gap: 10px;
118
+ border-bottom: 1px solid #f3f3f5;
119
+ align-items: center;
120
+ padding: 20px 0;
121
+ }
122
+
123
+ .options-list {
124
+ min-width: 25ch;
125
+ background-color: var(--uui-color-surface);
126
+ box-shadow: var(--uui-shadow-depth-3);
127
+ }
128
+
129
+ uui-combobox-list-option {
130
+ padding: 8px 20px;
131
+ }
132
+ `,
133
+ ]; }
134
+ };
135
+ __decorate([
136
+ query('#property-alias-dropdown')
137
+ ], UmbQueryBuilderFilterElement.prototype, "_propertyAliasDropdown", void 0);
138
+ __decorate([
139
+ query('#operator-dropdown')
140
+ ], UmbQueryBuilderFilterElement.prototype, "_operatorDropdown", void 0);
141
+ __decorate([
142
+ property({ type: Object, attribute: false })
143
+ ], UmbQueryBuilderFilterElement.prototype, "filter", void 0);
144
+ __decorate([
145
+ property({ type: Boolean })
146
+ ], UmbQueryBuilderFilterElement.prototype, "unremovable", void 0);
147
+ __decorate([
148
+ property({ type: Object, attribute: false })
149
+ ], UmbQueryBuilderFilterElement.prototype, "settings", void 0);
150
+ __decorate([
151
+ state()
152
+ ], UmbQueryBuilderFilterElement.prototype, "currentPropertyType", void 0);
153
+ UmbQueryBuilderFilterElement = __decorate([
154
+ customElement('umb-query-builder-filter')
155
+ ], UmbQueryBuilderFilterElement);
156
+ export default UmbQueryBuilderFilterElement;
@@ -0,0 +1,28 @@
1
+ import { UmbModalBaseElement } from '../../../../../shared/modal/index.js';
2
+ import './query-builder-filter.element.js';
3
+ export interface TemplateQueryBuilderModalData {
4
+ hidePartialViews?: boolean;
5
+ }
6
+ export interface TemplateQueryBuilderModalResult {
7
+ value: string;
8
+ }
9
+ export default class UmbChooseInsertTypeModalElement extends UmbModalBaseElement<TemplateQueryBuilderModalData, TemplateQueryBuilderModalResult> {
10
+ #private;
11
+ private _contentTypeDropdown?;
12
+ private _sortDropdown?;
13
+ private _filterContainer?;
14
+ private _filterElements;
15
+ private _templateQuery?;
16
+ private _queryRequest;
17
+ private _queryBuilderSettings?;
18
+ private _selectedRootContentName;
19
+ private _defaultSortDirection;
20
+ constructor();
21
+ render(): import("lit-html").TemplateResult<1>;
22
+ static styles: import("@lit/reactive-element/css-tag.js").CSSResult[];
23
+ }
24
+ declare global {
25
+ interface HTMLElementTagNameMap {
26
+ 'umb-templating-query-builder-modal': UmbChooseInsertTypeModalElement;
27
+ }
28
+ }
@@ -0,0 +1,277 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { UmbTemplateRepository } from '../../repository/template.repository.js';
8
+ import { UUITextStyles } from '../../../../../external/uui/index.js';
9
+ import { css, html, customElement, state, query, queryAll } from '../../../../../external/lit/index.js';
10
+ import { UmbModalBaseElement } from '../../../../../shared/modal/index.js';
11
+ import { UMB_DOCUMENT_PICKER_MODAL, UMB_MODAL_MANAGER_CONTEXT_TOKEN, } from '../../../../core/modal/index.js';
12
+ import { UmbDocumentRepository } from '../../../../documents/documents/index.js';
13
+ import './query-builder-filter.element.js';
14
+ var SortOrder;
15
+ (function (SortOrder) {
16
+ SortOrder["Ascending"] = "ascending";
17
+ SortOrder["Descending"] = "descending";
18
+ })(SortOrder || (SortOrder = {}));
19
+ let UmbChooseInsertTypeModalElement = class UmbChooseInsertTypeModalElement extends UmbModalBaseElement {
20
+ #documentRepository;
21
+ #modalManagerContext;
22
+ #templateRepository;
23
+ constructor() {
24
+ super();
25
+ this._queryRequest = {};
26
+ this._selectedRootContentName = 'all pages';
27
+ this._defaultSortDirection = SortOrder.Descending;
28
+ this.#postTemplateQuery = async () => {
29
+ const { data, error } = await this.#templateRepository.postTemplateQueryExecute({
30
+ requestBody: this._queryRequest,
31
+ });
32
+ if (data)
33
+ this._templateQuery = { ...data };
34
+ };
35
+ this.#openDocumentPicker = () => {
36
+ this.#modalManagerContext
37
+ ?.open(UMB_DOCUMENT_PICKER_MODAL)
38
+ .onSubmit()
39
+ .then((result) => {
40
+ this.#updateQueryRequest({ rootContentId: result.selection[0] });
41
+ if (result.selection.length > 0 && result.selection[0] === null) {
42
+ this._selectedRootContentName = 'all pages';
43
+ return;
44
+ }
45
+ if (result.selection.length > 0) {
46
+ this.#getDocumentItem(result.selection);
47
+ return;
48
+ }
49
+ });
50
+ };
51
+ this.#addFilterElement = () => {
52
+ this._filterContainer?.appendChild(this.#createFilterElement());
53
+ };
54
+ this.#updateFilters = () => {
55
+ this.#updateQueryRequest({ filters: Array.from(this._filterElements)?.map((filter) => filter.filter) ?? [] });
56
+ };
57
+ this.#removeFilter = (event) => {
58
+ const target = event.target;
59
+ this._filterContainer?.removeChild(target);
60
+ this.#updateFilters();
61
+ };
62
+ this.#templateRepository = new UmbTemplateRepository(this);
63
+ this.#documentRepository = new UmbDocumentRepository(this);
64
+ this.consumeContext(UMB_MODAL_MANAGER_CONTEXT_TOKEN, (instance) => {
65
+ this.#modalManagerContext = instance;
66
+ });
67
+ this.#init();
68
+ }
69
+ #init() {
70
+ this.#getTemplateQuerySettings();
71
+ this.#postTemplateQuery();
72
+ }
73
+ #close() {
74
+ this.modalContext?.reject();
75
+ }
76
+ #submit() {
77
+ this.modalContext?.submit({
78
+ value: this._templateQuery?.queryExpression ?? '',
79
+ });
80
+ }
81
+ #updateQueryRequest(update) {
82
+ this._queryRequest = { ...this._queryRequest, ...update };
83
+ this.#postTemplateQuery();
84
+ }
85
+ async #getTemplateQuerySettings() {
86
+ const { data, error } = await this.#templateRepository.getTemplateQuerySettings();
87
+ if (data)
88
+ this._queryBuilderSettings = data;
89
+ }
90
+ #postTemplateQuery;
91
+ #openDocumentPicker;
92
+ async #getDocumentItem(ids) {
93
+ const { data, error } = await this.#documentRepository.requestItemsLegacy(ids);
94
+ if (data) {
95
+ this._selectedRootContentName = data[0].name;
96
+ }
97
+ }
98
+ #createFilterElement() {
99
+ const filterElement = document.createElement('umb-query-builder-filter');
100
+ filterElement.settings = this._queryBuilderSettings;
101
+ filterElement.classList.add('row');
102
+ filterElement.addEventListener('add-filter', this.#addFilterElement);
103
+ filterElement.addEventListener('remove-filter', this.#removeFilter);
104
+ filterElement.addEventListener('update-query', this.#updateFilters);
105
+ return filterElement;
106
+ }
107
+ #setContentType(event) {
108
+ const target = event.target;
109
+ this.#updateQueryRequest({ contentTypeAlias: target.value ?? '' });
110
+ this._contentTypeDropdown.closePopover();
111
+ }
112
+ #setSortProperty(event) {
113
+ const target = event.target;
114
+ if (!this._queryRequest.sort)
115
+ this.#setSortDirection();
116
+ this.#updateQueryRequest({
117
+ sort: { ...this._queryRequest.sort, propertyAlias: target.value ?? '' },
118
+ });
119
+ this._sortDropdown.closePopover();
120
+ }
121
+ #setSortDirection() {
122
+ if (!this._queryRequest.sort?.direction) {
123
+ this.#updateQueryRequest({
124
+ sort: { ...this._queryRequest.sort, direction: this._defaultSortDirection },
125
+ });
126
+ return;
127
+ }
128
+ this.#updateQueryRequest({
129
+ sort: {
130
+ ...this._queryRequest.sort,
131
+ direction: this._queryRequest.sort?.direction === SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending,
132
+ },
133
+ });
134
+ }
135
+ #addFilterElement;
136
+ #updateFilters;
137
+ #removeFilter;
138
+ render() {
139
+ return html `
140
+ <umb-body-layout headline="Query builder">
141
+ <div id="main">
142
+ <uui-box>
143
+ <div class="row">
144
+ I want
145
+ <umb-button-with-dropdown look="outline" id="content-type-dropdown" label="Choose content type"
146
+ >${this._queryRequest?.contentTypeAlias ?? 'all content'}
147
+ <uui-combobox-list slot="dropdown" @change=${this.#setContentType} class="options-list">
148
+ <uui-combobox-list-option value="">all content</uui-combobox-list-option>
149
+ ${this._queryBuilderSettings?.contentTypeAliases?.map((alias) => html `<uui-combobox-list-option .value=${alias}
150
+ >content of type "${alias}"</uui-combobox-list-option
151
+ >`)}
152
+ </uui-combobox-list></umb-button-with-dropdown
153
+ >
154
+ from
155
+ <uui-button look="outline" @click=${this.#openDocumentPicker} label="Choose root content"
156
+ >${this._selectedRootContentName}
157
+ </uui-button>
158
+ </div>
159
+ <div id="filter-container">
160
+ <umb-query-builder-filter
161
+ unremovable
162
+ class="row"
163
+ .settings=${this._queryBuilderSettings}
164
+ @add-filter=${this.#addFilterElement}
165
+ @update-query=${this.#updateFilters}
166
+ @remove-filter=${this.#removeFilter}></umb-query-builder-filter>
167
+ </div>
168
+ <div class="row">
169
+ ordered by
170
+ <umb-button-with-dropdown look="outline" id="sort-dropdown" label="Property alias"
171
+ >${this._queryRequest.sort?.propertyAlias ?? ''}
172
+ <uui-combobox-list slot="dropdown" @change=${this.#setSortProperty} class="options-list">
173
+ ${this._queryBuilderSettings?.properties?.map((property) => html `<uui-combobox-list-option .value=${property.alias ?? ''}
174
+ >${property.alias}</uui-combobox-list-option
175
+ >`)}
176
+ </uui-combobox-list></umb-button-with-dropdown
177
+ >
178
+
179
+ ${this._queryRequest.sort?.propertyAlias
180
+ ? html `<uui-button look="outline" @click=${this.#setSortDirection}
181
+ >${this._queryRequest.sort.direction ?? this._defaultSortDirection}</uui-button
182
+ >`
183
+ : ''}
184
+ </div>
185
+ <div class="row">
186
+ <span id="results-count"
187
+ >${this._templateQuery?.resultCount ?? 0} items returned, in ${this._templateQuery?.executionTime ?? 0}
188
+ ms</span
189
+ >
190
+ </div>
191
+ <umb-code-block language="C#" copy> ${this._templateQuery?.queryExpression ?? ''} </umb-code-block>
192
+ </uui-box>
193
+ </div>
194
+
195
+ <div slot="actions">
196
+ <uui-button @click=${this.#close} look="secondary" label="Close">Close</uui-button>
197
+ <uui-button @click=${this.#submit} look="primary" color="positive" label="Submit">Submit</uui-button>
198
+ </div>
199
+ </umb-body-layout>
200
+ `;
201
+ }
202
+ static { this.styles = [
203
+ UUITextStyles,
204
+ css `
205
+ :host {
206
+ display: block;
207
+ color: var(--uui-color-text);
208
+ --umb-header-layout-height: 70px;
209
+ }
210
+
211
+ #main {
212
+ box-sizing: border-box;
213
+ height: calc(
214
+ 100dvh - var(--umb-header-layout-height) - var(--umb-footer-layout-height) - 2 * var(--uui-size-layout-1)
215
+ );
216
+ }
217
+
218
+ .options-list {
219
+ min-width: 30ch;
220
+ background-color: var(--uui-color-surface);
221
+ box-shadow: var(--uui-shadow-depth-3);
222
+ }
223
+
224
+ uui-combobox-list-option {
225
+ padding: 8px 20px;
226
+ }
227
+
228
+ .row {
229
+ display: flex;
230
+ gap: 10px;
231
+ border-bottom: 1px solid #f3f3f5;
232
+ align-items: center;
233
+ padding: 20px 0;
234
+ }
235
+
236
+ #filter-container {
237
+ flex-direction: column;
238
+ justify-content: flex-start;
239
+ }
240
+
241
+ #results-count {
242
+ font-weight: bold;
243
+ }
244
+ `,
245
+ ]; }
246
+ };
247
+ __decorate([
248
+ query('#content-type-dropdown')
249
+ ], UmbChooseInsertTypeModalElement.prototype, "_contentTypeDropdown", void 0);
250
+ __decorate([
251
+ query('#sort-dropdown')
252
+ ], UmbChooseInsertTypeModalElement.prototype, "_sortDropdown", void 0);
253
+ __decorate([
254
+ query('#filter-container')
255
+ ], UmbChooseInsertTypeModalElement.prototype, "_filterContainer", void 0);
256
+ __decorate([
257
+ queryAll('umb-query-builder-filter')
258
+ ], UmbChooseInsertTypeModalElement.prototype, "_filterElements", void 0);
259
+ __decorate([
260
+ state()
261
+ ], UmbChooseInsertTypeModalElement.prototype, "_templateQuery", void 0);
262
+ __decorate([
263
+ state()
264
+ ], UmbChooseInsertTypeModalElement.prototype, "_queryRequest", void 0);
265
+ __decorate([
266
+ state()
267
+ ], UmbChooseInsertTypeModalElement.prototype, "_queryBuilderSettings", void 0);
268
+ __decorate([
269
+ state()
270
+ ], UmbChooseInsertTypeModalElement.prototype, "_selectedRootContentName", void 0);
271
+ __decorate([
272
+ state()
273
+ ], UmbChooseInsertTypeModalElement.prototype, "_defaultSortDirection", void 0);
274
+ UmbChooseInsertTypeModalElement = __decorate([
275
+ customElement('umb-templating-query-builder-modal')
276
+ ], UmbChooseInsertTypeModalElement);
277
+ export default UmbChooseInsertTypeModalElement;
@@ -0,0 +1,33 @@
1
+ import { TemplateQueryExecuteModel } from '../../../../../external/backend-api/index.js';
2
+ import type { UmbControllerHostElement } from '../../../../../libs/controller-api/index.js';
3
+ /**
4
+ * A data source for the Template Query Builder that fetches data from the server
5
+ * @export
6
+ * @class UmbTemplateQueryBuilderServerDataSource
7
+ */
8
+ export declare class UmbTemplateQueryBuilderServerDataSource {
9
+ #private;
10
+ /**
11
+ * Creates an instance of UmbTemplateQueryBuilderServerDataSource.
12
+ * @param {UmbControllerHostElement} host
13
+ * @memberof UmbTemplateQueryBuilderServerDataSource
14
+ */
15
+ constructor(host: UmbControllerHostElement);
16
+ /**
17
+ * Fetches the query builder settings from the server
18
+ *
19
+ * @return {*}
20
+ * @memberof UmbTemplateQueryBuilderServerDataSource
21
+ */
22
+ getTemplateQuerySettings(): Promise<import("../../../../../shared/repository/index.js").DataSourceResponse<import("../../../../../external/backend-api/index.js").TemplateQuerySettingsResponseModel>>;
23
+ /**
24
+ * Executes a query builder query on the server
25
+ *
26
+ * @param {{ requestBody?: TemplateQueryExecuteModel }} { requestBody }
27
+ * @return {*}
28
+ * @memberof UmbTemplateQueryBuilderServerDataSource
29
+ */
30
+ postTemplateQueryExecute({ requestBody }: {
31
+ requestBody?: TemplateQueryExecuteModel;
32
+ }): Promise<import("../../../../../shared/repository/index.js").DataSourceResponse<import("../../../../../external/backend-api/index.js").TemplateQueryResultResponseModel>>;
33
+ }
@@ -0,0 +1,37 @@
1
+ import { TemplateResource } from '../../../../../external/backend-api/index.js';
2
+ import { tryExecuteAndNotify } from '../../../../../shared/resources/index.js';
3
+ /**
4
+ * A data source for the Template Query Builder that fetches data from the server
5
+ * @export
6
+ * @class UmbTemplateQueryBuilderServerDataSource
7
+ */
8
+ export class UmbTemplateQueryBuilderServerDataSource {
9
+ #host;
10
+ /**
11
+ * Creates an instance of UmbTemplateQueryBuilderServerDataSource.
12
+ * @param {UmbControllerHostElement} host
13
+ * @memberof UmbTemplateQueryBuilderServerDataSource
14
+ */
15
+ constructor(host) {
16
+ this.#host = host;
17
+ }
18
+ /**
19
+ * Fetches the query builder settings from the server
20
+ *
21
+ * @return {*}
22
+ * @memberof UmbTemplateQueryBuilderServerDataSource
23
+ */
24
+ async getTemplateQuerySettings() {
25
+ return tryExecuteAndNotify(this.#host, TemplateResource.getTemplateQuerySettings());
26
+ }
27
+ /**
28
+ * Executes a query builder query on the server
29
+ *
30
+ * @param {{ requestBody?: TemplateQueryExecuteModel }} { requestBody }
31
+ * @return {*}
32
+ * @memberof UmbTemplateQueryBuilderServerDataSource
33
+ */
34
+ async postTemplateQueryExecute({ requestBody }) {
35
+ return tryExecuteAndNotify(this.#host, TemplateResource.postTemplateQueryExecute({ requestBody }));
36
+ }
37
+ }