implement UmbLitElement

This commit is contained in:
Niels Lyngsø
2023-01-04 09:31:13 +01:00
parent 964c85ded0
commit a587204822
3 changed files with 34 additions and 33 deletions

View File

@@ -1,13 +1,13 @@
import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html, LitElement } from 'lit';
import { css, html } from 'lit';
import { customElement } from 'lit/decorators.js';
import { ifDefined } from 'lit/directives/if-defined.js';
import type { UmbCollectionContext } from '../collection.context';
import type { ManifestCollectionBulkAction } from '@umbraco-cms/models';
import { UmbContextConsumerMixin } from '@umbraco-cms/context-api';
import { UmbLitElement } from 'src/core/element/lit-element.element';
@customElement('umb-collection-bulk-action-media-delete')
export class UmbCollectionBulkActionDeleteElement extends UmbContextConsumerMixin(LitElement) {
export class UmbCollectionBulkActionDeleteElement extends UmbLitElement {
static styles = [UUITextStyles, css``];
// TODO: make a UmbCollectionContextMedia:

View File

@@ -1,5 +1,5 @@
import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html, LitElement, nothing } from 'lit';
import { css, html, nothing } from 'lit';
import { customElement, state, property } from 'lit/decorators.js';
import { map } from 'rxjs';
import './collection-selection-actions.element';
@@ -7,12 +7,12 @@ import './collection-toolbar.element';
import type { UmbCollectionContext } from './collection.context';
import { createExtensionElement } from '@umbraco-cms/extensions-api';
import type { ManifestCollectionView, MediaDetails } from '@umbraco-cms/models';
import { UmbObserverMixin } from '@umbraco-cms/observable-api';
import { umbExtensionsRegistry } from '@umbraco-cms/extensions-registry';
import { UmbContextConsumerMixin } from '@umbraco-cms/context-api';
import { UmbLitElement } from 'src/core/element/lit-element.element';
import type { UmbObserverController } from 'src/core/observable-api/observer.controller';
@customElement('umb-collection')
export class UmbCollectionElement extends UmbContextConsumerMixin(UmbObserverMixin(LitElement)) {
export class UmbCollectionElement extends UmbLitElement {
static styles = [
UUITextStyles,
css`
@@ -34,7 +34,7 @@ export class UmbCollectionElement extends UmbContextConsumerMixin(UmbObserverMix
private _routes: Array<any> = [];
@state()
private _selection: Array<string> = [];
private _selection?: Array<string> | null;
private _collectionContext?: UmbCollectionContext<MediaDetails>;
@@ -48,7 +48,7 @@ export class UmbCollectionElement extends UmbContextConsumerMixin(UmbObserverMix
this._observeCollectionViews();
}
private _collectionViewUnsubscribe?: () => void;
private _collectionViewUnsubscribe?: UmbObserverController;
constructor() {
super();
@@ -68,29 +68,31 @@ export class UmbCollectionElement extends UmbContextConsumerMixin(UmbObserverMix
}
private _observeCollectionViews() {
this._collectionViewUnsubscribe?.();
this._collectionViewUnsubscribe?.destroy();
this._collectionViewUnsubscribe = this.observe<Array<ManifestCollectionView>>(
// TODO: could we make some helper methods for this scenario:
umbExtensionsRegistry?.extensionsOfType('collectionView').pipe(
map((extensions) => {
return extensions.filter((extension) => extension.meta.entityType === this._entityType);
})
),
(views) => {
if (views?.length === 0) return;
this._createRoutes(views);
}
);
}
private _createRoutes(views: ManifestCollectionView[]) {
private _createRoutes(views: ManifestCollectionView[] | null) {
this._routes = [];
this._routes = views.map((view) => {
return {
path: `${view.meta.pathName}`,
component: () => createExtensionElement(view),
};
});
if(views) {
this._routes = views.map((view) => {
return {
path: `${view.meta.pathName}`,
component: () => createExtensionElement(view),
};
});
}
this._routes.push({
path: '**',
@@ -103,7 +105,7 @@ export class UmbCollectionElement extends UmbContextConsumerMixin(UmbObserverMix
<umb-body-layout no-header-background>
<umb-collection-toolbar slot="header"></umb-collection-toolbar>
<router-slot id="router-slot" .routes="${this._routes}"></router-slot>
${this._selection.length > 0
${this._selection && this._selection.length > 0
? html`<umb-collection-selection-actions slot="footer"></umb-collection-selection-actions>`
: nothing}
</umb-body-layout>

View File

@@ -1,14 +1,13 @@
import { UUITextStyles } from '@umbraco-ui/uui-css';
import { css, html, LitElement } from 'lit';
import { css, html } from 'lit';
import { customElement, state } from 'lit/decorators.js';
import { repeat } from 'lit/directives/repeat.js';
import type { UmbCollectionContext } from '../collection.context';
import type { MediaDetails } from '@umbraco-cms/models';
import { UmbContextConsumerMixin } from '@umbraco-cms/context-api';
import { UmbObserverMixin } from '@umbraco-cms/observable-api';
import { UmbLitElement } from 'src/core/element/lit-element.element';
@customElement('umb-collection-view-media-grid')
export class UmbCollectionViewsMediaGridElement extends UmbContextConsumerMixin(UmbObserverMixin(LitElement)) {
export class UmbCollectionViewsMediaGridElement extends UmbLitElement {
static styles = [
UUITextStyles,
css`
@@ -66,19 +65,19 @@ export class UmbCollectionViewsMediaGridElement extends UmbContextConsumerMixin(
];
@state()
private _mediaItems: Array<MediaDetails> = [];
private _mediaItems?: Array<MediaDetails>;
@state()
private _selection: Array<string> = [];
private _selection?: Array<string>;
private _collectionContext?: UmbCollectionContext<MediaDetails>;
constructor() {
super();
document.addEventListener('dragenter', (e) => {
document.addEventListener('dragenter', () => {
this.toggleAttribute('dragging', true);
});
document.addEventListener('dragleave', (e) => {
document.addEventListener('dragleave', () => {
this.toggleAttribute('dragging', false);
});
document.addEventListener('drop', (e) => {
@@ -96,11 +95,11 @@ export class UmbCollectionViewsMediaGridElement extends UmbContextConsumerMixin(
if (!this._collectionContext) return;
this.observe<Array<MediaDetails>>(this._collectionContext.data, (mediaItems) => {
this._mediaItems = mediaItems.sort((a, b) => (a.hasChildren === b.hasChildren ? 0 : a ? -1 : 1));
this._mediaItems = mediaItems?.sort((a, b) => (a.hasChildren === b.hasChildren ? 0 : a ? -1 : 1));
});
this.observe<Array<string>>(this._collectionContext.selection, (selection) => {
this._selection = selection;
this._selection = selection || undefined;
});
}
@@ -118,7 +117,7 @@ export class UmbCollectionViewsMediaGridElement extends UmbContextConsumerMixin(
}
private _isSelected(mediaItem: MediaDetails) {
return this._selection.includes(mediaItem.key);
return this._selection?.includes(mediaItem.key);
}
private _renderMediaItem(item: MediaDetails) {
@@ -126,7 +125,7 @@ export class UmbCollectionViewsMediaGridElement extends UmbContextConsumerMixin(
//TODO: fix the file extension when media items have a file extension.
return html`<uui-card-media
selectable
?select-only=${this._selection.length > 0}
?select-only=${this._selection && this._selection.length > 0}
?selected=${this._isSelected(item)}
@open=${() => this._handleOpenItem(item)}
@selected=${() => this._handleSelect(item)}
@@ -145,11 +144,11 @@ export class UmbCollectionViewsMediaGridElement extends UmbContextConsumerMixin(
label="Drop files here"
accept=""></uui-file-dropzone>
<div id="media-files">
${repeat(
${this._mediaItems ? repeat(
this._mediaItems,
(file, index) => file.key + index,
(file) => this._renderMediaItem(file)
)}
) : ''}
</div>
`;
}