diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/document-tracked-reference-table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/document-tracked-reference-table.element.ts new file mode 100644 index 0000000000..584a13bdcc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/document-tracked-reference-table.element.ts @@ -0,0 +1,116 @@ +import { UmbDocumentTrackedReferenceRepository } from '../repository/index.js'; +import type { RelationItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { css, customElement, html, nothing, property, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; + +@customElement('umb-document-tracked-reference-table') +export class UmbDocumentTrackedReferenceTableElement extends UmbLitElement { + #documentTrackedReferenceRepository = new UmbDocumentTrackedReferenceRepository(this); + #pageSize = 10; + + @property() + unique = ''; + + @state() + _items: Array = []; + + /** + * Indicates if there are more references to load, i.e. if the server has more references to return. + * This is used to determine if the "...and X more references" text should be displayed. + */ + @state() + _hasMoreReferences = 0; + + @state() + _errorMessage = ''; + + firstUpdated() { + this.#getTrackedReferences(); + } + + async #getTrackedReferences() { + // Get the first 10 tracked references for the document: + const { data, error } = await this.#documentTrackedReferenceRepository.requestTrackedReference( + this.unique, + 0, + this.#pageSize, + ); + + if (error) { + this._errorMessage = error.message; + return; + } + + if (!data) return; + + this._items = data.items; + this._hasMoreReferences = data.total > this.#pageSize ? data.total - this.#pageSize : 0; + } + + render() { + return html` ${this.#renderErrorMessage()} ${this.#renderTable()} `; + } + + #renderTable() { + if (!this._items) return nothing; + return html` + + + + + Name + Type Name + + + ${repeat( + this._items, + (item) => item.nodeId, + (item) => + html` + + + + ${item.nodeName} + ${item.contentTypeName} + `, + )} + ${this._hasMoreReferences + ? html` + + + + ...and ${this._hasMoreReferences} more items + + + + ` + : nothing} + + + `; + } + + #renderErrorMessage() { + if (this._errorMessage) { + return html`
${this._errorMessage}
`; + } + return nothing; + } + + static styles = [ + UmbTextStyles, + css` + #error { + color: var(--uui-color-negative); + margin-bottom: 1rem; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-tracked-reference-table': UmbDocumentTrackedReferenceTableElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/document-tracked-reference-table.stories.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/document-tracked-reference-table.stories.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/index.ts new file mode 100644 index 0000000000..7738a990a5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/components/index.ts @@ -0,0 +1 @@ +export * from './document-tracked-reference-table.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/index.ts index 9f92b38d91..378cd7b5d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tracked-reference/index.ts @@ -1,2 +1,3 @@ //export * from './manifests.js'; +export * from './components/index.js'; export * from './repository/index.js';