Skip to content

Commit e744fc6

Browse files
committed
Merge branch 'main' into v15/fix/embedded-media-package
2 parents 0bb1ae9 + dda914f commit e744fc6

File tree

5 files changed

+72
-20
lines changed

5 files changed

+72
-20
lines changed

src/packages/core/validation/controllers/validation.controller.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ export class UmbValidationController extends UmbControllerBase implements UmbVal
219219
/**
220220
* Validate this context, all the validators of this context will be validated.
221221
* Notice its a recursive check meaning sub validation contexts also validates their validators.
222-
* @returns succeed {Promise<boolean>} - Returns a promise that resolves to true if the validator succeeded, this depends on the validators and wether forceSucceed is set.
222+
* @returns succeed {Promise<boolean>} - Returns a promise that resolves to true if the validation succeeded.
223223
*/
224224
async validate(): Promise<void> {
225225
// TODO: clear server messages here?, well maybe only if we know we will get new server messages? Do the server messages hook into the system like another validator?

src/packages/templating/modals/templating-page-field-builder/components/template-field-dropdown-list/template-field-dropdown-list.element.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ import type { UUIComboboxEvent, UUIComboboxElement } from '@umbraco-cms/backoffi
1616
import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
1717
import { UmbMediaTypeDetailRepository, UMB_MEDIA_TYPE_PICKER_MODAL } from '@umbraco-cms/backoffice/media-type';
1818
import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal';
19+
import {
20+
UMB_VALIDATION_EMPTY_LOCALIZATION_KEY,
21+
UmbFormControlMixin,
22+
type UmbFormControlValidatorConfig,
23+
} from '@umbraco-cms/backoffice/validation';
1924

2025
interface FieldPickerValue {
2126
alias: string;
@@ -29,19 +34,44 @@ enum FieldType {
2934
}
3035

3136
@customElement('umb-template-field-dropdown-list')
32-
export class UmbTemplateFieldDropdownListElement extends UmbLitElement {
37+
export class UmbTemplateFieldDropdownListElement extends UmbFormControlMixin<
38+
FieldPickerValue | undefined,
39+
typeof UmbLitElement,
40+
undefined
41+
>(UmbLitElement) {
42+
//
43+
#requiredValidation?: UmbFormControlValidatorConfig;
44+
@property({ type: Boolean })
45+
public get required(): boolean | undefined {
46+
return undefined;
47+
}
48+
public set required(value: boolean | undefined) {
49+
if (value === true) {
50+
this.#requiredValidation ??= this.addValidator(
51+
'valueMissing',
52+
() => this.requiredMessage,
53+
() => !this._value,
54+
);
55+
} else if (this.#requiredValidation) {
56+
this.removeValidator(this.#requiredValidation);
57+
}
58+
}
59+
60+
@property({ type: String })
61+
requiredMessage = UMB_VALIDATION_EMPTY_LOCALIZATION_KEY;
62+
3363
@property({ type: Boolean, attribute: 'exclude-media-type', reflect: true })
3464
public excludeMediaType = false;
3565

3666
private _value: FieldPickerValue | undefined;
3767
@property({ type: Object })
38-
public set value(val: FieldPickerValue | undefined) {
68+
public override set value(val: FieldPickerValue | undefined) {
3969
const oldVal = this._value;
4070
this._value = val;
4171
this.requestUpdate('value', oldVal);
4272
this.dispatchEvent(new UmbChangeEvent());
4373
}
44-
public get value(): FieldPickerValue | undefined {
74+
public override get value(): FieldPickerValue | undefined {
4575
return this._value;
4676
}
4777

@@ -176,8 +206,8 @@ export class UmbTemplateFieldDropdownListElement extends UmbLitElement {
176206
if (this._type !== FieldType.SYSTEM && !this._unique) return;
177207
return html`
178208
<strong>${this.localize.string(this._uniqueName ?? '')}</strong>
179-
<uui-combobox id="value" value=${ifDefined(this.value?.alias)}>
180-
<uui-combobox-list @change=${this.#onChangeValue}>
209+
<uui-combobox id="value" value=${ifDefined(this.value?.alias)} @change=${this.#onChangeValue}>
210+
<uui-combobox-list>
181211
${repeat(
182212
this._customFields,
183213
(field) => field.alias,

src/packages/templating/modals/templating-page-field-builder/templating-page-field-builder-modal.element.ts

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,35 @@ import type { UmbTemplateFieldDropdownListElement } from './components/template-
77
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
88
import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit';
99
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
10-
import type { UUIBooleanInputEvent, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
10+
import type { UUIBooleanInputEvent, UUIButtonState, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui';
1111

1212
// import of local components
1313
import './components/template-field-dropdown-list/index.js';
14+
import { UmbValidationContext, umbBindToValidation } from '@umbraco-cms/backoffice/validation';
1415

1516
@customElement('umb-templating-page-field-builder-modal')
1617
export class UmbTemplatingPageFieldBuilderModalElement extends UmbModalBaseElement<
1718
UmbTemplatingPageFieldBuilderModalData,
1819
UmbTemplatingPageFieldBuilderModalValue
1920
> {
20-
private _close() {
21+
#validation = new UmbValidationContext(this);
22+
23+
#close() {
2124
this.modalContext?.reject();
2225
}
2326

24-
private _submit() {
25-
if (!this._field) return;
26-
this.value = { output: getUmbracoFieldSnippet(this._field, this._default, this._recursive) };
27-
this.modalContext?.submit();
27+
async #submit() {
28+
this._submitButtonState = 'waiting';
29+
30+
try {
31+
await this.#validation.validate();
32+
this._submitButtonState = 'success';
33+
34+
this.value = { output: getUmbracoFieldSnippet(this._field!, this._default, this._recursive) };
35+
this.modalContext?.submit();
36+
} catch {
37+
this._submitButtonState = 'failed';
38+
}
2839
}
2940

3041
@state()
@@ -39,6 +50,9 @@ export class UmbTemplatingPageFieldBuilderModalElement extends UmbModalBaseEleme
3950
@state()
4051
private _recursive: boolean = false;
4152

53+
@state()
54+
private _submitButtonState: UUIButtonState;
55+
4256
/** TODO: Implement "Choose field" */
4357

4458
#onChangeFieldValue(e: Event) {
@@ -50,12 +64,14 @@ export class UmbTemplatingPageFieldBuilderModalElement extends UmbModalBaseEleme
5064
<umb-body-layout headline=${this.localize.term('template_insert')}>
5165
<uui-box>
5266
<div>
53-
<uui-label for="page-field-value">
54-
<umb-localize key="templateEditor_chooseField">Choose field</umb-localize>
55-
</uui-label>
56-
<umb-template-field-dropdown-list
57-
@change=${this.#onChangeFieldValue}
58-
exclude-media-type></umb-template-field-dropdown-list>
67+
<umb-property-layout orientation="vertical" label=${this.localize.term('templateEditor_chooseField')}>
68+
<umb-template-field-dropdown-list
69+
slot="editor"
70+
required
71+
${umbBindToValidation(this)}
72+
@change=${this.#onChangeFieldValue}
73+
exclude-media-type></umb-template-field-dropdown-list>
74+
</umb-property-layout>
5975
6076
<uui-label for="page-field-default-value">
6177
<umb-localize key="templateEditor_defaultValue">Default value</umb-localize>
@@ -85,14 +101,15 @@ export class UmbTemplatingPageFieldBuilderModalElement extends UmbModalBaseEleme
85101
</uui-box>
86102
<uui-button
87103
slot="actions"
88-
@click=${this._close}
104+
@click=${this.#close}
89105
look="secondary"
90106
label=${this.localize.term('general_close')}></uui-button>
91107
<uui-button
92108
slot="actions"
93-
@click=${this._submit}
109+
@click=${this.#submit}
94110
color="positive"
95111
look="primary"
112+
.state=${this._submitButtonState}
96113
label=${this.localize.term('general_submit')}></uui-button>
97114
</umb-body-layout>
98115
`;

src/packages/user/user/workspace/user/components/user-workspace-profile-settings/user-workspace-profile-settings.element.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
66
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
77
import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event';
88
import type { UmbUiCultureInputElement } from '@umbraco-cms/backoffice/localization';
9+
import { umbBindToValidation } from '@umbraco-cms/backoffice/validation';
910

1011
@customElement('umb-user-workspace-profile-settings')
1112
export class UmbUserWorkspaceProfileSettingsElement extends UmbLitElement {
@@ -79,6 +80,7 @@ export class UmbUserWorkspaceProfileSettingsElement extends UmbLitElement {
7980
@change="${this.#onEmailChange}"
8081
required
8182
required-message=${this.localize.term('user_emailRequired')}
83+
${umbBindToValidation(this)}
8284
value=${ifDefined(this._user?.email)}></uui-input>
8385
</umb-property-layout>
8486
`;

src/packages/user/user/workspace/user/user-workspace.context.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type { UmbSubmittableWorkspaceContext } from '@umbraco-cms/backoffice/wor
99
import { UmbSubmittableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace';
1010
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
1111
import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';
12+
import { UmbValidationContext } from '@umbraco-cms/backoffice/validation';
1213

1314
type EntityType = UmbUserDetailModel;
1415

@@ -40,6 +41,8 @@ export class UmbUserWorkspaceContext
4041
constructor(host: UmbControllerHost) {
4142
super(host, UMB_USER_WORKSPACE_ALIAS);
4243

44+
this.addValidationContext(new UmbValidationContext(this));
45+
4346
this.routes.setRoutes([
4447
{
4548
path: 'edit/:id',

0 commit comments

Comments
 (0)