{ "version": 3, "sources": ["src/app/models/item.ts", "src/app/utilities/tree.ts", "src/app/generic-fields/generic-fields.ts", "src/app/core/item.service.ts"], "sourcesContent": ["interface Price {\r\n pricePlanName?: string\r\n customerGroupId: number\r\n customerGroupName: string\r\n validFrom?: string\r\n validTo?: string\r\n priceBase: number\r\n priceMax: number\r\n pricePerPeriod: number\r\n}\r\n\r\nexport interface ItemWithMetadata {\r\n itemID: number\r\n itemName: string\r\n itemName2: string\r\n urlSlug: string\r\n crossSellingName?: string\r\n description: string\r\n priceDescription: string\r\n showTip: boolean\r\n isBookable: boolean\r\n itemType: ItemType\r\n rootFolderName: string\r\n rootFolderId: number\r\n metadata: { [key: string]: any }\r\n location: Location\r\n buildingId: number\r\n image: string\r\n amount: number\r\n showPriceTable: boolean\r\n prices?: Price[]\r\n addresses: Address[]\r\n articleNumber: string\r\n gallery?: { url: string }[]\r\n materialIcon?: string\r\n buildingName?: string\r\n unit: UnitEnum\r\n tariff: TariffEnum\r\n itemQuantity: number[]\r\n priceOnRequest: boolean\r\n freeAccessory: boolean\r\n}\r\n\r\nexport enum UnitEnum {\r\n Auto = 'Auto', AllowManual = 'AllowManual', ManualOnly = 'ManualOnly'\r\n}\r\n\r\nexport enum TariffEnum {\r\n Auto = 'Auto', AllowManual = 'AllowManual', ManualOnly = 'ManualOnly'\r\n}\r\n\r\nexport interface ItemWithBuilding extends ItemWithMetadata {\r\n building: ItemWithMetadata | undefined\r\n}\r\n\r\nexport interface Location {\r\n id: number\r\n name: string\r\n street: string\r\n zipCode: string\r\n city: string\r\n gps: {\r\n latitude: number\r\n longitude: number\r\n }\r\n}\r\n\r\nexport interface Address {\r\n type: string\r\n name: string\r\n function: string\r\n street: string\r\n zipCode: string\r\n city: string\r\n phone: string\r\n mail: string\r\n website: string\r\n comments: string\r\n}\r\n\r\n\r\nexport enum ItemType {\r\n Building = 'Building',\r\n Room = 'Room',\r\n Accessory = 'Accessory',\r\n OutdoorFacility = 'OutdoorFacility',\r\n Folder = 'Folder',\r\n Service = 'Service',\r\n Other = 'Other',\r\n GiftCard = 'GiftCard'\r\n}\r\n", "import { Renderer2 } from '@angular/core';\r\n\r\ninterface HasChildren {\r\n children?: T[]\r\n}\r\n\r\ninterface HasItemId extends HasChildren {\r\n itemId: number\r\n}\r\n\r\nexport function forEachTreeNode>(nodes: T[], callbackFn: (node: T, parent?: T) => any, parent?: T): void {\r\n for (const node of nodes) {\r\n callbackFn(node, parent)\r\n\r\n if (node.children)\r\n forEachTreeNode(node.children, callbackFn, node)\r\n }\r\n}\r\n\r\n// Find TreeNode by ItemId and return first match\r\nexport function findTreeNode>(nodes: T[], itemId: number): T | null {\r\n for (const node of nodes) {\r\n if (node.itemId === itemId)\r\n return node\r\n\r\n if (node.children) {\r\n const childResult = findTreeNode(node.children, itemId)\r\n if (childResult)\r\n return childResult\r\n }\r\n }\r\n\r\n return null\r\n}\r\n\r\n// Find all TreeNodes matching the selector\r\nexport function findTreeNodes>(nodes: T[], selector: (node: T) => boolean): T[] {\r\n const result: T[] = []\r\n\r\n for (const node of nodes) {\r\n if (selector(node))\r\n result.push(node)\r\n\r\n if (node.children)\r\n findTreeNodes(node.children, selector)\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function onMenuTreeOpen(renderer: Renderer2): void {\r\n renderer.addClass(document.body, 'has-matmenu-tree')\r\n}\r\nexport function onMenuTreeClose(renderer: Renderer2): void {\r\n renderer.removeClass(document.body, 'has-matmenu-tree')\r\n}\r\n", "export interface FieldConfig {\r\n id: string\r\n fieldType: 'text' | 'dropdown' | 'datepicker' | 'datetimepicker' | 'timepicker'\r\n title: string\r\n isRequired: boolean\r\n index: number\r\n\r\n fieldName?: string\r\n isRequiredError?: string\r\n regex?: string\r\n regexError?: string\r\n defaultValue?: string\r\n maxLength: number\r\n values?: string\r\n value?: string | Date | null // current value\r\n hint?: string\r\n}\r\n\r\nexport interface FieldConfigRaw {\r\n index: number,\r\n id: number,\r\n values: { [key: string]: string }\r\n}\r\n\r\n\r\nexport function normalizeFieldsConfigs(fieldsObj: FieldConfigRaw[]): FieldConfig[] {\r\n return fieldsObj.map(raw => {\r\n\r\n const result = raw.values as any\r\n result.id = raw.id.toString()\r\n result.index = raw.index\r\n\r\n result.fieldType = result.fieldType?.toLowerCase()\r\n result.isRequired = typeof result.isRequired === 'string' && result.isRequired.toLowerCase() === 'true'\r\n result.maxLength = typeof result.maxLength === 'string' ? +result.maxLength : 1000\r\n\r\n return result as FieldConfig\r\n }).sort((a, b) => a.index > b.index ? 1 : -1)\r\n}\r\n", "import { Injectable } from '@angular/core';\r\nimport { normalizeFieldsConfigs } from '../generic-fields/generic-fields';\r\nimport { ItemType } from '../models/item';\r\nimport { TreeAndItems } from '../root-store/object-tree-store/object-tree.models';\r\nimport { forEachTreeNode } from '../utilities/tree';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ItemService {\r\n private static itemDialogUrlSchema = /.*\\/item\\/(.+)-([\\d]+).*/\r\n\r\n public static prepareItemTreeData(treeAndItems: TreeAndItems): void {\r\n // initialize some properties on the items-list\r\n treeAndItems.items.forEach(i => {\r\n if (i.fields)\r\n i.fields = normalizeFieldsConfigs(i.fields as any)\r\n\r\n if (i.bookable === undefined)\r\n i.bookable = true\r\n\r\n if (i.buildingId)\r\n i.building = treeAndItems.items.find(i2 => i2.id == i.buildingId)\r\n })\r\n\r\n // extend tree with item-property\r\n forEachTreeNode(treeAndItems.tree, (node, parent) => {\r\n node.parent = parent // set parent reference to allow easy navigation in the tree\r\n node.grandChildren = node.children?.some(c => c.children && c.children.length > 0) ?? false\r\n\r\n const item = treeAndItems.items.find(i => i.id == node.itemId)\r\n if (item)\r\n node.item = item\r\n else {\r\n console.warn('item not found', node, 'parent', parent)\r\n node.item = { id: 0, name: '', urlSlug: '', description: '', type: ItemType.Other, showTip: false, onlyIndividuallySelectable: false }\r\n }\r\n })\r\n }\r\n\r\n public static getItemFromUrl(url: string) {\r\n let urlMatches = url.match(ItemService.itemDialogUrlSchema)\r\n\r\n if (urlMatches && urlMatches.length >= 3)\r\n return {\r\n name: urlMatches[1],\r\n id: +urlMatches[2],\r\n slug: urlMatches[1] + '-' + urlMatches[2],\r\n }\r\n\r\n return null\r\n }\r\n}\r\n"], "mappings": "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", "names": ["UnitEnum", "TariffEnum", "ItemType", "forEachTreeNode", "nodes", "callbackFn", "parent", "node", "children", "findTreeNode", "itemId", "childResult", "normalizeFieldsConfigs", "fieldsObj", "map", "raw", "result", "values", "id", "toString", "index", "fieldType", "toLowerCase", "isRequired", "maxLength", "sort", "a", "b", "ItemService", "prepareItemTreeData", "treeAndItems", "items", "forEach", "i", "fields", "normalizeFieldsConfigs", "bookable", "undefined", "buildingId", "building", "find", "i2", "id", "forEachTreeNode", "tree", "node", "parent", "grandChildren", "children", "some", "c", "length", "item", "itemId", "console", "warn", "name", "urlSlug", "description", "type", "ItemType", "Other", "showTip", "onlyIndividuallySelectable", "getItemFromUrl", "url", "urlMatches", "match", "itemDialogUrlSchema", "slug", "_ItemService", "factory", "\u0275fac", "providedIn"] }