Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export class UmbDataTypePickerFlowDataTypePickerModalElement extends UmbModalBas

const collection = await dataTypeCollectionRepository.requestCollection({
skip: 0,
take: 100,
take: 1000,
editorUiAlias: propertyEditorUiAlias,
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {
id="dropdown-popover"
data-mark="app-language-menu"
@beforetoggle=${this.#onPopoverToggle}>
<umb-popover-layout>
<umb-popover-layout>
<uui-scroll-container style="max-height:calc(100vh - (var(--umb-header-layout-height) + 60px));">
${repeat(
this._languages,
(language) => language.unique,
Expand All @@ -152,7 +153,9 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {
</uui-menu-item>
`,
)}
</umb-popover-layout>
</uui-scroll-container>
</umb-popover-layout>

</uui-popover-container>`;
}

Expand Down Expand Up @@ -197,6 +200,8 @@ export class UmbAppLanguageSelectElement extends UmbLitElement {

uui-menu-item {
color: var(--uui-color-text);

width: auto;
}
`,
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@
height: number;
};

/**
* @element umb-property-editor-ui-image-crops
*/
@customElement('umb-property-editor-ui-image-crops')
export class UmbPropertyEditorUIImageCropsElement extends UmbLitElement implements UmbPropertyEditorUiElement {
@query('#label')
Expand All @@ -24,6 +21,9 @@
@state()
private _value: Array<UmbCrop> = [];

@state()
private _isCreating = false;

@property({ type: Array })
public set value(value: Array<UmbCrop>) {
this._value = value ?? [];
Expand All @@ -39,13 +39,8 @@
#oldInputValue = '';

#sorter = new UmbSorterController(this, {
getUniqueOfElement: (element: HTMLElement) => {
const unique = element.dataset['alias'];
return unique;
},
getUniqueOfModel: (modelEntry: UmbCrop) => {
return modelEntry.alias;
},
getUniqueOfElement: (element: HTMLElement) => element.dataset['alias'],
getUniqueOfModel: (modelEntry: UmbCrop) => modelEntry.alias,
identifier: 'Umb.SorterIdentifier.ImageCrops',
itemSelector: '.crop',
containerSelector: '.crops',
Expand All @@ -64,45 +59,28 @@

#onEdit(crop: UmbCrop) {
this.editCropAlias = crop.alias;

const form = this.shadowRoot?.querySelector('form') as HTMLFormElement;
if (!form) return;

const label = form.querySelector('#label') as HTMLInputElement;
const alias = form.querySelector('#alias') as HTMLInputElement;
const width = form.querySelector('#width') as HTMLInputElement;
const height = form.querySelector('#height') as HTMLInputElement;

if (!alias || !width || !height) return;

label.value = crop.label;
alias.value = crop.alias;
width.value = crop.width.toString();
height.value = crop.height.toString();
this._isCreating = false;

Check notice on line 62 in src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops/property-editor-ui-image-crops.element.ts

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (v16/dev)

✅ No longer an issue: Complex Conditional

UmbPropertyEditorUIImageCropsElement.onEdit no longer has a complex conditional. A complex conditional is an expression inside a branch (e.g. if, for, while) which consists of multiple, logical operators such as AND/OR. The more logical operators in an expression, the more severe the code smell.
}

#onEditCancel() {
this.editCropAlias = '';
this._isCreating = false;
}

#onSubmit(event: Event) {
event.preventDefault();
const form = event.target as HTMLFormElement;
if (!form) return;

if (!form.checkValidity()) return;
if (!form || !form.checkValidity()) return;

const formData = new FormData(form);

const label = formData.get('label') as string;
const alias = formData.get('alias') as string;
const width = formData.get('width') as string;
const height = formData.get('height') as string;

if (!label || !alias || !width || !height) return;
if (!this.value) this.value = [];

const newCrop = {
const newCrop: UmbCrop = {
label,
alias,
width: parseInt(width),
Expand All @@ -112,48 +90,21 @@
if (this.editCropAlias) {
const index = this.value.findIndex((item) => item.alias === this.editCropAlias);
if (index === -1) return;

const temp = [...this.value];
temp[index] = newCrop;
this.value = [...temp];
this.editCropAlias = '';
} else {
this.value = [...this.value, newCrop];
}
this.dispatchEvent(new UmbChangeEvent());

this.dispatchEvent(new UmbChangeEvent());
form.reset();
this._labelInput.focus();
}

#renderActions() {
return this.editCropAlias
? html`<uui-button @click=${this.#onEditCancel}>Cancel</uui-button>
<uui-button look="secondary" type="submit" label="Save"></uui-button>`
: html`<uui-button look="secondary" type="submit" label="Add"></uui-button>`;
}

#onLabelInput() {
const value = this._labelInput.value ?? '';

const aliasValue = generateAlias(value);

const alias = this.shadowRoot?.querySelector('#alias') as HTMLInputElement;

if (!alias) return;

const oldAliasValue = generateAlias(this.#oldInputValue);

if (alias.value === oldAliasValue || !alias.value) {
alias.value = aliasValue;
}

this.#oldInputValue = value;
this._labelInput?.focus();
this._isCreating = false;
}

override render() {
if (!this.value) this.value = [];

#renderForm(initial?: UmbCrop) {
return html`
<uui-form>
<form @submit=${this.#onSubmit}>
Expand All @@ -165,54 +116,86 @@
id="label"
name="label"
type="text"
autocomplete="false"
value=""></uui-input>
.value=${initial?.label ?? ''}></uui-input>
</div>
<div class="input">
<uui-label for="alias">Alias</uui-label>
<uui-input label="Alias" id="alias" name="alias" type="text" autocomplete="false" value=""></uui-input>
<uui-input label="Alias" id="alias" name="alias" type="text" autocomplete="false" .value=${initial?.alias ?? ''}></uui-input>
</div>
<div class="input">
<uui-label for="width">Width</uui-label>
<uui-input label="Width" id="width" name="width" type="number" autocomplete="false" value="" min="0">
<uui-input label="Width" id="width" name="width" type="number" autocomplete="false" .value=${initial?.width ?? ''} min="0">
<span class="append" slot="append">px</span>
</uui-input>
</div>
<div class="input">
<uui-label for="height">Height</uui-label>
<uui-input label="Height" id="height" name="height" type="number" autocomplete="false" value="" min="0">
<uui-input label="Height" id="height" name="height" type="number" autocomplete="false" .value=${initial?.height ?? ''} min="0">
<span class="append" slot="append">px</span>
</uui-input>
</div>
<div class="action-wrapper">${this.#renderActions()}</div>
<div class="action-wrapper">
${this.editCropAlias
? html`<uui-button @click=${this.#onEditCancel}>Cancel</uui-button>
<uui-button look="secondary" type="submit" label="Save"></uui-button>`
: html`<uui-button look="secondary" type="submit" label="Add"></uui-button>`}
</div>
</form>
</uui-form>
<div class="crops">
${repeat(
this.value,
(item) => item.alias,
(item) => html`
<div class="crop" data-alias="${item.alias}">
<uui-icon name="icon-grip" class="crop-drag"></uui-icon>
<span><strong>${item.label}</strong> <em>(${item.alias})</em></span>
<span class="crop-size">(${item.width} x ${item.height}px)</span>
<div class="crop-actions">
<uui-button
label=${this.localize.term('general_edit')}
color="default"
@click=${() => this.#onEdit(item)}></uui-button>
<uui-button
label=${this.localize.term('general_remove')}
color="danger"
@click=${() => this.#onRemove(item.alias)}></uui-button>
</div>
</div>
`,
)}
</div>
`;
}

#onLabelInput() {
const value = this._labelInput.value ?? '';
const aliasValue = generateAlias(value);
const alias = this.shadowRoot?.querySelector('#alias') as HTMLInputElement;
if (!alias) return;

const oldAliasValue = generateAlias(this.#oldInputValue);
if (alias.value === oldAliasValue || !alias.value) {
alias.value = aliasValue;
}

this.#oldInputValue = value;
}

override render() {
return html`
<uui-ref-list class="crops">
${repeat(
this.value,
(item) => item.alias,
(item) => html`
${this.editCropAlias === item.alias
? html`<div class="crop-form">${this.#renderForm(item)}</div>`
: html`
<uui-ref-node
class="crop"
data-alias="${item.alias}"
detail="${item.width} x ${item.height}px"
name="${item.label} (${item.alias})">
<uui-icon slot="icon" name="icon-crop"></uui-icon>
<uui-action-bar slot="actions">
<uui-button
label=${this.localize.term('general_edit')}
color="default"
@click=${() => this.#onEdit(item)}></uui-button>
<uui-button
label=${this.localize.term('general_remove')}
color="danger"
@click=${() => this.#onRemove(item.alias)}></uui-button>
</uui-action-bar>
</uui-ref-node>
`}
`
)}
</uui-ref-list>
${!this._isCreating && !this.editCropAlias
? html`<uui-button look="outline" @click=${() => (this._isCreating = true)}>Create crop</uui-button>`
: ''}
${this._isCreating ? this.#renderForm() : ''}
`;
}
static override readonly styles = [
UmbTextStyles,
css`
Expand All @@ -228,34 +211,16 @@
.crop {
display: flex;
align-items: center;
background: var(--uui-color-background);
}
.crop-drag {
cursor: grab;
padding-inline: var(--uui-size-space-4);
color: var(--uui-color-disabled-contrast);
font-weight: bold;
}

.crop-drag:active {
cursor: grabbing;
}

.crop-size {
font-size: 0.9em;
padding-inline: var(--uui-size-space-4);
}
.crop-actions {
display: flex;
margin-left: auto;
}
form {
display: flex;
gap: var(--uui-size-space-2);
flex-wrap: wrap;
}
.input {
display: flex;
flex-direction: column;
flex: 1 1 200px;
}
uui-input[type='number'] {
text-align: right;
Expand Down Expand Up @@ -283,4 +248,4 @@
interface HTMLElementTagNameMap {
'umb-property-editor-ui-image-crops': UmbPropertyEditorUIImageCropsElement;
}
}
}
Loading