{"version":3,"sources":["webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/cart/cart-product-list.ts","webpack:///./src/components/cart/cart-product-list.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/cart/nested-cart-product-list.ts","webpack:///./src/components/cart/nested-cart-product-list.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/cart/transport-list.ts","webpack:///./src/components/cart/transport-list.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/general/accordion.ts","webpack:///./src/components/general/accordion.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/general/loading.ts","webpack:///./src/components/general/loading.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/general/pager.ts","webpack:///./src/components/general/pager.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/general/simple-tree.ts","webpack:///./src/components/general/simple-tree.html","webpack:///src/var/www/virtualhost/client.tk.salome.ee/www/staging/src/components/general/toast.ts","webpack:///./src/components/general/toast.html"],"names":["log","getLogger","cartProductService","productService","warehouseService","appConfig","eventAggregator","i18n","options","showImages","showEan","showStock","showWarehouse","showReason","showDisplayPrice","isReturnCart","imagesLoaded","subscriptions","this","subscribeOnce","userSettingsLoaded","formatPrice","tryLoadImages","attached","disposeAll","add","subscribe","cartProductsWarehouseChanged","product","updateProduct","loadWarehouses","detached","productsChanged","processResult","loadSortable","products","forEach","loadExternalStock","warehousesReady","getWarehouses","then","result","warehouses","catch","showErrorToast","tr","loadThumbnail","hasTkItem","imageLoadingCount","fetchThumbnail","id","thumbnailVersion","thumbnail","finally","Math","max","error","getErrorMessage","thumbnailFailed","thumbnailLoaded","element","trigger","closest","getInstance","content","container","html","loadImages","fetchImages","images","fillDefaultSelectedStock","warehouseId","selectedExternalStock","fallbackStock","undefined","picked","externalStock","stock","fallback","selectedStock","stockItem","find","x","warehouse","quantity","prices","formatStockPrices","userSettings","publish","updateCartTotal","existingExternalStock","fetchExternalStock","isArrayEmpty","preserveExternalStockRefundableDeposit","showGallery","children","length","dataGallerySelector","document","querySelector","toggle","cartProduct","isNaN","isValidMinimumQuantity","getMinimumQuantity","putExistingProduct","Array","isArray","p","cartProductId","index","findIndex","Object","assign","returnCartChanged","cartProductsChanged","codes","code","lineUnitPrice","_selected","_finalPrice","linePrices","removeFromCart","delete","splice","formatProductsPrices","CartProductListCustomElement","module","exports","returnService","router","showInvoiceId","showTransport","showAddToCart","showAddToReturn","warehousesLoaded","loadWarehouseNames","transportOptionsLoaded","loadTransportNames","toCartQuantity","returnQuantity","warehouseName","getExternalWarehouseName","getWarehouseName","transportOptions","transportName","getTransportName","transportId","querySelectorAll","slice","call","show","searchProduct","target","prop","navigateToRoute","query","page","type","Precise","searchInvoice","invoiceId","getUniqueProductId","returnProduct","returnButton","getElementById","disabled","rvsOrder","rvsOrderId","amount","parseInt","showSuccessToast","allowedWarehouses","name","groupId","get","NestedCartProductListCustomElement","EXTERNAL_TRANSPORT_KEY","combinedWarehouses","selectedTransportsForWarehouses","Map","comment","selectedTransportAddress","totalWithoutVat","totalVat","totalWithVat","updateSelectedTransports","updateCartProductWarehouseId","loadAddresses","userSpecifiedAddresses","contractSettings","changeTransportForWarehouse","newTransportId","set","isWarehouseCombinationPresent","isCombinedWarehouse","getOtherCombinedWarehouse","filter","isExternalWarehouse","saveTransport","externalWarehouseId","preselectOnlyTransportOption","allowedTransportOptions","anyExternalWarehouseProducts","some","size","keys","next","value","canChangeTransport","internal","hasFirstWarehouse","hasSecondWarehouse","includes","getMainCombinedWarehouse","shouldDisplayInList","TransportListCustomElement","click","item","clickFunction","getClass","classes","currentPage","lastPage","extremePagesLimit","nearbyPagesLimit","depth","handleToggleClick","event","preventDefault","stopPropagation","handleItemClick","_expanded"],"mappings":"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","file":"app~b88f4497.ad153662758f8fd9edb8.chunk.js","sourcesContent":["import { retainCartLineOffer } from \"domain/Cart/CartExternalStock\";\nimport { buildCartLinePayload } from \"domain/Cart/CartLinePayload\";\nimport { I18N } from \"aurelia-i18n\";\nimport { IWarehouse } from \"domain/Client/IWarehouse\";\nimport { WarehouseService } from \"services/client/warehouse-service\";\nimport { ICartProduct } from \"domain/Cart/ICartProduct\";\nimport { AppConfig } from \"app-config\";\nimport { Utils } from \"utils/helpers/utils\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport { LogManager, autoinject, observable, bindable } from \"aurelia-framework\";\nimport { IProduct } from \"domain/Product/IProduct\";\nimport { CartProductService } from \"services/cart/cart-product-service\";\nimport { ProductService } from \"services/product/product-service\";\nimport { PriceHelper } from \"utils/helpers/price-helper\";\nimport { TKEvent } from \"utils/enums/TKEvent\";\nimport { Subscriptions } from \"utils/helpers/subscriptions\";\nimport { ProductExtraHelper } from \"utils/helpers/product-extra-helper\";\nimport { isExternalProduct } from \"domain/Cart/Origin\";\nimport { cartLinePrices } from \"domain/Product/PriceDisplay\";\nimport { lineUnitPrice, pickExternalStock } from \"domain/Cart/CartProductUpdate\";\nimport $ from \"jquery\";\nimport \"bootstrap\";\nimport { Modal, Popover } from \"bootstrap\";\n\nexport const log = LogManager.getLogger(\"app.components.product-list\");\n\n@autoinject\nexport class CartProductListCustomElement {\n  @bindable @observable products: ICartProduct[];\n  @bindable warehouses: IWarehouse[];\n\n  @bindable options = {\n    showImages: false,\n    showEan: false,\n    showStock: false,\n    showWarehouse: false,\n    showReason: false,\n    showDisplayPrice: false,\n    isReturnCart: false,\n  };\n\n  imagesLoaded = false;\n\n  /**\n   * SAL-335 (TKCLIENT-1HC/22B): resolves once the warehouse list has loaded (or failed).\n   * fillDefaultSelectedStock waits on it, so a line whose external stock returns before the\n   * warehouses still gets its default warehouse instead of crashing on `warehouses.find`.\n   */\n  private warehousesReady?: Promise<void>;\n\n  constructor(\n    private cartProductService: CartProductService,\n    private productService: ProductService,\n    private warehouseService: WarehouseService,\n    private appConfig: AppConfig,\n    private eventAggregator: EventAggregator,\n    private i18n: I18N\n  ) {\n    this.eventAggregator.subscribeOnce(TKEvent.userSettingsLoaded, () => {\n      this.formatPrice();\n      this.tryLoadImages();\n    });\n  }\n\n  /** SAL-283 r8: a detached list must not PUT lines or push totals for the cart page on screen. */\n  private subscriptions = new Subscriptions();\n\n  attached() {\n    this.subscriptions.disposeAll();\n    this.subscriptions.add(\n      this.eventAggregator.subscribe(TKEvent.cartProductsWarehouseChanged, (product: ICartProduct) =>\n        this.updateProduct(product),\n      ),\n    );\n    // options are populated now\n    this.loadWarehouses();\n    this.tryLoadImages();\n  }\n\n  detached() {\n    this.subscriptions.disposeAll();\n  }\n\n  // #region MAIN\n\n  productsChanged() {\n    this.imagesLoaded = false;\n    this.processResult();\n  }\n\n  processResult() {\n    Utils.loadSortable();\n\n    this.formatPrice();\n    this.tryLoadImages();\n\n    this.products.forEach(product => {\n      this.loadExternalStock(product);\n    });\n  }\n\n  // #endregion\n\n  // #region LOAD\n\n  loadWarehouses(): Promise<void> {\n    if (!this.warehousesReady) {\n      this.warehousesReady = this.warehouseService\n        .getWarehouses()\n        .then(result => {\n          this.warehouses = result ?? [];\n        })\n        .catch(() => {\n          this.warehouses = this.warehouses ?? [];\n          Utils.showErrorToast(log, this.i18n.tr(\"components.warehouses.errors.load\"));\n        });\n    }\n    return this.warehousesReady;\n  }\n\n  loadThumbnail(product: IProduct) {\n    // SAL-329: a partner line with no TK item has nothing to load a picture of.\n    if (!ProductExtraHelper.hasTkItem(product)) return;\n\n    product.imageLoadingCount = (product.imageLoadingCount ?? 0) + 1;\n\n    this.productService\n      .fetchThumbnail(product.id, product.thumbnailVersion)\n      .then(result => {\n        if (result == \"\") return;\n        // SAL-266: an <img src> URL; the browser loads and caches the bytes.\n        product.thumbnail = result;\n      })\n      .finally(() => {\n        product.imageLoadingCount = Math.max((product.imageLoadingCount ?? 1) - 1, 0);\n      })\n      .catch(error => Utils.showErrorToast(log, Utils.getErrorMessage(error, this.i18n)));\n  }\n\n  /** SAL-266: no thumbnail (404) or a broken one: show nothing instead of a broken image. */\n  thumbnailFailed(product: IProduct) {\n    product.thumbnail = null;\n  }\n\n  /** SAL-266: large thumbnail on hover, only once the image has really loaded. */\n  thumbnailLoaded(product: IProduct, element: HTMLElement) {\n    const trigger = element?.closest(`[data-image=\"${product.id}\"]`) as HTMLElement | null;\n    if (!trigger || Popover.getInstance(trigger)) return;\n    new Popover(trigger, {\n      content: `<img src=\"${product.thumbnail}\"></img>`,\n      trigger: \"hover focus\",\n      container: trigger,\n      html: true,\n    });\n  }\n\n  loadImages(product: IProduct) {\n    if (!ProductExtraHelper.hasTkItem(product)) return;\n\n    product.imageLoadingCount = (product.imageLoadingCount ?? 0) + 1;\n\n    this.productService\n      .fetchImages(product.id)\n      .then(result => {\n        product.images = result;\n      })\n      .finally(() => {\n        product.imageLoadingCount = Math.max((product.imageLoadingCount ?? 1) - 1, 0);\n      })\n      .catch(error => Utils.showErrorToast(log, Utils.getErrorMessage(error, this.i18n)));\n  }\n\n  fillDefaultSelectedStock(product: ICartProduct) {\n    const warehouseId = product.warehouseId ?? 0;\n    let selectedExternalStock: any = null;\n    product.fallbackStock = undefined;\n\n    // SAL-283: external-ness comes from the stored origin (legacy lines: externalWarehouseId).\n    if (isExternalProduct(product)) {\n      const picked = pickExternalStock(product, product.externalStock ?? []);\n      selectedExternalStock = picked.stock ?? null;\n      if (picked.fallback) product.fallbackStock = picked.stock;\n    }\n\n    if (selectedExternalStock) {\n      product.selectedStock = selectedExternalStock;\n    } else if (isExternalProduct(product)) {\n      // SAL-283 QA r6 / SAL-315: no supplier of the line's group has a row (e.g. 0 tk left). No stock row\n      // is picked (a made-up local row for warehouse -1 was saved back and the order went nowhere); the\n      // line shows its stored finalPrice.\n      product.selectedStock = undefined;\n    } else {\n      let stockItem = (product.stock ?? []).find(x => x.warehouse?.id == warehouseId);\n      const warehouse = this.warehouses?.find(x => x.id == warehouseId);\n\n      if (!stockItem && warehouse) {\n        stockItem = {\n          warehouse,\n          quantity: \"0\",\n          prices: product?.prices ?? [],\n        };\n        PriceHelper.formatStockPrices([stockItem], this.appConfig.userSettings, this.i18n, true);\n      }\n\n      product.selectedStock = stockItem;\n    }\n    this.eventAggregator.publish(TKEvent.updateCartTotal);\n  }\n\n  loadExternalStock(product: ICartProduct) {\n    if (product && retainCartLineOffer(product)) {\n      if (product.selectedStock) this.eventAggregator.publish(TKEvent.updateCartTotal);\n      return;\n    }\n\n    const existingExternalStock = product.externalStock ?? [];\n\n    this.productService\n      .fetchExternalStock(product.id)\n      .then(result => {\n        if (Utils.isArrayEmpty(result)) result = [];\n        ProductExtraHelper.preserveExternalStockRefundableDeposit(result, existingExternalStock);\n        product.externalStock = result;\n\n        PriceHelper.formatStockPrices(\n          product.externalStock,\n          this.appConfig.userSettings,\n          this.i18n\n        );\n      })\n      .finally(() => {\n        // SAL-335: wait for the warehouse list so the default stock row has its warehouse.\n        this.loadWarehouses().then(() => this.fillDefaultSelectedStock(product));\n      });\n  }\n\n  // #endregion\n\n  // #region ACTIONS\n\n  showGallery(product: IProduct) {\n    $(() => {\n      // If there are no images to display\n      if ($(`[data-gallery=\"${product.id}\"]`).children(\".carousel-inner\").children().length == 0)\n        return;\n\n      const dataGallerySelector = document.querySelector(`[data-gallery-wrapper=\"${product.id}\"]`);\n      if (dataGallerySelector) new Modal(dataGallerySelector).toggle();\n    });\n  }\n\n  updateProduct(product: ICartProduct) {\n    const cartProduct = buildCartLinePayload(product as any);\n    if (cartProduct == null) {\n      Utils.showErrorToast(log, this.i18n.tr(\"pages.cart.errors.warehouse-missing\", { codes: product.code }));\n      return;\n    }\n\n    if (isNaN(cartProduct.quantity)) return;\n    if (!ProductExtraHelper.isValidMinimumQuantity(cartProduct.quantity, product.selectedStock)) {\n      product.quantity = this.getMinimumQuantity(product);\n      Utils.showErrorToast(log, this.i18n.tr(\"components.products.errors.minimum-quantity\"));\n      return;\n    }\n\n    // SAL-283 QA r5: the page total (and with it the header badge) follows the edit at once.\n    this.eventAggregator.publish(TKEvent.updateCartTotal);\n\n    this.cartProductService\n      .putExistingProduct(cartProduct)\n      .then(result => {\n        if (result && result.products && Array.isArray(result.products)) {\n          const updated = result.products.find(p => p.cartProductId === cartProduct.cartProductId);\n          const index = this.products.findIndex(p => p.cartProductId === updated?.cartProductId);\n\n          if (index !== -1) {\n            Object.assign(this.products[index], updated);\n          } else {\n            this.products = result.products;\n          }\n        }\n\n        if (this.options.isReturnCart)\n          this.eventAggregator.publish(TKEvent.returnCartChanged, result);\n\n        this.eventAggregator.publish(TKEvent.cartProductsChanged);\n      })\n      .catch(() => Utils.showErrorToast(log, this.i18n.tr(\"pages.cart.errors.update\")));\n\n    this.formatPrice();\n  }\n\n  /** QA 5b: a fallback row keeps the stored snapshot price. Extra args make the binding re-run. */\n  lineUnitPrice(product: ICartProduct, _selected?: unknown, _finalPrice?: unknown): number | null {\n    return lineUnitPrice(product as any);\n  }\n\n  /** SAL-283 QA r6: never undefined, also for a line without a picked stock row. */\n  linePrices(product: ICartProduct, _selected?: unknown) {\n    return cartLinePrices(product as any);\n  }\n\n  getMinimumQuantity(product: ICartProduct): number {\n    return ProductExtraHelper.getMinimumQuantity(product.selectedStock);\n  }\n\n  removeFromCart(cartProductId: number) {\n    this.cartProductService\n      .delete(cartProductId)\n      .then(() => {\n        this.products.forEach((product, index) => {\n          if (product.cartProductId == cartProductId) {\n            this.products.splice(index, 1);\n            return;\n          }\n        });\n\n        this.eventAggregator.publish(TKEvent.cartProductsChanged);\n      })\n      .catch(() => Utils.showErrorToast(log, this.i18n.tr(\"pages.cart.errors.remove\")));\n  }\n\n  // #endregion\n\n  tryLoadImages() {\n    if (!this.products || !this.options.showImages || this.imagesLoaded) return;\n\n    this.imagesLoaded = true;\n    this.products.forEach(product => {\n      this.loadThumbnail(product);\n      this.loadImages(product);\n    });\n  }\n\n  formatPrice() {\n    if (!this.products || !this.appConfig.userSettings) return;\n\n    PriceHelper.formatProductsPrices(this.products, this.appConfig.userSettings, this.i18n, true);\n  }\n}\n","module.exports = \"<template>\\n  <require from=\\\"utils/classes/mobile-cards\\\"></require>\\n  <require from=\\\"utils/classes/value-converters\\\"></require>\\n  <require from=\\\"components/product/product-list/gallery\\\"></require>\\n  <require from=\\\"components/product/product-list/stock\\\"></require>\\n  <require from=\\\"components/product/product-list/price\\\"></require>\\n  <require from=\\\"!style-loader!css-loader!bootstrap-sortable/Contents/bootstrap-sortable.css\\\">\\n  </require>\\n\\n  <table mobile-cards\\n    id=\\\"accordion\\\"\\n    class=\\\"table table-borderless table-sm table-responsive-md sortable w-100 accordion table-striped mc-cart\\\">\\n    <thead>\\n      <tr id=\\\"product-list-header-row\\\">\\n        <th\\n          if.bind=\\\"appConfig.userSettings.imagesInProductPage && options.showImages\\\"\\n          class=\\\"text-center\\\"\\n          data-defaultsort=\\\"disabled\\\">\\n          ${'components.products.headers.thumbnail' & t}\\n        </th>\\n        <th data-defaultsign=\\\"nospan\\\">${'components.products.headers.code' & t}</th>\\n        <th data-defaultsign=\\\"nospan\\\">${'components.products.headers.name' & t}</th>\\n        <th if.bind=\\\"options.showEan\\\" class=\\\"text-center\\\" data-defaultsign=\\\"nospan\\\">\\n          ${'components.products.headers.ean' & t}\\n        </th>\\n        <th if.bind=\\\"options.showStock\\\" class=\\\"text-center\\\" data-defaultsign=\\\"nospan\\\">\\n          ${'components.products.headers.stock' & t}\\n        </th>\\n        <th if.bind=\\\"options.showReason\\\" class=\\\"text-center\\\" data-defaultsign=\\\"nospan\\\">\\n          ${'pages.returns.headers.reason' & t}\\n        </th>\\n        <th class=\\\"text-center\\\" data-defaultsign=\\\"nospan\\\">\\n          ${'components.products.headers.price' & t}\\n        </th>\\n        <th class=\\\"text-center\\\" data-defaultsign=\\\"nospan\\\">\\n          ${'components.products.headers.amount' & t}\\n        </th>\\n        <th class=\\\"text-center\\\" data-defaultsign=\\\"nospan\\\">\\n          ${'components.products.headers.total' & t}\\n        </th>\\n        <th data-defaultsort=\\\"disabled\\\"></th>\\n      </tr>\\n    </thead>\\n\\n    <tbody>\\n      <tr repeat.for=\\\"product of products\\\" class=\\\"product-row\\\">\\n        <td\\n          if.bind=\\\"appConfig.userSettings.imagesInProductPage && options.showImages\\\"\\n          class=\\\"product-image-wrapper\\\"\\n          click.trigger=\\\"showGallery(product)\\\"\\n          data-image.bind=\\\"product.id\\\">\\n          <span class=\\\"product-image-state\\\">\\n            <span\\n              if.bind=\\\"product.imageLoadingCount && !product.thumbnail\\\"\\n              class=\\\"product-image-loading\\\">\\n              <span class=\\\"spinner-border spinner-border-sm text-secondary\\\" role=\\\"status\\\"></span>\\n            </span>\\n            <img\\n              class=\\\"mx-auto product-image\\\"\\n              if.bind=\\\"product.thumbnail\\\"\\n              src.bind=\\\"product.thumbnail\\\"\\n              loading=\\\"lazy\\\"\\n              load.trigger=\\\"thumbnailLoaded(product, $event.target)\\\"\\n              error.trigger=\\\"thumbnailFailed(product)\\\" />\\n          </span>\\n        </td>\\n\\n        <td class=\\\"text-nowrap mc-code\\\"><span>${product.code}</span></td>\\n\\n        <td class=\\\"mc-full\\\"><span>${product.name}</span></td>\\n\\n        <td if.bind=\\\"options.showEan\\\" class=\\\"text-center text-nowrap mc-ean\\\">\\n          <span>${product.ean}</span>\\n        </td>\\n\\n        <td\\n          if.bind=\\\"options.showStock\\\"\\n          class=\\\"text-center text-nowrap mc-stock\\\"\\n          as-element=\\\"stock\\\"\\n          product.bind=\\\"product\\\"\\n          warehouses.bind=\\\"warehouses\\\"></td>\\n\\n        <td if.bind=\\\"options.showReason\\\" class=\\\"text-center text-nowrap\\\">\\n          <input\\n            type=\\\"text\\\"\\n            class=\\\"form-control form-control-sm mx-auto\\\"\\n            value.bind=\\\"product.comment\\\"\\n            change.trigger=\\\"updateProduct(product)\\\" />\\n        </td>\\n\\n        <td\\n          if.bind=\\\"options.showDisplayPrice\\\"\\n          class=\\\"text-end text-nowrap cart-price mc-price\\\"\\n          as-element=\\\"price\\\"\\n          prices.bind=\\\"linePrices(product, product.selectedStock)\\\"\\n          display-price.bind=\\\"lineUnitPrice(product, product.selectedStock, product.finalPrice)\\\"\\n          product.bind=\\\"product\\\"\\n          stock-item.bind=\\\"product.selectedStock\\\"></td>\\n        <td\\n          else\\n          class=\\\"text-end text-nowrap cart-price mc-price\\\"\\n          data-value.bind=\\\"product.finalPrice\\\"\\n          as-element=\\\"price\\\"\\n          prices.bind=\\\"linePrices(product, product.selectedStock)\\\"\\n          display-price.bind=\\\"product.finalPrice\\\"\\n          product.bind=\\\"product\\\"\\n          stock-item.bind=\\\"product.selectedStock\\\"></td>\\n\\n        <td class=\\\"text-center text-nowrap mc-qty\\\" data-value.bind=\\\"product.quantity\\\">\\n          <input\\n            type=\\\"number\\\"\\n            class=\\\"form-control form-control-sm mx-auto cart-product-amount\\\"\\n            min.bind=\\\"getMinimumQuantity(product)\\\"\\n            step.bind=\\\"getMinimumQuantity(product)\\\"\\n            value.bind=\\\"product.quantity\\\"\\n            input.trigger=\\\"updateProduct(product)\\\" />\\n        </td>\\n\\n        <td if.bind=\\\"options.showDisplayPrice\\\" class=\\\"text-end text-nowrap mc-total\\\">\\n          <span>${lineUnitPrice(product, product.selectedStock, product.finalPrice) * product.quantity | currencyFormat}</span>\\n        </td>\\n        <td else class=\\\"text-end text-nowrap mc-total\\\">\\n          <span>${product.finalPrice * product.quantity | currencyFormat}</span>\\n        </td>\\n\\n        <td class=\\\"clickable mc-action\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"btn btn-danger btn-sm text-nowrap float-end\\\"\\n            click.trigger=\\\"removeFromCart(product.cartProductId)\\\">\\n            ${'components.products.buttons.remove-from-cart' & t}\\n          </button>\\n        </td>\\n      </tr>\\n    </tbody>\\n  </table>\\n\\n  <gallery if.bind=\\\"appConfig.userSettings.imagesInProductPage\\\" products.bind=\\\"products\\\"></gallery>\\n</template>\\n\";","import { encodeSearchRouteQuery } from \"utils/helpers/search-route\";\nimport { IRvsOrder } from \"domain/Sale/IRvsOrder\";\nimport { I18N } from \"aurelia-i18n\";\nimport { IProduct } from \"domain/Product/IProduct\";\nimport { SearchType } from \"utils/enums/SearchType\";\nimport { AppConfig } from \"app-config\";\nimport { Utils } from \"utils/helpers/utils\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport { Router } from \"aurelia-router\";\nimport { LogManager, autoinject, observable, bindable } from \"aurelia-framework\";\nimport { TKEvent } from \"utils/enums/TKEvent\";\nimport { ICartProduct } from \"domain/Cart/ICartProduct\";\nimport { isExternalProduct, getExternalGroupId } from \"domain/Cart/Origin\";\nimport $ from \"jquery\";\nimport { ReturnService } from \"services/sale/return-service\";\nimport { Modal } from \"bootstrap\";\n\nexport const log = LogManager.getLogger(\"app.components.nested-cart-product-list\");\n\n// Shown in template, order, invoice and return pages\n@autoinject\nexport class NestedCartProductListCustomElement {\n  @bindable @observable products: ICartProduct[];\n  @bindable rvsOrder: IRvsOrder | undefined;\n\n  @bindable options = {\n    showInvoiceId: false,\n    showWarehouse: false,\n    showTransport: false,\n    showAddToCart: true,\n    showAddToReturn: false,\n  };\n\n  constructor(\n    private returnService: ReturnService,\n    private appConfig: AppConfig,\n    private router: Router,\n    private eventAggregator: EventAggregator,\n    private i18n: I18N,\n  ) {\n    this.eventAggregator.subscribeOnce(TKEvent.warehousesLoaded, () => this.loadWarehouseNames());\n    this.eventAggregator.subscribeOnce(TKEvent.transportOptionsLoaded, () =>\n      this.loadTransportNames(),\n    );\n  }\n\n  // #region MAIN\n\n  productsChanged() {\n    this.processResult();\n    this.loadWarehouseNames();\n    this.loadTransportNames();\n  }\n\n  processResult() {\n    (this.products ?? []).forEach(product => {\n      // Fill out the quantity in cart input\n      if (product.quantity === undefined) product.quantity = 1;\n\n      // Fill out the add-to-cart quantity input\n      if (product.toCartQuantity === undefined) product.toCartQuantity = \"1\";\n\n      // Fill out the return quantity input\n      if (product.returnQuantity === undefined) product.returnQuantity = \"1\";\n    });\n  }\n\n  loadWarehouseNames() {\n    (this.products ?? []).forEach(product => {\n      if (isExternalProduct(product)) {\n        product.warehouseName = this.getExternalWarehouseName(getExternalGroupId(product));\n        return;\n      }\n\n      product.warehouseName = this.getWarehouseName(product.warehouseId ?? 0);\n    });\n  }\n\n  loadTransportNames() {\n    if (!this.appConfig.transportOptions) return;\n\n    (this.products ?? []).forEach(product => {\n      product.transportName = this.getTransportName(product.transportId ?? \"0\");\n    });\n  }\n\n  // #endregion\n\n  // #region ACTIONS\n\n  showGallery(product: ICartProduct) {\n    $(() => {\n      // If there are no images to display\n      if ($(`[data-gallery=\"${product.id}\"]`).children(\".carousel-inner\").children().length == 0)\n        return;\n\n      const dataGallerySelector = document.querySelectorAll(\n        `[data-gallery-wrapper=\"${product.id}\"]`,\n      );\n      Modal.getInstance([].slice.call(dataGallerySelector))?.show();\n    });\n  }\n\n  searchProduct(target: HTMLElement, product: IProduct) {\n    // Check if child element was clicked instead\n    if ($(target).prop(\"tagName\") != \"TD\" && $(target).prop(\"tagName\") != \"TR\") return;\n\n    this.router.navigateToRoute(\"searchResult\", {\n      query: encodeSearchRouteQuery(product.code),\n      page: 1,\n      type: SearchType.Precise,\n    });\n  }\n\n  searchInvoice(invoiceId: number) {\n    this.router.navigateToRoute(\"invoiceIndex\", {\n      page: 1,\n      query: invoiceId,\n    });\n  }\n\n  getUniqueProductId(product: ICartProduct) {\n    return `${product.code}-${product.cartProductId || product.quantity || 0}`;\n  }\n\n  returnProduct(product: ICartProduct) {\n    const returnButton = document.getElementById(\n      this.getUniqueProductId(product),\n    ) as HTMLButtonElement;\n    returnButton.disabled = true;\n\n    this.returnService\n      .returnProduct({\n        invoiceId: this.rvsOrder?.invoiceId ?? 0,\n        rvsOrderId: this.rvsOrder?.id ?? 0,\n        code: product.code,\n        amount: parseInt(product.returnQuantity ?? \"1\"),\n      })\n      .then(() => {\n        Utils.showSuccessToast(this.i18n.tr(\"components.products.messages.added-to-return\"));\n\n        this.eventAggregator.publish(TKEvent.cartProductsChanged);\n      })\n      .catch(() => {\n        Utils.showErrorToast(log, this.i18n.tr(\"components.products.errors.add-to-return\"));\n      })\n      .finally(() => {\n        returnButton.disabled = false;\n      });\n  }\n\n  // #endregion\n\n  // #region HELPERS\n\n  getWarehouseName(warehouseId: number): string {\n    if (this.appConfig.allowedWarehouses != undefined) {\n      for (const warehouse of this.appConfig.allowedWarehouses) {\n        if (warehouse.id == warehouseId) return warehouse.name;\n      }\n    }\n    return `ID: ${warehouseId}`;\n  }\n\n  getExternalWarehouseName(groupId: number | undefined): string {\n    if (!groupId) return this.i18n.tr(\"pages.cart.fields.external-warehouse\");\n\n    if (groupId === 2 || groupId === 3 || groupId === 4) return this.i18n.tr(\"components.products.headers.partner-warehouse\");\n\n    if (groupId === 1) return this.i18n.tr(\"components.products.headers.factory-warehouse\");\n\n    return this.i18n.tr(\"pages.cart.fields.external-warehouse\");\n  }\n  getTransportName(transportId: string | number): string {\n    // using `` to convert \"string | number\" to string\n    return this.appConfig.transportOptions?.get(`${transportId}`) ?? `ID: ${transportId}`;\n  }\n\n  // #endregion\n}\n","module.exports = \"<template>\\n  <require from=\\\"utils/classes/mobile-cards\\\"></require>\\n  <require from=\\\"utils/classes/value-converters\\\"></require>\\n  <require from=\\\"components/product/product-list/stock\\\"></require>\\n  <require from=\\\"components/product/product-list/price\\\"></require>\\n  <require from=\\\"components/product/product-list/add-to-cart\\\"></require>\\n  <require from=\\\"components/general/pager\\\"></require>\\n  <require from=\\\"!style-loader!css-loader!bootstrap-sortable/Contents/bootstrap-sortable.css\\\">\\n  </require>\\n\\n  <table mobile-cards class=\\\"table w-100\\\">\\n    <thead>\\n      <tr>\\n        <th if.bind=\\\"options.showInvoiceId\\\">${'pages.invoices.headers.number' & t}</th>\\n        <th>${'components.products.headers.code' & t}</th>\\n        <th>${'components.products.headers.name' & t}</th>\\n        <th class=\\\"text-end\\\">${'components.products.headers.price' & t}</th>\\n        <th class=\\\"text-end\\\">${'components.products.headers.amount' & t}</th>\\n        <th class=\\\"text-end\\\">${'components.products.headers.total' & t}</th>\\n        <th if.bind=\\\"options.showWarehouse\\\" class=\\\"text-center\\\">\\n          ${'components.products.headers.warehouse' & t}\\n        </th>\\n        <th if.bind=\\\"options.showTransport\\\" class=\\\"text-center\\\">\\n          ${'components.products.headers.transport' & t}\\n        </th>\\n        <th if.bind=\\\"options.showAddToCart\\\" class=\\\"text-center\\\">\\n          ${'components.products.headers.add-to-cart' & t}\\n        </th>\\n        <th if.bind=\\\"options.showAddToReturn\\\" class=\\\"text-end\\\">\\n          ${'components.products.headers.return' & t}\\n        </th>\\n      </tr>\\n    </thead>\\n\\n    <tbody>\\n      <tr\\n        repeat.for=\\\"product of products\\\"\\n        class=\\\"clickable hover\\\"\\n        click.delegate=\\\"searchProduct($event.target, product)\\\">\\n        <td\\n          if.bind=\\\"options.showInvoiceId\\\"\\n          class=\\\"text-center clickable\\\"\\n          click.delegate=\\\"searchInvoice(product.invoiceId)\\\">\\n          <span>${product.invoiceId}</span>\\n        </td>\\n\\n        <td class=\\\"text-nowrap\\\"><span>${product.code}</span></td>\\n\\n        <td class=\\\"mc-full\\\"><span>${product.name}</span></td>\\n\\n        <td class=\\\"text-end text-nowrap\\\">\\n          <span>${product.finalPrice | currencyFormat}</span>\\n        </td>\\n\\n        <td class=\\\"text-end text-nowrap\\\"><span>${product.quantity}</span></td>\\n\\n        <td class=\\\"text-end text-nowrap\\\">\\n          <span>${product.finalPrice * product.quantity | currencyFormat}</span>\\n        </td>\\n\\n        <td if.bind=\\\"options.showWarehouse\\\" class=\\\"text-center\\\">\\n          <span>\\n            ${product.warehouseName}\\n          </span>\\n        </td>\\n\\n        <td if.bind=\\\"options.showTransport\\\" class=\\\"text-center\\\">\\n          <span>${product.transportName}</span>\\n        </td>\\n\\n        <td if.bind=\\\"options.showAddToCart\\\" class=\\\"text-nowrap mc-action\\\">\\n          <add-to-cart product.bind=\\\"product\\\"></add-to-cart>\\n        </td>\\n\\n        <td if.bind=\\\"options.showAddToReturn\\\" class=\\\"text-nowrap mc-action\\\">\\n          <div if.bind=\\\"product.quantity > 0\\\" class=\\\"input-group ml-auto return-product-form\\\">\\n            <input\\n              type=\\\"number\\\"\\n              class=\\\"form-control form-control-sm\\\"\\n              min=\\\"1\\\"\\n              step=\\\"1\\\"\\n              max.bind=\\\"product.quantity\\\"\\n              value.bind=\\\"product.returnQuantity\\\" />\\n            <div class=\\\"input-group-append\\\">\\n              <button\\n                type=\\\"button\\\"\\n                id=\\\"${getUniqueProductId(product)}\\\"\\n                class=\\\"btn btn-warning btn-sm clickable-important\\\"\\n                click.trigger=\\\"returnProduct(product)\\\">\\n                ${'components.products.buttons.return' & t}\\n              </button>\\n            </div>\\n          </div>\\n        </td>\\n      </tr>\\n    </tbody>\\n  </table>\\n</template>\\n\";","import { I18N } from \"aurelia-i18n\";\nimport { IWarehouse } from \"domain/Client/IWarehouse\";\nimport { AppConfig } from \"app-config\";\nimport { Utils } from \"utils/helpers/utils\";\nimport { TKEvent } from \"utils/enums/TKEvent\";\nimport { EventAggregator } from \"aurelia-event-aggregator\";\nimport { LogManager, autoinject, bindable } from \"aurelia-framework\";\nimport { IProduct } from \"domain/Product/IProduct\";\nimport { CartProductService } from \"services/cart/cart-product-service\";\nimport { ICartProduct } from \"domain/Cart/ICartProduct\";\nimport { isExternalProduct } from \"domain/Cart/Origin\";\nimport { isExternalStock } from \"domain/Cart/CartProductUpdate\";\nimport { buildCartLinePayload } from \"domain/Cart/CartLinePayload\";\nimport { warehouseDisplayName } from \"utils/helpers/warehouse-display-name\";\nimport { Subscriptions } from \"utils/helpers/subscriptions\";\nimport { contractTransportAddresses, linesToPreselect } from \"domain/Cart/TransportSelection\";\n\n// SAL-283: transport row key shared by all external (Factory/Partner) lines. It is only a UI key;\n// whether a line is external comes from its stored origin, never from its warehouseId.\nexport const EXTERNAL_TRANSPORT_KEY = -1;\n\nexport const log = LogManager.getLogger(\"app.cart.index\");\n\n@autoinject\nexport class TransportListCustomElement {\n  @bindable allowedTransportOptions: Map<string, string>;\n  @bindable warehouses: IWarehouse[];\n  userSpecifiedAddresses: string[];\n  combinedWarehouses = [1, 3];\n\n  @bindable products: ICartProduct[];\n  error: string;\n\n  // map contents: (warehouseId; transportId)\n  selectedTransportsForWarehouses = new Map<number, string>();\n\n  @bindable comment = \"\";\n  selectedTransportAddress = \"\";\n\n  totalWithoutVat = 0;\n  totalVat = 0;\n  totalWithVat = 0;\n\n  options = {\n    showImages: true,\n    showEan: true,\n    showStock: true,\n    showWarehouse: true,\n    showReason: false,\n    showDisplayPrice: true,\n  };\n\n  constructor(\n    private cartProductService: CartProductService,\n    private eventAggregator: EventAggregator,\n    private appConfig: AppConfig,\n    private i18n: I18N,\n  ) {}\n\n  /** SAL-283 r9: subscribe while on screen only (a left /cart kept handling events and mutating lines). */\n  private subscriptions = new Subscriptions();\n\n  attached() {\n    this.subscriptions.disposeAll();\n    this.subscriptions.add(\n      this.eventAggregator.subscribe(TKEvent.cartProductsChanged, () =>\n        this.updateSelectedTransports(),\n      ),\n      this.eventAggregator.subscribe(TKEvent.cartProductsWarehouseChanged, (product: IProduct) => {\n        this.updateCartProductWarehouseId(product);\n        this.updateSelectedTransports();\n      }),\n      // SAL-283 r9: on a first load the cart can arrive before the user's settings.\n      this.eventAggregator.subscribe(TKEvent.userSettingsLoaded, () => this.loadAddresses()),\n    );\n    this.loadAddresses();\n    this.updateSelectedTransports();\n  }\n\n  detached() {\n    this.subscriptions.disposeAll();\n  }\n\n  /** SAL-283 r9: contract settings may not be loaded yet (blank /cart on first load). */\n  loadAddresses() {\n    this.userSpecifiedAddresses = contractTransportAddresses(this.appConfig.contractSettings);\n  }\n\n  // #region OBSERVABLES, LISTENERS\n\n  changeTransportForWarehouse(warehouseId: number, newTransportId: string) {\n    this.selectedTransportsForWarehouses.set(warehouseId, newTransportId);\n\n    if (this.isWarehouseCombinationPresent() && this.isCombinedWarehouse(warehouseId)) {\n      this.selectedTransportsForWarehouses.set(\n        this.getOtherCombinedWarehouse(warehouseId),\n        newTransportId,\n      );\n    }\n\n    const productsToUpdate = this.products.filter(product =>\n      isExternalProduct(product)\n        ? this.isExternalWarehouse(warehouseId)\n        : product.warehouseId == warehouseId ||\n          product.warehouseId == this.getOtherCombinedWarehouse(warehouseId),\n    );\n    productsToUpdate.forEach(product => {\n      if (product.transportId == newTransportId) return;\n\n      product.transportId = newTransportId;\n      this.updateSelectedTransports();\n      this.saveTransport(product);\n    });\n  }\n\n  /** Sends the line's transport to the server (PlaceOrder validates the stored TransportId). */\n  saveTransport(product: ICartProduct) {\n    // SAL-315: never send the UI-only -1 group id; skip lines with no valid warehouse.\n    const cartProduct = buildCartLinePayload(product);\n    if (cartProduct == null) return;\n    this.cartProductService\n      .putExistingProduct(cartProduct)\n      .catch(() => Utils.showErrorToast(log, this.i18n.tr(\"pages.cart.errors.update\")));\n  }\n\n  updateSelectedTransports() {\n    if (!this.products) return;\n\n    this.selectedTransportsForWarehouses = new Map<number, string>();\n\n    for (const p of this.products) {\n      if (isExternalProduct(p)) {\n        this.selectedTransportsForWarehouses.set(EXTERNAL_TRANSPORT_KEY, p.transportId ?? \"0\");\n        continue;\n      }\n\n      this.selectedTransportsForWarehouses.set(p.warehouseId ?? 0, p.transportId ?? \"0\");\n    }\n  }\n\n  updateCartProductWarehouseId(product: IProduct) {\n    const cartProduct = this.products.find(p => p.id == product.id);\n    if (!cartProduct) return;\n\n    // A stock choice the user just made (a move); the stored origin is updated by the server.\n    if (!isExternalStock(product.selectedStock)) {\n      cartProduct.externalWarehouseId = undefined;\n      cartProduct.warehouseId = product.selectedStock?.warehouse?.id;\n    } else {\n      cartProduct.externalWarehouseId = product.selectedStock?.warehouse?.id;\n      cartProduct.warehouseId = 0;\n    }\n\n    this.preselectOnlyTransportOption();\n  }\n\n  // #endregion\n\n  // #region HELPERS\n\n  getWarehouseName(warehouseId: number): string {\n    if (this.isExternalWarehouse(warehouseId))\n      return this.i18n.tr(\"pages.cart.fields.external-warehouse\");\n    if (this.isWarehouseCombinationPresent() && this.isCombinedWarehouse(warehouseId))\n      return this.i18n.tr(\"pages.cart.fields.combined-warehouse\");\n\n    return (\n      warehouseDisplayName(warehouseId, [this.warehouses, this.appConfig.allowedWarehouses]) ?? \"\"\n    );\n  }\n\n  getTransportName(transportId: string): string {\n    return this.allowedTransportOptions.get(transportId) ?? \"?\";\n  }\n\n  anyExternalWarehouseProducts() {\n    return this.products.some(x => isExternalProduct(x));\n  }\n\n  preselectOnlyTransportOption() {\n    if (this.allowedTransportOptions?.size != 1) return;\n\n    const transportId = this.allowedTransportOptions.keys().next().value as string;\n\n    // SAL-283 r9: the preselected transport used to be set on screen only, never saved, so the\n    // dropdown showed it while PlaceOrder refused with \"missing transport selection\".\n    for (const product of linesToPreselect(this.products, transportId)) {\n      product.transportId = transportId;\n      this.saveTransport(product);\n    }\n    this.updateSelectedTransports();\n  }\n\n  canChangeTransport(warehouseId: number): boolean {\n    return true; // TEMP: always allow until better solution is found\n    /* return (\n      this.isExternalWarehouse(warehouseId) ||\n      warehouseId == this.appConfig.userSettings.warehouseId ||\n      this.isCombinedWarehouse(warehouseId)\n    ); */\n  }\n\n  isWarehouseCombinationPresent() {\n    const internal = this.products.filter(p => !isExternalProduct(p));\n    const hasFirstWarehouse = internal.some(p => p.warehouseId === this.combinedWarehouses[0]);\n    const hasSecondWarehouse = internal.some(p => p.warehouseId === this.combinedWarehouses[1]);\n\n    return hasFirstWarehouse && hasSecondWarehouse;\n  }\n\n  isCombinedWarehouse(warehouseId: number): boolean {\n    return this.combinedWarehouses.includes(warehouseId);\n  }\n\n  getMainCombinedWarehouse(): number {\n    return this.combinedWarehouses[0];\n  }\n\n  getOtherCombinedWarehouse(warehouseId: number): number {\n    if (!this.combinedWarehouses.includes(warehouseId)) return 0;\n    return this.combinedWarehouses.find(id => id !== warehouseId) ?? 0;\n  }\n\n  shouldDisplayInList(warehouseId: number): boolean {\n    return !(this.isWarehouseCombinationPresent() && warehouseId == this.combinedWarehouses[1]);\n  }\n\n  isExternalWarehouse(warehouseId: number): boolean {\n    return warehouseId === EXTERNAL_TRANSPORT_KEY;\n  }\n\n  //#endregion\n}\n","module.exports = \"<template>\\n  <require from=\\\"components/cart/cart-product-list\\\"></require>\\n  <require from=\\\"components/general/loading\\\"></require>\\n  <require from=\\\"utils/classes/value-converters\\\"></require>\\n\\n  <div class=\\\"row mt-3\\\" id=\\\"transport-list\\\">\\n    <div class=\\\"col border-right\\\">\\n      <h6>${'pages.cart.fields.transport-options' & t}</h6>\\n      <div\\n        repeat.for=\\\"[warehouseId, transportId] of selectedTransportsForWarehouses\\\"\\n        class=\\\"form-group row mt-1 align-items-center\\\">\\n        <template if.bind=\\\"shouldDisplayInList(warehouseId)\\\">\\n          <label for=\\\"${warehouseId}\\\" class=\\\"col-sm-6 col-form-label text-end\\\">\\n            <template if.bind=\\\"getWarehouseName(warehouseId)\\\">${getWarehouseName(warehouseId)}:</template>\\n          </label>\\n          <div class=\\\"col-sm-6 ps-0\\\">\\n            <select\\n              if.bind=\\\"canChangeTransport(warehouseId)\\\"\\n              class=\\\"form-select form-select-sm\\\"\\n              value.bind=\\\"transportId\\\"\\n              change.delegate=\\\"changeTransportForWarehouse(warehouseId, transportId)\\\">\\n              <option value.bind=\\\"0\\\">${'pages.cart.fields.choose-transport' & t}</option>\\n              <option repeat.for=\\\"[key, value] of allowedTransportOptions\\\" value.bind=\\\"key\\\">\\n                ${value}\\n              </option>\\n            </select>\\n            <p class=\\\"mb-0\\\" else>${getTransportName(transportId)}</p>\\n          </div>\\n        </template>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"col\\\">\\n      <h6>${'pages.cart.fields.transport-address' & t}</h6>\\n      <div class=\\\"form-group row mt-1\\\">\\n        <div class=\\\"col-auto\\\">\\n          <select class=\\\"form-select form-select-sm\\\" value.bind=\\\"selectedTransportAddress\\\">\\n            <option value=\\\"\\\">${'pages.cart.fields.choose-address' & t}</option>\\n            <option repeat.for=\\\"address of userSpecifiedAddresses\\\" value.bind=\\\"address\\\">\\n              ${address}\\n            </option>\\n          </select>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</template>\\n\";","import { IParentItem } from 'domain/Base/IParentItem';\nimport { bindable } from 'aurelia-framework';\n\nexport class AccordionCustomElement {\n  @bindable list: IParentItem[];\n  @bindable parentId: number;\n  @bindable clickFunction: any;\n  @bindable filter: string | undefined;\n\n  click(item: IParentItem) {\n    this.clickFunction({ item: item });\n  }\n\n  getClass(item: IParentItem): string {\n    let classes = \"\";\n\n    if (!item.children || !item.children.length) {\n      classes += \"accordion-child\";\n\n      if (this.filter)\n        classes += \" matching-item\";\n    }\n\n    return classes;\n  }\n}\n","module.exports = \"<template>\\n\\n  <div class=\\\"accordion\\\" data-parent-id.bind=\\\"parentId\\\">\\n    <div class=\\\"accordion-item\\\" repeat.for=\\\"item of list\\\">\\n      <h2 class=\\\"accordion-header\\\">\\n        <button class=\\\"accordion-button collapsed ${getClass(item)}\\\" type=\\\"button\\\"\\n                data-bs-toggle=\\\"collapse\\\" data-item-id.bind=\\\"item.id\\\"\\n                data-bs-target=\\\"[data-child-id='${parentId + '_' + item.id}']\\\"\\n                click.delegate=\\\"!item.children.length && clickFunction({item: item})\\\">\\n          ${item.name}\\n        </button>\\n      </h2>\\n      <div if.bind=\\\"item.children.length\\\" class=\\\"accordion-collapse collapse\\\"\\n           data-bs-parent=\\\"[data-parent-id='${parentId}']\\\"\\n           data-child-id.bind=\\\"parentId + '_' + item.id\\\">\\n        <div class=\\\"accordion-body\\\">\\n          <accordion list.bind=\\\"item.children\\\" parent-id.bind=\\\"parentId + '_' + item.id\\\"\\n                     filter.bind=\\\"filter\\\" click-function.call=\\\"click(item)\\\"></accordion>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n\\n</template>\\n\";","import { bindable } from 'aurelia-framework';\n\nexport class LoadingCustomElement {\n  @bindable error: boolean;\n  @bindable errorTitle: string;\n  @bindable errorDetails: string;\n  @bindable errorDetailsClass: string;\n\n  @bindable notFound: boolean;\n  @bindable notFoundTitle: string;\n  @bindable notFoundDetails: string;\n  @bindable notFoundDetailsClass: string;\n}\n","module.exports = \"<template>\\n\\n  <div class=\\\"card border-danger w-100\\\" if.bind=\\\"error\\\">\\n    <div class=\\\"card-body text-danger\\\">\\n      <h5 class=\\\"card-title\\\">${errorTitle}</h5>\\n      <p class=\\\"card-text ${errorDetailsClass}\\\">${errorDetails}</p>\\n    </div>\\n  </div>\\n\\n  <template else>\\n    <div class=\\\"card border-primary\\\" if.bind=\\\"notFound\\\">\\n      <div class=\\\"card-body text-primary\\\">\\n        <h5 class=\\\"card-title\\\">${notFoundTitle}</h5>\\n        <p class=\\\"card-text ${notFoundDetailsClass}\\\">${notFoundDetails}</p>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"w-100 text-center\\\" else>\\n      <div class=\\\"spinner-border\\\" role=\\\"status\\\"></div>\\n    </div>\\n  </template>\\n\\n</template>\\n\";","import { LogManager } from 'aurelia-framework';\nimport { bindable } from 'aurelia-framework';\n\nexport var log = LogManager.getLogger('app.components.pager');\n\nexport class PagerCustomElement {\n  @bindable currentPage: number = 1;\n  @bindable lastPage: number = 1;\n\n  // the number of first and last pages to be displayed\n  @bindable extremePagesLimit: number = 2;\n  // the number of pages that are displayed around the active page\n  @bindable nearbyPagesLimit: number = 2;\n}\n","module.exports = \"<template>\\n\\n  <nav if.bind=\\\"lastPage > 1\\\">\\n    <ul class=\\\"pagination justify-content-center\\\">\\n      <template if.bind=\\\"currentPage > 1\\\">\\n        <li class=\\\"page-item\\\">\\n          <a class=\\\"page-link\\\" href=\\\"\\\" click.delegate=\\\"currentPage = currentPage - 1\\\">&laquo;</a>\\n        </li>\\n\\n        <template repeat.for=\\\"i of (extremePagesLimit + 1)\\\">\\n          <li if.bind=\\\"i > 0 && i < currentPage - nearbyPagesLimit\\\" class=\\\"page-item\\\">\\n            <a class=\\\"page-link\\\" href=\\\"\\\" click.delegate=\\\"currentPage = i\\\">${i}</a>\\n          </li>\\n        </template>\\n\\n        <li if.bind=\\\"(extremePagesLimit + 1) < (currentPage - nearbyPagesLimit)\\\"\\n            class=\\\"page-item disabled\\\">\\n          <span class=\\\"page-link\\\">...</span>\\n        </li>\\n\\n        <template repeat.for=\\\"i of currentPage\\\">\\n          <li if.bind=\\\"i > 0 && i >= currentPage - nearbyPagesLimit\\\" class=\\\"page-item\\\">\\n            <a class=\\\"page-link\\\" href=\\\"\\\" click.delegate=\\\"currentPage = i\\\">${i}</a>\\n          </li>\\n        </template>\\n      </template>\\n      <li class=\\\"page-item disabled\\\" else><span class=\\\"page-link\\\">&laquo;</span></li>\\n\\n      <li class=\\\"page-item active\\\" aria-current=\\\"page\\\">\\n        <span class=\\\"page-link\\\">${currentPage}</span>\\n      </li>\\n\\n      <template if.bind=\\\"currentPage < lastPage\\\">\\n        <template repeat.for=\\\"i of (currentPage + nearbyPagesLimit + 1)\\\">\\n          <li if.bind=\\\"i > currentPage && i <= lastPage\\\" class=\\\"page-item\\\">\\n            <a class=\\\"page-link\\\" href=\\\"\\\" click.delegate=\\\"currentPage = i\\\">${i}</a>\\n          </li>\\n        </template>\\n\\n        <li if.bind=\\\"(lastPage - extremePagesLimit) > (currentPage + nearbyPagesLimit)\\\"\\n            class=\\\"page-item disabled\\\">\\n          <span class=\\\"page-link\\\"><span aria-hidden=\\\"true\\\">...</span></span>\\n        </li>\\n\\n        <template repeat.for=\\\"i of (lastPage + 1)\\\">\\n          <li class=\\\"page-item\\\"\\n              if.bind=\\\"i > (lastPage - extremePagesLimit) && i > (currentPage + nearbyPagesLimit)\\\">\\n            <a class=\\\"page-link\\\" href=\\\"\\\" click.delegate=\\\"currentPage = i\\\">${i}</a>\\n          </li>\\n        </template>\\n\\n        <li class=\\\"page-item\\\">\\n          <a class=\\\"page-link\\\" href=\\\"\\\" click.delegate=\\\"currentPage = currentPage + 1\\\">&raquo;</a>\\n        </li>\\n      </template>\\n      <template else>\\n        <li class=\\\"page-item disabled\\\"><span class=\\\"page-link\\\">&raquo;</span></li>\\n      </template>\\n    </ul>\\n  </nav>\\n\\n</template>\\n\";","import { IParentItem } from \"domain/Base/IParentItem\";\nimport { bindable } from \"aurelia-framework\";\n\nexport class SimpleTreeCustomElement {\n  @bindable list: IParentItem[];\n  @bindable depth: number = 0;\n  @bindable clickFunction: any;\n\n  handleToggleClick(event: Event, item: IParentItem) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.toggle(item);\n  }\n\n  handleItemClick(event: Event, item: IParentItem) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.click(item);\n  }\n\n  toggle(item: any) {\n    item._expanded = !item._expanded;\n  }\n\n  click(item: IParentItem) {\n    if (this.clickFunction) {\n      this.clickFunction({ item: item });\n    }\n  }\n}\n","module.exports = \"<template>\\n  <ul class=\\\"simple-tree list-unstyled mb-0\\\" css=\\\"padding-left: ${depth > 0 ? '1rem' : '0'}\\\">\\n    <li repeat.for=\\\"item of list\\\" class=\\\"text-muted\\\">\\n      <template if.bind=\\\"item.children && item.children.length\\\">\\n        <a\\n          href=\\\"\\\"\\n          click.delegate=\\\"handleToggleClick($event, item)\\\"\\n          class=\\\"text-decoration-none\\\">\\n          <i class=\\\"bi ${item._expanded ? 'bi-chevron-down' : 'bi-chevron-right'} me-1\\\"></i>\\n          <span>${item.name}</span>\\n        </a>\\n        <simple-tree\\n          if.bind=\\\"item._expanded\\\"\\n          list.bind=\\\"item.children\\\"\\n          depth.bind=\\\"depth + 1\\\"\\n          click-function.call=\\\"click(item)\\\">\\n        </simple-tree>\\n      </template>\\n      <template else>\\n        <a\\n          href=\\\"\\\"\\n          click.delegate=\\\"handleItemClick($event, item)\\\"\\n          class=\\\"ms-3\\\">\\n          ${item.name}\\n        </a>\\n      </template>\\n    </li>\\n  </ul>\\n</template>\\n\";","import { bindable } from 'aurelia-framework';\n\nexport class ToastCustomElement {\n  @bindable toastClass: string;\n  @bindable position: string;\n  @bindable messageClass: string;\n  @bindable message: string;\n}\n","module.exports = \"<template>\\n  <div\\n    class=\\\"toast ${toastClass} hide position-fixed ${position} m-5\\\"\\n    role=\\\"alert\\\"\\n    data-bs-delay=\\\"5000\\\">\\n    <div class=\\\"toast-header\\\">\\n      <strong class=\\\"me-auto ${messageClass}\\\">${message}</strong>\\n      <button type=\\\"button\\\" class=\\\"btn-close\\\" data-bs-dismiss=\\\"toast\\\"></button>\\n    </div>\\n    <div class=\\\"toast-body\\\"></div>\\n  </div>\\n</template>\\n\";"],"sourceRoot":""}