{ "version": 3, "sources": ["src/app/admin/script.service.ts", "src/app/admin/sxc/sxc.service.ts"], "sourcesContent": ["import { Injectable } from '@angular/core';\r\ndeclare const SXC_VERSION: string\r\n\r\ninterface Scripts {\r\n name: string\r\n src: string\r\n}\r\n\r\ninterface ScriptLoadResult {\r\n script: string\r\n loaded: boolean\r\n status: string\r\n}\r\n\r\nexport const ScriptStore: Scripts[] = [\r\n { name: 'sxc-api', src: '/Sxc/core/js/2sxc.api.min.js?cacheBreak=' + SXC_VERSION },\r\n { name: 'sxc-inpage', src: '/Sxc/core/dist/inpage/inpage.min.js?cacheBreak=' + SXC_VERSION }\r\n]\r\n\r\n// Service to inject JavaScript files dynamically\r\n// source: https://stackoverflow.com/a/42766146/4049371\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ScriptService {\r\n\r\n private scripts: { [key: string]: { loaded: boolean, src: string } } = {}\r\n\r\n constructor() {\r\n ScriptStore.forEach(script => {\r\n this.scripts[script.name] = {\r\n loaded: false,\r\n src: script.src\r\n }\r\n })\r\n }\r\n\r\n load(...scripts: string[]): Promise {\r\n const promises: Promise[] = []\r\n scripts.forEach(script => promises.push(this.loadScript(script)))\r\n return Promise.all(promises)\r\n }\r\n\r\n loadScript(name: string): Promise {\r\n return new Promise(resolve => {\r\n // resolve if already loaded\r\n if (this.scripts[name].loaded)\r\n resolve({ script: name, loaded: true, status: 'Already Loaded' })\r\n else {\r\n // load script\r\n const script = document.createElement('script')\r\n script.type = 'text/javascript'\r\n script.src = this.scripts[name].src\r\n\r\n script.onload = () => {\r\n this.scripts[name].loaded = true\r\n resolve({ script: name, loaded: true, status: 'Loaded' })\r\n }\r\n\r\n script.onerror = () => resolve({ script: name, loaded: false, status: 'Loaded' })\r\n document.getElementsByTagName('head')[0].appendChild(script)\r\n }\r\n })\r\n }\r\n}\r\n", "import { CommandNames, CommandParams, SxcGlobal } from '@2sic.com/2sxc-typings';\r\nimport { Injectable, NgZone } from '@angular/core';\r\nimport { Store } from '@ngrx/store';\r\nimport { BehaviorSubject, Observable, combineLatest, of } from 'rxjs';\r\nimport { filter, map, switchMap, take, tap } from 'rxjs/operators';\r\nimport { CatalogState } from 'src/app/root-store/catalog-store/state';\r\nimport { selectCatalog } from '../../root-store/catalog-store/selectors';\r\nimport { RootState } from '../../root-store/root-state.model';\r\nimport { AdminBackendService } from '../admin-backend.service';\r\nimport { ItemEditModel } from '../items/items.models';\r\nimport { ScriptService } from '../script.service';\r\nimport { SxcConfig } from './sxc.model';\r\n\r\ndeclare var $2sxc: SxcGlobal\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SxcService {\r\n private catalog!: CatalogState\r\n itemsConfig: SxcConfig | undefined\r\n private scriptsLoaded = new BehaviorSubject(false)\r\n public static readonly defaultAppId = 3\r\n\r\n constructor(\r\n private script: ScriptService,\r\n private store: Store,\r\n private adminBackend: AdminBackendService,\r\n private _ngZone: NgZone\r\n ) { }\r\n\r\n init(sxcConfig: SxcConfig | null = null): Observable {\r\n let configLoaded$: Observable\r\n if (sxcConfig) {\r\n this.itemsConfig = sxcConfig\r\n configLoaded$ = of(true)\r\n }\r\n else\r\n configLoaded$ = this.adminBackend.getSxcConfig().pipe(tap(c => this.itemsConfig = c), map(() => true))\r\n\r\n this.catalog = this.store.selectSignal(selectCatalog)()\r\n\r\n return combineLatest([this.loadScripts(), configLoaded$]).pipe(filter(([s, c]) => s && c))\r\n }\r\n\r\n private loadScripts(): Observable {\r\n if (!this.scriptsLoaded.value)\r\n this.script.load('sxc-api').then(() => {\r\n $2sxc.env.load({\r\n page: this.catalog.id,\r\n rvt: document.getElementById('__RequestVerificationToken')?.getAttribute('value'), // request verification token\r\n // root: '/', // this is your website root\r\n api: '/api/sxc/', // the api base path\r\n uiRoot: '/Sxc/core/', // the path above the js/dist which contains everything\r\n } as any)\r\n\r\n this.script.load('sxc-inpage')\r\n .then(() => this.scriptsLoaded.next(true))\r\n })\r\n\r\n return this.scriptsLoaded\r\n }\r\n\r\n public editItem(itemData: ItemEditModel, contentTypeNames: string[], onClose: () => void): void {\r\n const prefill = { ItemId: itemData.id, CatalogId: this.catalog.id, ParentCatalogId: this.catalog.parentCatalogId }\r\n const forRef = { Number: itemData.id, Target: this.itemsConfig!.targetTypeRoom, TargetType: this.itemsConfig!.targetTypeRoom, Singleton: true }\r\n const items: { [key: string]: any }[] = []\r\n\r\n // append all specified ContentTypes\r\n contentTypeNames.forEach(ContentTypeName => {\r\n const item = { ContentTypeName, For: forRef, Prefill: prefill } as any\r\n\r\n if (ContentTypeName === 'Description') // for Description: also add Name to prefill\r\n item.Prefill = { ItemId: prefill.ItemId, CatalogId: this.catalog.id, Name: itemData.name, ParentCatalogId: prefill.ParentCatalogId }\r\n\r\n items.push(item)\r\n })\r\n\r\n // when editing Description, append customer-specific ContentTypes\r\n if (contentTypeNames.includes('Description'))\r\n this.itemsConfig!.catalogContentTypes\r\n .filter((t) => t.itemType === itemData.itemType)\r\n .forEach(t => items.push({ ContentTypeName: t.name, For: forRef, Prefill: prefill }))\r\n\r\n this.editEntityInternal({ items }, onClose)\r\n }\r\n\r\n public editEntity(entityId: number, onClose: () => void): void {\r\n this.init().pipe(take(1)).subscribe(() => {\r\n this.editEntityInternal({ entityId }, onClose)\r\n })\r\n }\r\n\r\n public addEntity(contentTypeName: string, onClose: () => void) {\r\n this.init().pipe(take(1)).subscribe(() => {\r\n const prefill = { CatalogId: this.catalog.id }\r\n\r\n const item = { ContentTypeName: contentTypeName, Prefill: prefill } as any\r\n\r\n this.editEntityInternal({ items: [item] }, onClose)\r\n })\r\n }\r\n\r\n private editEntityInternal(params: CommandParams, onClose = () => { }): void {\r\n // This is the workflow step we will register to stop page refresh\r\n const workflowToDisableRefresh = {\r\n command: 'refresh', // The command name it's for\r\n phase: 'before', // The workflow-step should run before the command is executed\r\n code: (wfArgs: any) => { // The code which should be run\r\n if (onClose)\r\n this._ngZone.run(() => onClose())\r\n\r\n return false; // Return false to stop this command from happening\r\n }\r\n }\r\n\r\n this.getSxc().cms.run({ params, action: CommandNames.edit, workflows: [workflowToDisableRefresh] })\r\n }\r\n\r\n private getSxc() {\r\n return $2sxc({ zoneId: this.itemsConfig!.zoneId, appId: this.itemsConfig!.appId, pageId: this.catalog.id, moduleId: this.catalog.id })\r\n }\r\n\r\n openAppAdmin(): void {\r\n this.init()\r\n .pipe(take(1))\r\n .subscribe(() => this.getSxc().cms.run({\r\n action: CommandNames.app,\r\n workflows: [{ command: 'refresh', phase: 'before', code: () => false }]\r\n }))\r\n }\r\n\r\n clearCache(): Observable {\r\n return this.init().pipe(\r\n take(1),\r\n switchMap(() => this.adminBackend.clearSxcCache(this.itemsConfig!.appId)))\r\n }\r\n}\r\n"], "mappings": "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", "names": ["ScriptStore", "name", "src", "ScriptService", "constructor", "scripts", "forEach", "script", "loaded", "load", "promises", "push", "loadScript", "Promise", "all", "resolve", "status", "document", "createElement", "type", "onload", "onerror", "getElementsByTagName", "appendChild", "factory", "\u0275fac", "providedIn", "_ScriptService", "SxcService", "constructor", "script", "store", "adminBackend", "_ngZone", "scriptsLoaded", "BehaviorSubject", "init", "sxcConfig", "configLoaded$", "itemsConfig", "of", "getSxcConfig", "pipe", "tap", "c", "map", "catalog", "selectSignal", "selectCatalog", "combineLatest", "loadScripts", "filter", "s", "value", "load", "then", "$2sxc", "env", "page", "id", "rvt", "document", "getElementById", "getAttribute", "api", "uiRoot", "next", "editItem", "itemData", "contentTypeNames", "onClose", "prefill", "ItemId", "CatalogId", "ParentCatalogId", "parentCatalogId", "forRef", "Number", "Target", "targetTypeRoom", "TargetType", "Singleton", "items", "forEach", "ContentTypeName", "item", "For", "Prefill", "Name", "name", "push", "includes", "catalogContentTypes", "t", "itemType", "editEntityInternal", "editEntity", "entityId", "take", "subscribe", "addEntity", "contentTypeName", "params", "workflowToDisableRefresh", "command", "phase", "code", "wfArgs", "run", "getSxc", "cms", "action", "workflows", "zoneId", "appId", "pageId", "moduleId", "openAppAdmin", "clearCache", "switchMap", "clearSxcCache", "_SxcService", "defaultAppId", "\u0275\u0275inject", "ScriptService", "Store", "AdminBackendService", "NgZone", "factory", "\u0275fac", "providedIn"] }