{"version":3,"file":"static/js/f92fd4c6e71c2e4edeb4.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/actions/get-roof-table.action.ts?6b0d","webpack://Msdyn365.Commerce.Online/./src/actions/lobas-list-page-state.ts?acf6","webpack://Msdyn365.Commerce.Online/./src/actions/lobas-url-utils.ts?fbe6","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-roof-table-links.tsx?c906","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-checkbox.tsx?dacf","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-table.tsx?ffc3","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-utilities.ts?d05f","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-range-refine-item.tsx?dbdf","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-refine-item.tsx?d200","webpack://Msdyn365.Commerce.Online/./src/modules/components/lobas-refine-submenu.tsx?970b","webpack://Msdyn365.Commerce.Online/./src/modules/lobas-roof-table/lobas-roof-table.tsx?5370","webpack://Msdyn365.Commerce.Online/./src/modules/lobas-roof-table/lobas-roof-table.view.tsx?fa49","webpack://Msdyn365.Commerce.Online/./lib/lobas-roof-table/module-registration.js?91c0","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/internals/does-not-exceed-safe-integer.js?905d","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/internals/flatten-into-array.js?5fb7","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.array.flat-map.js?33b2","webpack://Msdyn365.Commerce.Online/./node_modules/@msdyn365-commerce/bootloader/node_modules/core-js/modules/es.array.unscopables.flat-map.js?b6f5","webpack://Msdyn365.Commerce.Online/external var \"React\"?0d3b","webpack://Msdyn365.Commerce.Online/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { createObservableDataAction, IAction, ICreateActionContext } from '@msdyn365-commerce/core';\r\nimport { retailAction } from '@msdyn365-commerce/retail-proxy';\r\nimport { IRoof } from './DataServiceEntities.g';\r\nimport { createGetRoofTableInput } from './DataActionExtension.g';\r\n\r\nexport default createObservableDataAction({\r\n action: >retailAction,\r\n input: (context: ICreateActionContext) => {\r\n return createGetRoofTableInput({ Paging: { Top: 0 } });\r\n }\r\n});\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n//import { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\n//import { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\nimport { ILobasTableRefinerHierarchy, ILobasTableRefinerValue } from '../modules/components/lobas-table';\r\nimport { IRoof } from './DataServiceEntities.g';\r\n\r\n/**\r\n * Export listPageType.\r\n */\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * ListPageState class.\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ILobasTableRefinerValue[] | null = null;\r\n\r\n //@observable public activeProducts: ProductSearchResult[] = [];\r\n\r\n @observable public activeRoofs: IRoof[] = [];\r\n\r\n //@observable public sortingCritera: SortingInfo | null = null;\r\n\r\n @observable public currentPageNumber: number | null = null;\r\n\r\n @observable public refiners: ILobasTableRefinerHierarchy[] | null = null;\r\n\r\n @observable public totalTableCount: number | undefined;\r\n\r\n @observable public pageSize: number = 1000;\r\n\r\n @observable public pageType: listPageType = 'Unknown';\r\n\r\n //@observable public featureProduct: SimpleProduct | null = null;\r\n\r\n //@observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input.\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => 'ListPageState';\r\n\r\n public getCacheObjectType = () => 'ListPageState';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * Create new input for create action.\r\n * @param inputData\r\n */\r\nexport const createListPageInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction({\r\n action: >listPageStateAction,\r\n input: createListPageInput\r\n});\r\n","/* eslint-disable no-debugger */\r\n/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport MsDyn365, { IRequestContext, getUrlSync, IActionContext } from '@msdyn365-commerce/core';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { ILobasTableRefinerValue } from '../modules/components/lobas-table';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\r\n */\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL.\r\n * @param fullUrl The full URL of the page.\r\n * @param requestContext\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ILobasTableRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray\r\n .map(compressedRefiner => {\r\n try {\r\n const parsedRefiner: ILobasTableRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch {\r\n return undefined;\r\n }\r\n })\r\n .filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nexport const compressRefiners = (refiners: ILobasTableRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners.\r\n * @param fullUrl The Current URL of the page.\r\n * @param refiners The refiners which should be added to the URL.\r\n * @param sortingColumns\r\n * @param skipCount\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ILobasTableRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (refiners.length === 0) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(refiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n debugger;\r\n if (sortingColumns !== undefined) {\r\n if (sortingColumns.length === 0) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context.\r\n * @param key The query parameter key.\r\n * @param requestContext The request context.\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context.\r\n * @param requestContext The request context.\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n }\r\n return new URL((requestContext.url.requestUrl));\r\n};\r\n\r\nexport function getArticlePageUrlSync(name: string, recordId: number, ctx: IActionContext): string {\r\n return getUrlSync('article', ctx, {\r\n article: { Title: name || '', Id: recordId }\r\n })!;\r\n}\r\n","import * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { getPayloadObject, getTelemetryAttributes, ITelemetryContent, onTelemetryClick } from '@msdyn365-commerce-modules/utilities';\r\nimport React from 'react';\r\n\r\nexport interface ILinksData {\r\n linkText?: string;\r\n linkUrl: Msdyn365.ILinkData;\r\n disabled: boolean;\r\n ariaLabel?: string;\r\n openInNewTab?: boolean;\r\n}\r\n\r\nexport interface IRoofTableLinks {\r\n links: ILinksData[] | undefined;\r\n //requestContext: Msdyn365.IRequestContext;\r\n telemetryContent: ITelemetryContent;\r\n role?: string;\r\n //onTextChange?(index: number): (event: Msdyn365.ContentEditableEvent) => void;\r\n}\r\n\r\nexport class RoofTableLinks extends React.PureComponent {\r\n public render(): JSX.Element {\r\n const editableLinks = this._mapEditableLinks(this.props.links);\r\n const disabledLinks = this._mapDisabledLinks(this.props.links);\r\n\r\n return (\r\n
\r\n {editableLinks && editableLinks.length > 0 ? (\r\n \r\n ) : null}\r\n {disabledLinks && disabledLinks.length > 0 ? disabledLinks : null}\r\n
\r\n );\r\n }\r\n\r\n private readonly _mapEditableLinks = (linkdata: ILinksData[] | undefined): Msdyn365.ILinksData[] | null => {\r\n if (!linkdata || linkdata.length === 0) {\r\n return null;\r\n }\r\n const editableLinks: Msdyn365.ILinksData[] = [];\r\n\r\n linkdata.forEach((link, index) => {\r\n // Construct telemetry attribute to render\r\n const payLoad = getPayloadObject('click', this.props.telemetryContent, '', '');\r\n const linkText = link.linkText ? link.linkText : '';\r\n payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.props.telemetryContent, payLoad);\r\n const btnClass = index === 0 ? 'msc-cta__primary' : 'msc-cta__secondary';\r\n\r\n if (!link.disabled) {\r\n const editableLink: Msdyn365.ILinksData = {\r\n ariaLabel: link.ariaLabel,\r\n className: btnClass,\r\n linkText: link.linkText,\r\n linkUrl: link.linkUrl.destinationUrl,\r\n openInNewTab: link.openInNewTab,\r\n role: this.props.role,\r\n additionalProperties: attributes,\r\n onClick: onTelemetryClick(this.props.telemetryContent, payLoad, linkText)\r\n };\r\n editableLinks.push(editableLink);\r\n }\r\n });\r\n\r\n return editableLinks;\r\n };\r\n\r\n private readonly _mapDisabledLinks = (linkdata: ILinksData[] | undefined): JSX.Element[] | null => {\r\n if (!linkdata || linkdata.length === 0) {\r\n return null;\r\n }\r\n\r\n const disabledLinks = linkdata\r\n .filter(link => link.disabled)\r\n .map((link, index) => {\r\n return (\r\n
\r\n {link.linkText}\r\n
\r\n );\r\n });\r\n\r\n return disabledLinks;\r\n };\r\n}\r\nexport default RoofTableLinks;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport classnames from 'classnames';\r\nimport * as React from 'react';\r\n\r\nexport interface ILobasRadioButtonProps {\r\n isChecked?: boolean;\r\n value?: string;\r\n ariaSetSize?: number;\r\n ariaPosInSet?: number;\r\n ariaLabel?: string;\r\n name: string;\r\n className?: string;\r\n isSingleSelectOnly?: boolean;\r\n onChange(reacords: object): void;\r\n}\r\n\r\n/**\r\n * AddPaymentForm SFC.\r\n * @param root0\r\n * @param root0.isChecked\r\n * @param root0.value\r\n * @param root0.ariaLabel\r\n * @param root0.name\r\n * @param root0.className\r\n * @param root0.onChange\r\n * @param root0.isSingleSelectOnly\r\n * @extends {React.FC}\r\n */\r\nconst LobasCheckBoxButton: React.FC = ({\r\n isChecked,\r\n value,\r\n ariaLabel,\r\n name,\r\n className,\r\n onChange,\r\n isSingleSelectOnly\r\n}) => {\r\n const cssClass = classnames('ms-input-radio', className ? className : '');\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default LobasCheckBoxButton;\r\n","/* eslint-disable security/detect-object-injection */\r\n/* eslint-disable no-debugger */\r\n/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ObjectExtensions, ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport classnames from 'classnames';\r\nimport React from 'react';\r\nimport {\r\n Button,\r\n format,\r\n KeyCodes,\r\n Node,\r\n UncontrolledPagination,\r\n ITelemetryContent,\r\n getTelemetryObject\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport RoofTableLinks, { ILinksData } from './lobas-roof-table-links';\r\nimport { ILobasRoofTableProps } from '../lobas-roof-table/lobas-roof-table.props.autogenerated';\r\nimport { ILobasRoofTableData } from '../lobas-roof-table/lobas-roof-table.data';\r\nimport LobasCheckBoxButton from './lobas-checkbox';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { SearchRefiner, SearchRefinerValue } from '@msdyn365-commerce/retail-proxy';\r\n/**\r\n * Table Resources.\r\n */\r\nexport interface ILobasTableResources {}\r\n\r\n/**\r\n * Table props.\r\n */\r\nexport interface ILobasDataTableProps {\r\n resources: ILobasTableResources;\r\n headings: (ILobasHeadingsProperty | undefined)[];\r\n subheadings: (ILobasHeadingsProperty | undefined)[];\r\n rows: ILobasTableRowProps[];\r\n className?: string;\r\n editLinkText?: string;\r\n actionLinkText?: string;\r\n deleteLinkText?: string;\r\n viewLinkText?: string;\r\n editLinkTooltip?: string;\r\n actionLinkTooltip?: string;\r\n deleteLinkTooltip?: string;\r\n viewLinkTooltip?: string;\r\n enableToModify: boolean;\r\n showCheckBoxes?: boolean;\r\n isSortable?: boolean;\r\n showPagination?: boolean;\r\n paginationProperty: ILobasPaginationProperty;\r\n minifyActions?: boolean;\r\n minifiedButtonText?: string;\r\n excludedColumns?: string[]; // Filled with ILobasTableItemProps.id of columns not to show\r\n isSingleSelectOnly: boolean;\r\n businessUserSelectCheckBoxAriaLabelText?: string;\r\n sortByAscending?: string;\r\n sortByDescending?: string;\r\n resourcePrefix?: string;\r\n actions: {\r\n onDelete?(userData: ILobasTableItemProps[], referenceBack?: HTMLButtonElement | null): void | undefined;\r\n onEdit?(userData: ILobasTableItemProps[], referenceBack?: HTMLButtonElement | null): void | undefined;\r\n onView?(userData: ILobasTableItemProps[]): void | undefined;\r\n };\r\n checkBoxCallback?(records: ILobasTableRowProps[]): void;\r\n formatPrice?(price: number): string;\r\n sourceProps: ILobasRoofTableProps;\r\n isRefinerMenuExpandedOnInitialLoad: boolean;\r\n}\r\n\r\n/**\r\n * Table IPaginationProperty props.\r\n */\r\nexport interface ILobasPaginationProperty {\r\n itemPerPage: number;\r\n skipCount: number;\r\n prevText: string;\r\n nextText: string;\r\n paginationText: string;\r\n url: string;\r\n}\r\n\r\n/**\r\n * Table ITableItemProps props.\r\n */\r\nexport interface ILobasTableItemProps {\r\n id: string;\r\n type: LobasTableDataType;\r\n value: boolean | number | string;\r\n className?: string;\r\n isLinkItem: boolean;\r\n links?: ILobasLinkProps[];\r\n}\r\n\r\n/**\r\n * Table IButtonReferences props.\r\n */\r\nexport interface ILobasButtonReferences {\r\n edit?: React.RefObject;\r\n delete?: React.RefObject;\r\n}\r\n\r\n/**\r\n * Table ITableRowProps props.\r\n */\r\nexport interface ILobasTableRowProps {\r\n row: ILobasTableItemProps[];\r\n isSelected: boolean;\r\n buttonReferences?: ILobasButtonReferences;\r\n}\r\n\r\n/**\r\n * Table IDataTableCells props.\r\n */\r\ninterface ILobasDataTableCells {\r\n header: boolean;\r\n className: string;\r\n content: string | number | React.ReactNode;\r\n cellIndex: number;\r\n scope: 'col' | 'row';\r\n colSpan?: number;\r\n records?: ILobasTableRowProps;\r\n}\r\n\r\n/**\r\n * Table IHeadingsProperty props.\r\n */\r\nexport interface ILobasHeadingsProperty {\r\n name: string;\r\n sortable: boolean;\r\n ariaLabel?: string;\r\n colspan?: number;\r\n}\r\n\r\n/**\r\n * Table ITableState props.\r\n */\r\nexport interface ILobasTableState {\r\n sortingKey: string;\r\n ascendingOrder: boolean;\r\n showActions: boolean;\r\n selectedIndex: string;\r\n refinerButtonExpanded: boolean;\r\n}\r\n\r\nexport interface ILobasLinkProps {\r\n linkUrl: string;\r\n disabled: boolean;\r\n linkText?: string;\r\n linkType?: string;\r\n}\r\n\r\nexport interface ILobasTableRefinerHierarchy extends SearchRefiner {\r\n /**\r\n * @description Array of children refiner values.\r\n */\r\n Values: ILobasTableRefinerValue[];\r\n SourceValue?: number;\r\n}\r\n\r\nexport interface ILobasTableRefinerValue extends SearchRefinerValue {\r\n RefinerSourceValue?: number;\r\n}\r\n\r\n/**\r\n * Table TableDataType props.\r\n */\r\nexport enum LobasTableDataType {\r\n Number = 'Number',\r\n Text = 'Text',\r\n Price = 'Price'\r\n}\r\n\r\nexport default class LobasTable extends React.PureComponent {\r\n public componentClassName: string = 'ms-table';\r\n\r\n private readonly headingPrefix: string = 'table';\r\n\r\n private readonly capitalizeHeadingPrefix: string = 'Table';\r\n\r\n constructor(props: ILobasDataTableProps) {\r\n super(props);\r\n\r\n const isExpanded = this.props.isRefinerMenuExpandedOnInitialLoad;\r\n\r\n this.state = {\r\n ascendingOrder: true,\r\n sortingKey: (props && props.headings[0] && props.headings[0].name) || '',\r\n showActions: props && props.minifyActions !== undefined ? !props.minifyActions : true,\r\n selectedIndex: '',\r\n refinerButtonExpanded: isExpanded\r\n };\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { className, headings, subheadings, rows, isSortable, showPagination, paginationProperty } = this.props;\r\n const { sortingKey, ascendingOrder } = this.state;\r\n const classname = classnames(this.componentClassName, className);\r\n let tableRows = isSortable && sortingKey ? this._sortTableRow(rows, sortingKey, ascendingOrder) : rows;\r\n let paginationLinks = null;\r\n\r\n if (showPagination) {\r\n const { skipCount, itemPerPage, nextText, prevText, paginationText, url } = paginationProperty;\r\n\r\n paginationLinks = (\r\n \r\n );\r\n\r\n tableRows = this._getCurrentPageData(tableRows, skipCount, skipCount + itemPerPage);\r\n }\r\n\r\n const tableBody = this._renderRow(tableRows);\r\n const tableHead = this._renderHeadingRows(headings, subheadings);\r\n\r\n return (\r\n
\r\n \r\n {tableHead}\r\n {tableBody}\r\n
\r\n {paginationLinks}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Set sorting key.\r\n * @param event -The mouse event.\r\n */\r\n private readonly _selectSortingKey = (event: React.MouseEvent | React.KeyboardEvent) => {\r\n const target = event.target as HTMLElement;\r\n let columnName = target.getAttribute('data-sort-name') ? (target.getAttribute('data-sort-name') as string) : '';\r\n\r\n if (!columnName) {\r\n columnName =\r\n target.parentElement && target.parentElement.getAttribute('data-sort-name')\r\n ? (target.parentElement.getAttribute('data-sort-name') as string)\r\n : '';\r\n }\r\n\r\n const { sortingKey, ascendingOrder } = this.state;\r\n let newOrder = true;\r\n\r\n if (sortingKey === columnName) {\r\n newOrder = !ascendingOrder;\r\n }\r\n\r\n this.setState({\r\n sortingKey: columnName,\r\n ascendingOrder: newOrder,\r\n showActions: false\r\n });\r\n };\r\n\r\n /**\r\n * Checkbox change.\r\n * @param rows -Table rows.\r\n * @param checkBoxCallback -Checkboxcallback function.\r\n * @param index -Index value for row.\r\n * @returns Checkbox rows.\r\n */\r\n private readonly _onCheckBoxChangeHandler = (\r\n rows: ILobasTableRowProps[],\r\n checkBoxCallback: (records: ILobasTableRowProps[]) => void,\r\n index?: number\r\n ) => () => {\r\n if (ObjectExtensions.isNumber(index)) {\r\n rows[index].isSelected = !rows[index].isSelected;\r\n }\r\n checkBoxCallback(rows);\r\n };\r\n\r\n private readonly _renderHeadingRows = (\r\n headerColumnData: (ILobasHeadingsProperty | undefined)[],\r\n subheaderColumnData: (ILobasHeadingsProperty | undefined)[]\r\n ) => {\r\n return [this._renderHeadingRow(headerColumnData), this._renderHeadingRow(subheaderColumnData)];\r\n };\r\n\r\n private readonly _renderHeadingRow = (columnData: (ILobasHeadingsProperty | undefined)[]) => {\r\n const {\r\n resources,\r\n showCheckBoxes,\r\n enableToModify,\r\n minifyActions,\r\n rows,\r\n actionLinkText,\r\n isSortable,\r\n checkBoxCallback,\r\n resourcePrefix,\r\n isSingleSelectOnly,\r\n businessUserSelectCheckBoxAriaLabelText,\r\n sortByAscending,\r\n sortByDescending\r\n } = this.props;\r\n const { sortingKey, ascendingOrder } = this.state;\r\n\r\n const sortingClassName = ascendingOrder ? 'asc' : 'dsc';\r\n\r\n const sortingValue = ascendingOrder ? sortByAscending : sortByDescending;\r\n\r\n const columns = columnData.map((data, cellIndex) => {\r\n if (!data) {\r\n return;\r\n }\r\n const counterAddition = 1;\r\n const updatedCellIndex = cellIndex + counterAddition;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- unsafe assignment.\r\n const heading =\r\n resources[`${this.headingPrefix}${data.name}HeadingText`] ||\r\n resources[`${resourcePrefix!}${this.capitalizeHeadingPrefix}${data.name}HeadingText`] ||\r\n resources[`${data.name}HeadingText`] ||\r\n data.name;\r\n\r\n const columnSortValue = sortingKey === data.name && sortingValue !== undefined ? sortingValue : '';\r\n\r\n const columnAriaLabel = data.ariaLabel ? `${format(data.ariaLabel, heading)} ${columnSortValue}` : '';\r\n\r\n const content = (isSortable && data.sortable && (\r\n \r\n \r\n {heading}\r\n \r\n \r\n )) || (\r\n \r\n {heading}\r\n \r\n );\r\n\r\n return content;\r\n });\r\n\r\n const radioCheckBox = showCheckBoxes && checkBoxCallback && !isSingleSelectOnly && (\r\n \r\n );\r\n\r\n const actionContent = (\r\n \r\n {minifyActions ? '' : actionLinkText}\r\n \r\n );\r\n\r\n return (\r\n \r\n {showCheckBoxes &&\r\n this.tableCell({\r\n header: true,\r\n className: `${this.componentClassName}__heading-row-data__checkbox checkbox`,\r\n content: radioCheckBox,\r\n cellIndex: -1,\r\n scope: 'col'\r\n })}\r\n {columns}\r\n {enableToModify &&\r\n this.tableCell({\r\n header: true,\r\n className: `${this.componentClassName}__heading-row-data action-links`,\r\n content: actionContent,\r\n cellIndex: 1,\r\n scope: 'col'\r\n })}\r\n \r\n );\r\n };\r\n\r\n private readonly _renderRow = (rows: ILobasTableRowProps[]) => {\r\n const {\r\n enableToModify,\r\n showCheckBoxes,\r\n excludedColumns,\r\n actions,\r\n checkBoxCallback,\r\n formatPrice,\r\n isSingleSelectOnly,\r\n businessUserSelectCheckBoxAriaLabelText\r\n } = this.props;\r\n\r\n const tableRows = rows.map((rowsData, index) => {\r\n let className = index % 2 ? `${this.componentClassName}__row even-row` : `${this.componentClassName}__row odd-row`;\r\n let showActions = false;\r\n let additionalNameAriaLabel = '';\r\n let columnData: (JSX.Element | undefined)[] = [];\r\n const row = rowsData.row;\r\n\r\n if (row !== undefined && ArrayExtensions.hasElements(row)) {\r\n additionalNameAriaLabel = rowsData.row[0].value.toString();\r\n columnData = rowsData.row.map((cell, index2) => {\r\n if (excludedColumns && excludedColumns.includes(cell.id)) {\r\n return;\r\n }\r\n\r\n // Numbers/price data types will always be right-aligned per design standards\r\n const extraClass = cell.type === LobasTableDataType.Number || cell.type === LobasTableDataType.Price ? 'num-type' : '';\r\n let cellContent: any =\r\n cell.type === LobasTableDataType.Price && formatPrice ? formatPrice(cell.value as number) : cell.value;\r\n const columnSpecificClass = cell.className || '';\r\n\r\n if (cell.isLinkItem) {\r\n cellContent = (\r\n \r\n );\r\n }\r\n\r\n return this.tableCell({\r\n header: false,\r\n className: classnames(`${this.componentClassName}__row-data`, extraClass, columnSpecificClass),\r\n content: cellContent,\r\n cellIndex: index2,\r\n scope: 'row'\r\n });\r\n });\r\n }\r\n\r\n const radioCheckBox = showCheckBoxes && checkBoxCallback && (\r\n \r\n );\r\n const rowKey = `row-${index}`;\r\n\r\n if (rowKey === this.state.selectedIndex && this.state.showActions) {\r\n className += ' selected';\r\n showActions = true;\r\n }\r\n\r\n const actionButtons = actions && this._renderActions(rowsData.row, showActions, rowKey, rowsData.buttonReferences);\r\n\r\n return (\r\n \r\n {showCheckBoxes &&\r\n this.tableCell({\r\n header: false,\r\n className: `${this.componentClassName}__row-data`,\r\n content: radioCheckBox,\r\n cellIndex: index,\r\n scope: 'row',\r\n records: rowsData\r\n })}\r\n {columnData}\r\n {enableToModify &&\r\n this.tableCell({\r\n header: false,\r\n className: `${this.componentClassName}__row-data`,\r\n content: actionButtons,\r\n cellIndex: index,\r\n scope: 'row',\r\n records: rowsData\r\n })}\r\n \r\n );\r\n });\r\n\r\n return tableRows;\r\n };\r\n\r\n private readonly _renderActions = (\r\n data: ILobasTableItemProps[],\r\n showActions: boolean,\r\n key: string,\r\n buttonReference?: ILobasButtonReferences\r\n ): React.ReactNode => {\r\n const {\r\n editLinkText,\r\n deleteLinkText,\r\n viewLinkText,\r\n editLinkTooltip,\r\n deleteLinkTooltip,\r\n viewLinkTooltip,\r\n actionLinkTooltip,\r\n minifyActions,\r\n minifiedButtonText,\r\n actionLinkText,\r\n actions: { onEdit, onDelete, onView }\r\n } = this.props;\r\n const handleClickEdit =\r\n onEdit !== undefined\r\n ? () => {\r\n onEdit(data, buttonReference?.edit?.current);\r\n }\r\n : undefined;\r\n const handleClickDelete =\r\n onDelete !== undefined\r\n ? () => {\r\n onDelete(data, buttonReference?.delete?.current);\r\n }\r\n : undefined;\r\n const handleClickView =\r\n onView !== undefined\r\n ? () => {\r\n onView(data);\r\n }\r\n : undefined;\r\n\r\n const actionButtons = (\r\n \r\n {handleClickView && (\r\n \r\n )}\r\n {handleClickEdit && (\r\n \r\n {editLinkText}\r\n \r\n )}\r\n {handleClickDelete && (\r\n \r\n {deleteLinkText}\r\n \r\n )}\r\n \r\n );\r\n\r\n if (minifyActions) {\r\n return (\r\n \r\n \r\n {minifiedButtonText ? minifiedButtonText : ''}\r\n \r\n {showActions && actionButtons}\r\n \r\n );\r\n }\r\n return actionButtons;\r\n };\r\n\r\n private readonly _toggleActions = (event: React.MouseEvent) => {\r\n const target = event && (event.target as HTMLElement);\r\n const newKey = target && target.getAttribute('data-type') ? (target.getAttribute('data-type') as string) : '';\r\n this.setState({\r\n showActions: !this.state.showActions,\r\n selectedIndex: newKey\r\n });\r\n };\r\n\r\n private readonly _sortTableRow = (table: ILobasTableRowProps[], sortingkey: string, ascendingOrder: boolean): ILobasTableRowProps[] => {\r\n return table.sort((userOne: ILobasTableRowProps, userTwo: ILobasTableRowProps) => {\r\n const userOneData = userOne.row.find(cell => {\r\n return cell.id === sortingkey;\r\n });\r\n const userTwoData = userTwo.row.find(cell => {\r\n return cell.id === sortingkey;\r\n });\r\n\r\n if (!userOneData || !userTwoData) {\r\n return -1;\r\n }\r\n\r\n if (typeof userOneData.value === 'number' && typeof userTwoData.value === 'number') {\r\n return ascendingOrder ? userOneData.value - userTwoData.value : userTwoData.value - userOneData.value;\r\n }\r\n\r\n const cleanFirst =\r\n (userOneData.value as string) &&\r\n userOneData.value\r\n .toString()\r\n .toLowerCase()\r\n .trim();\r\n const cleanSecond =\r\n (userOneData.value as string) &&\r\n userTwoData.value\r\n .toString()\r\n .toLowerCase()\r\n .trim();\r\n\r\n if (!cleanFirst || !cleanSecond) {\r\n return -1;\r\n }\r\n if (ascendingOrder) {\r\n return cleanFirst < cleanSecond ? -1 : 1;\r\n }\r\n return cleanFirst > cleanSecond ? -1 : 1;\r\n });\r\n };\r\n\r\n private readonly _getCurrentPageData = (tableRows: ILobasTableRowProps[], start: number, end: number): ILobasTableRowProps[] => {\r\n if (start >= end) {\r\n return tableRows;\r\n }\r\n\r\n const result = [];\r\n for (let i = start; i < end; i++) {\r\n tableRows[i] && result.push(tableRows[i]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n private readonly tableCell = (props: ILobasDataTableCells) => {\r\n const { className, header, cellIndex, scope, colSpan, content } = props;\r\n const hiddenTabIndex = -1;\r\n const initialTabIndex = 0;\r\n return header ? (\r\n initialTabIndex ? initialTabIndex : hiddenTabIndex}\r\n >\r\n {content}\r\n \r\n ) : (\r\n \r\n {content}\r\n \r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n
\r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n
\r\n {paginationNextText}\r\n
\r\n );\r\n };\r\n\r\n /**\r\n * Calls method display result.\r\n * @param event - Keyboard event.\r\n */\r\n private readonly _handleKeyPressPrev = (event: React.KeyboardEvent): void => {\r\n if (event.keyCode === KeyCodes.Enter || event.keyCode === KeyCodes.Space) {\r\n this._selectSortingKey(event);\r\n }\r\n };\r\n}\r\n\r\nexport function getLinksData(props: ILobasLinkProps[] | undefined): ILinksData[] | undefined {\r\n const linksData =\r\n props &&\r\n props.map(\r\n item =>\r\n ({\r\n linkUrl: { destinationUrl: `${item.linkUrl}`, type: `${item.linkType}` } as Msdyn365.ILinkData,\r\n linkText: `${item.linkText}`,\r\n disabled: item.disabled,\r\n openInNewTab: true\r\n } as ILinksData)\r\n );\r\n return linksData;\r\n}\r\n\r\nexport function getTelemetryContent(props: ILobasRoofTableProps): ITelemetryContent {\r\n return getTelemetryObject(props.context.request.telemetryPageName!, props.friendlyName, props.telemetry);\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n//import { ITelemetry } from '@msdyn365-commerce/core';\r\nimport { AttributeDataType, RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n\r\nimport { ILobasTableRefineItemToggleNotification } from './lobas-refine-item-toggle-notification';\r\nimport { ILobasTableRefinerValue } from './lobas-table';\r\n\r\n/**\r\n * Types of product refiner values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum LobasTableRefinerValueDataTypeValue {\r\n /**\r\n * Range slider is used for selections like price.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Range = 1,\r\n\r\n /**\r\n * Range input is a different way to specify ranges and can be expressed with input boxes\r\n * as well as a set of discrete single-select type values.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n RangeInput = 4,\r\n\r\n /**\r\n * This is a discrete list item, either multi-select or single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n List = 5,\r\n\r\n /**\r\n * Boolean types allows only single-select.\r\n * @deprecated This will be removed soon. Please, use `AttributeDataType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { AttributeDataType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Boolean = 6\r\n}\r\n\r\n/**\r\n * Types of product refiners.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\nexport enum LobasTableRefinerTypeValue {\r\n /**\r\n * Refiner values are single-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Single = 0,\r\n\r\n /**\r\n * Refiner values are multi-select.\r\n * @deprecated This will be removed soon. Please, use `RefinerType` from `@msdyn365-commerce/retail-proxy` instead.\r\n * @example\r\n * ```\r\n * import { RefinerType } from `@msdyn365-commerce/retail-proxy`;\r\n * ```\r\n */\r\n Multi = 1\r\n}\r\n\r\nexport enum LobasTableRefinerSource {\r\n None = 0\r\n}\r\n\r\n/**\r\n * Checks if the data type value corresponds to a slider.\r\n * @param dataTypeValue\r\n */\r\nexport function isRangeType(dataTypeValue: number | undefined): boolean {\r\n return (\r\n dataTypeValue === AttributeDataType.Currency ||\r\n dataTypeValue === AttributeDataType.Decimal ||\r\n dataTypeValue === AttributeDataType.Integer\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n */\r\nexport function findMatchingRefinementCriterion(\r\n tableRefinerValue: ILobasTableRefinerValue,\r\n refinementCriteria: ILobasTableRefinerValue[]\r\n): ILobasTableRefinerValue | undefined {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return refinementCriteria.find((refinementCriterion: ILobasTableRefinerValue) =>\r\n isMatchingRefinementCriterion(tableRefinerValue, refinementCriterion)\r\n );\r\n}\r\n\r\n/**\r\n * Find the refinement criterion associated with this product refiner value.\r\n * @param productRefinerValue Product refiner value to match.\r\n * @param refinementCriteria Selected refinement criteria.\r\n * @param refinementCriterion\r\n */\r\nexport function isMatchingRefinementCriterion(\r\n tableRefinerValue: ILobasTableRefinerValue,\r\n refinementCriterion: ILobasTableRefinerValue\r\n): boolean {\r\n // If the value is a range, then match only on data type value; otherwise match on item string\r\n return (\r\n refinementCriterion.RefinerRecordId === tableRefinerValue.RefinerRecordId &&\r\n refinementCriterion.RefinerSourceValue === tableRefinerValue.RefinerSourceValue &&\r\n refinementCriterion.DataTypeValue === tableRefinerValue.DataTypeValue &&\r\n (isRangeType(refinementCriterion.DataTypeValue) ||\r\n refinementCriterion.LeftValueBoundString === tableRefinerValue.LeftValueBoundString)\r\n );\r\n}\r\n\r\nexport function getUpdatedRefinementCriteria(\r\n itemToggleNotification: ILobasTableRefineItemToggleNotification,\r\n currentRefinementCriteria: ILobasTableRefinerValue[]\r\n): ILobasTableRefinerValue[] {\r\n const updatedRefinementCriteria: ILobasTableRefinerValue[] = [];\r\n let toggledItemFound = false;\r\n currentRefinementCriteria.forEach((selectedCriterion: ILobasTableRefinerValue) => {\r\n if (isMatchingRefinementCriterion(itemToggleNotification.tableRefinerValue, selectedCriterion)) {\r\n toggledItemFound = true;\r\n if (itemToggleNotification.isSelecting) {\r\n const next = {\r\n ...selectedCriterion,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n selectedCriterion.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n selectedCriterion.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n } // Else the item is being de-selected, so omit it from the refinement criteria\r\n } else {\r\n // Keep existing criterion because it is not in the item toggle notification\r\n updatedRefinementCriteria.push(selectedCriterion);\r\n }\r\n });\r\n\r\n if (!toggledItemFound) {\r\n const next = {\r\n ...itemToggleNotification.tableRefinerValue,\r\n LeftValueBoundString:\r\n (itemToggleNotification.rangeStart !== undefined && `${itemToggleNotification.rangeStart}`) ||\r\n itemToggleNotification.tableRefinerValue.LeftValueBoundString,\r\n RightValueBoundString:\r\n (itemToggleNotification.rangeEnd !== undefined && `${itemToggleNotification.rangeEnd}`) ||\r\n itemToggleNotification.tableRefinerValue.RightValueBoundString\r\n };\r\n updatedRefinementCriteria.push(next);\r\n\r\n // If single select, then deselect any others in the parent refiner group\r\n if (\r\n (itemToggleNotification.tableRefinerValue.DataTypeValue === AttributeDataType.Text ||\r\n itemToggleNotification.tableRefinerValue.DataTypeValue === AttributeDataType.TrueFalse) &&\r\n itemToggleNotification.parentTableRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect\r\n ) {\r\n itemToggleNotification.parentTableRefinerHierarchy.Values.forEach((child: ILobasTableRefinerValue) => {\r\n if (child.RefinerRecordId === next.RefinerRecordId && child.LeftValueBoundString === next.LeftValueBoundString) {\r\n // Do nothing\r\n } else {\r\n const matchingIndex = updatedRefinementCriteria.findIndex((criterion: ILobasTableRefinerValue) =>\r\n isMatchingRefinementCriterion(child, criterion)\r\n );\r\n if (matchingIndex > -1) {\r\n updatedRefinementCriteria.splice(matchingIndex, 1);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n return updatedRefinementCriteria;\r\n}\r\n\r\n// export function formatPrice(\r\n// amount: string | undefined,\r\n// currency: string | undefined,\r\n// locale: string | undefined,\r\n// telemetry: ITelemetry\r\n// ): string {\r\n// if (!amount || !currency) {\r\n// telemetry.trace(`[refine-menu.utilities.formatPrice] could not format price for ${amount} ${currency}`);\r\n// return amount || '';\r\n// }\r\n// const priceAmount = (amount && Number(amount)) || 0;\r\n// let result: string;\r\n\r\n// try {\r\n// result = new Intl.NumberFormat(locale, {\r\n// style: 'currency',\r\n// currencyDisplay: 'symbol',\r\n// currency,\r\n// minimumFractionDigits: 0\r\n// }).format(priceAmount);\r\n// } catch (error) {\r\n// result = `${priceAmount} ${currency}`;\r\n// telemetry.warning(`[refine-menu.utilities.formatPrice] Failed to format price for ${result}: ${error}`);\r\n// }\r\n\r\n// return result;\r\n// }\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { ISliderLabel, ISliderThumbProps, Slider } from '@msdyn365-commerce-modules/utilities';\r\nimport debounce from 'lodash/debounce';\r\nimport { computed } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport { ILobasTableRefineItemProps, ILobasTableRefineItemState } from './lobas-refine-item';\r\n\r\ntype InputType = 'Min' | 'Max';\r\n\r\nexport type RangeRefineItemType = 'slider' | 'input';\r\n\r\n/**\r\n * Range refine item properties.\r\n */\r\nexport interface IRangeRefineItemProps extends ILobasTableRefineItemProps {\r\n rangeType: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n sliderKey?: string;\r\n}\r\n\r\n/**\r\n * Range refine item state.\r\n */\r\nexport interface IRangeRefineItemState extends ILobasTableRefineItemState {\r\n validationErrorMin: string | undefined;\r\n validationErrorMax: string | undefined;\r\n selectedMin: string | undefined;\r\n selectedMax: string | undefined;\r\n touchedMin: boolean;\r\n touchedMax: boolean;\r\n sliderId: string;\r\n minValue: string | undefined;\r\n maxValue: string | undefined;\r\n labels: ISliderLabel[];\r\n sliderThumbs: ISliderThumbProps[];\r\n}\r\n\r\n/**\r\n * RangeRefineItem component (controlled by RefineSubmenu).\r\n */\r\n@observer\r\nexport default class RangeRefineItem extends React.Component {\r\n private readonly _formattedPriceReverseLookup: Map = new Map();\r\n\r\n private readonly minInput: React.RefObject;\r\n\r\n private readonly maxInput: React.RefObject;\r\n\r\n @computed get currencyCode(): string {\r\n return this.props.tableRefinerValue.UnitText || '';\r\n }\r\n\r\n public constructor(props: IRangeRefineItemProps) {\r\n super(props);\r\n this._onRangeUpdate = this._onRangeUpdate.bind(this);\r\n this._onRangeUpdateEnd = this._onRangeUpdateEnd.bind(this);\r\n this._handleRangeTooltipText = this._handleRangeTooltipText.bind(this);\r\n this._changeMin = this._changeMin.bind(this);\r\n this._changeMax = this._changeMax.bind(this);\r\n this._finishChangeMin = this._finishChangeMin.bind(this);\r\n this._finishChangeMax = this._finishChangeMax.bind(this);\r\n\r\n this.minInput = React.createRef();\r\n this.maxInput = React.createRef();\r\n\r\n const { selectedRefinementCriterion } = this.props;\r\n const initialMin = selectedRefinementCriterion?.LeftValueBoundString ?? '0';\r\n const initialMax = selectedRefinementCriterion?.RightValueBoundString;\r\n const sliderId = `slider_${String(this.props.parentTableRefinerHierarchy.RecordId)}_${String(\r\n this.props.tableRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.tableRefinerValue.LeftValueBoundString ? this.props.tableRefinerValue.LeftValueBoundString : '0';\r\n const maxValue = this.props.tableRefinerValue.RightValueBoundString ? this.props.tableRefinerValue.RightValueBoundString : '0';\r\n //const minPrice = this._formatPrice(minValue);\r\n //const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minValue, maxValue);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.tableRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ?? this.props.tableRefinerValue.RightValueBoundString ?? maxValue;\r\n //const selectedMinPrice = this._formatPrice(selectedMin);\r\n //const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n //selectedMinPrice,\r\n selectedMax //,\r\n //selectedMaxPrice,\r\n //maxPrice\r\n );\r\n this.state = {\r\n isChecked: false,\r\n validationErrorMin: undefined,\r\n validationErrorMax: undefined,\r\n selectedMin: initialMin,\r\n selectedMax: initialMax,\r\n touchedMin: false,\r\n touchedMax: false,\r\n sliderId,\r\n minValue,\r\n maxValue,\r\n labels,\r\n sliderThumbs\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: IRangeRefineItemProps, nextState: IRangeRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public componentDidUpdate(previousProps: IRangeRefineItemProps): void {\r\n if (previousProps !== this.props) {\r\n this.updateSliderProps();\r\n }\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const { tableRefinerValue, parentTableRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!tableRefinerValue || !parentTableRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error(\r\n 'Cannot render refine value range without tableRefinerValue and parentTableRefinerHierarchy'\r\n );\r\n return undefined;\r\n }\r\n\r\n if (this.props.rangeType === 'input') {\r\n return this._renderInputFields();\r\n }\r\n\r\n return this._renderSlider();\r\n }\r\n\r\n /**\r\n * Function to update slider props.\r\n */\r\n private updateSliderProps(): void {\r\n const sliderId = `slider_${String(this.props.parentTableRefinerHierarchy.RecordId)}_${String(\r\n this.props.tableRefinerValue.RefinerRecordId\r\n )}`;\r\n const minValue = this.props.tableRefinerValue.LeftValueBoundString ? this.props.tableRefinerValue.LeftValueBoundString : '0';\r\n const maxValue = this.props.tableRefinerValue.RightValueBoundString ? this.props.tableRefinerValue.RightValueBoundString : '0';\r\n //const minPrice = this._formatPrice(minValue);\r\n //const maxPrice = this._formatPrice(maxValue);\r\n const labels: ISliderLabel[] = this.getLabels(sliderId, minValue, maxValue);\r\n const selectedMin =\r\n this.props.selectedRefinementCriterion?.LeftValueBoundString ?? this.props.tableRefinerValue.LeftValueBoundString ?? '0';\r\n const selectedMax =\r\n this.props.selectedRefinementCriterion?.RightValueBoundString ?? this.props.tableRefinerValue.RightValueBoundString ?? maxValue;\r\n //const selectedMinPrice = this._formatPrice(selectedMin);\r\n //const selectedMaxPrice = this._formatPrice(selectedMax);\r\n const sliderKeyString = this.props.sliderKey ? `_${String(this.props.sliderKey)}` : '';\r\n const sliderThumbs: ISliderThumbProps[] = this.getSliderThumbs(\r\n sliderId,\r\n sliderKeyString,\r\n selectedMin,\r\n //selectedMinPrice,\r\n selectedMax //,\r\n //selectedMaxPrice,\r\n //maxPrice\r\n );\r\n this.setState({ sliderId, minValue, maxValue, labels, sliderThumbs });\r\n }\r\n\r\n /**\r\n * Function to create the labels for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param minValue - Slider min value.\r\n * @param maxValue - Slider max value.\r\n * @returns Array labels.\r\n */\r\n private readonly getLabels = (sliderId: string, minValue: string, maxValue: string): ISliderLabel[] => {\r\n return [\r\n {\r\n labelId: `${sliderId}_start`,\r\n labelString: `${minValue}`,\r\n labelPositioning: 'start'\r\n },\r\n {\r\n labelId: `${sliderId}_end`,\r\n labelString: `${maxValue}`,\r\n labelPositioning: 'end'\r\n }\r\n ];\r\n };\r\n\r\n /**\r\n * Function to create the slider thumbs for slider.\r\n * @param sliderId - Slider element id for the DOM.\r\n * @param sliderKey - Unique key for slider.\r\n * @param selectedMin - Slider selected min value.\r\n * @param selectedMinPrice - Slider selected min price.\r\n * @param selectedMax - Slider selected max value.\r\n * @param selectedMaxPrice - Slider selected max price..\r\n * @param maxPrice - Slider max price..\r\n * @returns Slider Thumb Props.\r\n */\r\n private readonly getSliderThumbs = (\r\n sliderId: string,\r\n sliderKey: string,\r\n selectedMin: string,\r\n //selectedMinPrice: string,\r\n selectedMax: string | undefined //,\r\n //selectedMaxPrice: string,\r\n //maxPrice: string\r\n ): ISliderThumbProps[] => {\r\n const sliderThumbDefaultValue = 0;\r\n return [\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_start`,\r\n value: (selectedMin && Number(selectedMin)) || sliderThumbDefaultValue,\r\n ariaLabel: `${this.props.minValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${/*selectedMinPrice*/ selectedMin}`\r\n },\r\n {\r\n id: `${sliderId}${sliderKey}_slider_thumb_end`,\r\n value: Number(selectedMax) /*|| Number(maxPrice)*/,\r\n ariaLabel: `${this.props.maxValueSliderThumbAriaLabel ?? ''} ${this.currencyCode}`,\r\n ariaValueText: `${/*selectedMaxPrice*/ selectedMax}`\r\n }\r\n ];\r\n };\r\n\r\n private _renderInputFields(): JSX.Element | undefined {\r\n const { isDisabled, parentTableRefinerHierarchy, refineItemCommonProps } = this.props;\r\n const { selectedMin, selectedMax, touchedMin, touchedMax, validationErrorMin, validationErrorMax } = this.state;\r\n\r\n const rangeAriaLabel = (refineItemCommonProps.rangeNameFormat || '{0}').replace('{0}', parentTableRefinerHierarchy.KeyName || '');\r\n const formAttrs = {\r\n 'aria-label': rangeAriaLabel,\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n // To enable price formatting of selected fields, this is the approach:\r\n // initial value: min=0 formatted as price, max=undefined\r\n // onFocus/onChange: convert to number (unformat) and mark as touched to indicate value is being edited\r\n // onBlur: validate and format entered value as price\r\n const minInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-min ${\r\n validationErrorMin ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const maxInputClassName = `ms-refine-submenu__input-range refine-submenu__input-range-max ${\r\n validationErrorMax ? 'refine-submenu__input-range--error' : ''\r\n }`;\r\n const minLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-min';\r\n const maxLabelClassName = 'ms-refine-submenu__input-range-label refine-submenu__input-range-label-max';\r\n const formattedSelectedMin = this._getFormattedSelectedValue(selectedMin, touchedMin, validationErrorMin);\r\n const formattedSelectedMax = this._getFormattedSelectedValue(selectedMax, touchedMax, validationErrorMax);\r\n return (\r\n
\r\n \r\n \r\n {validationErrorMin && (\r\n \r\n {validationErrorMin}\r\n \r\n )}\r\n {validationErrorMax && validationErrorMin !== validationErrorMax && (\r\n \r\n {validationErrorMax}\r\n \r\n )}\r\n
\r\n );\r\n }\r\n\r\n private _renderSlider(): JSX.Element | undefined {\r\n const { isDisabled, sliderKey } = this.props;\r\n const ariaAttributes = {\r\n 'aria-disabled': isDisabled\r\n };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _changeMin(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Min');\r\n }\r\n\r\n private _changeMax(event: React.FocusEvent): void {\r\n this._changeValue(event, 'Max');\r\n }\r\n\r\n private _changeValue(event: React.FocusEvent, inputType: InputType): void {\r\n const selectedKey = `selected${inputType}`;\r\n const touchedKey = `touched${inputType}`;\r\n this.setState({\r\n [selectedKey]: this._getInputWithoutFormatting(event.currentTarget.value),\r\n [touchedKey]: true\r\n });\r\n }\r\n\r\n private _finishChangeMin(event: React.FocusEvent): boolean {\r\n const selectedMinValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMin: selectedMinValue,\r\n minTouched: false\r\n });\r\n const minInput = Number(selectedMinValue);\r\n const { onToggle, parentTableRefinerHierarchy, tableRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const max = (selectedRefinementCriterion && selectedRefinementCriterion.RightValueBoundString) || undefined;\r\n\r\n const maxNum = max ? Number(max) : undefined;\r\n\r\n if (isNaN(minInput)) {\r\n this.setState({ validationErrorMin: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Min');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minInput, maxNum)) {\r\n onToggle({\r\n parentTableRefinerHierarchy,\r\n tableRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minInput,\r\n rangeEnd: maxNum\r\n });\r\n return true;\r\n }\r\n this._focus('Min');\r\n\r\n return false;\r\n }\r\n\r\n private _finishChangeMax(event: React.FocusEvent): boolean {\r\n const selectedMaxValue = this._getInputWithoutFormatting(event.currentTarget.value);\r\n this.setState({\r\n selectedMax: selectedMaxValue,\r\n maxTouched: false\r\n });\r\n const maxInput = Number(selectedMaxValue);\r\n const { onToggle, parentTableRefinerHierarchy, tableRefinerValue, refineItemCommonProps, selectedRefinementCriterion } = this.props;\r\n const min = (selectedRefinementCriterion && selectedRefinementCriterion.LeftValueBoundString) || '0';\r\n\r\n const minNum = Number(min);\r\n\r\n if (isNaN(maxInput)) {\r\n this.setState({ validationErrorMax: refineItemCommonProps.validationErrorNaN });\r\n this._focus('Max');\r\n return false;\r\n }\r\n\r\n if (this._validateRange(minNum, maxInput)) {\r\n if (tableRefinerValue) {\r\n onToggle({\r\n parentTableRefinerHierarchy,\r\n tableRefinerValue,\r\n isSelecting: true,\r\n rangeStart: minNum,\r\n rangeEnd: maxInput\r\n });\r\n } else {\r\n this._focus('Max');\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private _focus(inputType: InputType): void {\r\n const ref = inputType === 'Max' ? this.maxInput : this.minInput;\r\n\r\n setTimeout(() => {\r\n if (ref && ref.current) {\r\n ref.current.focus();\r\n }\r\n }, 50);\r\n }\r\n\r\n private _getFormattedSelectedValue(\r\n selected: string | undefined,\r\n touched: boolean,\r\n validationError: string | undefined\r\n ): string | undefined {\r\n if (touched || validationError || selected === undefined) {\r\n return selected;\r\n }\r\n return this._formatPrice(selected);\r\n }\r\n\r\n private _validateRange(min: number, max: number | undefined): boolean {\r\n const { refineItemCommonProps } = this.props;\r\n if (max === undefined) {\r\n return true;\r\n }\r\n\r\n if (min > max) {\r\n this.setState({\r\n validationErrorMin: refineItemCommonProps.validationErrorRange,\r\n validationErrorMax: refineItemCommonProps.validationErrorRange\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _formatPrice(amount: string | undefined): string {\r\n const result = this.props.context.cultureFormatter.formatCurrency(Number(amount), this.currencyCode);\r\n return result;\r\n }\r\n\r\n private _getInputWithoutFormatting(input: string): string {\r\n // First try to cast raw input to a number\r\n const inputAsNum = Number(input);\r\n if (!isNaN(inputAsNum)) {\r\n return input;\r\n }\r\n\r\n // Otherwise try a reverse lookup and fall back to the raw input if all else fails\r\n const reverseLookupResult = this._formattedPriceReverseLookup.get(input);\r\n return reverseLookupResult || input;\r\n }\r\n\r\n // NOTE: Fix types once Shared Components build pipeline bug fixed\r\n private _onRangeUpdate(sliderChangeNotification: any): void {\r\n // Need to filter out mousemove events as these cause errors after the menu updates and slider re-renders\r\n if (sliderChangeNotification.eventType !== 'mousemove') {\r\n const { onToggle, parentTableRefinerHierarchy, tableRefinerValue } = this.props;\r\n if (tableRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentTableRefinerHierarchy,\r\n tableRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n }\r\n\r\n private _onRangeUpdateEnd(sliderChangeNotification: any): void {\r\n const { onToggle, parentTableRefinerHierarchy, tableRefinerValue } = this.props;\r\n if (tableRefinerValue && sliderChangeNotification) {\r\n onToggle({\r\n parentTableRefinerHierarchy,\r\n tableRefinerValue,\r\n isSelecting: true,\r\n rangeStart: sliderChangeNotification.firstThumbValue,\r\n rangeEnd: sliderChangeNotification.secondThumbValue\r\n });\r\n\r\n this._focusOnSliderThumb(sliderChangeNotification);\r\n }\r\n }\r\n\r\n private _focusOnSliderThumb(sliderChangeNotification: any): void {\r\n if (sliderChangeNotification.id) {\r\n const element = document.getElementById(`${sliderChangeNotification.id}range`);\r\n if (element) {\r\n setTimeout(() => {\r\n element.focus();\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private _handleRangeTooltipText(tooltip: number): string {\r\n return `${tooltip}`; //this._formatPrice(`${tooltip}`);\r\n }\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\n//import { RatingComponent, SwatchComponent } from '@msdyn365-commerce/components';\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { RefinerType } from '@msdyn365-commerce/retail-proxy';\r\n//import { checkIfShouldDisplayAsSwatch, DimensionTypes, IDimensionsApp, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { /*format,*/ getPayloadObject, getTelemetryAttributes, IPayLoad, ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport { ILobasTableRefineItemCommonProps } from './lobas-refine-item.props.common';\r\nimport { ILobasTableRefineItemToggleNotification } from './lobas-refine-item-toggle-notification';\r\nimport { ILobasTableRefinerHierarchy, ILobasTableRefinerValue } from './lobas-table';\r\n\r\n/**\r\n * RefineItem properties.\r\n */\r\nexport interface ILobasTableRefineItemProps {\r\n parentTableRefinerHierarchy: ILobasTableRefinerHierarchy;\r\n tableRefinerValue: ILobasTableRefinerValue;\r\n selectedRefinementCriterion: ILobasTableRefinerValue | undefined;\r\n selectedRefinerValues?: ILobasTableRefinerValue[];\r\n refineItemCommonProps: ILobasTableRefineItemCommonProps;\r\n isDisabled: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n index?: number;\r\n tableCountAriaLabel?: string;\r\n singleTableCountAriaLabel?: string;\r\n isMobileView?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onToggle(notfication: Readonly): void;\r\n urlBuilder(refiner: ILobasTableRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine item state.\r\n */\r\nexport interface ILobasTableRefineItemState extends React.ComponentState {\r\n isChecked: boolean;\r\n renderingError?: object;\r\n}\r\n\r\n/**\r\n * Single-select and multi-select refine item component (controlled by RefineSubmenu).\r\n */\r\nexport default class LobasTableRefineItem extends React.Component {\r\n private readonly anchorType: React.RefObject;\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n public constructor(props: ILobasTableRefineItemProps) {\r\n super(props);\r\n this._onClick = this._onClick.bind(this);\r\n this.state = {\r\n isChecked: !!this.props.selectedRefinementCriterion\r\n };\r\n this.anchorType = React.createRef();\r\n this.payLoad = getPayloadObject('click', this.props.telemetryContent!, '');\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ILobasTableRefineItemProps, nextState: ILobasTableRefineItemState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | undefined {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n parentTableRefinerHierarchy,\r\n tableRefinerValue,\r\n selectedRefinementCriterion,\r\n tableCountAriaLabel,\r\n singleTableCountAriaLabel,\r\n index,\r\n children,\r\n onToggle,\r\n context,\r\n telemetryContent,\r\n ...attrs\r\n } = this.props;\r\n if (!tableRefinerValue) {\r\n refineItemCommonProps.telemetry.error('[refine-item] Cannot render refineItem without refinerValue');\r\n return undefined;\r\n }\r\n if (!tableRefinerValue.LeftValueBoundString) {\r\n refineItemCommonProps.telemetry.warning(\r\n `[refine-item] RefineItem without LeftValueBoundString: ${JSON.stringify(tableRefinerValue)}`\r\n );\r\n }\r\n const isSingleSelect = parentTableRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n let itemTypeClassName = isSingleSelect ? 'single-select' : 'multi-select';\r\n itemTypeClassName = `ms-refine-submenu-item ${itemTypeClassName}`;\r\n const inputType = isSingleSelect ? 'radio' : 'checkbox';\r\n const isChecked = !!selectedRefinementCriterion;\r\n itemTypeClassName = isChecked ? `${itemTypeClassName}-checked` : itemTypeClassName;\r\n // if (parentProductRefinerHierarchy.SourceValue === ProductRefinerSource.Rating) {\r\n // return this._renderRating(\r\n // productRefinerValue,\r\n // parentProductRefinerHierarchy,\r\n // isChecked,\r\n // context,\r\n // index,\r\n // telemetryContent,\r\n // productCountAriaLabel,\r\n // singleProductCountAriaLabel\r\n // );\r\n // }\r\n this.payLoad.contentAction.etext = tableRefinerValue.LeftValueBoundLocalizedString || tableRefinerValue.LeftValueBoundString;\r\n const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n\r\n return (\r\n /*
  • \r\n \r\n {/*this._renderSwatch()}\r\n \r\n {tableRefinerValue.LeftValueBoundLocalizedString || tableRefinerValue.LeftValueBoundString}\r\n {tableRefinerValue.Count !== undefined && ` (${tableRefinerValue.Count})`}\r\n \r\n \r\n
  • */\r\n \r\n {tableRefinerValue.LeftValueBoundLocalizedString || tableRefinerValue.LeftValueBoundString}\r\n \r\n );\r\n }\r\n\r\n // private _renderSwatch(): JSX.Element | null {\r\n // const productRefinerValue = this.props.productRefinerValue;\r\n // // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- Replace with actual value for empty string.\r\n // const text = productRefinerValue.LeftValueBoundLocalizedString || productRefinerValue.LeftValueBoundString || '';\r\n\r\n // const dimensionType = (this.props.parentProductRefinerHierarchy.KeyName?.toLocaleLowerCase() ?? '') as DimensionTypes;\r\n // const hasColor = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchColorHexCode);\r\n // const hasImage = !StringExtensions.isNullOrWhitespace(productRefinerValue.SwatchImageUrl);\r\n // const hasValidSwatch = hasColor || hasImage;\r\n // const shouldDisplayAsSwatch =\r\n // hasValidSwatch && checkIfShouldDisplayAsSwatch(dimensionType, this.props.context as ICoreContext);\r\n // const swatchItems = shouldDisplayAsSwatch\r\n // ? [\r\n // {\r\n // itemId: `${productRefinerValue.RefinerRecordId ?? ''}-${dimensionType}-${text}`,\r\n // value: text,\r\n // dimensionType,\r\n // colorHexCode: productRefinerValue.SwatchColorHexCode,\r\n // imageUrl: productRefinerValue.SwatchImageUrl\r\n // }\r\n // ]\r\n // : undefined;\r\n\r\n // if (!swatchItems) {\r\n // return null;\r\n // }\r\n\r\n // return (\r\n // \r\n // );\r\n // }\r\n\r\n // private _getRefinerUrl(): string {\r\n // const { urlBuilder, parentTableRefinerHierarchy, tableRefinerValue, selectedRefinementCriterion } = this.props;\r\n\r\n // if (tableRefinerValue) {\r\n // return urlBuilder({\r\n // parentTableRefinerHierarchy,\r\n // tableRefinerValue,\r\n // isSelecting: !selectedRefinementCriterion\r\n // });\r\n // }\r\n\r\n // return '';\r\n // }\r\n\r\n private readonly _onClick = (e: React.MouseEvent): void => {\r\n e.preventDefault();\r\n // eslint-disable-next-line no-debugger\r\n const { parentTableRefinerHierarchy, tableRefinerValue, selectedRefinementCriterion } = this.props;\r\n if (tableRefinerValue) {\r\n this.props.onToggle({\r\n parentTableRefinerHierarchy,\r\n tableRefinerValue,\r\n isSelecting: !selectedRefinementCriterion\r\n });\r\n\r\n setTimeout(() => {\r\n this.anchorType.current && this.anchorType.current.focus();\r\n }, 0);\r\n }\r\n };\r\n\r\n // private _renderRating(\r\n // productRefinerValue: ProductRefinerValue,\r\n // parentProductRefinerHierarchy: IProductRefinerHierarchy,\r\n // isChecked: boolean,\r\n // context: ICoreContext,\r\n // index?: number,\r\n // telemetryContent?: ITelemetryContent,\r\n // ratingUserCountAriaLabel?: string,\r\n // ratingSingleUserCountAriaLabel?: string\r\n // ): JSX.Element | undefined {\r\n // if (productRefinerValue.LeftValueBoundString) {\r\n // this.payLoad.contentAction.etext = productRefinerValue.LeftValueBoundLocalizedString;\r\n // const attribute = getTelemetryAttributes(telemetryContent!, this.payLoad);\r\n // const refinerRating = Number.parseInt(productRefinerValue.LeftValueBoundString, 10);\r\n // const ratingRefiner = this.props.selectedRefinerValues?.find(\r\n // value => value.DataTypeValue === productRefinerValue.DataTypeValue\r\n // );\r\n // const selectedRating = Number.parseInt(ratingRefiner?.LeftValueBoundString || '0', 10);\r\n // const defaultChkProductCount = 1;\r\n // let ratingComponentClass: string = 'ms-rating-component';\r\n // if (refinerRating > selectedRating) {\r\n // ratingComponentClass = `${ratingComponentClass}__up`;\r\n // } else if (refinerRating < selectedRating) {\r\n // ratingComponentClass = `${ratingComponentClass}__down`;\r\n // } else {\r\n // ratingComponentClass = `${ratingComponentClass}__current`;\r\n // }\r\n // const productCountAriaLabelValue =\r\n // productRefinerValue.Count !== undefined && productRefinerValue.Count === defaultChkProductCount\r\n // ? ratingSingleUserCountAriaLabel && format(ratingSingleUserCountAriaLabel, productRefinerValue.Count)\r\n // : ratingUserCountAriaLabel && format(ratingUserCountAriaLabel, productRefinerValue.Count);\r\n // return (\r\n // \r\n // \r\n // \r\n // \r\n // {productRefinerValue.Count !== undefined && `(${productRefinerValue.Count})`}\r\n // \r\n // \r\n // \r\n // );\r\n // }\r\n // return undefined;\r\n // }\r\n}\r\n","import { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { DisplayTemplate, ProductRefinerSource /*, RefinerType*/ } from '@msdyn365-commerce/retail-proxy';\r\nimport { /*Button, Collapse,*/ ITelemetryContent } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nimport RangeRefineItem, { RangeRefineItemType } from './lobas-range-refine-item';\r\nimport RefineItem from './lobas-refine-item';\r\nimport { ILobasTableRefineItemCommonProps } from './lobas-refine-item.props.common';\r\nimport { ILobasTableRefineItemToggleNotification } from './lobas-refine-item-toggle-notification';\r\nimport { findMatchingRefinementCriterion, isRangeType } from './lobas-utilities';\r\nimport { ILobasTableRefinerHierarchy, ILobasTableRefinerValue } from './lobas-table';\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\n/**\r\n * Properties associated with the RefineSubmenu component.\r\n */\r\nexport interface ILobasRefineSubmenuProps {\r\n tempRangeTypeTODO: RangeRefineItemType;\r\n minValueSliderThumbAriaLabel?: string;\r\n maxValueSliderThumbAriaLabel?: string;\r\n tableRefinerHierarchy: IProductRefinerHierarchy;\r\n selectedRefinerValues: ILobasTableRefinerValue[];\r\n refineItemCommonProps: ILobasTableRefineItemCommonProps;\r\n isDisabled: boolean;\r\n isExpandedOnInitialLoad: boolean;\r\n context: ICoreContext>;\r\n moduleId: string;\r\n moduleTypeName: string;\r\n productCountAriaLabel?: string;\r\n singleProductCountAriaLabel?: string;\r\n isMobile?: boolean;\r\n\r\n /**\r\n * The telemetry content\r\n */\r\n telemetryContent?: ITelemetryContent;\r\n onUpdateRefiners(notfication: Readonly): void;\r\n urlBuilder(refiner: ILobasTableRefineItemToggleNotification): string;\r\n}\r\n\r\n/**\r\n * Refine submenu state.\r\n */\r\nexport interface ILobasRefineSubmenuState extends React.ComponentState {\r\n expanded: boolean;\r\n}\r\n\r\n/**\r\n *\r\n * The RefineSubmenu component renders the submenu category and child items.\r\n * This computed observes the stateful category hierarchy object.\r\n * @extends {React.PureComponent}\r\n */\r\nclass LobasRefineSubmenu extends React.Component {\r\n constructor(props: ILobasRefineSubmenuProps) {\r\n super(props);\r\n\r\n this._onToggleItem = this._onToggleItem.bind(this);\r\n this._onToggleSubmenu = this._onToggleSubmenu.bind(this);\r\n\r\n const isExpanded = this.props.isExpandedOnInitialLoad;\r\n\r\n // If (this.props.productRefinerHierarchy.DataTypeValue === ProductRefinerValueDataTypeValue.Range) {\r\n // isExpanded = true;\r\n // }\r\n\r\n this.state = {\r\n expanded: isExpanded\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ILobasRefineSubmenuProps, nextState: ILobasRefineSubmenuState): boolean {\r\n if (this.state === nextState && this.props === nextProps) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const { tableRefinerHierarchy, refineItemCommonProps } = this.props;\r\n\r\n if (!tableRefinerHierarchy) {\r\n refineItemCommonProps.telemetry.error('Cannot render submenu without refiner hierarchy data');\r\n }\r\n\r\n if (tableRefinerHierarchy.SourceValue === ProductRefinerSource.Rating && this.props.context.app.config.hideRating) {\r\n return null;\r\n }\r\n return (\r\n /*
    \r\n \r\n {tableRefinerHierarchy.KeyName}\r\n \r\n \r\n {this._renderChildItems(tableRefinerHierarchy)}\r\n \r\n
    */\r\n\r\n
    \r\n \r\n {this._renderChildItems(tableRefinerHierarchy)}\r\n
    \r\n );\r\n }\r\n\r\n private _renderChildItems(tableRefinerHierarchy: ILobasTableRefinerHierarchy): JSX.Element | null {\r\n if (isRangeType(tableRefinerHierarchy.DataTypeValue)) {\r\n return this._renderRange(tableRefinerHierarchy);\r\n }\r\n return this._renderSingleMultiSelect(tableRefinerHierarchy);\r\n }\r\n\r\n private _renderSingleMultiSelect(tableRefinerHierarchy: ILobasTableRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n productCountAriaLabel,\r\n singleProductCountAriaLabel,\r\n isMobile\r\n } = this.props;\r\n //const isSingleSelect = tableRefinerHierarchy.RefinerTypeValue === RefinerType.SingleSelect;\r\n //const role = isSingleSelect ? { role: 'radiogroup' } : undefined;\r\n const refinerValuesList = tableRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ILobasTableRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `[refine-submenu] Could not render refine item for refiner ${tableRefinerHierarchy.RecordId} (${tableRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n // eslint-disable-next-line no-debugger\r\n\r\n return (\r\n \r\n refinerValuesList.find(value => value.RefinerRecordId === selectedValue.RefinerRecordId)\r\n )}\r\n refineItemCommonProps={refineItemCommonProps}\r\n onToggle={this._onToggleItem}\r\n urlBuilder={this.props.urlBuilder}\r\n isDisabled={isDisabled}\r\n key={index}\r\n index={index}\r\n context={context}\r\n moduleId={this.props.moduleId}\r\n moduleTypeName={this.props.moduleTypeName}\r\n telemetryContent={this.props.telemetryContent}\r\n tableCountAriaLabel={productCountAriaLabel}\r\n singleTableCountAriaLabel={singleProductCountAriaLabel}\r\n isMobileView={isMobile}\r\n />\r\n );\r\n });\r\n return (\r\n \r\n {listItems}\r\n \r\n );\r\n }\r\n\r\n private _getRangeType(tableRefinerHierarchy: ILobasTableRefinerHierarchy): 'input' | 'slider' {\r\n if (\r\n tableRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Range ||\r\n tableRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.Slider ||\r\n tableRefinerHierarchy.DisplayTemplateValue === DisplayTemplate.SliderWithBars\r\n ) {\r\n return 'slider';\r\n }\r\n return 'input';\r\n }\r\n\r\n private _renderRange(tableRefinerHierarchy: ILobasTableRefinerHierarchy): JSX.Element | null {\r\n const {\r\n isDisabled,\r\n refineItemCommonProps,\r\n selectedRefinerValues,\r\n context,\r\n minValueSliderThumbAriaLabel,\r\n maxValueSliderThumbAriaLabel\r\n } = this.props;\r\n const submenuClassNamePrefix = 'ms-refine-submenu__item list-group-item refine-submenu__item';\r\n const refinerValuesList = tableRefinerHierarchy.Values || [];\r\n const listItems = refinerValuesList.map((child: ILobasTableRefinerValue, index: number) => {\r\n if (!child) {\r\n refineItemCommonProps.telemetry.error(\r\n `Could not render refine item for refiner ${tableRefinerHierarchy.RecordId} (${tableRefinerHierarchy.KeyName})`\r\n );\r\n return null;\r\n }\r\n\r\n const selectedRefinementCriterion = findMatchingRefinementCriterion(child, selectedRefinerValues);\r\n\r\n const rangeType = this._getRangeType(tableRefinerHierarchy);\r\n const key = selectedRefinementCriterion\r\n ? `${selectedRefinementCriterion.LeftValueBoundString}-${selectedRefinementCriterion.RightValueBoundString}`\r\n : `not-selected-${index}`;\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n });\r\n return
      {listItems}
    ;\r\n }\r\n\r\n private _onToggleItem(itemToggleNotification: ILobasTableRefineItemToggleNotification): void {\r\n this.props.onUpdateRefiners(itemToggleNotification);\r\n }\r\n\r\n private _onToggleSubmenu(): void {\r\n this.setState(prevState => ({\r\n expanded: !prevState.expanded\r\n }));\r\n }\r\n}\r\n\r\nexport default LobasRefineSubmenu;\r\n","/* eslint-disable security/detect-object-injection */\r\n/* eslint-disable @typescript-eslint/no-floating-promises */\r\n/* eslint-disable no-debugger */\r\n/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport * as React from 'react';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { ILobasRoofTableData } from './lobas-roof-table.data';\r\nimport {\r\n /*expandRefinersCount,*/\r\n ILobasRoofTableConfig,\r\n ILobasRoofTableProps,\r\n ISubHeaderElementData\r\n} from './lobas-roof-table.props.autogenerated';\r\nimport {\r\n IModuleProps,\r\n INodeProps,\r\n getTelemetryObject,\r\n //ILabeledDropdownOption,\r\n ITelemetryContent,\r\n //IPayLoad,\r\n //getPayloadObject,\r\n Heading //,\r\n /*LabeledDropdown,*/\r\n //UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { /*IItemReference,*/ IRoof } from '../../actions/DataServiceEntities.g';\r\nimport { computed, observable, transaction, reaction } from 'mobx';\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { observer } from 'mobx-react';\r\nimport LobasTable, {\r\n ILobasDataTableProps,\r\n ILobasHeadingsProperty,\r\n ILobasLinkProps,\r\n ILobasTableItemProps,\r\n ILobasTableRefinerHierarchy,\r\n ILobasTableRefinerValue,\r\n /*ILobasTableRefinerValue,*/\r\n ILobasTableRowProps,\r\n LobasTableDataType\r\n} from '../components/lobas-table';\r\nimport { buildListPageUrl, getCurrentUrl, hydrateRefinersFromUrl } from '../../actions/lobas-url-utils';\r\n//import LobasRefineSubmenu from '../components/lobas-refine-submenu';\r\n//import { ILobasTableRefineItemToggleNotification } from '../components/lobas-refine-item-toggle-notification';\r\nimport { getUpdatedRefinementCriteria /*, isMatchingRefinementCriterion*/ } from '../components/lobas-utilities';\r\nimport { ILobasTableRefineItemCommonProps } from '../components/lobas-refine-item.props.common';\r\n//import ChoiceSummary from '../components/lobas-choice-summary';\r\n//import { IChoiceSummaryClickNotification } from '../components/lobas-choice-summary.props';\r\n//import { AttributeDataType } from '@msdyn365-commerce/retail-proxy';\r\n//import getRoofTableAction from '../../actions/get-roof-table.action';\r\n//import { getRoofTableAsync } from '../../actions/DataActionExtension.g';\r\nimport { ListPageState } from '../../actions/lobas-list-page-state';\r\nimport { IRefineMenuViewProps } from '../lobas-search-result-container/lobas-search-result-container';\r\n//import RefineSubmenu from '../lobas-search-result-container/components/refine-submenu';\r\n//import { IRefineItemToggleNotification, getUpdatedRefinementCriteria } from '../lobas-search-result-container/components';\r\nimport LobasRefineSubmenu from '../components/lobas-refine-submenu';\r\nimport { ILobasTableRefineItemToggleNotification } from '../components/lobas-refine-item-toggle-notification';\r\nimport { getRelatedProductsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n//import { ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\n\r\nexport interface ILobasRoofTableViewProps extends ILobasRoofTableProps<{}> {\r\n RoofList: IModuleProps;\r\n moduleContainer: INodeProps;\r\n heading: React.ReactNode;\r\n roofListTable: React.ReactNode;\r\n refineMenu: ILobasRoofTableRefineMenuViewProps;\r\n RefineAndModuleSectionContainer: INodeProps;\r\n //choiceSummary: React.ReactNode;\r\n pagination?: React.ReactNode;\r\n productSegmentRefiners: React.ReactNode;\r\n productCategoryRefiners: React.ReactNode;\r\n}\r\n\r\nexport interface ILobasProductSegmentProps {\r\n ProductSegmentName: string;\r\n IsActive: boolean;\r\n}\r\n\r\nexport interface ILobasProductCategoryProps {\r\n ProductCategoryName: string;\r\n IsActive: boolean;\r\n}\r\n\r\nexport interface ILobasRoofTableState {\r\n //sortingState: ISortByCollectionState;\r\n refiners: ILobasTableRefinerHierarchy[];\r\n isReady: boolean;\r\n refresh: boolean;\r\n productSegments: ILobasProductSegmentProps[];\r\n productCategories: ILobasProductCategoryProps[];\r\n tableProps: ILobasDataTableProps | undefined;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\nexport interface ILobasRoofTableRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n}\r\n\r\nexport const sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc',\r\n sortByOptionBestSelling: 'BestSelling',\r\n sortByOptionNewScore: 'NewScore',\r\n sortByOptionTrendingScore: 'TrendingScore'\r\n};\r\n\r\n/*interface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}*/\r\n/**\r\n *\r\n * Lobas roof table component\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nclass LobasRoofTable extends React.PureComponent, ILobasRoofTableState> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm';\r\n }\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n //private readonly defaultPageNumber = 0;\r\n\r\n private readonly mobileExcludedColumns: string[];\r\n\r\n private readonly moduleClassName: string = 'ms-business-organization-list';\r\n\r\n //private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly _refineItemCommonProps: ILobasTableRefineItemCommonProps;\r\n\r\n //private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n private isListPageStateUpdated: boolean = false;\r\n\r\n private refiners: IProductRefinerHierarchy[] | [];\r\n\r\n public constructor(props: ILobasRoofTableProps, state: ILobasRoofTableState) {\r\n super(props);\r\n this.mobileExcludedColumns = [];\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._updateViewport = this._updateViewport.bind(this);\r\n\r\n this.state = {\r\n isReady: false,\r\n refresh: true,\r\n refiners: [],\r\n productSegments: [\r\n { ProductSegmentName: 'Taksikkerhet', IsActive: false },\r\n { ProductSegmentName: 'Fallsikring', IsActive: false },\r\n { ProductSegmentName: 'Solar', IsActive: false }\r\n ],\r\n productCategories: this.props.config.headers\r\n ? this.props.config.headers?.map(data => ({ ProductCategoryName: data.name, IsActive: false }))\r\n : [],\r\n tableProps: undefined\r\n };\r\n\r\n //this._sortAndFilterContainerRef = React.createRef();\r\n\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n this._updateViewport();\r\n\r\n this.refiners = [];\r\n }\r\n\r\n public async componentDidMount(): Promise {\r\n if (MsDyn365.isBrowser && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n }\r\n\r\n const [listPageState, roofTable] = await Promise.all([this.props.data.listPageState, this.props.data.roofTable]);\r\n\r\n this._updateListPageState(listPageState, roofTable);\r\n\r\n const tableProps = await this._createTableProps(roofTable); // This method now contains the async logic\r\n this.setState({ tableProps: tableProps });\r\n\r\n for (const segment of this.state.productSegments) {\r\n const categories =\r\n this.props.config.headers &&\r\n this.props.config.headers.filter(header => header.productSegment === segment.ProductSegmentName);\r\n\r\n if (categories && categories.length === 1) {\r\n this.setState((prevState: ILobasRoofTableState) => {\r\n const updatedItems = prevState.productCategories.map(category => {\r\n if (category.ProductCategoryName === categories[0].name) {\r\n return { ...category, IsActive: true };\r\n }\r\n return category;\r\n });\r\n\r\n return { productCategories: updatedItems, refresh: true };\r\n });\r\n }\r\n }\r\n\r\n /*reaction(\r\n () => {\r\n return [listPageState.currentPageNumber];\r\n },\r\n async () => {\r\n const newListPageState = await this.props.data.listPageState;\r\n const newRoofTable = await getRoofTableAsync({\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n }\r\n }\r\n });\r\n\r\n /*this.refiners = await getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: this.props.app.apiSettings.channelId,\r\n CatalogId: this.props.app.catalogId\r\n }\r\n },\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(newListPageState.pageSize * (newListPageState.currentPageNumber ?? 0), 0)\r\n }\r\n },\r\n this.props.context.actionContext\r\n );\r\n\r\n newListPageState.totalTableCount = newRoofTable.length;\r\n newListPageState.activeRoofs = newRoofTable;\r\n }\r\n );*/\r\n this.props.data.roofTable.then(roofTable => {\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n //let querySorting: SortColumn[] = [];\r\n\r\n /*if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query &&\r\n +this.props.context.request.query.skip / this.props.config.itemsPerPage(1000 || 10)) ||\r\n 0;\r\n //listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = /*this.props.config.itemsPerPage 1000 || 10;*/\r\n listPageState.activeRoofs = roofTable;\r\n listPageState.totalTableCount = roofTable.length;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber //,\r\n /*listPageState.sortingCritera &&\r\n listPageState.sortingCritera.Columns &&\r\n listPageState.sortingCritera.Columns.length*/\r\n ];\r\n },\r\n async () => {\r\n const roofTable = this._getActiveRoofs(listPageState.activeFilters);\r\n listPageState.activeRoofs = roofTable;\r\n listPageState.totalTableCount = roofTable.length;\r\n this.setState({ tableProps: await this._createTableProps(roofTable) });\r\n /*if (this.props.config.updateRefinerPanel) {\r\n const refiners = this._getRefiners(listPageState.activeRoofs);s\r\n this.setState({ refiners });\r\n }*/\r\n }\r\n );\r\n });\r\n });\r\n //this.payLoad = getPayloadObject('click', this.telemetryContent, '');\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n const {\r\n data: { listPageState, roofTable }\r\n } = this.props;\r\n\r\n if (!this.isListPageStateUpdated && listPageState.result && roofTable.result) {\r\n //this._updateListPageState(listPageState.result, roofTable.result);\r\n this.isListPageStateUpdated = true;\r\n }\r\n\r\n const { heading, className } = this.props.config;\r\n /*const {\r\n formItems,\r\n isFormActive,\r\n formType,\r\n isModalOpen,\r\n statementRequestFromDateString,\r\n statementRequestToDateString,\r\n isStatementRequestModalOpen\r\n } = this.state;*/\r\n\r\n const viewProps = {\r\n ...this.props,\r\n className: classnames('ms-search-result-container', className),\r\n RoofList: {\r\n moduleProps: this.props,\r\n className: classnames(this.moduleClassName, className)\r\n },\r\n moduleContainer: {\r\n className: `${this.moduleClassName}__container`\r\n },\r\n heading: heading && ,\r\n roofListTable: this.state.tableProps ? : <>,\r\n refineMenu: this._getRefineMenu(),\r\n RefineAndModuleSectionContainer: { className: 'ms-search-result-container__refine-product-section' },\r\n productSegmentRefiners: this._getProductSegmentRefiners(),\r\n productCategoryRefiners: this._getProductCategoryRefiners()\r\n //choiceSummary: this._getChoiceSummary()\r\n //pagination: this._getPagination()\r\n } as ILobasRoofTableViewProps;\r\n\r\n return this.props.renderView(viewProps) as React.ReactElement;\r\n }\r\n\r\n private async _createTableProps(content: IRoof[] | []): Promise {\r\n const { config, resources, context } = this.props;\r\n //const { tableSort, showPagination, paginationItemPerPage } = config;\r\n //const { businessUserPaginationNextButtonText, businessUserPaginationPreviousButtonText, businessUserEditButtonText, businessUserViewUserButtonText,\r\n //businessUserDeleteButtonText, businessUserActionButtonText, businessUserPaginationAriaLabel, columnSortAriaLabel } = resources;\r\n\r\n const tableData = await this._createTableItems(content);\r\n const tableHeading = this._createTableHeaders(config);\r\n const tableSubHeading = this._createTableSubHeaders(config);\r\n\r\n return {\r\n resources,\r\n headings: tableHeading,\r\n subheadings: tableSubHeading,\r\n rows: tableData,\r\n className: `${this.moduleClassName}__table`,\r\n enableToModify: false,\r\n showCheckBoxes: false,\r\n isSortable: true,\r\n resourcePrefix: 'businessUser',\r\n minifyActions: this.isMobile,\r\n excludedColumns: this.isMobile ? this.mobileExcludedColumns : [],\r\n paginationProperty: {\r\n skipCount:\r\n context &&\r\n context.request &&\r\n context.request.query &&\r\n context.request.query.skip &&\r\n !isNaN(Number.parseInt(context.request.query.skip, 10))\r\n ? Number.parseInt(context.request.query.skip, 10)\r\n : 0,\r\n itemPerPage: 1000,\r\n prevText: resources.businessUserPaginationPreviousButtonText,\r\n nextText: resources.businessUserPaginationNextButtonText,\r\n paginationText: resources.businessUserPaginationAriaLabel,\r\n url: (context && this._getCurrentUrl(context.request).href) || ''\r\n },\r\n isSingleSelectOnly: true,\r\n sortByAscending: resources.sortByAscending,\r\n sortByDescending: resources.sortByDescending,\r\n actions: {},\r\n sourceProps: this.props,\r\n isRefinerMenuExpandedOnInitialLoad: false\r\n };\r\n }\r\n\r\n private _createTableHeaders(content: ILobasRoofTableConfig): (ILobasHeadingsProperty | undefined)[] {\r\n const tableHeading =\r\n (ArrayExtensions.hasElements(content.headers) &&\r\n content.headers.map(item => {\r\n if (\r\n (!item.itemCategory && !item.subHeaderElements) ||\r\n (this.state.productSegments.some(\r\n segment => segment.ProductSegmentName === item.productSegment && segment.IsActive\r\n ) &&\r\n this.state.productCategories.some(category => category.ProductCategoryName === item.name && category.IsActive))\r\n ) {\r\n if (this.isMobile && this.mobileExcludedColumns.includes(item.name)) {\r\n return undefined;\r\n }\r\n return {\r\n name: item.name,\r\n sortable: item.roofDataReference ? true : false,\r\n ariaLabel: this.props.resources.columnSortAriaLabel,\r\n colspan: item.subHeaderElements ? item.subHeaderElements.length : 1\r\n } as ILobasHeadingsProperty;\r\n }\r\n return undefined;\r\n })) ||\r\n [];\r\n\r\n return tableHeading;\r\n }\r\n\r\n private _createTableSubHeaders(content: ILobasRoofTableConfig): (ILobasHeadingsProperty | undefined)[] {\r\n const tableSubHeading: (ILobasHeadingsProperty | undefined)[] = [];\r\n\r\n ArrayExtensions.hasElements(content.headers) &&\r\n content.headers.map(header => {\r\n if (\r\n (!header.itemCategory && !header.subHeaderElements) ||\r\n (this.state.productSegments.some(segment => segment.ProductSegmentName === header.productSegment && segment.IsActive) &&\r\n this.state.productCategories.some(category => category.ProductCategoryName === header.name && category.IsActive))\r\n ) {\r\n const subHeaders = (header.subHeaderElements as unknown) as ISubHeaderElementData[];\r\n if (subHeaders && subHeaders.length > 0) {\r\n subHeaders.map(subHeader => {\r\n if (this.isMobile && this.mobileExcludedColumns.includes(subHeader.name)) {\r\n tableSubHeading.push(undefined);\r\n }\r\n tableSubHeading.push({\r\n name: subHeader.name,\r\n sortable: false,\r\n ariaLabel: '',\r\n colspan: 1\r\n });\r\n });\r\n } else {\r\n tableSubHeading.push({\r\n name: '',\r\n sortable: false,\r\n ariaLabel: '',\r\n colspan: 1\r\n });\r\n }\r\n }\r\n });\r\n\r\n return tableSubHeading;\r\n }\r\n\r\n private async _createTableItems(content: IRoof[] | undefined): Promise {\r\n const roofTable = content;\r\n\r\n if (!ArrayExtensions.hasElements(roofTable)) {\r\n return [];\r\n }\r\n\r\n const tableRows: ILobasTableRowProps[] = [];\r\n\r\n for (const roof of roofTable) {\r\n const row = await this._createTableDataRow(roof);\r\n tableRows.push({\r\n row: row,\r\n isSelected: false\r\n });\r\n }\r\n\r\n return tableRows;\r\n }\r\n\r\n private async _createTableDataRow(roof: IRoof): Promise {\r\n const config = this.props.config;\r\n const categories = config.headers;\r\n const dataRow: ILobasTableItemProps[] = [];\r\n\r\n const distinctItems = [...new Map(roof.ItemReferences?.map(item => [item['Id'], item])).values()];\r\n\r\n if (!ArrayExtensions.hasElements(categories)) {\r\n return [];\r\n }\r\n\r\n for (const category of categories) {\r\n if (\r\n (!category.itemCategory && !category.subHeaderElements) ||\r\n (this.state.productSegments.some(segment => segment.ProductSegmentName === category.productSegment && segment.IsActive) &&\r\n this.state.productCategories.some(\r\n productCategory => productCategory.ProductCategoryName === category.name && productCategory.IsActive\r\n ))\r\n ) {\r\n if (category.roofDataReference && !ArrayExtensions.hasElements(category.subHeaderElements)) {\r\n const values = Object.values(roof);\r\n const propertyIndex = Object.keys(roof).findIndex(x => x === category.roofDataReference);\r\n let valueType = null;\r\n\r\n // eslint-disable-next-line security/detect-object-injection\r\n switch (typeof values[propertyIndex]) {\r\n case 'number':\r\n valueType = LobasTableDataType.Number;\r\n break;\r\n case 'string':\r\n valueType = LobasTableDataType.Text;\r\n break;\r\n default:\r\n valueType = LobasTableDataType.Text;\r\n }\r\n\r\n dataRow.push({\r\n id: `${category.name}`,\r\n // eslint-disable-next-line security/detect-object-injection\r\n type: valueType === LobasTableDataType.Number && values[propertyIndex] === 0 ? LobasTableDataType.Text : valueType,\r\n // eslint-disable-next-line security/detect-object-injection\r\n value: valueType === LobasTableDataType.Number && values[propertyIndex] === 0 ? '' : values[propertyIndex],\r\n isLinkItem: false\r\n });\r\n } else if ((category.itemCategory && category.itemReference) || ArrayExtensions.hasElements(category.subHeaderElements)) {\r\n if (ArrayExtensions.hasElements(category.subHeaderElements)) {\r\n const subHeaderElements = (category.subHeaderElements as unknown) as ISubHeaderElementData[];\r\n\r\n for (const subHeaderElement of subHeaderElements) {\r\n if (\r\n !(category.productSegment === 'Solar' && subHeaderElement.itemCategory.toLowerCase().includes('innfeste'))\r\n ) {\r\n const fitleredItems =\r\n distinctItems &&\r\n distinctItems.filter(\r\n x =>\r\n x.Model === roof?.Id &&\r\n x.Category === subHeaderElement.itemCategory &&\r\n x.Name?.includes(subHeaderElement.itemReference) &&\r\n this._checkAdditionalItemReferences(x.Name, subHeaderElement.additionalItemReferences)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(fitleredItems)) {\r\n dataRow.push({\r\n id: `${subHeaderElement.name}`,\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: true,\r\n links: fitleredItems.map(item => {\r\n let newName = item.Name;\r\n this.props.config.hiddenTexts &&\r\n this.props.config.hiddenTexts.forEach(text => {\r\n newName = newName ? newName.replace(text, '') : '';\r\n });\r\n return {\r\n linkUrl: `${this.props.context.request.url.requestUrl.origin}/${item.Product}.p`,\r\n linkText: newName,\r\n linkType: '',\r\n disabled: item.ProductReference === 0 ? true : false\r\n } as ILobasLinkProps;\r\n })\r\n });\r\n } else {\r\n dataRow.push({\r\n id: `${subHeaderElement.name}`,\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: false\r\n });\r\n }\r\n\r\n if (subHeaderElement.itemCategory === 'Solarkonsoller') {\r\n //const relatedProducts: ProductSearchResult[] | null | undefined = [];\r\n\r\n const promises = fitleredItems.map(item =>\r\n getRelatedProductsAsync(\r\n { callerContext: this.props.context.actionContext },\r\n item.Product!,\r\n this.props.context.request.apiSettings.channelId,\r\n this.props.context.request.apiSettings.catalogId,\r\n 5637144576\r\n )\r\n );\r\n\r\n const allRelatedProductsResult = await Promise.all(promises);\r\n\r\n if (ArrayExtensions.hasElements(allRelatedProductsResult)) {\r\n dataRow.push({\r\n id: 'Innf.sk',\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: true,\r\n links: allRelatedProductsResult.flatMap(relatedProducts => {\r\n return relatedProducts\r\n .filter(relatedProduct => relatedProduct.Name?.toLowerCase().includes('innfeste'))\r\n .map(item => {\r\n let newName = item.Name;\r\n this.props.config.hiddenTexts &&\r\n this.props.config.hiddenTexts.forEach(text => {\r\n newName = newName ? newName.replace(text, '') : '';\r\n });\r\n return {\r\n linkUrl: `${this.props.context.request.url.requestUrl.origin}/${item.RecordId}.p`,\r\n linkText: newName,\r\n linkType: '',\r\n disabled: false\r\n } as ILobasLinkProps;\r\n });\r\n })\r\n });\r\n } else {\r\n dataRow.push({\r\n id: `${category.name}`,\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: false\r\n });\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n const fitleredItems =\r\n distinctItems &&\r\n distinctItems.filter(\r\n x =>\r\n x.Model === roof?.Id &&\r\n x.Category === category.itemCategory &&\r\n x.Name?.includes(category.itemReference !== undefined ? category.itemReference : '') &&\r\n this._checkAdditionalItemReferences(x.Name, category.additionalItemReference)\r\n );\r\n if (ArrayExtensions.hasElements(fitleredItems)) {\r\n dataRow.push({\r\n id: `${category.name}`,\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: true,\r\n links: fitleredItems.map(item => {\r\n let newName = item.Name;\r\n this.props.config.hiddenTexts &&\r\n this.props.config.hiddenTexts.forEach(text => {\r\n newName = newName ? newName.replace(text, '') : '';\r\n });\r\n return {\r\n linkUrl: `${this.props.context.request.url.requestUrl.origin}/${item.Product}.p`,\r\n linkText: newName,\r\n linkType: '',\r\n disabled: item.ProductReference === 0 ? true : false\r\n } as ILobasLinkProps;\r\n })\r\n });\r\n } else {\r\n dataRow.push({\r\n id: `${category.name}`,\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: false\r\n });\r\n }\r\n }\r\n } else {\r\n dataRow.push({\r\n id: `${category.name}`,\r\n type: LobasTableDataType.Text,\r\n value: '',\r\n isLinkItem: false\r\n });\r\n }\r\n }\r\n }\r\n\r\n return dataRow;\r\n }\r\n\r\n private _checkAdditionalItemReferences(input: string, itemReferences: string[] | undefined): boolean {\r\n let withoutExclamation: string[] = [];\r\n let withExclamation: string[] = [];\r\n let containsForbidden = false;\r\n let containsAllAllowed = true;\r\n\r\n if (itemReferences && ArrayExtensions.hasElements(itemReferences)) {\r\n // Split the array into two arrays: one with and one without exclamation marks\r\n withoutExclamation = itemReferences.filter(str => str !== null && !str.startsWith('!'));\r\n withExclamation = itemReferences.filter(str => str !== null && str.startsWith('!')).map(str => str.substring(1)); // removing the exclamation mark\r\n\r\n containsForbidden = withExclamation.some(forbiddenStr => input.includes(forbiddenStr));\r\n containsAllAllowed = withoutExclamation.every(allowedStr => input.includes(allowedStr));\r\n }\r\n\r\n return containsAllAllowed && !containsForbidden;\r\n }\r\n\r\n public handleHeadingChange = (event: Msdyn365.ContentEditableEvent): void => {\r\n this.props.config.heading!.text = event.target.value;\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n }\r\n\r\n private readonly _getCurrentUrl = (reqContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (reqContext.url.requestUrl.href) {\r\n return new URL(reqContext.url.requestUrl.href);\r\n }\r\n return new URL(reqContext.url.requestUrl.href);\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context /*, config*/ } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.refiners)\r\n ? this.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n })\r\n : this.refiners &&\r\n this.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values) && !this._shouldHideFromRefiners(refiner);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n //this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n //const expandedRefiners = this.expandrefinerCount;\r\n const subMenus =\r\n validRefiners &&\r\n validRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n index)*/}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n telemetryContent={this.telemetryContent}\r\n productCountAriaLabel={this.props.resources.productCountAriaLabel}\r\n //refineItemAriaLabel={this.props.resources.refineItemAriaLabel}\r\n //refineItemsAriaLabel={this.props.resources.refineItemsAriaLabel}\r\n singleProductCountAriaLabel={this.props.resources.singleProductCountAriaLabel}\r\n isMobile={this.isMobile}\r\n />\r\n );\r\n });\r\n\r\n return {\r\n RefineMenuContainer: { className: 'ms-search-result-container__refine-menu lobas-dropdown' },\r\n RefinerSectionContainer: { className: 'ms-search-result-container__refiner-section lobas-dropdown' },\r\n refiners: subMenus\r\n };\r\n };\r\n\r\n /**\r\n * Should hide from refiners.\r\n * @param refiner - The refiner.\r\n * @returns ShouldHideFromRefiners.\r\n */\r\n private readonly _shouldHideFromRefiners = (refiner: IProductRefinerHierarchy): boolean => {\r\n // Always hide sortable attribute since it's just for sorting products in Azure search, not for customers\r\n return (\r\n //refiner.RecordId === this.props.data.products.result?.inventoryAwareSortableAttributeId ||\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- app configs are of generic type\r\n /*(this.props.context.app.config.productListInventoryDisplay === ProductListInventoryFilteringOptions.HideOOS &&\r\n refiner.RecordId === this.props.data.products.result?.channelInventoryConfigurationId) ||*/\r\n (refiner.KeyName !== 'Pris' &&\r\n refiner.KeyName !== 'Price' &&\r\n ArrayExtensions.hasElements(this.props.config.hiddenRefiners) &&\r\n this.props.config.hiddenRefiners.filter(refinerName => refinerName === refiner.KeyName).length > 0) ||\r\n ((refiner.KeyName === 'Pris' || refiner.KeyName === 'Price') &&\r\n !(\r\n this.props.context.request.user.isAuthenticated &&\r\n ((this.props.context.request.user.customerAccountNumber !== null &&\r\n this.props.context.request.user.customerAccountNumber !== '') ||\r\n this.props.context.request.user.isOBORequest)\r\n ))\r\n );\r\n };\r\n\r\n /*private readonly _getRefiners = (activeRoofs: IRoof[] | undefined): ILobasTableRefinerHierarchy[] => {\r\n const { config } = this.props;\r\n const refinersWithValue: ILobasTableRefinerHierarchy[] = [];\r\n\r\n //Creating list of headers we want to use as filters. Only use headers which has a\r\n //roofDataReference value and does not have any elements in subHeaderElements array\r\n const refiners =\r\n config.headers &&\r\n config.headers\r\n .filter(header => header.roofDataReference && !ArrayExtensions.hasElements(header.subHeaderElements))\r\n .map((header, index) => {\r\n return {\r\n name: header.name,\r\n reference: header.roofDataReference,\r\n key: index\r\n };\r\n });\r\n\r\n //Creating refinersWithValues\r\n if (refiners) {\r\n refiners.map(refiner => {\r\n if (refiner.name) {\r\n const refinerValues = activeRoofs\r\n ? activeRoofs.map(roof => {\r\n return {\r\n RefinerRecordId: roof.Id,\r\n RefinerSourceValue: Object.keys(roof).findIndex(x => x === refiner.reference),\r\n LeftValueBoundString: Object.values(roof)[Object.keys(roof).findIndex(x => x === refiner.reference)],\r\n DataTypeValue: 5\r\n };\r\n })\r\n : [];\r\n\r\n let uniqueRefinerValues: ILobasTableRefinerValue[] = [];\r\n\r\n if (typeof refinerValues[0].LeftValueBoundString === 'number') {\r\n uniqueRefinerValues = [\r\n {\r\n LeftValueBoundString: `${Math.min.apply(\r\n Math,\r\n refinerValues.map(x => {\r\n return x.LeftValueBoundString;\r\n })\r\n )}`,\r\n RightValueBoundString: `${Math.max.apply(\r\n Math,\r\n refinerValues.map(x => {\r\n return x.LeftValueBoundString;\r\n })\r\n )}`,\r\n RefinerSourceValue: refinerValues[0].RefinerSourceValue,\r\n DataTypeValue: 4\r\n }\r\n ];\r\n } else {\r\n uniqueRefinerValues = [...new Map(refinerValues.map(value => [value['LeftValueBoundString'], value])).values()];\r\n }\r\n\r\n refinersWithValue.push({\r\n KeyName: refiner.name,\r\n DataTypeValue: uniqueRefinerValues[0].DataTypeValue,\r\n DisplayTemplateValue: uniqueRefinerValues[0].DataTypeValue === AttributeDataType.Text ? 0 : 1,\r\n Values: uniqueRefinerValues\r\n });\r\n }\r\n });\r\n }\r\n\r\n for (var i = 0; i < refinersWithValue.length; i++) {\r\n if (\r\n (refinersWithValue[i].DataTypeValue !== AttributeDataType.Text &&\r\n refinersWithValue[i].Values[0].LeftValueBoundString === '0' &&\r\n refinersWithValue[i].Values[0].RightValueBoundString === '0') ||\r\n refinersWithValue[i].Values.length === 0\r\n ) {\r\n refinersWithValue.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n\r\n return refinersWithValue;\r\n };*/\r\n\r\n /*private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };*/\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: ILobasTableRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\r\n\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: ILobasTableRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n /*private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n return (\r\n \r\n );\r\n };*/\r\n\r\n /*private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ILobasTableRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };*/\r\n\r\n /*private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ILobasTableRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ILobasTableRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };*/\r\n\r\n private readonly _getActiveRoofs = (activeFilters: ILobasTableRefinerValue[] | null): IRoof[] => {\r\n const roofTable = this.props.data.roofTable.result;\r\n\r\n let activeRoofs: IRoof[] = [];\r\n\r\n if (roofTable) {\r\n if (activeFilters) {\r\n activeRoofs = roofTable.filter(roof => {\r\n return activeFilters\r\n .map(filter => {\r\n if (\r\n roof.TypeName === filter.LeftValueBoundString ||\r\n roof.CoveringName === filter.LeftValueBoundString ||\r\n roof.ManufacturerName === filter.LeftValueBoundString ||\r\n roof.ModelName === filter.LeftValueBoundString\r\n ) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n })\r\n .every(x => x === true);\r\n });\r\n } else {\r\n activeRoofs = roofTable;\r\n }\r\n }\r\n\r\n return activeRoofs;\r\n };\r\n\r\n private readonly _updateListPageState = (listPageState: ListPageState, roofTable: IRoof[]): void => {\r\n //let querySorting: SortColumn[] = [];\r\n //const defaultPageNumber: number = 10;\r\n\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n /*if (this.props.context.request.query?.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }*/\r\n\r\n /*listPageState.currentPageNumber =\r\n (this.props.context.request.query &&\r\n +this.props.context.request.query.skip / (this.props.config.itemsPerPage ?? defaultPageNumber)) ||\r\n 0;*/\r\n //listPageState.sortingCritera = { Columns: querySorting };\r\n //listPageState.pageSize = this.props.config.itemsPerPage ?? defaultPageNumber;\r\n listPageState.activeRoofs = roofTable;\r\n listPageState.totalTableCount = roofTable.length;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n /*if (this.props.context.request.query?.productId) {\r\n const featureProduct = this.props.data.featureProduct.result;\r\n if (featureProduct) {\r\n listPageState.featureProduct = featureProduct;\r\n }\r\n }*/\r\n };\r\n\r\n /*private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n // eslint-disable-next-line max-len -- existing code\r\n const skipCount = listPageState?.currentPageNumber\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = listPageState?.totalTableCount || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n \r\n );\r\n };*/\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n /*private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n
    \r\n
    \r\n );\r\n };*/\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n /*private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n
    \r\n {paginationNextText}\r\n
    \r\n );\r\n };*/\r\n\r\n private readonly _getProductSegmentRefiners = (): React.ReactNode => {\r\n return (\r\n
    \r\n
    {this.props.resources.productSegmentRefiners}
    \r\n
    \r\n \r\n Taksikkerhet\r\n \r\n \r\n Fallsikring\r\n \r\n \r\n Solar\r\n \r\n
    \r\n
    \r\n );\r\n };\r\n\r\n private readonly _getProductCategoryRefiners = (): React.ReactNode => {\r\n const refiners = [];\r\n if (this.props.config.headers && ArrayExtensions.hasElements(this.props.config.headers)) {\r\n for (const category of this.props.config.headers) {\r\n const productSegment = this.state.productSegments.find(x => x.ProductSegmentName === category.productSegment);\r\n if (productSegment && productSegment.IsActive) {\r\n const productCategory = this.state.productCategories.find(x => x.ProductCategoryName === category.name);\r\n refiners.push(\r\n \r\n {category.name}\r\n \r\n );\r\n }\r\n }\r\n }\r\n\r\n if (this.state.productSegments.some(segment => segment.IsActive)) {\r\n return (\r\n
    \r\n
    {this.props.resources.productCategoryRefiners}
    \r\n
    {refiners}
    \r\n
    \r\n );\r\n } else {\r\n return <>;\r\n }\r\n };\r\n\r\n private readonly _onClick = async (e: React.MouseEvent): Promise => {\r\n e.preventDefault();\r\n // eslint-disable-next-line no-debugger\r\n const control = e.currentTarget.textContent;\r\n\r\n this.setState((prevState: ILobasRoofTableState) => {\r\n const updatedItems = prevState.productSegments.map(segment => {\r\n if (segment.ProductSegmentName === control) {\r\n return { ...segment, IsActive: !segment.IsActive };\r\n }\r\n return segment;\r\n });\r\n\r\n return { productSegments: updatedItems, refresh: true };\r\n });\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n const activeRoofs = listPageState.activeRoofs;\r\n const tableProps = await this._createTableProps(activeRoofs);\r\n this.setState({ tableProps });\r\n };\r\n\r\n private readonly _onClickCategories = async (e: React.MouseEvent): Promise => {\r\n e.preventDefault();\r\n // eslint-disable-next-line no-debugger\r\n const control = e.currentTarget.textContent;\r\n\r\n this.setState((prevState: ILobasRoofTableState) => {\r\n const updatedItems = prevState.productCategories.map(category => {\r\n if (category.ProductCategoryName === control) {\r\n return { ...category, IsActive: !category.IsActive };\r\n }\r\n return category;\r\n });\r\n\r\n return { productCategories: updatedItems, refresh: true };\r\n });\r\n\r\n const listPageState = await this.props.data.listPageState;\r\n const activeRoofs = listPageState.activeRoofs;\r\n const tableProps = await this._createTableProps(activeRoofs);\r\n this.setState({ tableProps });\r\n };\r\n}\r\n\r\nexport default LobasRoofTable;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as React from 'react';\r\nimport { ILobasRoofTableViewProps /*, ILobasRoofTableRefineMenuViewProps */ } from './lobas-roof-table';\r\n//import { ArrayExtensions, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\n\r\nconst LobasRoofTableView: React.FC = props => {\r\n const {\r\n RoofList,\r\n roofListTable,\r\n moduleContainer,\r\n heading,\r\n //refineMenu,\r\n RefineAndModuleSectionContainer,\r\n /*choiceSummary*/ pagination,\r\n productSegmentRefiners,\r\n productCategoryRefiners\r\n } = props;\r\n\r\n return (\r\n \r\n {productSegmentRefiners}\r\n {productCategoryRefiners}\r\n {/*refineMenu && renderRefiner(refineMenu)*/}\r\n {heading}\r\n {/* \r\n
    {choiceSummary}
    \r\n
    */}\r\n \r\n {roofListTable}\r\n {pagination}\r\n \r\n
    \r\n );\r\n};\r\n\r\n/*const renderRefiner = (props: ILobasRoofTableRefineMenuViewProps): JSX.Element | null => {\r\n const { refiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n if (refiners) {\r\n return (\r\n \r\n \r\n {refiners.map((submenu, index) => (\r\n {submenu}\r\n ))}\r\n \r\n \r\n );\r\n }\r\n return null;\r\n};*/\r\n\r\nexport default LobasRoofTableView;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['lobas-roof-table'] = {\n c: () => require('partner/modules/lobas-roof-table/lobas-roof-table.tsx'),\n $type: 'contentModule',\n da: [{name:'listPageState', path:'actions/lobas-list-page-state', runOn: 0},{name:'roofTable', path:'actions/get-roof-table.action', runOn: 0}],\n \n iNM: false,\n ns: '__local__',\n n: 'lobas-roof-table',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/lobas-roof-table'\n });\n \n\n {\n const sanitizedActionPath = 'actions/get-roof-table.action';\n let dataAction = require('partner/actions/get-roof-table.action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'actions/lobas-list-page-state';\n let dataAction = require('partner/actions/lobas-list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|lobas-roof-table|lobas-roof-table'] = {\n c: () => require('partner/modules/lobas-roof-table/lobas-roof-table.view.tsx'),\n cn: '__local__-__local__-lobas-roof-table'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","var $TypeError = TypeError;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; // 2 ** 53 - 1 == 9007199254740991\n\nmodule.exports = function (it) {\n if (it > MAX_SAFE_INTEGER) throw $TypeError('Maximum allowed index exceeded');\n return it;\n};\n","'use strict';\nvar isArray = require('../internals/is-array');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar doesNotExceedSafeInteger = require('../internals/does-not-exceed-safe-integer');\nvar bind = require('../internals/function-bind-context');\n\n// `FlattenIntoArray` abstract operation\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar flattenIntoArray = function (target, original, source, sourceLen, start, depth, mapper, thisArg) {\n var targetIndex = start;\n var sourceIndex = 0;\n var mapFn = mapper ? bind(mapper, thisArg) : false;\n var element, elementLen;\n\n while (sourceIndex < sourceLen) {\n if (sourceIndex in source) {\n element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n if (depth > 0 && isArray(element)) {\n elementLen = lengthOfArrayLike(element);\n targetIndex = flattenIntoArray(target, original, element, elementLen, targetIndex, depth - 1) - 1;\n } else {\n doesNotExceedSafeInteger(targetIndex + 1);\n target[targetIndex] = element;\n }\n\n targetIndex++;\n }\n sourceIndex++;\n }\n return targetIndex;\n};\n\nmodule.exports = flattenIntoArray;\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flatMap` method\n// https://tc39.es/ecma262/#sec-array.prototype.flatmap\n$({ target: 'Array', proto: true }, {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen = lengthOfArrayLike(O);\n var A;\n aCallable(callbackfn);\n A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return A;\n }\n});\n","// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flatMap');\n","module.exports = React;","module.exports = ReactDOM;"],"names":["createObservableDataAction","action","retailAction","input","context","createGetRoofTableInput","Paging","Top","ListPageState","constructor","activeFilters","activeRoofs","currentPageNumber","refiners","pageSize","pageType","__decorate","observable","ListPageStateInput","getCacheKey","getCacheObjectType","dataCacheType","async","listPageStateAction","ctx","createListPageInput","inputData","compressedRefinerKeys","hydrateRefinersFromUrl","requestContext","compressedRefinerArray","parseQueryParam","length","map","compressedRefiner","parsedRefiner","forEach","refinerKey","index","_unused","filter","Boolean","buildListPageUrl","fullUrl","sortingColumns","skipCount","undefined","searchParams","delete","set","JSON","stringify","compressedRefiners","refiner","push","compressRefiners","href","toString","key","query","parse","decodeURIComponent","getCurrentUrl","MsDyn365","URL","window","location","url","requestUrl","RoofTableLinks","React","_mapEditableLinks","linkdata","editableLinks","link","payLoad","getPayloadObject","this","props","telemetryContent","linkText","contentAction","etext","attributes","getTelemetryAttributes","btnClass","disabled","editableLink","ariaLabel","className","linkUrl","destinationUrl","openInNewTab","role","additionalProperties","onClick","onTelemetryClick","_mapDisabledLinks","render","links","disabledLinks","Msdyn365","_ref","isChecked","value","name","onChange","isSingleSelectOnly","cssClass","classnames","checked","type","LobasTableDataType","LobasTable","super","componentClassName","headingPrefix","capitalizeHeadingPrefix","_selectSortingKey","event","target","columnName","getAttribute","parentElement","sortingKey","ascendingOrder","state","newOrder","setState","showActions","_onCheckBoxChangeHandler","rows","checkBoxCallback","ObjectExtensions","isSelected","_renderHeadingRows","headerColumnData","subheaderColumnData","_renderHeadingRow","columnData","resources","showCheckBoxes","enableToModify","minifyActions","actionLinkText","isSortable","resourcePrefix","businessUserSelectCheckBoxAriaLabelText","sortByAscending","sortByDescending","sortingClassName","sortingValue","columns","data","cellIndex","updatedCellIndex","heading","columnSortValue","columnAriaLabel","format","sortable","onKeyUp","_handleKeyPressPrev","scope","tabIndex","trim","colSpan","colspan","radioCheckBox","LobasCheckBoxButton","actionContent","tableCell","header","content","_renderRow","excludedColumns","actions","formatPrice","rowsData","additionalNameAriaLabel","row","ArrayExtensions","cell","index2","includes","id","extraClass","Number","Price","cellContent","columnSpecificClass","isLinkItem","Object","assign","getLinksData","getTelemetryContent","sourceProps","rowKey","selectedIndex","actionButtons","_renderActions","buttonReferences","records","buttonReference","editLinkText","deleteLinkText","viewLinkText","editLinkTooltip","deleteLinkTooltip","viewLinkTooltip","actionLinkTooltip","minifiedButtonText","onEdit","onDelete","onView","handleClickEdit","_buttonReference$edit","edit","current","handleClickDelete","_buttonReference$dele","handleClickView","Node","Button","innerRef","title","_toggleActions","newKey","_sortTableRow","table","sortingkey","sort","userOne","userTwo","userOneData","find","userTwoData","cleanFirst","toLowerCase","cleanSecond","_getCurrentPageData","tableRows","start","end","result","i","_renderPrev","paginationPreviousText","_renderNext","paginationNextText","keyCode","KeyCodes","isExpanded","isRefinerMenuExpandedOnInitialLoad","headings","refinerButtonExpanded","subheadings","showPagination","paginationProperty","classname","paginationLinks","itemPerPage","nextText","prevText","paginationText","UncontrolledPagination","qsp","items","itemsPerPage","startingItem","previousText","previousAriaLabel","nextAriaLabel","tableBody","tableHead","item","linkType","getTelemetryObject","request","telemetryPageName","friendlyName","telemetry","LobasTableRefinerValueDataTypeValue","LobasTableRefinerTypeValue","LobasTableRefinerSource","isRangeType","dataTypeValue","AttributeDataType","findMatchingRefinementCriterion","tableRefinerValue","refinementCriteria","refinementCriterion","isMatchingRefinementCriterion","RefinerRecordId","RefinerSourceValue","DataTypeValue","LeftValueBoundString","getUpdatedRefinementCriteria","itemToggleNotification","currentRefinementCriteria","updatedRefinementCriteria","toggledItemFound","selectedCriterion","isSelecting","next","_objectSpread","rangeStart","RightValueBoundString","rangeEnd","parentTableRefinerHierarchy","RefinerTypeValue","RefinerType","Values","child","matchingIndex","findIndex","criterion","splice","RangeRefineItem","_selectedRefinementCr","_this$props$selectedR","_this$props$selectedR2","_ref2","_this$props$selectedR3","_this$props$selectedR4","_formattedPriceReverseLookup","Map","getLabels","sliderId","minValue","maxValue","labelId","labelString","labelPositioning","getSliderThumbs","sliderKey","selectedMin","selectedMax","_this$props$minValueS","_this$props$maxValueS","minValueSliderThumbAriaLabel","currencyCode","ariaValueText","maxValueSliderThumbAriaLabel","_onRangeUpdate","bind","_onRangeUpdateEnd","_handleRangeTooltipText","_changeMin","_changeMax","_finishChangeMin","_finishChangeMax","minInput","maxInput","selectedRefinementCriterion","initialMin","initialMax","String","RecordId","labels","sliderKeyString","sliderThumbs","validationErrorMin","validationErrorMax","touchedMin","touchedMax","UnitText","shouldComponentUpdate","nextProps","nextState","componentDidUpdate","previousProps","updateSliderProps","refineItemCommonProps","rangeType","_renderInputFields","_renderSlider","error","_ref3","_this$props$selectedR5","_this$props$selectedR6","_ref4","_this$props$selectedR7","_this$props$selectedR8","isDisabled","formAttrs","rangeNameFormat","replace","KeyName","minInputClassName","maxInputClassName","formattedSelectedMin","_getFormattedSelectedValue","formattedSelectedMax","minLabel","onFocus","onBlur","ref","maxLabel","placeholder","placeholderTextMax","ariaAttributes","Slider","inForm","min","max","step","orientation","showLabels","showTooltip","onChangeEnd","debounce","handleTooltipText","_changeValue","inputType","selectedKey","touchedKey","_getInputWithoutFormatting","currentTarget","selectedMinValue","minTouched","onToggle","maxNum","isNaN","validationErrorNaN","_focus","_validateRange","selectedMaxValue","maxTouched","minNum","setTimeout","focus","selected","touched","validationError","_formatPrice","validationErrorRange","amount","cultureFormatter","formatCurrency","inputAsNum","get","sliderChangeNotification","eventType","firstThumbValue","secondThumbValue","_focusOnSliderThumb","element","document","getElementById","tooltip","computed","observer","LobasTableRefineItem","_onClick","e","preventDefault","anchorType","_this$props","tableCountAriaLabel","singleTableCountAriaLabel","children","attrs","_objectWithoutProperties","_excluded","warning","isSingleSelect","itemTypeClassName","LeftValueBoundLocalizedString","attribute","LobasRefineSubmenu","_onToggleItem","_onToggleSubmenu","isExpandedOnInitialLoad","expanded","tableRefinerHierarchy","SourceValue","ProductRefinerSource","app","config","hideRating","htmlFor","_renderChildItems","_renderRange","_renderSingleMultiSelect","selectedRefinerValues","productCountAriaLabel","singleProductCountAriaLabel","isMobile","refinerValuesList","listItems","RefineItem","selectedValue","urlBuilder","moduleId","moduleTypeName","isMobileView","_getRangeType","DisplayTemplateValue","DisplayTemplate","onUpdateRefiners","prevState","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","LobasRoofTable","_this$props$config$he","moduleClassName","_pageType","urlTokens","isListPageStateUpdated","handleHeadingChange","text","_getCurrentUrl","reqContext","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","updateRefinerPanel","_shouldHideFromRefiners","activeRefiners","listPageState","RefineMenuContainer","RefinerSectionContainer","productRefinerHierarchy","_refineItemCommonProps","_onUpdateRefiners","_buildRefinerUrl","typeName","hiddenRefiners","refinerName","user","isAuthenticated","customerAccountNumber","isOBORequest","actionContext","history","pushState","transaction","newRefinementCriteria","_getActiveRoofs","roofTable","roof","TypeName","CoveringName","ManufacturerName","ModelName","every","x","_updateListPageState","totalTableCount","_getProductSegmentRefiners","productSegmentRefiners","productSegments","IsActive","_getProductCategoryRefiners","headers","category","productSegment","ProductSegmentName","productCategory","productCategories","ProductCategoryName","_onClickCategories","some","segment","productCategoryRefiners","control","textContent","refresh","tableProps","_createTableProps","mobileExcludedColumns","_viewport","device","Type","_updateViewport","isReady","locale","validationErrorNotNumber","validationErrorNotRange","addEventListener","Promise","all","categories","then","reaction","componentWillUnmount","removeEventListener","viewProps","RoofList","moduleProps","moduleContainer","Heading","headingTag","tag","roofListTable","refineMenu","RefineAndModuleSectionContainer","renderView","tableData","_createTableItems","_createTableHeaders","_createTableSubHeaders","skip","parseInt","businessUserPaginationPreviousButtonText","businessUserPaginationNextButtonText","businessUserPaginationAriaLabel","itemCategory","subHeaderElements","roofDataReference","columnSortAriaLabel","tableSubHeading","subHeaders","subHeader","_createTableDataRow","_roof$ItemReferences","dataRow","distinctItems","ItemReferences","values","propertyIndex","keys","valueType","Text","itemReference","subHeaderElement","fitleredItems","_x$Name","Model","Id","Category","Name","_checkAdditionalItemReferences","additionalItemReferences","newName","hiddenTexts","origin","Product","ProductReference","promises","getRelatedProductsAsync","callerContext","apiSettings","channelId","catalogId","allRelatedProductsResult","flatMap","relatedProducts","relatedProduct","_relatedProduct$Name","_x$Name2","additionalItemReference","itemReferences","withoutExclamation","withExclamation","containsForbidden","containsAllAllowed","str","startsWith","substring","forbiddenStr","allowedStr","_getViewport","innerWidth","gridSettings","xs","w","sm","md","lg","pagination","Module","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","c","require","$type","da","path","runOn","iNM","ns","n","p","pdp","__bindings__","viewDictionary","cn","$TypeError","TypeError","module","exports","it","isArray","lengthOfArrayLike","doesNotExceedSafeInteger","flattenIntoArray","original","source","sourceLen","depth","mapper","thisArg","elementLen","targetIndex","sourceIndex","mapFn","$","aCallable","toObject","arraySpeciesCreate","proto","callbackfn","A","O","arguments","addToUnscopables","ReactDOM"],"sourceRoot":""}