Merge pull request #1126 from umbraco/feature/tree-picker-open-infinity-editor

Tree Picker: Open item in Infinity Editor
This commit is contained in:
Niels Lyngsø
2024-01-24 09:38:16 +01:00
committed by GitHub
3 changed files with 81 additions and 15 deletions

View File

@@ -4,6 +4,7 @@ import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import type { DocumentItemResponseModel, DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { splitStringToArray } from '@umbraco-cms/backoffice/utils';
import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
import { type UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter';
const SORTER_CONFIG: UmbSorterConfig<string> = {
@@ -98,13 +99,25 @@ export class UmbInputDocumentElement extends FormControlMixin(UmbLitElement) {
}
@state()
private _items: Array<DocumentItemResponseModel> = [];
private _editDocumentPath = '';
@state()
private _items?: Array<DocumentItemResponseModel>;
#pickerContext = new UmbDocumentPickerContext(this);
constructor() {
super();
new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL)
.addAdditionalPath('document')
.onSetup(() => {
return { data: { entityType: 'document', preset: {} } };
})
.observeRouteBuilder((routeBuilder) => {
this._editDocumentPath = routeBuilder({});
});
this.addValidator(
'rangeUnderflow',
() => this.minMessage,
@@ -141,11 +154,6 @@ export class UmbInputDocumentElement extends FormControlMixin(UmbLitElement) {
});
}
#openItem(item: DocumentItemResponseModel) {
// TODO: Implement the Content editing infinity editor. [LK]
console.log('TODO: _openItem', item);
}
render() {
return html` ${this.#renderItems()} ${this.#renderAddButton()} `;
}
@@ -199,9 +207,13 @@ export class UmbInputDocumentElement extends FormControlMixin(UmbLitElement) {
#renderOpenButton(item: DocumentItemResponseModel) {
if (!this.showOpenButton) return;
return html`<uui-button @click=${() => this.#openItem(item)} label="Open document ${item.name}"
>${this.localize.term('general_open')}</uui-button
>`;
return html`
<uui-button
href="${this._editDocumentPath}edit/${item.id}"
label="${this.localize.term('general_open')} ${item.name}">
${this.localize.term('general_open')}
</uui-button>
`;
}
static styles = [

View File

@@ -2,8 +2,9 @@ import { UmbMediaPickerContext } from './input-media.context.js';
import { css, html, customElement, property, state, ifDefined, repeat } from '@umbraco-cms/backoffice/external/lit';
import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import type { MediaItemResponseModel, MediaTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import type { MediaItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { splitStringToArray } from '@umbraco-cms/backoffice/utils';
import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
import { type UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter';
const SORTER_CONFIG: UmbSorterConfig<string> = {
@@ -94,6 +95,9 @@ export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) {
this.selectedIds = splitStringToArray(idsString);
}
@state()
private _editMediaPath = '';
@state()
private _items?: Array<MediaItemResponseModel>;
@@ -102,6 +106,15 @@ export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) {
constructor() {
super();
new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL)
.addAdditionalPath('media')
.onSetup(() => {
return { data: { entityType: 'media', preset: {} } };
})
.observeRouteBuilder((routeBuilder) => {
this._editMediaPath = routeBuilder({});
});
this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(',')));
this.observe(this.#pickerContext.selectedItems, (selectedItems) => (this._items = selectedItems));
@@ -175,7 +188,6 @@ export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) {
#renderItem(item: MediaItemResponseModel) {
// TODO: `file-ext` value has been hardcoded here. Find out if API model has value for it. [LK]
// TODO: How to handle the `showOpenButton` option? [LK]
return html`
<uui-card-media
name=${ifDefined(item.name === null ? undefined : item.name)}
@@ -183,6 +195,7 @@ export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) {
file-ext="jpg">
${this.#renderIsTrashed(item)}
<uui-action-bar slot="actions">
${this.#renderOpenButton(item)}
<uui-button label="Copy media">
<uui-icon name="icon-documents"></uui-icon>
</uui-button>
@@ -199,6 +212,18 @@ export class UmbInputMediaElement extends FormControlMixin(UmbLitElement) {
return html`<uui-tag size="s" slot="tag" color="danger">Trashed</uui-tag>`;
}
#renderOpenButton(item: MediaItemResponseModel) {
if (!this.showOpenButton) return;
return html`
<uui-button
compact
href="${this._editMediaPath}edit/${item.id}"
label=${this.localize.term('general_edit') + ` ${item.name}`}>
<uui-icon name="icon-edit"></uui-icon>
</uui-button>
`;
}
static styles = [
css`
.container {

View File

@@ -3,6 +3,7 @@ import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui';
import { UmbLitElement } from '@umbraco-cms/internal/lit-element';
import type { MemberItemResponseModel } from '@umbraco-cms/backoffice/backend-api';
import { splitStringToArray } from '@umbraco-cms/backoffice/utils';
import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal';
import { type UmbSorterConfig, UmbSorterController } from '@umbraco-cms/backoffice/sorter';
const SORTER_CONFIG: UmbSorterConfig<string> = {
@@ -87,6 +88,9 @@ export class UmbInputMemberElement extends FormControlMixin(UmbLitElement) {
this.#sorter.setModel(ids);
}
@property({ type: Boolean })
showOpenButton?: boolean;
@property({ type: Array })
allowedContentTypeIds?: string[] | undefined;
@@ -97,7 +101,10 @@ export class UmbInputMemberElement extends FormControlMixin(UmbLitElement) {
}
@state()
private _items: Array<MemberItemResponseModel> = [];
private _editMemberPath = '';
@state()
private _items?: Array<MemberItemResponseModel>;
// TODO: Create the `UmbMemberPickerContext` [LK]
//#pickerContext = new UmbMemberPickerContext(this);
@@ -105,6 +112,14 @@ export class UmbInputMemberElement extends FormControlMixin(UmbLitElement) {
constructor() {
super();
new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL)
.addAdditionalPath('member')
.onSetup(() => {
return { data: { entityType: 'member', preset: {} } };
})
.observeRouteBuilder((routeBuilder) => {
this._editMemberPath = routeBuilder({});
});
// TODO: Uncomment, once `UmbMemberPickerContext` has been implemented. [LK]
// this.addValidator(
// 'rangeUnderflow',
@@ -192,14 +207,28 @@ export class UmbInputMemberElement extends FormControlMixin(UmbLitElement) {
<uui-ref-node name=${ifDefined(item.name)} detail=${ifDefined(item.id)}>
${this.#renderIsTrashed(item)}
<uui-action-bar slot="actions">
<uui-button @click=${() => this.#requestRemoveItem(item)} label="Remove member ${item.name}"
>Remove</uui-button
>
${this.#renderOpenButton(item)}
<uui-button
@click=${() => this._requestRemoveItem(item)}
label="${this.localize.term('general_remove')} ${item.name}">
${this.localize.term('general_remove')}
</uui-button>
</uui-action-bar>
</uui-ref-node>
`;
}
#renderOpenButton(item: MemberItemResponseModel) {
if (!this.showOpenButton) return;
return html`
<uui-button
compact
href="${this._editMemberPath}edit/${item.id}"
label=${this.localize.term('general_edit') + ` ${item.name}`}>
<uui-icon name="icon-edit"></uui-icon>
</uui-button>
`;
}
#renderIsTrashed(item: MemberItemResponseModel) {
// TODO: Uncomment, once the Management API model support deleted members. [LK]
//if (!item.isTrashed) return;