{"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 { TemporaryFileService } from '@umbraco-cms/backoffice/external/backend-api';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { tryExecuteAndNotify } 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(id: string, file: File) {\r\n\t\treturn tryExecuteAndNotify(\r\n\t\t\tthis.#host,\r\n\t\t\tTemporaryFileService.postTemporaryFile({\r\n\t\t\t\tformData: {\r\n\t\t\t\t\tId: id,\r\n\t\t\t\t\tFile: file,\r\n\t\t\t\t},\r\n\t\t\t}),\r\n\t\t);\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 * @returns {*}\r\n\t * @memberof UmbTemporaryFileRepository\r\n\t */\r\n\tupload(id: string, file: File) {\r\n\t\treturn this.#source.create(id, file);\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\tprivate _progress = 0;\r\n\r\n\t@property({ type: Number })\r\n\tpublic set progress(v: number) {\r\n\t\tconst oldVal = this._progress;\r\n\r\n\t\tconst p = clamp(v, 0, 100);\r\n\t\tthis._progress = p;\r\n\r\n\t\tthis.requestUpdate('progress', oldVal);\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\toverride render() {\r\n\t\treturn html`\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t${this.complete\r\n\t\t\t\t\t? html``\r\n\t\t\t\t\t: html``}\r\n\t\t\t
\r\n\t\t
`;\r\n\t}\r\n\r\n\tstatic override styles = css`\r\n\t\t:host {\r\n\t\t\tdisplay: block;\r\n\t\t}\r\n\r\n\t\t#wrapper {\r\n\t\t\tbox-sizing: border-box;\r\n\t\t\tbox-shadow: inset 0px 0px 0px 6px var(--uui-color-surface);\r\n\t\t\tbackground-color: var(--uui-color-selected);\r\n\t\t\tposition: relative;\r\n\t\t\tborder-radius: 100%;\r\n\t\t\tfont-size: var(--uui-size-6);\r\n\t\t}\r\n\r\n\t\t:host([complete]) #wrapper {\r\n\t\t\tbackground-color: var(--uui-color-positive);\r\n\t\t}\r\n\t\t:host([complete]) uui-loader-circle {\r\n\t\t\tcolor: var(--uui-color-positive);\r\n\t\t}\r\n\r\n\t\tuui-loader-circle {\r\n\t\t\tdisplay: absolute;\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}\r\n\r\n\t\tuui-badge {\r\n\t\t\tpadding: 0;\r\n\t\t\tbackground-color: transparent;\r\n\t\t}\r\n\r\n\t\tuui-icon {\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","export 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}\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","import { UmbTemporaryFileRepository } from './temporary-file.repository.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 { UmbArrayState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\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\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\tstatus: TemporaryFileStatus.WAITING,\r\n\t\t\t...uploadableItem,\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 => ({ status: TemporaryFileStatus.WAITING, ...item }));\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 #handleUpload(item: UploadableItem) {\r\n\t\tif (!item.temporaryUnique) throw new Error(`Unique is missing for item ${item}`);\r\n\r\n\t\tconst { error } = await this.#temporaryFileRepository\r\n\t\t\t.upload(item.temporaryUnique, item.file)\r\n\t\t\t.catch(() => ({ error: true }));\r\n\r\n\t\tlet status: TemporaryFileStatus;\r\n\t\tif (error) {\r\n\t\t\tstatus = TemporaryFileStatus.ERROR;\r\n\t\t\tthis.#queue.updateOne(item.temporaryUnique, { ...item, status });\r\n\t\t} else {\r\n\t\t\tstatus = TemporaryFileStatus.SUCCESS;\r\n\t\t\tthis.#queue.updateOne(item.temporaryUnique, { ...item, status });\r\n\t\t}\r\n\r\n\t\treturn { ...item, status };\r\n\t}\r\n}\r\n"],"names":["UmbTemporaryFileServerDataSource","#host","host","id","file","tryExecuteAndNotify","TemporaryFileService","UmbTemporaryFileRepository","UmbRepositoryBase","#source","UmbTemporaryFileBadgeElement","UmbLitElement","v","oldVal","p","clamp","html","css","__decorateClass","property","customElement","TemporaryFileStatus","UmbTemporaryFileManager","UmbControllerBase","#temporaryFileRepository","#queue","UmbArrayState","item","uploadableItem","options","#handleQueue","queueItems","items","unique","uniques","filesCompleted","queue","handler","completedUpload","#handleUpload","chunkSize","chunks","i","chunk","error","status"],"mappings":";;;;;;;;AASO,MAAMA,EAAiC;AAAA,EAC7CC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYC,GAAyB;AACpC,SAAKD,KAAQC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUd,MAAM,OAAOC,GAAYC,GAAY;AAC7B,WAAAC;AAAA,MACN,KAAKJ;AAAA,MACLK,EAAqB,kBAAkB;AAAA,QACtC,UAAU;AAAA,UACT,IAAIH;AAAA,UACJ,MAAMC;AAAA,QAAA;AAAA,MAEP,CAAA;AAAA,IACF;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASD,KAAKD,GAAY;AAChB,QAAI,CAACA,EAAU,OAAA,IAAI,MAAM,eAAe;AACjC,WAAAE,EAAoB,KAAKJ,IAAOK,EAAqB,qBAAqB,EAAE,IAAAH,EAAA,CAAI,CAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzF,OAAOA,GAAY;AAClB,QAAI,CAACA,EAAU,OAAA,IAAI,MAAM,eAAe;AACjC,WAAAE,EAAoB,KAAKJ,IAAOK,EAAqB,wBAAwB,EAAE,IAAAH,EAAA,CAAI,CAAC;AAAA,EAAA;AAE7F;ACpDO,MAAMI,UAAmCC,EAAkB;AAAA,EACjEC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYP,GAAyB;AACpC,UAAMA,CAAI,GACL,KAAAO,KAAU,IAAIT,EAAiCE,CAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzD,OAAOC,GAAYC,GAAY;AAC9B,WAAO,KAAKK,GAAQ,OAAON,GAAIC,CAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpC,OAAOD,GAAY;AACX,WAAA,KAAKM,GAAQ,OAAON,CAAE;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS9B,YAAYA,GAAY;AAChB,WAAA,KAAKM,GAAQ,KAAKN,CAAE;AAAA,EAAA;AAE7B;;;;;;AC/Ca,IAAAO,IAAN,cAA2CC,EAAc;AAAA,EAAzD,cAAA;AAAA,UAAA,GAAA,SAAA,GACN,KAAQ,YAAY,GAgBpB,KAAO,WAAW;AAAA,EAAA;AAAA,EAblB,IAAW,SAASC,GAAW;AAC9B,UAAMC,IAAS,KAAK,WAEdC,IAAIC,EAAMH,GAAG,GAAG,GAAG;AACzB,SAAK,YAAYE,GAEZ,KAAA,cAAc,YAAYD,CAAM;AAAA,EAAA;AAAA,EAEtC,IAAW,WAAmB;AAC7B,WAAO,KAAK;AAAA,EAAA;AAAA,EAMJ,SAAS;AACV,WAAAG;AAAA;AAAA,mCAE0B,KAAK,WAAW,MAAM,KAAK,QAAQ;AAAA,MAChE,KAAK,WACJA,6CACAA,6CAAgD;AAAA;AAAA;AAAA,EAAA;AA+CvD;AAxEaN,EA8BI,SAASO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1BdC,EAAA;AAAA,EADVC,EAAS,EAAE,MAAM,OAAQ,CAAA;AAAA,GAHdT,EAID,WAAA,YAAA,CAAA;AAaJQ,EAAA;AAAA,EADNC,EAAS,EAAE,MAAM,SAAS,SAAS,GAAM,CAAA;AAAA,GAhB9BT,EAiBL,WAAA,YAAA,CAAA;AAjBKA,IAANQ,EAAA;AAAA,EADNE,EAAc,0BAA0B;AAAA,GAC5BV,CAAA;ACLD,IAAAW,sBAAAA,OACXA,EAAA,UAAU,WACVA,EAAA,UAAU,WACVA,EAAA,QAAQ,SAHGA,IAAAA,KAAA,CAAA,CAAA;ACUL,MAAMC,UAEHC,EAAkB;AAAA,EAFrB,cAAA;AAAA,UAAA,GAAA,SAAA,GAGN,KAASC,KAA2B,IAAIjB,EAA2B,KAAK,KAAK,GAEpE,KAAAkB,KAAS,IAAIC,EAA8B,IAAI,CAACC,MAASA,EAAK,eAAe,GACtE,KAAA,QAAQ,KAAKF,GAAO,aAAa;AAAA,EAAA;AAAA,EAHxCD;AAAA,EAEAC;AAAA,EAGT,MAAM,UAAUG,GAAgCC,GAAqE;AAC/G,SAAAJ,GAAO,SAAS,EAAE;AAEvB,UAAME,IAAuB;AAAA,MAC5B,QAAQN,EAAoB;AAAA,MAC5B,GAAGO;AAAA,IACJ;AAEK,gBAAAH,GAAO,UAAUE,CAAI,IAClB,MAAM,KAAKG,GAAa,EAAE,GAAGD,GAAS,WAAW,GAAG,GAAG,CAAC;AAAA,EAAA;AAAA,EAGjE,MAAM,OACLE,GACAF,GACiC;AAC5B,SAAAJ,GAAO,SAAS,EAAE;AAEjB,UAAAO,IAAQD,EAAW,IAAI,CAACJ,OAA0B,EAAE,QAAQN,EAAoB,SAAS,GAAGM,EAAO,EAAA;AACpG,gBAAAF,GAAO,OAAOO,CAAK,GACjB,KAAKF,GAAa,EAAE,GAAGD,GAAS;AAAA,EAAA;AAAA,EAGxC,UAAUI,GAAgB;AACpB,SAAAR,GAAO,UAAUQ,CAAM;AAAA,EAAA;AAAA,EAG7B,OAAOC,GAAwB;AACzB,SAAAT,GAAO,OAAOS,CAAO;AAAA,EAAA;AAAA,EAG3B,MAAMJ,GAAaD,GAA4E;AAC9F,UAAMM,IAAwC,CAAC,GACzCC,IAAQ,KAAKX,GAAO,SAAS;AAE/B,QAAA,CAACW,EAAM,OAAe,QAAAD;AAEpB,UAAAE,IAAmD,OAAOV,MAAS;AACxE,YAAMW,IAAkB,MAAM,KAAKC,GAAcZ,CAAI;AACrD,MAAAQ,EAAe,KAAKG,CAAe,GAE/BT,GAAS,YAAgB,MAAAA,EAAQ,SAASS,CAAe;AAAA,IAC9D,GAEME,IAAYX,GAAS,aAAa,GAClCY,IAAS,KAAK,KAAKL,EAAM,SAASI,CAAS;AAEjD,aAASE,IAAI,GAAGA,IAAID,GAAQC,KAAK;AAChC,YAAMC,IAAQP,EAAM,MAAMM,IAAIF,GAAWE,IAAIF,IAAYA,CAAS;AAClE,YAAM,QAAQ,IAAIG,EAAM,IAAIN,CAAO,CAAC;AAAA,IAAA;AAG9B,WAAAF;AAAA,EAAA;AAAA,EAGR,MAAMI,GAAcZ,GAAsB;AACrC,QAAA,CAACA,EAAK,gBAAiB,OAAM,IAAI,MAAM,8BAA8BA,CAAI,EAAE;AAE/E,UAAM,EAAE,OAAAiB,EAAM,IAAI,MAAM,KAAKpB,GAC3B,OAAOG,EAAK,iBAAiBA,EAAK,IAAI,EACtC,MAAM,OAAO,EAAE,OAAO,KAAO;AAE3B,QAAAkB;AACJ,WAAID,KACHC,IAASxB,EAAoB,OACxB,KAAAI,GAAO,UAAUE,EAAK,iBAAiB,EAAE,GAAGA,GAAM,QAAAkB,GAAQ,MAE/DA,IAASxB,EAAoB,SACxB,KAAAI,GAAO,UAAUE,EAAK,iBAAiB,EAAE,GAAGA,GAAM,QAAAkB,GAAQ,IAGzD,EAAE,GAAGlB,GAAM,QAAAkB,EAAO;AAAA,EAAA;AAE3B;"}