{"version":3,"file":"index.js","sources":["../../../../src/packages/core/temporary-file/temporary-file.server.data-source.ts","../../../../src/packages/core/temporary-file/temporary-file.repository.ts","../../../../src/packages/core/temporary-file/components/temporary-file-badge.element.ts","../../../../src/packages/core/temporary-file/types.ts","../../../../src/packages/core/temporary-file/temporary-file-manager.class.ts"],"sourcesContent":["import type { UmbDataSourceResponse } from '../repository/index.js';\r\nimport { TemporaryFileService, type PostTemporaryFileResponse } from '@umbraco-cms/backoffice/external/backend-api';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { tryExecuteAndNotify, tryXhrRequest } from '@umbraco-cms/backoffice/resources';\r\n\r\n/**\r\n * A data source to upload temporary files to the server\r\n * @class UmbTemporaryFileServerDataSource\r\n * @implements {RepositoryDetailDataSource}\r\n */\r\nexport class UmbTemporaryFileServerDataSource {\r\n\t#host: UmbControllerHost;\r\n\r\n\t/**\r\n\t * Creates an instance of UmbTemporaryFileServerDataSource.\r\n\t * @param {UmbControllerHost} host - The controller host for this controller to be appended to\r\n\t * @memberof UmbTemporaryFileServerDataSource\r\n\t */\r\n\tconstructor(host: UmbControllerHost) {\r\n\t\tthis.#host = host;\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads a temporary file to the server\r\n\t * @param {string} id\r\n\t * @param {File} file\r\n\t * @returns {*}\r\n\t * @memberof UmbTemporaryFileServerDataSource\r\n\t */\r\n\tasync create(\r\n\t\tid: string,\r\n\t\tfile: File,\r\n\t\tonProgress?: (progress: ProgressEvent) => void,\r\n\t\tabortSignal?: AbortSignal,\r\n\t): Promise> {\r\n\t\tconst body = new FormData();\r\n\t\tbody.append('Id', id);\r\n\t\tbody.append('File', file);\r\n\t\tconst xhrRequest = tryXhrRequest({\r\n\t\t\turl: '/umbraco/management/api/v1/temporary-file',\r\n\t\t\tmethod: 'POST',\r\n\t\t\tresponseHeader: 'Umb-Generated-Resource',\r\n\t\t\tbody,\r\n\t\t\tonProgress,\r\n\t\t\tabortSignal,\r\n\t\t});\r\n\t\treturn tryExecuteAndNotify(this.#host, xhrRequest);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a temporary file from the server\r\n\t * @param {string} id\r\n\t * @returns {*}\r\n\t * @memberof UmbTemporaryFileServerDataSource\r\n\t */\r\n\tread(id: string) {\r\n\t\tif (!id) throw new Error('Id is missing');\r\n\t\treturn tryExecuteAndNotify(this.#host, TemporaryFileService.getTemporaryFileById({ id }));\r\n\t}\r\n\r\n\t/**\r\n\t * Deletes a temporary file from the server\r\n\t * @param {string} id\r\n\t * @returns {*}\r\n\t * @memberof UmbTemporaryFileServerDataSource\r\n\t */\r\n\tdelete(id: string) {\r\n\t\tif (!id) throw new Error('Id is missing');\r\n\t\treturn tryExecuteAndNotify(this.#host, TemporaryFileService.deleteTemporaryFileById({ id }));\r\n\t}\r\n}\r\n","import { UmbTemporaryFileServerDataSource } from './temporary-file.server.data-source.js';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository';\r\n\r\n/**\r\n * A repository for uploading temporary files\r\n * @class UmbTemporaryFileRepository\r\n * @augments {UmbRepositoryBase}\r\n */\r\nexport class UmbTemporaryFileRepository extends UmbRepositoryBase {\r\n\t#source: UmbTemporaryFileServerDataSource;\r\n\r\n\t/**\r\n\t * Creates an instance of UmbTemporaryFileRepository.\r\n\t * @param {UmbControllerHost} host - The controller host for this controller to be appended to\r\n\t * @memberof UmbTemporaryFileRepository\r\n\t */\r\n\tconstructor(host: UmbControllerHost) {\r\n\t\tsuper(host);\r\n\t\tthis.#source = new UmbTemporaryFileServerDataSource(host);\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads a temporary file\r\n\t * @param {string} id\r\n\t * @param {File} file\r\n\t * @param onProgress\r\n\t * @returns {*}\r\n\t * @memberof UmbTemporaryFileRepository\r\n\t */\r\n\tupload(id: string, file: File, onProgress?: (progress: ProgressEvent) => void, abortSignal?: AbortSignal) {\r\n\t\treturn this.#source.create(id, file, onProgress, abortSignal);\r\n\t}\r\n\r\n\t/**\r\n\t * Deletes a temporary file\r\n\t * @param {string} id\r\n\t * @returns {*}\r\n\t * @memberof UmbTemporaryFileRepository\r\n\t */\r\n\tdelete(id: string) {\r\n\t\treturn this.#source.delete(id);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets a temporary file\r\n\t * @param {string} id\r\n\t * @returns {*}\r\n\t * @memberof UmbTemporaryFileRepository\r\n\t */\r\n\trequestById(id: string) {\r\n\t\treturn this.#source.read(id);\r\n\t}\r\n}\r\n","import { css, customElement, html, property } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';\r\nimport { clamp } from '@umbraco-cms/backoffice/utils';\r\n\r\n@customElement('umb-temporary-file-badge')\r\nexport class UmbTemporaryFileBadgeElement extends UmbLitElement {\r\n\t#progress = 0;\r\n\r\n\t@property({ type: Number })\r\n\tpublic set progress(v: number) {\r\n\t\tconst p = clamp(Math.ceil(v), 0, 100);\r\n\t\tthis.#progress = p;\r\n\t}\r\n\tpublic get progress(): number {\r\n\t\treturn this.#progress;\r\n\t}\r\n\r\n\t@property({ type: Boolean, reflect: true })\r\n\tpublic complete = false;\r\n\r\n\t@property({ type: Boolean, reflect: true })\r\n\tpublic error = false;\r\n\r\n\toverride render() {\r\n\t\treturn html`
\r\n\t\t\t\r\n\t\t\t
${this.#renderIcon()}
\r\n\t\t
`;\r\n\t}\r\n\r\n\t#renderIcon() {\r\n\t\tif (this.error) {\r\n\t\t\treturn html``;\r\n\t\t}\r\n\r\n\t\tif (this.complete) {\r\n\t\t\treturn html``;\r\n\t\t}\r\n\r\n\t\treturn `${this.progress}%`;\r\n\t}\r\n\r\n\tstatic override readonly styles = css`\r\n\t\t#wrapper {\r\n\t\t\tposition: relative;\r\n\t\t\theight: 75%;\r\n\t\t}\r\n\r\n\t\t:host([complete]) {\r\n\t\t\tuui-loader-circle,\r\n\t\t\t#icon {\r\n\t\t\t\tcolor: var(--uui-color-positive);\r\n\t\t\t}\r\n\t\t}\r\n\t\t:host([error]) {\r\n\t\t\tuui-loader-circle,\r\n\t\t\t#icon {\r\n\t\t\t\tcolor: var(--uui-color-danger);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tuui-loader-circle {\r\n\t\t\tz-index: 2;\r\n\t\t\tinset: 0;\r\n\t\t\tcolor: var(--uui-color-focus);\r\n\t\t\tfont-size: var(--uui-size-12);\r\n\t\t\twidth: 100%;\r\n\t\t\theight: 100%;\r\n\t\t}\r\n\r\n\t\t#icon {\r\n\t\t\tcolor: var(--uui-color-text);\r\n\t\t\tfont-size: var(--uui-size-6);\r\n\t\t\tposition: absolute;\r\n\t\t\ttop: 50%;\r\n\t\t\tleft: 50%;\r\n\t\t\ttransform: translate(-50%, -50%);\r\n\t\t}\r\n\t`;\r\n}\r\n\r\ndeclare global {\r\n\tinterface HTMLElementTagNameMap {\r\n\t\t'umb-temporary-file-badge': UmbTemporaryFileBadgeElement;\r\n\t}\r\n}\r\n\r\nexport default UmbTemporaryFileBadgeElement;\r\n","import type { TemporaryFileConfigurationResponseModel } from '@umbraco-cms/backoffice/external/backend-api';\r\n\r\nexport enum TemporaryFileStatus {\r\n\tSUCCESS = 'success',\r\n\tWAITING = 'waiting',\r\n\tERROR = 'error',\r\n}\r\n\r\nexport interface UmbTemporaryFileModel {\r\n\tfile: File;\r\n\ttemporaryUnique: string;\r\n\tstatus?: TemporaryFileStatus;\r\n\tonProgress?: (progress: number) => void;\r\n\tabortSignal?: AbortSignal;\r\n}\r\n\r\nexport type UmbQueueHandlerCallback = (item: TItem) => Promise;\r\n\r\nexport type UmbUploadOptions = {\r\n\tchunkSize?: number;\r\n\tcallback?: UmbQueueHandlerCallback;\r\n};\r\n\r\nexport type UmbTemporaryFileConfigurationModel = TemporaryFileConfigurationResponseModel;\r\n","import { UmbTemporaryFileRepository } from './temporary-file.repository.js';\r\nimport { UmbTemporaryFileConfigRepository } from './config/index.js';\r\nimport {\r\n\tTemporaryFileStatus,\r\n\ttype UmbQueueHandlerCallback,\r\n\ttype UmbTemporaryFileModel,\r\n\ttype UmbUploadOptions,\r\n} from './types.js';\r\nimport { observeMultiple, UmbArrayState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api';\r\nimport { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';\r\nimport { formatBytes } from '@umbraco-cms/backoffice/utils';\r\n\r\nexport class UmbTemporaryFileManager<\r\n\tUploadableItem extends UmbTemporaryFileModel = UmbTemporaryFileModel,\r\n> extends UmbControllerBase {\r\n\treadonly #temporaryFileRepository = new UmbTemporaryFileRepository(this._host);\r\n\treadonly #temporaryFileConfigRepository = new UmbTemporaryFileConfigRepository(this._host);\r\n\treadonly #localization = new UmbLocalizationController(this._host);\r\n\r\n\treadonly #queue = new UmbArrayState([], (item) => item.temporaryUnique);\r\n\tpublic readonly queue = this.#queue.asObservable();\r\n\r\n\tasync uploadOne(uploadableItem: UploadableItem, options?: UmbUploadOptions): Promise {\r\n\t\tthis.#queue.setValue([]);\r\n\r\n\t\tconst item: UploadableItem = {\r\n\t\t\t...uploadableItem,\r\n\t\t\tstatus: TemporaryFileStatus.WAITING,\r\n\t\t};\r\n\r\n\t\tthis.#queue.appendOne(item);\r\n\t\treturn (await this.#handleQueue({ ...options, chunkSize: 1 }))[0];\r\n\t}\r\n\r\n\tasync upload(\r\n\t\tqueueItems: Array,\r\n\t\toptions?: UmbUploadOptions,\r\n\t): Promise> {\r\n\t\tthis.#queue.setValue([]);\r\n\r\n\t\tconst items = queueItems.map((item): UploadableItem => ({ ...item, status: TemporaryFileStatus.WAITING }));\r\n\t\tthis.#queue.append(items);\r\n\t\treturn this.#handleQueue({ ...options });\r\n\t}\r\n\r\n\tremoveOne(unique: string) {\r\n\t\tthis.#queue.removeOne(unique);\r\n\t}\r\n\r\n\tremove(uniques: Array) {\r\n\t\tthis.#queue.remove(uniques);\r\n\t}\r\n\r\n\tasync #handleQueue(options?: UmbUploadOptions): Promise> {\r\n\t\tconst filesCompleted: Array = [];\r\n\t\tconst queue = this.#queue.getValue();\r\n\r\n\t\tif (!queue.length) return filesCompleted;\r\n\r\n\t\tconst handler: UmbQueueHandlerCallback = async (item) => {\r\n\t\t\tconst completedUpload = await this.#handleUpload(item);\r\n\t\t\tfilesCompleted.push(completedUpload);\r\n\r\n\t\t\tif (options?.callback) await options.callback(completedUpload);\r\n\t\t};\r\n\r\n\t\tconst chunkSize = options?.chunkSize ?? 5;\r\n\t\tconst chunks = Math.ceil(queue.length / chunkSize);\r\n\r\n\t\tfor (let i = 0; i < chunks; i++) {\r\n\t\t\tconst chunk = queue.slice(i * chunkSize, i * chunkSize + chunkSize);\r\n\t\t\tawait Promise.all(chunk.map(handler));\r\n\t\t}\r\n\r\n\t\treturn filesCompleted;\r\n\t}\r\n\r\n\tasync #validateItem(item: UploadableItem): Promise {\r\n\t\tlet maxFileSize = await this.observe(this.#temporaryFileConfigRepository.part('maxFileSize')).asPromise();\r\n\t\tif (maxFileSize) {\r\n\t\t\t// Convert from kilobytes to bytes\r\n\t\t\tmaxFileSize *= 1024;\r\n\t\t\tif (item.file.size > maxFileSize) {\r\n\t\t\t\tconst notification = await this.getContext(UMB_NOTIFICATION_CONTEXT);\r\n\t\t\t\tnotification.peek('warning', {\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\theadline: 'Upload',\r\n\t\t\t\t\t\tmessage: `\r\n\t${this.#localization.term('media_invalidFileSize')}: ${item.file.name} (${formatBytes(item.file.size)}).\r\n\r\n\t${this.#localization.term('media_maxFileSize')} ${formatBytes(maxFileSize)}.\r\n\t\t\t\t\t\t`,\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst fileExtension = item.file.name.split('.').pop() ?? '';\r\n\r\n\t\tconst [allowedExtensions, disallowedExtensions] = await this.observe(\r\n\t\t\tobserveMultiple([\r\n\t\t\t\tthis.#temporaryFileConfigRepository.part('allowedUploadedFileExtensions'),\r\n\t\t\t\tthis.#temporaryFileConfigRepository.part('disallowedUploadedFilesExtensions'),\r\n\t\t\t]),\r\n\t\t).asPromise();\r\n\r\n\t\tif (\r\n\t\t\t(allowedExtensions?.length && !allowedExtensions.includes(fileExtension)) ||\r\n\t\t\t(disallowedExtensions?.length && disallowedExtensions.includes(fileExtension))\r\n\t\t) {\r\n\t\t\tconst notification = await this.getContext(UMB_NOTIFICATION_CONTEXT);\r\n\t\t\tnotification.peek('warning', {\r\n\t\t\t\tdata: {\r\n\t\t\t\t\tmessage: `${this.#localization.term('media_disallowedFileType')}: ${fileExtension}`,\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tasync #handleUpload(item: UploadableItem) {\r\n\t\tif (!item.temporaryUnique) throw new Error(`Unique is missing for item ${item}`);\r\n\r\n\t\tconst isValid = await this.#validateItem(item);\r\n\t\tif (!isValid) {\r\n\t\t\tthis.#queue.updateOne(item.temporaryUnique, {\r\n\t\t\t\t...item,\r\n\t\t\t\tstatus: TemporaryFileStatus.ERROR,\r\n\t\t\t});\r\n\t\t\treturn { ...item, status: TemporaryFileStatus.ERROR };\r\n\t\t}\r\n\r\n\t\tconst { error } = await this.#temporaryFileRepository.upload(\r\n\t\t\titem.temporaryUnique,\r\n\t\t\titem.file,\r\n\t\t\t(evt) => {\r\n\t\t\t\t// Update progress in percent if a callback is provided\r\n\t\t\t\tif (item.onProgress) item.onProgress((evt.loaded / evt.total) * 100);\r\n\t\t\t},\r\n\t\t\titem.abortSignal,\r\n\t\t);\r\n\t\tconst status = error ? TemporaryFileStatus.ERROR : TemporaryFileStatus.SUCCESS;\r\n\r\n\t\tthis.#queue.updateOne(item.temporaryUnique, { ...item, status });\r\n\t\treturn { ...item, status };\r\n\t}\r\n}\r\n"],"names":["UmbTemporaryFileServerDataSource","#host","host","id","file","onProgress","abortSignal","body","xhrRequest","tryXhrRequest","tryExecuteAndNotify","TemporaryFileService","UmbTemporaryFileRepository","UmbRepositoryBase","#source","_progress","_UmbTemporaryFileBadgeElement_instances","renderIcon_fn","UmbTemporaryFileBadgeElement","UmbLitElement","__privateAdd","v","p","clamp","__privateSet","__privateGet","html","__privateMethod","css","__decorateClass","property","customElement","TemporaryFileStatus","UmbTemporaryFileManager","UmbControllerBase","#temporaryFileRepository","#temporaryFileConfigRepository","UmbTemporaryFileConfigRepository","#localization","UmbLocalizationController","#queue","UmbArrayState","item","uploadableItem","options","#handleQueue","queueItems","items","unique","uniques","filesCompleted","queue","handler","completedUpload","#handleUpload","chunkSize","chunks","i","chunk","#validateItem","maxFileSize","UMB_NOTIFICATION_CONTEXT","formatBytes","fileExtension","allowedExtensions","disallowedExtensions","observeMultiple","error","evt","status"],"mappings":"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"}