{"version":3,"file":"7979.4403bebb265843027067.js","mappings":"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","sources":["webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/AnimationComponents/view-more-section.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/hooks/useIsOverflow.ts","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Basket/notice-list.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Modal/modal-spinner.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/AnimationComponents/load-spinner.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/FormInputs/dropdown-checkboxes.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/Icons/icon-email.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Tabs/tab.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Tabs/tabs.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactReducers/Profile/profile-composer.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactReducers/ProductPicker/product-picker-composer.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductPicker/product-picker-radio-select.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductPicker/product-picker-selected-details.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductPicker/product-picker-selected-typelist.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/LoginModal/login-modal.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductPicker/product-picker.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductDescription/product-description-error-boundary.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductDescription/product-description.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/TrialLicense/TrialLicenseMediaTypeList/trial-license-media-type-radio-item.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/TrialLicense/TrialLicenseMediaTypeList/trial-license-media-type-list.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/Icons/icon-chevron-right.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductMediaLink/product-media-link-with-callback.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/Icons/icon-book-open.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactReducers/TrialLicense/trial-license-composer.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/TrialLicense/trial-license-link.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/ProductMediaLink/product-media-link.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/Icons/icon-bars.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/product-review-block.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/tab-facts.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/Icons/icon-pdf.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/tab-free-materials.js","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/Shared/Icons/icon-website.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactComponents/ProductPage/product-page.tsx","webpack://gyldendal-uddannelse/./src/Foundation/Frontend/ReactViews/ProductPage/product-page-view.js"],"sourcesContent":["import React, { ReactNode, useState } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { useIsOverflow } from \"hooks/useIsOverflow\";\r\n\r\ninterface IViewMoreSectionProps {\r\n    children: ReactNode;\r\n}\r\nconst ViewMoreSection = ({ children }: IViewMoreSectionProps) => {\r\n    const { ref, isOverflow } = useIsOverflow();\r\n\r\n    const [isOpen, setIsOpen] = useState(false);\r\n    const toggle = () => setIsOpen(!isOpen);\r\n\r\n    const rootClasses = classNames({\r\n        \"view-more-section\": true,\r\n        \"no-shadow\": !isOverflow || isOpen,\r\n        open: isOpen\r\n    });\r\n    const arrowClasses = classNames({\r\n        \"arrow-icon\": isOverflow || isOpen,\r\n        \"arrow-icon-down\": !isOpen,\r\n        \"arrow-icon-up\": isOpen\r\n    });\r\n\r\n    return (\r\n        <>\r\n            <div className={rootClasses} ref={ref}>\r\n                {children}\r\n            </div>\r\n            <button\r\n                type=\"button\"\r\n                className=\"view-more-btn\"\r\n                onClick={toggle}\r\n                aria-label={`${isOpen ? \"Vis mindre\" : \"Vis mere\"}`}\r\n                aria-expanded={isOpen}\r\n            >\r\n                <div className={arrowClasses}></div>\r\n            </button>\r\n        </>\r\n    );\r\n};\r\n\r\nexport default ViewMoreSection;\r\n","import { useLayoutEffect, useRef, useState } from \"react\";\r\n\r\nexport const useIsOverflow = (callback?: (hasOverflow: boolean) => void) => {\r\n    const [isOverflow, setIsOverflow] = useState(false);\r\n    const ref = useRef<HTMLDivElement>(null);\r\n\r\n    useLayoutEffect(() => {\r\n        const { current } = ref;\r\n\r\n        const trigger = () => {\r\n            const hasOverflow =\r\n                (current as HTMLDivElement).scrollHeight > (current as HTMLDivElement).clientHeight;\r\n\r\n            setIsOverflow(hasOverflow);\r\n\r\n            if (callback) callback(hasOverflow);\r\n        };\r\n        if (current != null) {\r\n            trigger();\r\n        }\r\n    }, [callback, ref]);\r\n\r\n    return { ref, isOverflow };\r\n};\r\n","import React, { Component } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nclass NoticeList extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n    }\r\n\r\n    render() {\r\n        const noticeArray = this.props.noticeArray;\r\n        const contentInfoClasses = classNames(\"content-info\", {\r\n            \"no-icon\": this.props.noIcon\r\n        });\r\n\r\n        return (\r\n            <div className=\"notice-list\">\r\n                {noticeArray.map((item, idx) => {\r\n                    return (\r\n                        <div className={contentInfoClasses} key={idx}>\r\n                            <div dangerouslySetInnerHTML={{ __html: item }} />\r\n                        </div>\r\n                    );\r\n                })}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default NoticeList;\r\n","import React from \"react\";\r\nimport Modal from \"ReactComponents/Modal/modal\";\r\nimport LoadSpinner from \"ReactComponents/Shared/AnimationComponents/load-spinner\";\r\n\r\nfunction ModalSpinner(props) {\r\n    return (\r\n        <Modal isOpen={props.isOpen} notCloseable={props.isOpen}>\r\n            <div className=\"u-text-align-center\">\r\n                <LoadSpinner />\r\n            </div>\r\n        </Modal>\r\n    );\r\n}\r\n\r\nexport default ModalSpinner;\r\n","import React, { Component } from \"react\";\r\n\r\nclass LoadSpinner extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n    }\r\n\r\n    render() {\r\n        return (\r\n            <div\r\n                role=\"progressbar\"\r\n                aria-busy=\"true\"\r\n                aria-live=\"polite\"\r\n                aria-valuetext=\"Loading...\"\r\n                className=\"loader loader--large loader--block\"\r\n            >\r\n                <span />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default LoadSpinner;\r\n","import React, { Component } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\n/**\r\n * @param (object Array) this.props.dataSource\r\n * @param (function) this.props.onChange (will recive new dataSouceArray)\r\n * @param (boolean)  expanded (show or hide)\r\n * @param (function) used to close expanded variable with this.props.closeFunction(false)\r\n */\r\nclass DropdownCheckboxes extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            data: this.props.dataSource.slice() || []\r\n        };\r\n\r\n        this.dropdownRef = React.createRef();\r\n        this.keyEventHandler = this.keyEventHandler.bind(this);\r\n        this.close = this.close.bind(this);\r\n        this.handleClickOutside = this.handleClickOutside.bind(this);\r\n        this.updateItem = this.updateItem.bind(this);\r\n        this.checkboxSubmitHandler = this.checkboxSubmitHandler.bind(this);\r\n    }\r\n\r\n    close() {\r\n        this.setState({\r\n            data: this.props.dataSource\r\n        });\r\n        this.props.closeFunction(false);\r\n    }\r\n\r\n    keyEventHandler(e) {\r\n        if (e.key == \"Escape\") {\r\n            this.close();\r\n        }\r\n    }\r\n\r\n    componentDidUpdate() {\r\n        if (this.props.expanded) {\r\n            document.addEventListener(\"click\", this.handleClickOutside, { capture: true });\r\n            document.addEventListener(\"keyup\", this.keyEventHandler);\r\n        } else {\r\n            document.removeEventListener(\"click\", this.handleClickOutside, { capture: true });\r\n            document.removeEventListener(\"keyup\", this.keyEventHandler);\r\n        }\r\n    }\r\n\r\n    handleClickOutside(event) {\r\n        const domNode = this.dropdownRef.current;\r\n        if (!domNode || !domNode.contains(event.target)) {\r\n            this.close();\r\n        }\r\n    }\r\n\r\n    checkboxSubmitHandler() {\r\n        this.props.onChange(this.state.data);\r\n    }\r\n\r\n    updateItem(item, idx) {\r\n        const arr = this.state.data;\r\n        const newarr = arr.slice().map((obj, i) => {\r\n            if (i == idx) {\r\n                obj.Selected = !item.Selected;\r\n            }\r\n            return Object.assign({}, obj);\r\n        });\r\n        this.setState({\r\n            data: newarr\r\n        });\r\n    }\r\n\r\n    render() {\r\n        const list = (\r\n            <ul>\r\n                {this.state.data.map((item, idx) => {\r\n                    return (\r\n                        <li key={idx} className=\"dropdown-checkbox__option\">\r\n                            <label className=\"checkbox\" htmlFor={item.Label}>\r\n                                <span hidden>{item.Label}</span>\r\n                                <input\r\n                                    id={item.Label}\r\n                                    type=\"checkbox\"\r\n                                    className=\"checkbox__input\"\r\n                                    checked={item.Selected}\r\n                                    onChange={() => {\r\n                                        this.updateItem(item, idx);\r\n                                    }}\r\n                                />\r\n                                <div className=\"dropdown-checkbox__option__text\">\r\n                                    <span>{item.Label}</span>\r\n                                    <span className=\"dropdown-checkbox__option__text__details\">\r\n                                        {item.Details}\r\n                                    </span>\r\n                                </div>\r\n                                <div className=\"checkbox__indicator\"></div>\r\n                            </label>\r\n                        </li>\r\n                    );\r\n                })}\r\n            </ul>\r\n        );\r\n\r\n        const classes = classNames({\r\n            \"dropdown-checkbox\": true,\r\n            isExpanded: this.props.expanded\r\n        });\r\n        const selectBtnText = this.props.selectBtnText || \"Vælg klasser\";\r\n\r\n        return (\r\n            <div className={classes} ref={this.dropdownRef}>\r\n                {this.props.expanded && (\r\n                    <div className=\"dropdown-checkbox__popup\">\r\n                        <div className=\"dropdown-checkbox__options\">{list}</div>\r\n                        <div className=\"dropdown-checkbox__popup__footer\">\r\n                            <button\r\n                                type=\"button\"\r\n                                className=\"button button-secondary button--wide button--slim\"\r\n                                onClick={this.checkboxSubmitHandler}\r\n                            >\r\n                                {selectBtnText}\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                )}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default DropdownCheckboxes;\r\n","import React, { Component } from \"react\";\r\n\r\nclass IconEmail extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n    }\r\n\r\n    render() {\r\n        return (\r\n            <svg x=\"0px\" y=\"0px\" width=\"50px\" height=\"50px\" viewBox=\"0 0 50 50\" role=\"presentation\">\r\n                <path\r\n                    d=\"M3.8,10.5v29.1h42.5V10.5H3.8z M19.7,27.8l5.3,2.9l5.3-2.9L42,37.3H8L19.7,27.8z M6,36.1V20.2l11.7,6.5L6,36.1z M32.4,26.7\r\n\t        L44,20.2v15.9L32.4,26.7z M44,12.7v4.9L25,28.2L6,17.6v-4.9H44z\"\r\n                />\r\n            </svg>\r\n        );\r\n    }\r\n}\r\n\r\nexport default IconEmail;\r\n","import React, { Component } from \"react\";\r\n\r\nclass Tab extends Component {\r\n    render() {\r\n        return (\r\n            <div\r\n                role=\"tabpanel\"\r\n                id={\"panel\"}\r\n                tabIndex={0}\r\n                aria-labelledby={`tab-${this.props.label}`}\r\n                aria-label={this.props.label}\r\n                className=\"tabs__content-inner\"\r\n            >\r\n                {this.props.children}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Tab;\r\n","import React, { Component } from \"react\";\r\nimport classNames from \"classnames\";\r\n\r\nclass Tabs extends Component {\r\n    constructor() {\r\n        super();\r\n\r\n        this.state = {\r\n            isCurrent: 0,\r\n            counter: 0\r\n        };\r\n\r\n        this.setCurrent = this.setCurrent.bind(this);\r\n        this.onKeyDown = this.onKeyDown.bind(this);\r\n    }\r\n\r\n    componentDidUpdate(prevProps) {\r\n        if (prevProps.initialCurrentIndex !== this.props.initialCurrentIndex) {\r\n            this.setState({\r\n                isCurrent: this.props.initialCurrentIndex,\r\n                counter: this.props.initialCurrentIndex\r\n            });\r\n        }\r\n    }\r\n\r\n    setCurrent(tab, counter) {\r\n        this.setState({\r\n            isCurrent: tab,\r\n            counter: counter\r\n        });\r\n    }\r\n\r\n    onKeyDown(e) {\r\n        const tabs = document.querySelectorAll('[role=\"tab\"]');\r\n\r\n        let tabFocus = this.state.isCurrent;\r\n        let counter = this.state.counter;\r\n\r\n        const availableFocusIndex = [];\r\n\r\n        tabs.forEach((item, index) => {\r\n            if (!item.disabled) {\r\n                availableFocusIndex.push(index);\r\n            }\r\n        });\r\n\r\n        if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\r\n            tabs[tabFocus].setAttribute(\"tabindex\", -1);\r\n            // Move right\r\n            if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\r\n                counter++;\r\n                tabFocus = availableFocusIndex[counter];\r\n                // If we're at the end, go to the start\r\n                if (counter >= availableFocusIndex.length) {\r\n                    tabFocus = 0;\r\n                    counter = 0;\r\n                }\r\n                // Move left\r\n            } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\r\n                counter--;\r\n                tabFocus = availableFocusIndex[counter];\r\n                // If we're at the start, move to the end\r\n                if (counter < 0) {\r\n                    tabFocus = tabs.length - 1;\r\n                    counter = availableFocusIndex.length - 1;\r\n                }\r\n            }\r\n\r\n            tabs[tabFocus].setAttribute(\"tabindex\", 0);\r\n            tabs[tabFocus].focus();\r\n            this.setCurrent(tabFocus, counter);\r\n        }\r\n    }\r\n\r\n    componentDidMount() {\r\n        const tabList = document.querySelector('[role=\"tablist\"]');\r\n        tabList.addEventListener(\"keydown\", this.onKeyDown, false);\r\n    }\r\n\r\n    componentWillUnmount() {\r\n        const tabList = document.querySelector('[role=\"tablist\"]');\r\n        tabList.removeEventListener(\"keydown\", this.onKeyDown, false);\r\n    }\r\n\r\n    render() {\r\n        const childTabs = this.props.children.filter(child => {\r\n            return child != false;\r\n        });\r\n\r\n        return (\r\n            <div role=\"tablist\" className=\"tabs-container\">\r\n                <div className=\"tabs__menu\">\r\n                    <div className=\"tabs__menu-inner\">\r\n                        {childTabs.map((child, index) => {\r\n                            const tabClasses = classNames({\r\n                                tabs__menu__tab: true,\r\n                                active: this.state.isCurrent == index,\r\n                                disabled: child.props.isDisabled\r\n                            });\r\n                            return (\r\n                                <button\r\n                                    role=\"tab\"\r\n                                    aria-selected={this.state.isCurrent == index}\r\n                                    aria-controls={\"panel\"}\r\n                                    key={index}\r\n                                    disabled={child.props.isDisabled}\r\n                                    id={`tab-${child.props.label}`}\r\n                                    className={tabClasses}\r\n                                    onClick={child.props.isDisabled ? null : () => this.setCurrent(index)}\r\n                                >\r\n                                    {child.props.label}\r\n                                    {child.props.labelCount && <span>{child.props.labelCount}</span>}\r\n                                </button>\r\n                            );\r\n                        })}\r\n                    </div>\r\n                </div>\r\n\r\n                <div className=\"tabs__content\">{childTabs[this.state.isCurrent]}</div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Tabs;\r\n","// @ts-check\r\nimport { connect } from \"react-redux\";\r\nimport { profileSelector, profileActions } from \"./profile-reducer\";\r\n\r\nexport const mapStateToProps = function (state) {\r\n    return {\r\n        userInfo: profileSelector.userInfo(state),\r\n        loggedIn: profileSelector.loggedIn(state),\r\n        loginUrl: profileSelector.loginUrl(state),\r\n        logoutUrl: profileSelector.logoutUrl(state),\r\n        profileLinks: profileSelector.profileLinks(state),\r\n        userName: profileSelector.userName(state),\r\n        userCreatePending: profileSelector.userCreatePending(state),\r\n        loginRedirecting: profileSelector.loginRedirecting(state),\r\n        createLoginContent: profileSelector.createLoginContent(state),\r\n        createProfileUrl: profileSelector.createProfileUrl(state),\r\n        createProfileUniLoginUrl: profileSelector.createProfileUniLoginUrl(state),\r\n        uniPromptContent: profileSelector.uniPromptContent(state),\r\n        isUniLoggedInOnly: profileSelector.isUniLoggedInOnly(state)\r\n    };\r\n};\r\n\r\nexport const mapDispatchToProps = function (dispatch) {\r\n    return {\r\n        userLoggedIn: () => dispatch(profileActions.userLoggedIn()),\r\n        userLogin: () => dispatch(profileActions.userLogin()),\r\n        unicConnect: () => dispatch(profileActions.unicConnect()),\r\n        userLogout: () => dispatch(profileActions.userLogout()),\r\n        userCreateSubmit: (userinfo, resolve, reject, apiUrl) =>\r\n            dispatch(profileActions.userCreateSubmit({ userinfo, resolve, reject, apiUrl })),\r\n        getNewsletterProfile: (email, resolve, reject, apiUrl) =>\r\n            dispatch(profileActions.getNewsletterProfile({ email, resolve, reject, apiUrl }))\r\n    };\r\n};\r\n\r\nexport function profileComposer(Component) {\r\n    return connect(mapStateToProps, mapDispatchToProps)(Component);\r\n}\r\n","import { connect } from \"react-redux\";\r\nimport { productPickerSelector, productPickerActions } from \"./product-picker-reducer\";\r\nimport { profileSelector } from \"../Profile/profile-reducer\";\r\nimport { basketSelector, basketActions } from \"ReactReducers/Basket/basket-reducer\";\r\n\r\nexport function productPickerComposer(Component) {\r\n    const mapStateToProps = function (state) {\r\n        return {\r\n            productPickerWork: productPickerSelector.work(state),\r\n            productPickerProduct: productPickerSelector.productIndex(state),\r\n            productPickerBasketProductConfig: productPickerSelector.basketProductConfig(state),\r\n            amount: productPickerSelector.amount(state),\r\n            salesConfigIndex: productPickerSelector.salesConfigIndex(state),\r\n            periodValueIndex: productPickerSelector.periodValueIndex(state),\r\n            primaryPrice: productPickerSelector.primaryPrice(state),\r\n            secondaryPrice: productPickerSelector.secondaryPrice(state),\r\n            classesValue: productPickerSelector.classesValue(state),\r\n            isGettingProductPrice: productPickerSelector.isGettingProductPrice(state),\r\n            isAdding: basketSelector.isAdding(state),\r\n            basket: basketSelector.basket(state),\r\n            loggedIn: profileSelector.loggedIn(state)\r\n        };\r\n    };\r\n\r\n    const mapDispatchToProps = function (dispatch) {\r\n        return {\r\n            setWork: work => dispatch(productPickerActions.setWork(work)),\r\n            setProductIndex: productIndex => dispatch(productPickerActions.setProductIndex(productIndex)),\r\n            setAmount: quantity => dispatch(productPickerActions.setAmount(quantity)),\r\n            setSalesConfigIndex: index => dispatch(productPickerActions.setSalesConfigIndex(index)),\r\n            setPeriodValueIndex: index => dispatch(productPickerActions.setPeriodValueIndex(index)),\r\n            setClassesValue: classesData => dispatch(productPickerActions.setClassesValue(classesData)),\r\n            basketAdd: basketItem => dispatch(basketActions.basketAdd(basketItem))\r\n        };\r\n    };\r\n\r\n    return connect(mapStateToProps, mapDispatchToProps)(Component);\r\n}\r\n","import React, { Component } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { InfoTypes } from \"ReactComponents/Shared/Constants/info-types\";\r\nimport propTypes from \"prop-types\";\r\nimport AmountInput from \"ReactComponents/Shared/FormInputs/amount-input\";\r\nimport DeliveryCostsModalButton from \"ReactComponents/DeliveryCostsModalButton/delivery-costs-modal-button\";\r\n\r\nclass ProductPickerRadioSelect extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.clickHandler = this.clickHandler.bind(this);\r\n    }\r\n\r\n    clickHandler(e, index) {\r\n        e.preventDefault();\r\n        const event = e;\r\n        event.target.value = index;\r\n        this.props.onChange(event);\r\n    }\r\n\r\n    render() {\r\n        const currentSalesConfig = this.props.salesConfigIndex || 0;\r\n\r\n        return (\r\n            <div className=\"product-picker__items\">\r\n                {this.props.Work.Products.map((product, index) => {\r\n                    const isCurrent = this.props.Work.Products[this.props.current].Id == product.Id;\r\n                    const productConfig = product.PriceConfigurations[currentSalesConfig];\r\n                    return (\r\n                        <ProductComponent\r\n                            key={index}\r\n                            index={index}\r\n                            isCurrent={isCurrent}\r\n                            product={product}\r\n                            productConfig={productConfig}\r\n                            setAmount={this.props.setAmount}\r\n                            amount={this.props.amount}\r\n                            clickHandler={this.clickHandler}\r\n                            productDeliveryInfo={this.props.Work.ProductDeliveryInfo}\r\n                        />\r\n                    );\r\n                })}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nconst ProductComponent = ({\r\n    index,\r\n    isCurrent,\r\n    product,\r\n    productConfig,\r\n    setAmount,\r\n    amount,\r\n    clickHandler,\r\n    productDeliveryInfo\r\n}) => {\r\n    const classList = classNames(\"product-picker__item\", {\r\n        selected: isCurrent,\r\n        \"radio__indicator--selected\": isCurrent,\r\n        \"product-picker__item--selected\": isCurrent\r\n    });\r\n    const inStockClasses = classNames(\"price-label__stock\", {\r\n        \"info-type--info\": product.InfoType == InfoTypes.info,\r\n        \"info-type--alert\": product.InfoType == InfoTypes.alert\r\n    });\r\n    const priceClasses = classNames(\"product-picker__item__price\", {\r\n        discounted: product.DiscountedPrice\r\n    });\r\n    const hasPriceConfiguration = product.PriceConfigurations.length > 0;\r\n    const hasProductInfoTextButNoPriceConfiguration = product.ProductInfoText && !hasPriceConfiguration;\r\n\r\n    if (hasPriceConfiguration) {\r\n        amount = amount ?? productConfig.Quantity;\r\n    }\r\n\r\n    return (\r\n        <>\r\n            <div key={index} className={classList}>\r\n                <a\r\n                    className=\"product-picker__item__link\"\r\n                    href={product.ProductPageLink}\r\n                    onClick={e => {\r\n                        e.preventDefault();\r\n                        if (!isCurrent) {\r\n                            clickHandler(e, index);\r\n                        }\r\n                    }}\r\n                >\r\n                    <div className=\"product-picker__item__radiowrap\">\r\n                        <span className=\"radio__indicator\"></span>\r\n                    </div>\r\n\r\n                    <div className=\"product-picker__item__link__content\">\r\n                        <p className=\"product-picker--primary-text\">{product.MediaType}</p>\r\n                        {hasPriceConfiguration && (\r\n                            <div className={priceClasses}>\r\n                                <div>\r\n                                    <span className=\"product-picker__unit-text\">\r\n                                        {product.StockText ? (\r\n                                            <span className={inStockClasses}>{product.StockText}</span>\r\n                                        ) : (\r\n                                            <span>{product.PriceUnit}</span>\r\n                                        )}\r\n                                        {\" - \"}\r\n                                    </span>\r\n                                    <span className=\"product-picker__item__price-primary product-picker--primary-text\">\r\n                                        {product.PrimaryPrice}\r\n                                    </span>\r\n                                    {product.DiscountedPrice && (\r\n                                        <span className=\"product-picker__item__price-discount\">\r\n                                            {product.DiscountedPrice}\r\n                                        </span>\r\n                                    )}\r\n                                </div>\r\n                                <span className=\"product-picker__note\">{product.SecondaryPrice}</span>\r\n                                {product.IsPhysical && productDeliveryInfo && (\r\n                                    <DeliveryCostsModalButton productDeliveryInfo={productDeliveryInfo} />\r\n                                )}\r\n                                {isCurrent && productConfig.IsBuyable && productConfig.AllowQuantity && (\r\n                                    <div className=\"product-picker_quantitywrap\">\r\n                                        <AmountInput\r\n                                            context={product.Title}\r\n                                            onChange={e => {\r\n                                                setAmount(e.target.value);\r\n                                            }}\r\n                                            min=\"1\"\r\n                                            value={amount}\r\n                                        />\r\n                                    </div>\r\n                                )}\r\n                            </div>\r\n                        )}\r\n                    </div>\r\n                </a>\r\n            </div>\r\n            {isCurrent && hasProductInfoTextButNoPriceConfiguration && (\r\n                <div className=\"product-picker-selected-details\">\r\n                    <div className=\"product-picker__item__info__row\">\r\n                        <div className=\"product-picker__item__product-info-text\">\r\n                            <div dangerouslySetInnerHTML={{ __html: product.ProductInfoText }} />\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            )}\r\n        </>\r\n    );\r\n};\r\n\r\nProductPickerRadioSelect.propTypes = {\r\n    Work: propTypes.object.isRequired\r\n};\r\n\r\nexport default ProductPickerRadioSelect;\r\n","import React, { Component } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport ReactSuperSelect from \"react-super-select\";\r\nimport DropdownCheckboxes from \"ReactComponents/Shared/FormInputs/dropdown-checkboxes\";\r\nimport { productPickerComposer } from \"ReactReducers/ProductPicker/product-picker-composer\";\r\nimport Modal from \"ReactComponents/Modal/modal\";\r\n\r\nclass ProductPickerSelectedDetails extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            tempAmount: 0,\r\n            showClassSelector: false,\r\n            infoModalShow: false\r\n        };\r\n        this.selectChangeHandler = this.selectChangeHandler.bind(this);\r\n        this.classSelectorVisible = this.classSelectorVisible.bind(this);\r\n        this.classSelectorSubmitHandler = this.classSelectorSubmitHandler.bind(this);\r\n        this.openInfoModal = this.openInfoModal.bind(this);\r\n        this.closeInfoModal = this.closeInfoModal.bind(this);\r\n    }\r\n\r\n    openInfoModal() {\r\n        this.setState({ infoModalShow: true });\r\n    }\r\n\r\n    closeInfoModal() {\r\n        this.setState({ infoModalShow: false });\r\n    }\r\n\r\n    selectChangeHandler(objectSelected, ArrayOfChoices) {\r\n        for (let i = 0; i < ArrayOfChoices.length; i++) {\r\n            if (\r\n                ArrayOfChoices[i].UnitValue == objectSelected.UnitValue &&\r\n                ArrayOfChoices[i].UnitTypeCode == objectSelected.UnitTypeCode\r\n            ) {\r\n                this.props.setPeriodValueIndex(i);\r\n                return;\r\n            }\r\n        }\r\n    }\r\n\r\n    classSelectorVisible(value) {\r\n        this.setState({\r\n            showClassSelector: value\r\n        });\r\n    }\r\n\r\n    classSelectorSubmitHandler(value) {\r\n        this.classSelectorVisible(false);\r\n        this.props.setClassesValue(value);\r\n    }\r\n\r\n    getPriceBasisText() {\r\n        const c = this.props.configs;\r\n        const classOptions = c.ClassOptions.Options;\r\n        const relevantClasses =\r\n            this.props.product.RelevantClasses && this.props.product.RelevantClasses.Classes;\r\n\r\n        if (c.IsSchoolLicenseAndRelevantClasses && relevantClasses) {\r\n            // Price based on relevant classes\r\n            const generateString = () => {\r\n                const classCount = relevantClasses && relevantClasses.length;\r\n                let preText = \"\";\r\n                //TODO: maybe get flag from Sitecore if price configuration is pr. student?\r\n                const isPriceUnitStudent = this.props.product.PriceUnit.includes(\"elev\");\r\n\r\n                if (isPriceUnitStudent) {\r\n                    let studentCount = 0;\r\n                    relevantClasses &&\r\n                        relevantClasses.map(item => {\r\n                            studentCount += item.StudentCount;\r\n                        });\r\n                    preText = studentCount + \" \" + this.props.labels.StudentsLabel;\r\n                } else {\r\n                    preText = classCount + \" \" + this.props.labels.ClassesLabel;\r\n                }\r\n\r\n                return (\r\n                    <span>\r\n                        {preText} (\r\n                        {relevantClasses &&\r\n                            relevantClasses.map((item, index) => {\r\n                                const after = index + 1 == classCount ? \"\" : \", \";\r\n                                return (\r\n                                    <span key={index}>\r\n                                        {item.ClassName}\r\n                                        {after}\r\n                                    </span>\r\n                                );\r\n                            })}\r\n                        )\r\n                    </span>\r\n                );\r\n            };\r\n\r\n            return generateString();\r\n        } else if (c.ShowClassDropdown) {\r\n            // Price based on custom selected classes\r\n            const classes = classOptions.filter(item => item.Selected);\r\n            const numStudents = classes && classes.map(item => item.Value).reduce((a, b) => a + b, 0);\r\n            return c.PriceBasisText.replace(/\\{0\\}/g, classes.length).replace(/\\{1\\}/g, numStudents);\r\n        } else {\r\n            const numStudents =\r\n                classOptions && classOptions.map(item => item.Value).reduce((a, b) => a + b, 0);\r\n            return c.PriceBasisText.replace(/\\{0\\}/g, classOptions.length).replace(/\\{1\\}/g, numStudents);\r\n        }\r\n    }\r\n\r\n    render() {\r\n        //const product = this.props.product;\r\n        const c = this.props.configs;\r\n\r\n        const customSelectedValueTemplate = arr => {\r\n            const obj = arr[0];\r\n            return (\r\n                <div className=\"custom-selected-template\">\r\n                    <span>{obj.AccessPeriodText}</span>\r\n                    <span>{obj.PriceText}</span>\r\n                </div>\r\n            );\r\n        };\r\n\r\n        const customOptionTemplate = obj => {\r\n            return (\r\n                <div className=\"custom-selected-template\">\r\n                    <span>{obj.AccessPeriodText}</span>\r\n                    <span>{obj.PriceText}</span>\r\n                </div>\r\n            );\r\n        };\r\n\r\n        const periodSelectHandler = objSelected => {\r\n            if (objSelected) {\r\n                this.selectChangeHandler(objSelected, c.PeriodOptions);\r\n            }\r\n        };\r\n\r\n        const renderSelectClassesButton = selectedClasses => {\r\n            const hasSelectedClasses = selectedClasses.length > 0;\r\n            const btnClasses = classNames({\r\n                \"button button--slim\": true,\r\n                \"button-primary\": !hasSelectedClasses,\r\n                \"button-secondary\": hasSelectedClasses\r\n            });\r\n            const btnText = hasSelectedClasses ? c.EditSelectedLevels : c.ChooseSelectedLevelsText;\r\n            return (\r\n                <button\r\n                    type=\"button\"\r\n                    className={btnClasses}\r\n                    onClick={() => {\r\n                        this.classSelectorVisible(true);\r\n                    }}\r\n                >\r\n                    {btnText}\r\n                </button>\r\n            );\r\n        };\r\n\r\n        const renderConfigInputInfo = () => {\r\n            const showPeriodDropdown = c.PeriodOptions.length && c.PeriodOptions.length > 1;\r\n            // default selected\r\n            const selectedPeriodObject = c.PeriodOptions.filter(item => {\r\n                return item.Selected;\r\n            })[0];\r\n            const selectedClasses = c.ClassOptions.Options.filter(obj => obj.Selected).map(obj => obj.Label);\r\n\r\n            return (\r\n                <div>\r\n                    {c.ShowClassOptions && (\r\n                        <div className=\"product-picker__item__info__row\">\r\n                            <div className=\"full\">\r\n                                <DropdownCheckboxes\r\n                                    dataSource={c.ClassOptions.Options}\r\n                                    onChange={this.classSelectorSubmitHandler}\r\n                                    expanded={this.state.showClassSelector}\r\n                                    closeFunction={this.classSelectorVisible}\r\n                                    selectBtnText={c.ConfigurationSelect}\r\n                                />\r\n                                <div className=\"product-picker__choose-classes-wrapper\">\r\n                                    {renderSelectClassesButton(selectedClasses)}\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    )}\r\n                    {showPeriodDropdown && (\r\n                        <div className=\"product-picker__item__info__row vertical-align tall\">\r\n                            <div className=\"full\">\r\n                                <ReactSuperSelect\r\n                                    dataSource={c.PeriodOptions}\r\n                                    onChange={periodSelectHandler}\r\n                                    placeholder={c.ChoosePeriodText}\r\n                                    initialValue={selectedPeriodObject}\r\n                                    optionValueKey=\"PrimaryUnitPrice\"\r\n                                    optionLabelKey=\"TotalPriceLabel\"\r\n                                    customOptionTemplateFunction={customOptionTemplate}\r\n                                    customSelectedValueTemplateFunction={customSelectedValueTemplate}\r\n                                />\r\n                            </div>\r\n                        </div>\r\n                    )}\r\n                </div>\r\n            );\r\n        };\r\n\r\n        const renderSummaryInfo = () => {\r\n            const hasContent = c.AccessText || c.AccessPeriodText || c.AccessRenewText;\r\n            const priceBasisNotification = c.IsSchoolLicenseAndRelevantClasses\r\n                ? this.props.labels.PriceBasisNotification\r\n                : null;\r\n\r\n            return (\r\n                <div>\r\n                    {hasContent && (\r\n                        <div className=\"product-picker__item__info__row tall\">\r\n                            <table className=\"product-picker-table\">\r\n                                <tbody>\r\n                                    {c.AccessLabel && c.AccessText && (\r\n                                        <tr>\r\n                                            <td>{c.AccessLabel}</td>\r\n                                            <td className=\"u-text-align-right\">\r\n                                                {c.AccessText.replace(/\\{0\\}/g, this.props.amount)}\r\n                                            </td>\r\n                                        </tr>\r\n                                    )}\r\n                                    {c.AccessPeriodLabel && !!c.AccessPeriodText && (\r\n                                        <tr>\r\n                                            <td>{c.AccessPeriodLabel}</td>\r\n                                            {c.PeriodOptions.length > 1 &&\r\n                                            this.props.isGettingProductPrice ? (\r\n                                                <td className=\"u-text-align-right\">\r\n                                                    <div className=\"loader\">\r\n                                                        <span></span>\r\n                                                    </div>\r\n                                                </td>\r\n                                            ) : (\r\n                                                <td className=\"u-text-align-right\">{c.AccessPeriodText}</td>\r\n                                            )}\r\n                                        </tr>\r\n                                    )}\r\n                                    {c.AccessRenewLabel && c.AccessRenewText && (\r\n                                        <tr>\r\n                                            <td>{c.AccessRenewLabel}</td>\r\n                                            <td className=\"u-text-align-right\">{c.AccessRenewText}</td>\r\n                                        </tr>\r\n                                    )}\r\n                                    {c.PriceBasisLabel && (\r\n                                        <tr>\r\n                                            <td>{c.PriceBasisLabel}</td>\r\n                                            {this.props.isGettingProductPrice ? (\r\n                                                <td className=\"u-text-align-right\">\r\n                                                    <div className=\"loader\">\r\n                                                        <span></span>\r\n                                                    </div>\r\n                                                </td>\r\n                                            ) : (\r\n                                                <td className=\"u-text-align-right\">\r\n                                                    {this.getPriceBasisText()}\r\n                                                </td>\r\n                                            )}\r\n                                        </tr>\r\n                                    )}\r\n                                    {c.ShowClassOptions &&\r\n                                        !c.PriceBasisLabel &&\r\n                                        this.props.isGettingProductPrice && ( // First time getting PriceBasisText for class license\r\n                                            <tr>\r\n                                                <td></td>\r\n                                                <td className=\"u-text-align-right\">\r\n                                                    <div className=\"loader\">\r\n                                                        <span></span>\r\n                                                    </div>\r\n                                                </td>\r\n                                            </tr>\r\n                                        )}\r\n                                </tbody>\r\n                            </table>\r\n                        </div>\r\n                    )}\r\n                    {priceBasisNotification && (\r\n                        <div className=\"product-picker__item__info__row vertical-align\">\r\n                            <div\r\n                                className=\"full product-picker__note\"\r\n                                dangerouslySetInnerHTML={{ __html: priceBasisNotification }}\r\n                            />\r\n                        </div>\r\n                    )}\r\n                </div>\r\n            );\r\n        };\r\n\r\n        return (\r\n            <div className=\"product-picker-selected-details\">\r\n                {(c.LicenseLabel != null || c.LicenseText != null) && (\r\n                    <div>\r\n                        <div className=\"product-picker__item__info__row vertical-align\">\r\n                            <div className=\"left\">\r\n                                <span className=\"product-picker__item__info__row__header\">\r\n                                    {c.LicenseLabel}\r\n                                </span>\r\n                                {c.LicenseTypeText && !c.LicenseText && (\r\n                                    <span className=\"u-text-space-left\">{c.LicenseTypeText}</span>\r\n                                )}\r\n                                {c.LicenseTypeText && c.LicenseText && (\r\n                                    <div className=\"product-picker__note\">{c.LicenseTypeText}</div>\r\n                                )}\r\n                            </div>\r\n                            {/* TODO: Should be the institution, but we are not getting any. Change design for LicenseTypeText, if we'll get LicenseText! */}\r\n                            {c.LicenseText && (\r\n                                <div className=\"right product-picker__note\">{c.LicenseText}</div>\r\n                            )}\r\n                        </div>\r\n                        <hr />\r\n                    </div>\r\n                )}\r\n\r\n                {!c.IsBuyable && c.BuyableNote && (\r\n                    <div className=\"product-picker__item__info__row\">\r\n                        <div className=\"full\" dangerouslySetInnerHTML={{ __html: c.BuyableNote }} />\r\n                    </div>\r\n                )}\r\n\r\n                {c.IsBuyable && (\r\n                    <div>\r\n                        {renderSummaryInfo()}\r\n                        {renderConfigInputInfo()}\r\n                    </div>\r\n                )}\r\n\r\n                {c.PriceInfoLinkText && <hr />}\r\n                {c.PriceInfoLinkText && (\r\n                    <div className=\"product-picker__item__info__row\">\r\n                        <div className=\"full\">\r\n                            <div className=\"content-info\">\r\n                                <button type=\"button\" className=\"link-button\" onClick={this.openInfoModal}>\r\n                                    {c.PriceInfoLinkText}\r\n                                </button>\r\n                                <Modal\r\n                                    isOpen={this.state.infoModalShow}\r\n                                    toClose={this.closeInfoModal}\r\n                                    showCloseButton\r\n                                    labelledBy=\"price-info-title\"\r\n                                >\r\n                                    <div\r\n                                        className=\"content-rich-text\"\r\n                                        id=\"price-info-title\"\r\n                                        dangerouslySetInnerHTML={{ __html: c.PriceInfoContentText }}\r\n                                    />\r\n                                </Modal>\r\n                            </div>\r\n                        </div>\r\n                    </div>\r\n                )}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default productPickerComposer(ProductPickerSelectedDetails);\r\n","import React, { Component } from \"react\";\r\nimport ProductPickerSelectedDetails from \"./product-picker-selected-details\";\r\nimport IconArrow from \"ReactComponents/Shared/Icons/icon-arrow\";\r\nimport { productPickerComposer } from \"ReactReducers/ProductPicker/product-picker-composer\";\r\nimport propTypes from \"prop-types\";\r\n\r\nclass ProductPickerSelectedTypelist extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n\r\n        this.selectConfig = this.selectConfig.bind(this);\r\n    }\r\n\r\n    selectConfig(e, index) {\r\n        this.props.setSalesConfigIndex(index);\r\n    }\r\n\r\n    render() {\r\n        const product = this.props.product;\r\n        const productConfigs = product.PriceConfigurations;\r\n        const hasMoreProductConfigs = productConfigs.length !== 1;\r\n        const showList = this.props.salesConfigIndex === null;\r\n        const current = this.props.salesConfigIndex || 0;\r\n\r\n        const showTypeList = () => {\r\n            return (\r\n                <div className=\"product-picker-typelist__list\">\r\n                    {productConfigs.map((conf, index) => {\r\n                        return (\r\n                            <div key={index} className=\"product-picker-typelist__item\">\r\n                                <div className=\"left\">\r\n                                    <strong className=\"product-picker-typelist__item__Label\">\r\n                                        {conf.LicenseLabel || \"!LicenseLabel\"}\r\n                                    </strong>\r\n                                    <span className=\"product-picker-typelist__item__summary\">\r\n                                        {conf.ConfigurationSummary || \"!ConfigurationSummary\"}\r\n                                    </span>\r\n                                </div>\r\n                                <div className=\"right\">\r\n                                    <button\r\n                                        type=\"button\"\r\n                                        className=\"link-button\"\r\n                                        onClick={e => {\r\n                                            this.selectConfig(e, index);\r\n                                        }}\r\n                                    >\r\n                                        {conf.ConfigurationSelect}\r\n                                    </button>\r\n                                </div>\r\n                            </div>\r\n                        );\r\n                    })}\r\n                </div>\r\n            );\r\n        };\r\n\r\n        const showSelectedType = () => {\r\n            return (\r\n                <div className=\"product-picker-typelist__selection\">\r\n                    {hasMoreProductConfigs ? (\r\n                        <div className=\"product-picker-typelist__navigation\">\r\n                            <button\r\n                                type=\"button\"\r\n                                className=\"link-button\"\r\n                                onClick={e => {\r\n                                    this.selectConfig(e, null);\r\n                                }}\r\n                            >\r\n                                <IconArrow direction=\"left\" />\r\n                            </button>\r\n                        </div>\r\n                    ) : (\r\n                        \"\"\r\n                    )}\r\n                    <div className=\"product-picker-typelist__content\">\r\n                        {productConfigs.map((conf, index) => {\r\n                            const hasContent =\r\n                                conf.AccessText || conf.AccessPeriodText || conf.AccessRenewText;\r\n\r\n                            if (\r\n                                (hasContent || conf.ShowClassOptions) &&\r\n                                (current == index || !hasMoreProductConfigs)\r\n                            ) {\r\n                                return (\r\n                                    <ProductPickerSelectedDetails\r\n                                        key={index}\r\n                                        configs={conf}\r\n                                        product={this.props.product}\r\n                                        labels={this.props.labels}\r\n                                    />\r\n                                );\r\n                            }\r\n                        })}\r\n                    </div>\r\n                </div>\r\n            );\r\n        };\r\n\r\n        return (\r\n            <div className=\"product-picker-typelist\">\r\n                {showList && hasMoreProductConfigs ? showTypeList() : showSelectedType()}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nProductPickerSelectedTypelist.propTypes = {\r\n    product: propTypes.object.isRequired\r\n};\r\n\r\nexport default productPickerComposer(ProductPickerSelectedTypelist);\r\n","import React from \"react\";\r\nimport Modal from \"ReactComponents/Modal/modal\";\r\n\r\nexport interface LoginModalprops {\r\n    labels: {\r\n        LoginIntroText: string;\r\n        LoginButtonText: string;\r\n        CreateProfileButtonText: string;\r\n    };\r\n    CreateProfileUrl: string;\r\n    onLoginClick: () => void;\r\n    onClose: () => void;\r\n    isOpen: boolean;\r\n}\r\n\r\nconst LoginModal = (props: LoginModalprops) => {\r\n    return (\r\n        <Modal isOpen={props.isOpen} toClose={props.onClose} showCloseButton>\r\n            <div\r\n                className=\"login-modal content--white article-content\"\r\n                style={{\r\n                    margin: \"auto\"\r\n                }}\r\n            >\r\n                <div\r\n                    className=\"content--push-bottom\"\r\n                    dangerouslySetInnerHTML={{\r\n                        __html: props.labels.LoginIntroText\r\n                    }}\r\n                ></div>\r\n                <p className=\"u-text-align-center\">\r\n                    <button onClick={props.onLoginClick} className=\"button button--slim button--wide\">\r\n                        {props.labels.LoginButtonText}\r\n                    </button>\r\n                </p>\r\n                <p className=\"u-text-align-center\">\r\n                    <a className=\"button-hollow button--slim button--wide\" href={props.CreateProfileUrl}>\r\n                        {props.labels.CreateProfileButtonText}\r\n                    </a>\r\n                </p>\r\n            </div>\r\n        </Modal>\r\n    );\r\n};\r\n\r\nexport default LoginModal;\r\n","import React, { Component } from \"react\";\r\nimport ProductPickerRadioSelect from \"./product-picker-radio-select\";\r\nimport SpinnerButton from \"ReactComponents/Shared/FormInputs/spinner-button\";\r\nimport NoticeList from \"ReactComponents/Basket/notice-list\";\r\nimport * as priceConfigUtils from \"ReactComponents/Shared/Utils/priceConfigUtils\";\r\nimport Modal from \"../../Modal/modal\";\r\nimport * as tracking from \"ReactComponents/Shared/Utils/tracking\";\r\nimport ProductPickerSelectedTypelist from \"./product-picker-selected-typelist\";\r\nimport DeliveryCostsModalButton from \"ReactComponents/DeliveryCostsModalButton/delivery-costs-modal-button\";\r\nimport LoginModal from \"ReactComponents/LoginModal/login-modal\";\r\nimport { ADD_TO_BASKET_LOCALSTORAGE_KEY, SINGLE_USER_LICENSE_CODE } from \"../../../constants\";\r\n\r\nclass ProductPicker extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n\r\n        this.state = {\r\n            ghModalOpen: false,\r\n            loginModalOpen: false\r\n        };\r\n\r\n        this.onChangeHandler = this.onChangeHandler.bind(this);\r\n        this.submitHandler = this.submitHandler.bind(this);\r\n        this.productInBasket = this.productInBasket.bind(this);\r\n        this.getUpdateInButtonState = this.getUpdateInButtonState.bind(this);\r\n        this.toggleLoginModal = this.toggleLoginModal.bind(this);\r\n        this.onLoginAndAddToBasket = this.onLoginAndAddToBasket.bind(this);\r\n    }\r\n\r\n    isLoading() {\r\n        if (this.props.currentProduct) {\r\n            return this.props.isAdding.indexOf(this.props.currentProduct.Id) != -1;\r\n        }\r\n    }\r\n\r\n    onChangeHandler(e) {\r\n        this.props.onChange(e);\r\n    }\r\n\r\n    toggleLoginModal(open) {\r\n        this.setState({\r\n            loginModalOpen: open\r\n        });\r\n    }\r\n\r\n    submitHandler() {\r\n        this.props.addToBasket();\r\n    }\r\n\r\n    productInBasket(productId) {\r\n        const basketHasItems =\r\n            this.props.basket && this.props.basket.BasketItems && this.props.basket.BasketItems.length > 0;\r\n        const productInBasket =\r\n            basketHasItems && this.props.basket.BasketItems.find(item => item.Isbn == productId);\r\n\r\n        return productInBasket || false;\r\n    }\r\n\r\n    getUpdateInButtonState(currentProduct, basketVersionOfProduct, currentPriceConfig) {\r\n        const labels = this.props.Labels.ProductPickerLabels;\r\n        const putInBasket = { disabled: false, label: labels.PutInBasketText };\r\n        const inBasket = { disabled: true, label: labels.IsInBasketText };\r\n        const canUpdateBasket = { disabled: false, label: labels.UpdateBasketText };\r\n        const noClassesSelected = { disabled: true, label: labels.NoClassesSelectedText };\r\n        const noPeriodSelected = { disabled: true, label: labels.NoPeriodSelectedText };\r\n\r\n        const hasPeriodOptions =\r\n            currentPriceConfig.PeriodOptions && currentPriceConfig.PeriodOptions.length > 1;\r\n        const isPhysicalProduct = currentPriceConfig.AccessFormCode == 0;\r\n        const sameAccessFormInBasket =\r\n            currentPriceConfig.AccessFormCode == basketVersionOfProduct.AccessFormCode;\r\n\r\n        const checkPeriodOptions = () => {\r\n            const currentPeriod = currentPriceConfig.PeriodOptions.filter(item => {\r\n                return item.Selected;\r\n            })[0];\r\n\r\n            const sameUnitTypeCode =\r\n                currentPeriod && currentPeriod.UnitTypeCode == basketVersionOfProduct.PeriodUnitTypeCode;\r\n            const sameUnitValue =\r\n                currentPeriod && currentPeriod.UnitValue == basketVersionOfProduct.PeriodUnitValue;\r\n            const samePeriod = sameUnitTypeCode && sameUnitValue;\r\n            const sameAmountAsInBasket = basketVersionOfProduct.Count == this.props.amount;\r\n\r\n            if (!currentPeriod) {\r\n                // No period selected\r\n                //console.log(\"checkPeriodOptions - No period selected\")\r\n                return noPeriodSelected;\r\n            } else if (!currentProduct.IsInBasket) {\r\n                // Not in basket\r\n                //console.log(\"checkPeriodOptions - Not in basket\")\r\n                return putInBasket;\r\n            } else if (sameAccessFormInBasket && samePeriod && sameAmountAsInBasket) {\r\n                // Same license type as in basket && same period && same amount\r\n                //console.log(\"checkPeriodOptions - Same license type as in basket && samePeriod && same amount\")\r\n                return inBasket;\r\n            } else {\r\n                //console.log(\"checkPeriodOptions - else\")\r\n                return canUpdateBasket;\r\n            }\r\n        };\r\n\r\n        if (isPhysicalProduct) {\r\n            // Physical products\r\n            //console.log(\"Physical product\");\r\n            if (!basketVersionOfProduct) {\r\n                return putInBasket;\r\n            }\r\n            return basketVersionOfProduct.Count != this.props.amount ? canUpdateBasket : inBasket;\r\n        } else {\r\n            // License product (school/class/teacher or single user)\r\n            //console.log(\"License product (school/class/teacher or single user)\");\r\n\r\n            if (currentPriceConfig.ShowClassOptions) {\r\n                // Has CLASS OPTIONS\r\n                //console.log(\"License product - CLASS OPTIONS\");\r\n\r\n                const currentClassesValue = currentPriceConfig ? currentPriceConfig.ClassOptions.Options : [];\r\n                const selectedClasses =\r\n                    currentClassesValue && priceConfigUtils.classesSelectedArray(currentClassesValue);\r\n                const sameClassesInBasket =\r\n                    selectedClasses &&\r\n                    priceConfigUtils.sameClassesSelected(basketVersionOfProduct.Classes, currentClassesValue);\r\n\r\n                if (selectedClasses && selectedClasses.length < 1) {\r\n                    // No classes selected\r\n                    return noClassesSelected;\r\n                } else if (!currentProduct.IsInBasket) {\r\n                    // Not in basket\r\n                    return putInBasket;\r\n                } else if (sameAccessFormInBasket && sameClassesInBasket) {\r\n                    // Same selection as in basket\r\n                    return inBasket;\r\n                } else {\r\n                    return canUpdateBasket;\r\n                }\r\n            } else if (hasPeriodOptions) {\r\n                // Has PERIOD OPTIONS\r\n                //console.log(\"License product - PERIOD OPTIONS\");\r\n                return checkPeriodOptions();\r\n            } else if (currentPriceConfig.IsSchoolLicenseAndRelevantClasses) {\r\n                // Has RELEVANT CLASSES\r\n                //console.log(\"License product -  RELEVANT CLASSES\");\r\n\r\n                if (!currentProduct.IsInBasket) {\r\n                    // Not in basket\r\n                    return putInBasket;\r\n                } else if (currentPriceConfig.AccessFormCode == basketVersionOfProduct.AccessFormCode) {\r\n                    // Same selection as in basket\r\n                    return inBasket;\r\n                } else {\r\n                    return canUpdateBasket;\r\n                }\r\n            } else {\r\n                // School-, class- or single-user-license (NO Class options / NO Period options / NO Relevant classes)\r\n                //console.log(\"License product - BUT NO Class-options/Period-options/Relevant Classes\");\r\n                if (!currentProduct.IsInBasket) {\r\n                    // Not in basket\r\n                    //console.log(\"Not in basket\");\r\n                    return putInBasket;\r\n                } else if (currentPriceConfig.AccessFormCode == basketVersionOfProduct.AccessFormCode) {\r\n                    // Same selection as in basket\r\n                    //console.log(\"Same selection as in basket\");\r\n                    if (\r\n                        currentPriceConfig.AllowQuantity &&\r\n                        basketVersionOfProduct.Count != this.props.amount\r\n                    ) {\r\n                        // Same selection as in basket - but count has changed\r\n                        //console.log(\"Same selection as in basket - but count has changed\");\r\n                        return canUpdateBasket;\r\n                    }\r\n                    return inBasket;\r\n                } else {\r\n                    // Is in basket, but NOT same accessFormCode E.g. School license (All students + all employees) - not in basket - not a count change\r\n                    //console.log(\"Is in basket, but NOT same accessFormCode\");\r\n                    return canUpdateBasket;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /* Save added product to local storage before login */\r\n    onLoginAndAddToBasket() {\r\n        const currentPriceConfig =\r\n            this.props.currentProduct.PriceConfigurations[this.props.salesConfigIndex] || false;\r\n\r\n        const currentClassesValue = currentPriceConfig ? currentPriceConfig.ClassOptions.Options : [];\r\n\r\n        localStorage.setItem(\r\n            ADD_TO_BASKET_LOCALSTORAGE_KEY,\r\n            JSON.stringify({\r\n                amount: this.props.amount,\r\n                product: this.props.currentProduct,\r\n                periodValueIndex: this.props.periodValueIndex,\r\n                salesConfigIndex: this.props.salesConfigIndex,\r\n                classesValue: currentClassesValue,\r\n                workId: this.props.work.Id\r\n            })\r\n        );\r\n\r\n        this.props.userLogin();\r\n    }\r\n\r\n    render() {\r\n        //product and priceconfigs\r\n        const currentProduct = this.props.currentProduct;\r\n        const configIndex =\r\n            currentProduct.PriceConfigurations && currentProduct.PriceConfigurations.length > 1\r\n                ? this.props.salesConfigIndex\r\n                : 0;\r\n        const currentPriceConfig = currentProduct.PriceConfigurations[configIndex] || false;\r\n        const isPhysicalProduct = currentPriceConfig.AccessFormCode == 0;\r\n        const hasPriceConfiguration = currentProduct.PriceConfigurations.length > 0;\r\n\r\n        //ready based on basket\r\n        const basketVersionOfProduct = this.productInBasket(currentProduct.Id);\r\n        const basketButtonState =\r\n            this.getUpdateInButtonState(currentProduct, basketVersionOfProduct, currentPriceConfig) || {};\r\n\r\n        const renderHelpConsoleForDevelopment = () => {\r\n            return (\r\n                <div className=\"pptest\">\r\n                    <span>Current product:</span>\r\n                    <br />\r\n                    Id:{\" \"}\r\n                    {currentProduct.Id ? <span>{currentProduct.Id}</span> : <span>false/null/undefined</span>}\r\n                    <br />\r\n                    IsInBasket:{\" \"}\r\n                    {currentProduct.IsInBasket || (isPhysicalProduct && basketVersionOfProduct) ? (\r\n                        <span className=\"u-text-green\">true</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">false</span>\r\n                    )}\r\n                    <hr />\r\n                    <p>\r\n                        Current PriceConfiguration[<span className=\"u-text-green\">{configIndex}</span>]{\" \"}\r\n                    </p>\r\n                    <p>\r\n                        SalesFormCode:{\" \"}\r\n                        <span className=\"u-text-green\">{currentPriceConfig.SalesFormCode}</span>\r\n                    </p>\r\n                    <p>\r\n                        AccessFormCode:{\" \"}\r\n                        <span className=\"u-text-green\">{currentPriceConfig.AccessFormCode}</span>\r\n                    </p>\r\n                    IsInBasket:{\" \"}\r\n                    {this.props.work &&\r\n                    this.props.work.Products[this.props.currentProductIndex].IsInBasket ? (\r\n                        <span className=\"u-text-green\">true</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">false</span>\r\n                    )}\r\n                    <br />\r\n                    IsBuyable:{\" \"}\r\n                    {currentPriceConfig.IsBuyable ? (\r\n                        <span className=\"u-text-green\">true</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">false</span>\r\n                    )}\r\n                    <br />\r\n                    {currentPriceConfig.ShowClassOptions ? (\r\n                        <div>\r\n                            ShowClassOptions:\r\n                            <span className=\"u-text-green\">true</span>\r\n                            <br />\r\n                            ClassOptions.Label:\r\n                            <span className=\"u-text-green\">{currentPriceConfig.ClassOptions.Label}</span>\r\n                            <br />\r\n                            ClassOptions.Options.length:\r\n                            <span className=\"u-text-green\">\r\n                                {currentPriceConfig.ClassOptions.Options.length}\r\n                            </span>\r\n                            <br />\r\n                        </div>\r\n                    ) : (\r\n                        <div>\r\n                            ShowClassOptions: <span className=\"u-text-red\">false</span>\r\n                        </div>\r\n                    )}\r\n                    {currentPriceConfig.PeriodOptions ? (\r\n                        <div>\r\n                            {\" \"}\r\n                            PeriodOptions:\r\n                            <button\r\n                                type=\"button\"\r\n                                className=\"link-button\"\r\n                                onClick={() => {\r\n                                    alert(JSON.stringify(currentPriceConfig.PeriodOptions));\r\n                                }}\r\n                            >\r\n                                Show json\r\n                            </button>\r\n                        </div>\r\n                    ) : (\r\n                        <div>\r\n                            {\" \"}\r\n                            PeriodOptions: <span className=\"u-text-red\">false</span>\r\n                        </div>\r\n                    )}\r\n                    ShouldLogin:{\" \"}\r\n                    {currentPriceConfig.ShouldLogin ? (\r\n                        <span className=\"u-text-green\">true</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">false</span>\r\n                    )}\r\n                    <br />\r\n                    Selected:{\" \"}\r\n                    {currentPriceConfig.Selected ? (\r\n                        <span className=\"u-text-green\">true</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">false</span>\r\n                    )}\r\n                    <br />\r\n                    AllowQuantity:{\" \"}\r\n                    {currentPriceConfig.AllowQuantity ? (\r\n                        <span className=\"u-text-green\">true</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">false</span>\r\n                    )}\r\n                    <br />\r\n                    BuyableNote:{\" \"}\r\n                    {currentPriceConfig.BuyableNote ? (\r\n                        <span>{currentPriceConfig.BuyableNote}</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">null</span>\r\n                    )}\r\n                    <br />\r\n                    ProductInfoText:{\" \"}\r\n                    {currentProduct.ProductInfoText ? (\r\n                        <span>{currentProduct.ProductInfoText}</span>\r\n                    ) : (\r\n                        <span className=\"u-text-red\">null</span>\r\n                    )}\r\n                    <br />\r\n                    <button\r\n                        type=\"button\"\r\n                        className=\"link-button\"\r\n                        onClick={() => {\r\n                            alert(JSON.stringify(currentPriceConfig));\r\n                        }}\r\n                    >\r\n                        Show config json\r\n                    </button>\r\n                </div>\r\n            );\r\n        };\r\n\r\n        return (\r\n            <div className=\"product-picker\">\r\n                <div className=\"product-picker__trumpet\">{this.props.Labels.VariantsLabel}</div>\r\n                <ProductPickerRadioSelect\r\n                    Work={this.props.work}\r\n                    labels={this.props.Labels.ProductPickerLabels}\r\n                    current={this.props.currentProductIndex}\r\n                    onChange={this.onChangeHandler}\r\n                    setAmount={this.props.setAmount}\r\n                    amount={this.props.amount}\r\n                />\r\n\r\n                {currentProduct.PriceConfigurations.length > 0 && !currentProduct.HideConfigurationDetails && (\r\n                    <div className=\"product-picker__item__info\">\r\n                        <ProductPickerSelectedTypelist\r\n                            product={currentProduct}\r\n                            labels={this.props.Labels.ProductPickerLabels}\r\n                        />\r\n                    </div>\r\n                )}\r\n\r\n                {currentPriceConfig.IsBuyable && (\r\n                    <div className=\"product-picker__total\">\r\n                        {currentPriceConfig.DiscountedPrice && (\r\n                            <div className=\"discounted product-picker--primary-text product-picker__total-primary\">\r\n                                <span>{currentPriceConfig.PrimaryPriceText}</span>\r\n                                {this.props.isGettingProductPrice ? (\r\n                                    <div className=\"loader\">\r\n                                        <span></span>\r\n                                    </div>\r\n                                ) : (\r\n                                    <div>\r\n                                        <p className=\"product-picker__item__price-primary product-picker--primary-text\">\r\n                                            {currentPriceConfig.PrimaryPrice}\r\n                                        </p>\r\n                                        {currentPriceConfig.DiscountedPrice && (\r\n                                            <p className=\"product-picker__item__price-discount\">\r\n                                                {currentPriceConfig.DiscountedPrice}\r\n                                            </p>\r\n                                        )}\r\n                                    </div>\r\n                                )}\r\n                            </div>\r\n                        )}\r\n                        {!currentPriceConfig.DiscountedPrice && (\r\n                            <div className=\"product-picker--primary-text product-picker__total-primary\">\r\n                                <span>{currentPriceConfig.PrimaryPriceText}</span>\r\n                                {this.props.isGettingProductPrice ? (\r\n                                    <div className=\"loader\">\r\n                                        <span></span>\r\n                                    </div>\r\n                                ) : (\r\n                                    <div>\r\n                                        <p className=\"product-picker__item__price-primary product-picker--primary-text\">\r\n                                            {currentPriceConfig.PrimaryPrice}\r\n                                        </p>\r\n                                    </div>\r\n                                )}\r\n                            </div>\r\n                        )}\r\n                        <p className=\"product-picker__note product-picker__total-secondary\">\r\n                            {currentPriceConfig.SecondaryPrice}\r\n                        </p>\r\n                        {isPhysicalProduct && this.props.Work.ProductDeliveryInfo && (\r\n                            <DeliveryCostsModalButton\r\n                                isTotalButton={true}\r\n                                productDeliveryInfo={this.props.Work.ProductDeliveryInfo}\r\n                            />\r\n                        )}\r\n                    </div>\r\n                )}\r\n\r\n                {currentPriceConfig.AccessFormCode === SINGLE_USER_LICENSE_CODE ? (\r\n                    <div className=\"product-picker__buttons\">\r\n                        {currentPriceConfig.ShouldLogin && !this.props.loggedIn ? (\r\n                            <button\r\n                                type=\"button\"\r\n                                className=\"button button--slim button--wide\"\r\n                                onClick={() => this.toggleLoginModal(true)}\r\n                            >\r\n                                {basketButtonState.label}\r\n                            </button>\r\n                        ) : (\r\n                            <SpinnerButton\r\n                                className=\"button button-primary button--slim button--wide\"\r\n                                label={basketButtonState.label}\r\n                                disabled={this.isLoading() || basketButtonState.disabled}\r\n                                isLoading={this.isLoading()}\r\n                                onClick={this.submitHandler}\r\n                            />\r\n                        )}\r\n                    </div>\r\n                ) : (\r\n                    <div className=\"product-picker__buttons\">\r\n                        {currentPriceConfig.ShouldLogin && !this.props.loggedIn ? (\r\n                            <button\r\n                                type=\"button\"\r\n                                className=\"button button--slim button--wide button-secondary\"\r\n                                onClick={() => {\r\n                                    this.props.userLogin();\r\n                                }}\r\n                            >\r\n                                {basketButtonState.label}\r\n                            </button>\r\n                        ) : (\r\n                            <div>\r\n                                {currentPriceConfig.IsBuyable && (\r\n                                    <div>\r\n                                        {currentProduct.IsInBasket ||\r\n                                        (basketVersionOfProduct && isPhysicalProduct) ? (\r\n                                            <SpinnerButton\r\n                                                className=\"button button-secondary button--slim button--wide\"\r\n                                                label={basketButtonState.label}\r\n                                                disabled={this.isLoading() || basketButtonState.disabled}\r\n                                                isLoading={this.isLoading()}\r\n                                                onClick={this.submitHandler}\r\n                                            />\r\n                                        ) : (\r\n                                            <SpinnerButton\r\n                                                className=\"button button-primary button--slim button--wide\"\r\n                                                label={basketButtonState.label}\r\n                                                disabled={this.isLoading() || basketButtonState.disabled}\r\n                                                isLoading={this.isLoading()}\r\n                                                onClick={this.submitHandler}\r\n                                            />\r\n                                        )}\r\n                                    </div>\r\n                                )}\r\n                            </div>\r\n                        )}\r\n\r\n                        {this.props.showAddTodoButton && (\r\n                            <button\r\n                                className=\"button button--slim button--wide button-hollow\"\r\n                                onClick={() => {\r\n                                    tracking.growthHackTracking(\"TodoListClick\");\r\n                                    this.setState({ ghModalOpen: true });\r\n                                }}\r\n                            >\r\n                                Tilføj til huskeliste\r\n                            </button>\r\n                        )}\r\n                    </div>\r\n                )}\r\n\r\n                {currentProduct.ProductInfoText && hasPriceConfiguration && (\r\n                    <div className=\"product-picker__notification-container\">\r\n                        <NoticeList noticeArray={[currentProduct.ProductInfoText]} noIcon />\r\n                    </div>\r\n                )}\r\n                <Modal\r\n                    isOpen={this.state.ghModalOpen}\r\n                    toClose={() => {\r\n                        this.setState({ ghModalOpen: false });\r\n                    }}\r\n                    showCloseButton\r\n                >\r\n                    <div\r\n                        className=\"article-content\"\r\n                        style={{\r\n                            margin: \"auto\"\r\n                        }}\r\n                    >\r\n                        {/*\r\n                            This is temporary code that will be removed once GrowthHacking is finished\r\n                            - that's why there is no string from Sitecore\r\n                        */}\r\n                        <p className=\"u-text-align-center\">\r\n                            Vi er ved at undersøge behovet for en huskeliste – så tak fordi at du klikkede på\r\n                            linket. Hvis interessen for en huskeliste er stor, så udvikler vi denne funktion\r\n                            meget snart!\r\n                        </p>\r\n                    </div>\r\n                </Modal>\r\n                {false && renderHelpConsoleForDevelopment()}\r\n\r\n                <LoginModal\r\n                    labels={{\r\n                        CreateProfileButtonText: this.props.LoginModal.Labels.CreateProfileButtonText,\r\n                        LoginButtonText: this.props.LoginModal.Labels.LoginButtonText,\r\n                        LoginIntroText: this.props.LoginModal.Labels.LoginIntroText\r\n                    }}\r\n                    isOpen={this.state.loginModalOpen}\r\n                    onLoginClick={this.onLoginAndAddToBasket}\r\n                    onClose={() => this.toggleLoginModal(false)}\r\n                    CreateProfileUrl={this.props.LoginModal.CreateProfileUrl}\r\n                />\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default ProductPicker;\r\n","import React, { Component } from \"react\";\r\nimport striptags from \"striptags\";\r\n\r\nclass ProductDescriptionErrorBoundary extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = { hasError: false };\r\n    }\r\n\r\n    componentDidCatch() {\r\n        this.setState({ hasError: true });\r\n\r\n        // TODO: Get API function to log error\r\n        // logErrorToMyService(error, info);\r\n    }\r\n\r\n    render() {\r\n        if (this.state.hasError) {\r\n            return (\r\n                <div className=\"product-details__description\">\r\n                    <div>{striptags(this.props.description)}</div>\r\n                </div>\r\n            );\r\n        }\r\n        return this.props.children;\r\n    }\r\n}\r\n\r\nexport default ProductDescriptionErrorBoundary;\r\n","import React from \"react\";\r\n\r\ninterface IProductDescriptionProps {\r\n    description: string;\r\n}\r\n\r\nconst ProductDescription = ({ description }: IProductDescriptionProps) => {\r\n    return (\r\n        <div className=\"product-details__description\">\r\n            <div className=\"content-rich-text\" dangerouslySetInnerHTML={{ __html: description }} />\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default ProductDescription;\r\n","import * as React from \"react\";\r\n\r\nconst TrialLicenseMediaTypeRadioItem = props => {\r\n    // todo: selected prop\r\n    // ..mediaType\r\n    // ...rich content\r\n\r\n    // trialLicenseProduct\r\n    //  - TrialLicenseStatusTitle\r\n    //  - TrialLicenseStatusText\r\n    //  - MediaType\r\n    //  - Product\r\n\r\n    // other products\r\n\r\n    if (!props.label) return null;\r\n    return (\r\n        <button\r\n            type=\"button\"\r\n            className=\"trial-license-media-type-radio-btn\"\r\n            onClick={props.onClick}\r\n            style={{\r\n                position: \"relative\",\r\n                padding: \"5.5px 5.5px 5.5px 50px\",\r\n                width: \"100%\",\r\n                cursor: \"pointer\",\r\n                userSelect: \"none\"\r\n            }}\r\n        >\r\n            <div\r\n                className={[\r\n                    \"product-picker__item__radiowrap\",\r\n                    props.selected ? \"radio__indicator--selected\" : \"\"\r\n                ].join(\" \")}\r\n            >\r\n                <span className=\"radio__indicator\"></span>\r\n            </div>\r\n            {props.label}\r\n        </button>\r\n    );\r\n};\r\n\r\nexport default TrialLicenseMediaTypeRadioItem;\r\n","// @ts-check\r\nimport SpinnerButton from \"ReactComponents/Shared/FormInputs/spinner-button\";\r\nimport TrialLicenseMediaTypeRadioItem from \"./trial-license-media-type-radio-item\";\r\n// import { trialLicenseMediaTypeListComposer } from \"ReactReducers/TrialLicense/TrialLicenseMediaTypeList/trial-license-media-type-list-composer\";\r\nimport React from \"react\";\r\n\r\nclass TrialLicenseMediaTypeList extends React.Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            selectedIndex: 0\r\n        };\r\n    }\r\n\r\n    render() {\r\n        if (!this.props.trialLicenseProducts) return null;\r\n\r\n        return (\r\n            <div className=\"trial-license-media-type-list\">\r\n                <h1\r\n                    dangerouslySetInnerHTML={{\r\n                        __html: this.props.trialLicenseProducts[this.state.selectedIndex]\r\n                            .TrialLicenseStatusTitle\r\n                    }}\r\n                />\r\n\r\n                <div>\r\n                    {this.props.trialLicenseProducts.map((trialLicenseProduct, index) => {\r\n                        return (\r\n                            <TrialLicenseMediaTypeRadioItem\r\n                                onClick={() => {\r\n                                    this.setState({ selectedIndex: index });\r\n                                }}\r\n                                key={index}\r\n                                selected={index == this.state.selectedIndex}\r\n                                label={trialLicenseProduct.MediaType}\r\n                            />\r\n                        );\r\n                    })}\r\n                </div>\r\n\r\n                <div\r\n                    className=\"content-rich-text\"\r\n                    dangerouslySetInnerHTML={{\r\n                        __html: this.props.trialLicenseProducts[this.state.selectedIndex]\r\n                            .TrialLicenseStatusText\r\n                    }}\r\n                ></div>\r\n\r\n                {!this.props.trialLicenseOrdered &&\r\n                    this.props.trialLicenseOrdered !== undefined &&\r\n                    this.props.trialLicenseProducts[this.state.selectedIndex].OrderAccessButtonText &&\r\n                    this.props.trialLicenseProducts[this.state.selectedIndex].OrderAccessButtonText.length >\r\n                        0 && (\r\n                        <SpinnerButton\r\n                            isLoading={this.props.isLoading}\r\n                            onClick={() => {\r\n                                this.props.onClick(this.props.trialLicenseProducts[this.state.selectedIndex]);\r\n                            }}\r\n                            className=\"trial-license-media-type-list__button button button--slim\"\r\n                            context=\"Lægger i kurv...\"\r\n                            label={\r\n                                this.props.trialLicenseProducts[this.state.selectedIndex]\r\n                                    .OrderAccessButtonText\r\n                            }\r\n                        />\r\n                    )}\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default TrialLicenseMediaTypeList;\r\n","import React from \"react\";\r\n\r\nconst IconChevronRight = () => {\r\n    return (\r\n        <svg\r\n            width=\"9\"\r\n            height=\"14\"\r\n            viewBox=\"0 0 9 14\"\r\n            fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            role=\"presentation\"\r\n        >\r\n            <path\r\n                d=\"M1 13L7 6.88235L0.999999 1\"\r\n                stroke=\"currentColor\"\r\n                strokeWidth=\"2\"\r\n                strokeLinecap=\"round\"\r\n            />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default IconChevronRight;\r\n","import React from \"react\";\r\nimport IconChevronRight from \"ReactComponents/Shared/Icons/icon-chevron-right\";\r\n\r\nexport interface IProductMediaLinkWithCallbackProps {\r\n    label: string;\r\n    icon: JSX.Element;\r\n    onClick: () => void;\r\n}\r\n\r\nconst ProductMediaLinkWithCallback = ({ label, icon, onClick }: IProductMediaLinkWithCallbackProps) => {\r\n    return (\r\n        <button onClick={onClick} className=\"product-media-link\" type=\"button\">\r\n            {icon}\r\n            <div className=\"product-media-link__text\">{label}</div>\r\n            <IconChevronRight />\r\n        </button>\r\n    );\r\n};\r\n\r\nexport default ProductMediaLinkWithCallback;\r\n","import React from \"react\";\r\n\r\nconst IconBookOpen = () => {\r\n    return (\r\n        <svg\r\n            width=\"19\"\r\n            height=\"17\"\r\n            viewBox=\"0 0 19 17\"\r\n            fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            role=\"presentation\"\r\n        >\r\n            <path\r\n                fillRule=\"evenodd\"\r\n                clipRule=\"evenodd\"\r\n                d=\"M9.22 15.3796C8.00831 14.5542 6.57614 14.1127 5.11 14.1127C3.64386 14.1127 2.21169 14.5542 1 15.3796V2.26962C2.21169 1.44417 3.64386 1.00269 5.11 1.00269C6.57614 1.00269 8.00831 1.44417 9.22 2.26962V15.3796Z\"\r\n                fill=\"white\"\r\n                stroke=\"#555E67\"\r\n                strokeWidth=\"2\"\r\n                strokeLinecap=\"round\"\r\n                strokeLinejoin=\"round\"\r\n            />\r\n            <path\r\n                fillRule=\"evenodd\"\r\n                clipRule=\"evenodd\"\r\n                d=\"M17.4287 15.3797C16.2191 14.5538 14.7885 14.112 13.3238 14.112C11.859 14.112 10.4284 14.5538 9.21875 15.3797V2.26968C10.4284 1.44377 11.859 1.00195 13.3238 1.00195C14.7885 1.00195 16.2191 1.44377 17.4287 2.26968V15.3797Z\"\r\n                fill=\"white\"\r\n                stroke=\"#555E67\"\r\n                strokeWidth=\"2\"\r\n                strokeLinecap=\"round\"\r\n                strokeLinejoin=\"round\"\r\n            />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default IconBookOpen;\r\n","import { connect } from \"react-redux\";\r\nimport { trialLicenseActions as actions } from \"./trial-license-reducer\";\r\nimport { trialLicenseSelector } from \"./trial-license-reducer\";\r\n\r\nexport function trialLicenseComposer(Component) {\r\n    const mapStateToProps = function (state) {\r\n        return {\r\n            trialLicensePending: trialLicenseSelector.trialLicensePending(state),\r\n            trialLicenseValidateSuccess: trialLicenseSelector.trialLicenseValidateSuccess(state),\r\n            trialLicenseRequestSuccess: trialLicenseSelector.trialLicenseRequestSuccess(state),\r\n            trialLicenseError: trialLicenseSelector.trialLicenseError(state),\r\n            trialLicenseErrorMessage: trialLicenseSelector.trialLicenseErrorMessage(state),\r\n            trialLicenseStatus: trialLicenseSelector.trialLicenseStatus(state)\r\n        };\r\n    };\r\n\r\n    const mapDispatchToProps = function (dispatch) {\r\n        return {\r\n            trialLicenseRequest: Payload => dispatch(actions.trialLicenseRequest(Payload)),\r\n            trialLicenseValidate: Payload => dispatch(actions.trialLicenseValidate(Payload))\r\n        };\r\n    };\r\n\r\n    return connect(mapStateToProps, mapDispatchToProps)(Component);\r\n}\r\n","// @ts-check\r\nimport React, { Component } from \"react\";\r\nimport Modal from \"ReactComponents/Modal/modal\";\r\nimport { profileComposer } from \"ReactReducers/Profile/profile-composer\";\r\nimport { trialLicenseComposer } from \"ReactReducers/TrialLicense/trial-license-composer\";\r\nimport { basketComposer } from \"ReactReducers/Basket/basket-composer\";\r\nimport TrialLicenseMediaTypeList from \"./TrialLicenseMediaTypeList/trial-license-media-type-list\";\r\nimport ModalSpinner from \"ReactComponents/Modal/modal-spinner\";\r\nimport ProductMediaLinkWithCallback from \"ReactComponents/ProductPage/ProductMediaLink/product-media-link-with-callback\";\r\nimport IconBookOpen from \"ReactComponents/Shared/Icons/icon-book-open\";\r\nimport IconEmail from \"ReactComponents/Shared/Icons/icon-email\";\r\n\r\nclass TrialLicenseLink extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n        this.state = {\r\n            modalOpen: false,\r\n            isAdding: false\r\n        };\r\n        this.toggleModal = this.toggleModal.bind(this);\r\n        this.validateLicense = this.validateLicense.bind(this);\r\n        this.onClick = this.onClick.bind(this);\r\n        this.addToBasket = this.addToBasket.bind(this);\r\n        this.renderTrialLicense = this.renderTrialLicense.bind(this);\r\n    }\r\n\r\n    toggleModal(value) {\r\n        let val = this.state.modalOpen;\r\n        if (value != undefined) {\r\n            val = value;\r\n        }\r\n        this.setState({\r\n            modalOpen: val\r\n        });\r\n    }\r\n\r\n    // isLoading() {\r\n    //     if (this.props.TrialLicense.TrialLicenseProductIsbn) {\r\n    //         const isAdding =\r\n    //             this.props.isAdding.indexOf(this.props.TrialLicense.TrialLicenseProductIsbn) != -1;\r\n    //         const isAdding2 = this.props.isAdding.indexOf(this.props.product.Isbn13) != -1;\r\n\r\n    //         console.log(\"this.props.isAdding\", isAdding);\r\n    //         console.log(\"this.props.isAdding2\", isAdding2);\r\n\r\n    //         return isAdding || isAdding2;\r\n    //     }\r\n    // }\r\n\r\n    validateLicense() {\r\n        if (this.props.TrialLicense.IsUserPermitted) {\r\n            const isbn = this.props.TrialLicense.TrialLicenseProductIsbn;\r\n            this.props.trialLicenseValidate({ isbn });\r\n        } else this.toggleModal(true);\r\n    }\r\n\r\n    componentDidUpdate(prevProps) {\r\n        if (prevProps.isAdding.length > this.props.isAdding.length) {\r\n            // console.log(\"Added to basket OR something went wrong\");\r\n            this.setState({ isAdding: false });\r\n            this.setState({ modalOpen: false });\r\n        }\r\n\r\n        if (\r\n            (!prevProps.trialLicenseValidateSuccess && this.props.trialLicenseValidateSuccess) ||\r\n            (!prevProps.trialLicenseRequestSuccess && this.props.trialLicenseRequestSuccess) ||\r\n            (!prevProps.trialLicenseError && this.props.trialLicenseError)\r\n        ) {\r\n            this.toggleModal(true);\r\n        }\r\n    }\r\n\r\n    addToBasket(payload) {\r\n        this.setState({ isAdding: true });\r\n        const basketItem = {\r\n            Id: payload.Product.Id,\r\n            amount: 1,\r\n            product: payload.Product,\r\n            BasketLineType: payload.IsPhysical ? \"TeacherCopies\" : \"Trial\",\r\n            PeriodUnitTypeCode: payload.Product.TrialAccess?.PeriodUnitTypeCode,\r\n            PeriodUnitValue: payload.Product.TrialAccess?.PeriodUnitValue,\r\n            SalesFormCode: payload.Product.TrialAccess?.SalesFormCode,\r\n            AccessFormCode: payload.Product.TrialAccess?.AccessFormCode\r\n        };\r\n        this.props.add(basketItem);\r\n    }\r\n\r\n    onClick(payload) {\r\n        this.addToBasket(payload);\r\n    }\r\n\r\n    render() {\r\n        const trialLicense = this.props.TrialLicense;\r\n        const createProfileUrl = this.props.createProfileUrl || {};\r\n        const productTitle = this.props.product?.Title ?? \"\";\r\n        const siteName = this.props.siteName ?? \"\";\r\n        const leadText = trialLicense.OrderViaEmail?.LeadText ?? \"\";\r\n        const email = trialLicense.OrderViaEmail?.Email ?? \"\";\r\n        const buttonText = trialLicense.OrderViaEmail?.ButtonText ?? \"\";\r\n\r\n        if (!this.props.loggedIn) {\r\n            return (\r\n                <>\r\n                    <ProductMediaLinkWithCallback\r\n                        icon={<IconBookOpen />}\r\n                        label={trialLicense.OrderTrialAccessText}\r\n                        onClick={() => this.toggleModal(true)}\r\n                    />\r\n                    <Modal\r\n                        isOpen={this.state.modalOpen}\r\n                        toClose={() => {\r\n                            this.toggleModal(false);\r\n                        }}\r\n                        showCloseButton\r\n                        labelledBy=\"trial-license-modal-title\"\r\n                    >\r\n                        <div\r\n                            className=\"content--white article-content\"\r\n                            style={{\r\n                                maxWidth: \"400px\",\r\n                                margin: \"auto\"\r\n                            }}\r\n                        >\r\n                            <div\r\n                                id=\"trial-license-modal-title\"\r\n                                className=\"content--push-bottom\"\r\n                                dangerouslySetInnerHTML={{ __html: trialLicense.LoginIntroText }}\r\n                            ></div>\r\n                            <p className=\"u-text-align-center\">\r\n                                <button\r\n                                    type=\"button\"\r\n                                    onClick={this.props.userLogin}\r\n                                    className=\"button button--slim button--wide\"\r\n                                >\r\n                                    {trialLicense.LoginButtonText}\r\n                                </button>\r\n                            </p>\r\n                            <p className=\"u-text-align-center\">\r\n                                <a\r\n                                    href={createProfileUrl.Url}\r\n                                    className=\"button-hollow button--slim button--wide\"\r\n                                >\r\n                                    {trialLicense.CreateProfileButtonText}\r\n                                </a>\r\n                            </p>\r\n\r\n                            {siteName === \"Gu\" && email && leadText && buttonText && (\r\n                                <>\r\n                                    <p className=\"u-text-align-center\">{leadText}</p>\r\n                                    <a\r\n                                        href={`mailto:${email}?subject=Bestilling%20af%20prøveadgang%20til:%20${productTitle}%20-%20${trialLicense.TrialLicenseProductIsbn}&body=Skriv%20din%20kontaktinfo%20her%0D%0ANavn:%0D%0AEmail:%0D%0ATlf.%20nr.:%0D%0AStilling:%0D%0ASkolenavn:%0D%0AInstitutionsnummer:%0D%0AKommune:`}\r\n                                        className=\"button-hollow button--slim button--wide button--flex button--has-icon\"\r\n                                    >\r\n                                        <IconEmail />\r\n                                        {buttonText}\r\n                                    </a>\r\n                                </>\r\n                            )}\r\n                        </div>\r\n                    </Modal>\r\n                </>\r\n            );\r\n        }\r\n\r\n        return (\r\n            <>\r\n                <ProductMediaLinkWithCallback\r\n                    icon={<IconBookOpen />}\r\n                    label={trialLicense.OrderTrialAccessText}\r\n                    onClick={this.validateLicense}\r\n                />\r\n                <div>\r\n                    <ModalSpinner isOpen={this.props.trialLicensePending && !this.props.trialLicenseError} />\r\n                    {this.renderTrialLicense(trialLicense, this.props.trialLicenseErrorMessage)}\r\n                </div>\r\n            </>\r\n        );\r\n    }\r\n\r\n    renderTrialLicense(trialLicense, errorMessage) {\r\n        if (errorMessage) {\r\n            return (\r\n                <Modal\r\n                    isOpen={this.state.modalOpen}\r\n                    toClose={() => {\r\n                        this.toggleModal(false);\r\n                    }}\r\n                    showCloseButton\r\n                    labelledBy=\"trial-license-modal-error-title\"\r\n                >\r\n                    <div\r\n                        id=\"trial-license-modal-error-title\"\r\n                        className=\"content--white article-content\"\r\n                        dangerouslySetInnerHTML={{ __html: errorMessage }}\r\n                    />\r\n                </Modal>\r\n            );\r\n        }\r\n\r\n        return trialLicense.IsUserPermitted ? (\r\n            <Modal\r\n                isOpen={this.state.modalOpen}\r\n                toClose={() => {\r\n                    this.toggleModal(false);\r\n                }}\r\n                showCloseButton\r\n            >\r\n                <div className=\"content--white article-content\">\r\n                    <TrialLicenseMediaTypeList\r\n                        trialLicenseProducts={this.props.trialLicenseStatus.TrialLicenseProducts}\r\n                        trialLicenseOrdered={this.props.trialLicenseStatus.TrialLicenseOrdered}\r\n                        onClick={this.onClick}\r\n                        isLoading={this.state.isAdding}\r\n                    />\r\n                </div>\r\n            </Modal>\r\n        ) : (\r\n            <Modal\r\n                isOpen={this.state.modalOpen}\r\n                toClose={() => {\r\n                    this.toggleModal(false);\r\n                }}\r\n                showCloseButton\r\n                labelledBy=\"trial-license-modal-invalid-permission-title\"\r\n            >\r\n                <div className=\"content--white article-content\">\r\n                    <div\r\n                        id=\"trial-license-modal-invalid-permission-title\"\r\n                        className=\"content-rich-text\"\r\n                        dangerouslySetInnerHTML={{\r\n                            __html: trialLicense.InvalidPermissionText\r\n                        }}\r\n                    />\r\n                </div>\r\n            </Modal>\r\n        );\r\n    }\r\n}\r\n\r\nexport default basketComposer(trialLicenseComposer(profileComposer(TrialLicenseLink)));\r\n","import React from \"react\";\r\nimport IconChevronRight from \"ReactComponents/Shared/Icons/icon-chevron-right\";\r\n\r\nexport interface IProductMediaLinkProps {\r\n    label: string;\r\n    url: string;\r\n    target?: string;\r\n    icon: JSX.Element;\r\n}\r\n\r\nconst ProductMediaLink = ({ label, url, target = \"_blank\", icon }: IProductMediaLinkProps) => {\r\n    return (\r\n        <a href={url} target={target} className=\"product-media-link\">\r\n            {icon}\r\n            <div className=\"product-media-link__text\">{label}</div>\r\n            <IconChevronRight />\r\n        </a>\r\n    );\r\n};\r\n\r\nexport default ProductMediaLink;\r\n","import React from \"react\";\r\n\r\nconst IconBars = () => {\r\n    return (\r\n        <svg\r\n            width=\"18\"\r\n            height=\"17\"\r\n            viewBox=\"0 0 18 17\"\r\n            fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            role=\"presentation\"\r\n        >\r\n            <path d=\"M1 1H17\" stroke=\"#555E67\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n            <path d=\"M1 6H17\" stroke=\"#555E67\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n            <path d=\"M1 11H17\" stroke=\"#555E67\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n            <path d=\"M1 16H11\" stroke=\"#555E67\" strokeWidth=\"2\" strokeLinecap=\"round\" />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default IconBars;\r\n","import React, { Component } from \"react\";\r\nimport Swiper from \"react-slick\";\r\nimport SliderNavigationButton from \"ReactComponents/Shared/SliderNavigation/slider-navigation-button\";\r\n\r\nclass ProductReviewBlock extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n    }\r\n\r\n    render() {\r\n        const reviewsArray = this.props.productReviews;\r\n        const reviewsCount = reviewsArray.length;\r\n        const swiperSettings = {\r\n            infinite: false,\r\n            slidesToShow: 1,\r\n            slidesToScroll: 1,\r\n            dots: reviewsCount > 1,\r\n            arrows: true,\r\n            prevArrow: <SliderNavigationButton arrowDirection=\"left\" />,\r\n            nextArrow: <SliderNavigationButton arrowDirection=\"right\" />,\r\n            easing: \"ease\",\r\n            speed: \"400\"\r\n        };\r\n\r\n        return (\r\n            <div className=\"product-review-block\">\r\n                <div className=\"product-review-block__slider custom-slick-slider\">\r\n                    <Swiper {...swiperSettings}>\r\n                        {reviewsArray &&\r\n                            reviewsArray.map((review, index) => {\r\n                                return (\r\n                                    <div key={index}>\r\n                                        <div className=\"product-review__item\">\r\n                                            <div\r\n                                                className=\"product-review__item__body\"\r\n                                                dangerouslySetInnerHTML={{ __html: review.ReviewText }}\r\n                                            />\r\n                                            {review.ReviewAuthor && (\r\n                                                <div\r\n                                                    className=\"product-review__item__author\"\r\n                                                    dangerouslySetInnerHTML={{ __html: review.ReviewAuthor }}\r\n                                                />\r\n                                            )}\r\n                                            {(review.ReviewSource || review.ReviewDate) && (\r\n                                                <div className=\"product-review__item__origin\">\r\n                                                    {review.ReviewSource && (\r\n                                                        <span\r\n                                                            className=\"origin-source\"\r\n                                                            dangerouslySetInnerHTML={{\r\n                                                                __html: review.ReviewSource\r\n                                                            }}\r\n                                                        />\r\n                                                    )}\r\n                                                    {review.ReviewDate && (\r\n                                                        <span\r\n                                                            className=\"origin-date\"\r\n                                                            dangerouslySetInnerHTML={{\r\n                                                                __html: review.ReviewDate\r\n                                                            }}\r\n                                                        />\r\n                                                    )}\r\n                                                </div>\r\n                                            )}\r\n                                        </div>\r\n                                    </div>\r\n                                );\r\n                            })}\r\n                    </Swiper>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default ProductReviewBlock;\r\n","import React, { Component } from \"react\";\r\n\r\nclass Facts extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n    }\r\n\r\n    render() {\r\n        const product = this.props.product;\r\n\r\n        return (\r\n            <div className=\"facts-tab-container\">\r\n                <div className=\"facts-tab-content\">\r\n                    <table className=\"facts-tab__facts-list\">\r\n                        <tbody>\r\n                            {product.ProductFacts.map((fact, index) => (\r\n                                <tr key={index}>\r\n                                    <td className=\"label\">{fact.Label}</td>\r\n                                    <td className=\"value\">\r\n                                        <div\r\n                                            className=\"content-rich-text\"\r\n                                            dangerouslySetInnerHTML={{ __html: fact.Text }}\r\n                                        />\r\n                                    </td>\r\n                                </tr>\r\n                            ))}\r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Facts;\r\n","import React from \"react\";\r\n\r\nconst IconPDF = () => {\r\n    return (\r\n        <svg\r\n            width=\"19\"\r\n            height=\"24\"\r\n            viewBox=\"0 0 19 24\"\r\n            fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            role=\"presentation\"\r\n        >\r\n            <path\r\n                d=\"M3 23H16C17.1046 23 18 22.1046 18 21V8.58509C18 8.11363 17.8334 7.65732 17.5297 7.29671L12.8258 1.71161C12.4457 1.26042 11.8859 1 11.296 1H3C1.89543 1 1 1.89543 1 3V21C1 22.1046 1.89543 23 3 23Z\"\r\n                fill=\"currentColor\"\r\n                fillOpacity=\"0.1\"\r\n                stroke=\"currentColor\"\r\n                strokeWidth=\"2\"\r\n                strokeLinejoin=\"round\"\r\n            />\r\n            <path\r\n                d=\"M4.55475 19H5.17075V18.16H5.63875C6.26675 18.16 6.77075 17.824 6.77075 17.176V17.168C6.77075 16.596 6.36675 16.2 5.69875 16.2H4.55475V19ZM5.17075 17.612V16.756H5.64675C5.95475 16.756 6.14675 16.904 6.14675 17.18V17.188C6.14675 17.428 5.96675 17.612 5.65875 17.612H5.17075ZM7.22663 19H8.31863C9.19863 19 9.80663 18.388 9.80663 17.6V17.592C9.80663 16.804 9.19863 16.2 8.31863 16.2H7.22663V19ZM7.84263 18.444V16.756H8.31863C8.82263 16.756 9.16263 17.104 9.16263 17.6V17.608C9.16263 18.104 8.82263 18.444 8.31863 18.444H7.84263ZM10.3555 19H10.9715V17.916H12.3075V17.356H10.9715V16.76H12.4875V16.2H10.3555V19Z\"\r\n                fill=\"currentColor\"\r\n            />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default IconPDF;\r\n","import React, { Component } from \"react\";\r\nimport IconPDF from \"ReactComponents/Shared/Icons/icon-pdf\";\r\n\r\nclass Extra extends Component {\r\n    constructor(props) {\r\n        super(props);\r\n    }\r\n\r\n    render() {\r\n        const freeMaterialGroups = this.props.freeMaterials?.FreeMaterialGroups || [];\r\n\r\n        return (\r\n            <div className=\"free-materials-tab-container\">\r\n                <div className=\"free-materials-tab-content\">\r\n                    <div className=\"free-materials__groups\">\r\n                        {freeMaterialGroups.map((item, idx) => (\r\n                            <div className=\"free-materials__group\" key={idx}>\r\n                                {item.GroupType && (\r\n                                    <h3 className=\"free-materials__group-title\">\r\n                                        <div\r\n                                            className=\"free-materials__group-title__text\"\r\n                                            dangerouslySetInnerHTML={{ __html: item.GroupTitle }}\r\n                                        />\r\n                                    </h3>\r\n                                )}\r\n                                {item.GroupMaterials &&\r\n                                    item.GroupMaterials.map((item, idx) => {\r\n                                        return (\r\n                                            <a key={idx} href={item.Url || \"#\"}>\r\n                                                <IconPDF />\r\n                                                <span\r\n                                                    dangerouslySetInnerHTML={{\r\n                                                        __html: item.Description + item.Extension\r\n                                                    }}\r\n                                                />\r\n                                            </a>\r\n                                        );\r\n                                    })}\r\n                            </div>\r\n                        ))}\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Extra;\r\n","import React from \"react\";\r\n\r\nconst IconWebsite = () => {\r\n    return (\r\n        <svg\r\n            className=\"icon-website\"\r\n            width=\"20\"\r\n            height=\"20\"\r\n            viewBox=\"0 0 20 20\"\r\n            fill=\"none\"\r\n            xmlns=\"http://www.w3.org/2000/svg\"\r\n            role=\"presentation\"\r\n        >\r\n            <path\r\n                d=\"M17 1H3C1.89543 1 1 1.89543 1 3V17C1 18.1046 1.89543 19 3 19H17C18.1046 19 19 18.1046 19 17V3C19 1.89543 18.1046 1 17 1Z\"\r\n                stroke=\"#555E67\"\r\n                strokeWidth=\"2\"\r\n                strokeLinecap=\"round\"\r\n                strokeLinejoin=\"round\"\r\n            />\r\n            <path d=\"M1 7H19\" stroke=\"#555E67\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n            <circle cx=\"4\" cy=\"4\" r=\"1\" fill=\"#555E67\" />\r\n            <circle cx=\"7\" cy=\"4\" r=\"1\" fill=\"#555E67\" />\r\n            <circle cx=\"10\" cy=\"4\" r=\"1\" fill=\"#555E67\" />\r\n        </svg>\r\n    );\r\n};\r\n\r\nexport default IconWebsite;\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { productPickerComposer } from \"ReactReducers/ProductPicker/product-picker-composer\";\r\nimport { profileComposer } from \"ReactReducers/Profile/profile-composer\";\r\nimport ViewMoreSection from \"ReactComponents/Shared/AnimationComponents/view-more-section\";\r\nimport ProductPicker from \"ReactComponents/ProductPage/ProductPicker/product-picker\";\r\n// import InspectionCopyLink from \"ReactComponents/InspectionCopy/inspection-copy\";\r\nimport IconLogo from \"ReactComponents/Shared/Icons/icon-logo\";\r\nimport ProductDescriptionErrorBoundary from \"./ProductDescription/product-description-error-boundary\";\r\nimport ProductDescription from \"./ProductDescription/product-description\";\r\nimport * as tracking from \"ReactComponents/Shared/Utils/tracking\";\r\nimport IWork from \"interfaces/IWork\";\r\nimport ILabels from \"interfaces/ILabels\";\r\nimport IBasketItem from \"interfaces/IBasketItem\";\r\nimport ITrialLicense from \"interfaces/ITrialLicense\";\r\nimport TrialLicenseLink from \"ReactComponents/TrialLicense/trial-license-link\";\r\nimport { IProfileState } from \"ReactReducers/Profile/profile-reducer\";\r\nimport { Draft } from \"@reduxjs/toolkit\";\r\nimport IInspectionCopy from \"interfaces/IInspectionCopy\";\r\nimport ProductMediaLink from \"./ProductMediaLink/product-media-link\";\r\nimport IconBars from \"ReactComponents/Shared/Icons/icon-bars\";\r\nimport IconBookOpen from \"ReactComponents/Shared/Icons/icon-book-open\";\r\nimport ProductReviewBlock from \"./product-review-block\";\r\nimport Facts from \"./tab-facts\";\r\nimport FreeMaterials from \"ReactComponents/ProductPage/tab-free-materials\";\r\nimport IconWebsite from \"ReactComponents/Shared/Icons/icon-website\";\r\nimport Tabs from \"ReactComponents/Tabs/tabs\";\r\nimport Tab from \"ReactComponents/Tabs/tab\";\r\nimport ProductSlider from \"ReactComponents/ProductSlider/product-slider\";\r\nimport { ADD_TO_BASKET_LOCALSTORAGE_KEY } from \"../../constants\";\r\nimport { FormColumnProps } from \"ReactComponents/TwoColumnGrid/two-column-grid\";\r\nimport DynamicContactForm from \"ReactComponents/DynamicContactForm/dynamic-contact-form\";\r\n\r\nexport interface IProductPageProps {\r\n    SiteName: string;\r\n    ProductIndex: number;\r\n    Work: IWork;\r\n    Labels: ILabels;\r\n    productPickerWork?: IWork;\r\n    productPickerProduct?: number;\r\n    amount: number;\r\n    TrialLicense?: ITrialLicense;\r\n    ShowAddTodoButton: boolean;\r\n    ShowReviewLink: boolean;\r\n    loggedIn: boolean;\r\n    isAdding: string[];\r\n    DynamicContactFormViewModel?: FormColumnProps;\r\n    userLogin: (state: Draft<IProfileState>) => Draft<IProfileState>;\r\n    InspectionCopy?: IInspectionCopy;\r\n    setProductIndex: (productIndex: number) => void;\r\n    basketAdd: (basketItem: IBasketItem) => void;\r\n    setAmount: (quantity: number) => void;\r\n    setWork: (work: IWork) => void;\r\n}\r\n\r\nconst ProductPage: React.FC<IProductPageProps> = props => {\r\n    console.log(\"ProductPage\", props);\r\n    const [currentProductIndex, setCurrentProductIndex] = useState(0);\r\n\r\n    const { ...formProps } = props.DynamicContactFormViewModel ?? null;\r\n\r\n    const onChangeProduct = useCallback(\r\n        (e: { target: { value: number } }) => {\r\n            const productChanged = e.target.value !== currentProductIndex;\r\n            if (productChanged) {\r\n                const work = props.productPickerWork ? props.productPickerWork : props.Work;\r\n                const product = work.Products[e.target.value];\r\n\r\n                if (product.ProductPageLink) {\r\n                    const url = window.location.origin + product.ProductPageLink;\r\n                    window.history.replaceState({}, \"\", url);\r\n                }\r\n\r\n                setCurrentProductIndex(e.target.value);\r\n                props.setProductIndex(e.target.value);\r\n\r\n                tracking.productDetailsView({ product });\r\n            }\r\n        },\r\n        [\r\n            props.productPickerWork,\r\n            props.Work,\r\n            currentProductIndex,\r\n            setCurrentProductIndex,\r\n            props.setProductIndex\r\n        ]\r\n    );\r\n\r\n    const addToBasket = useCallback(() => {\r\n        const work = props.productPickerWork ? props.productPickerWork : props.Work;\r\n        const index = props.productPickerProduct ?? currentProductIndex;\r\n        const product = work.Products[index];\r\n        const addToBasketItem = localStorage.getItem(ADD_TO_BASKET_LOCALSTORAGE_KEY);\r\n\r\n        const basketItem = {\r\n            Id: product.Id,\r\n            amount: props.amount,\r\n            product: product\r\n        };\r\n\r\n        if (addToBasketItem) {\r\n            const parsedObj = JSON.parse(addToBasketItem);\r\n            basketItem.Id = parsedObj.product.Id;\r\n            basketItem.amount = parsedObj.product.Amount;\r\n            basketItem.product = parsedObj.product;\r\n        }\r\n\r\n        props.basketAdd(basketItem);\r\n    }, [\r\n        props.productPickerWork,\r\n        props.Work,\r\n        props.basketAdd,\r\n        currentProductIndex,\r\n        props.productPickerProduct,\r\n        props.amount\r\n    ]);\r\n\r\n    useEffect(() => {\r\n        setCurrentProductIndex(props.ProductIndex || 0);\r\n        props.setProductIndex(props.ProductIndex ?? 0);\r\n\r\n        tracking.productDetailsView({ product: props.Work.Products[props.ProductIndex] });\r\n        props.setWork(props.Work);\r\n    }, []);\r\n\r\n    /* Automatically add to basket if \"addToBasketOnLoginReturn\" key is set in local storage */\r\n    useEffect(() => {\r\n        const basketItemFromLocalStorage = localStorage.getItem(ADD_TO_BASKET_LOCALSTORAGE_KEY);\r\n\r\n        if (!props.loggedIn) {\r\n            localStorage.removeItem(ADD_TO_BASKET_LOCALSTORAGE_KEY);\r\n        }\r\n\r\n        if (basketItemFromLocalStorage && props.loggedIn) {\r\n            addToBasket();\r\n\r\n            localStorage.removeItem(ADD_TO_BASKET_LOCALSTORAGE_KEY);\r\n        }\r\n    }, []);\r\n\r\n    const work = props.productPickerWork ?? props.Work;\r\n    const index = props.productPickerProduct ?? currentProductIndex;\r\n    const product = work.Products[index];\r\n\r\n    const licenceProduct = props.TrialLicense && work.Products[props.TrialLicense.ProductIndex];\r\n    // Insert potential word break after . to gracefully break website titles\r\n    const formattedTitle = product.Title.replace(/\\./g, \".<wbr>\");\r\n\r\n    const trialLicenseLinkProps = {\r\n        basketAdd: props.basketAdd,\r\n        TrialLicense: props.TrialLicense,\r\n        product: licenceProduct,\r\n        siteName: props.SiteName,\r\n        isAdding: props.isAdding\r\n    };\r\n\r\n    return (\r\n        <>\r\n            <div className=\"product-page-container\">\r\n                <div className=\"product-details-container\">\r\n                    <div className=\"product-left-container\">\r\n                        <div className=\"product__img\">\r\n                            {product.CoverImageUrl ? (\r\n                                <img\r\n                                    src={product.CoverImageUrl + \"&w=320\"}\r\n                                    loading=\"lazy\"\r\n                                    alt={`Forsideillustration til ${product.Title}`}\r\n                                />\r\n                            ) : (\r\n                                <div className=\"product__img--fallback\">\r\n                                    <IconLogo />\r\n                                </div>\r\n                            )}\r\n                        </div>\r\n                        <div className=\"product__media\">\r\n                            {product.CustomLink &&\r\n                                product.CustomLink.LinkText &&\r\n                                product.CustomLink.LinkUrl && (\r\n                                    <ProductMediaLink\r\n                                        label={product.CustomLink.LinkText}\r\n                                        url={product.CustomLink.LinkUrl}\r\n                                        target={product.CustomLink.Target}\r\n                                        icon={<IconBookOpen />}\r\n                                    />\r\n                                )}\r\n                            {props.Labels.ReadingSampleLink && (\r\n                                <ProductMediaLink\r\n                                    label={props.Labels.ReadingSampleLink}\r\n                                    url=\"\"\r\n                                    icon={<IconBookOpen />}\r\n                                />\r\n                            )}\r\n                            {product.HasTrialAccess && props.TrialLicense && (\r\n                                <TrialLicenseLink {...trialLicenseLinkProps} />\r\n                            )}\r\n                            {product.SampleUrl && (\r\n                                <ProductMediaLink\r\n                                    label={product.SampleUrl.Text}\r\n                                    url={product.SampleUrl.Url}\r\n                                    icon={<IconBars />}\r\n                                />\r\n                            )}\r\n                            {product.DigitalProductUrl && (\r\n                                <ProductMediaLink\r\n                                    label={product.DigitalProductUrl.Text}\r\n                                    url={product.DigitalProductUrl.Url}\r\n                                    icon={<IconWebsite />}\r\n                                />\r\n                            )}\r\n                            {props.InspectionCopy &&\r\n                                props.InspectionCopy.ShowInspectionCopyLink &&\r\n                                props.DynamicContactFormViewModel &&\r\n                                props.DynamicContactFormViewModel?.DynamicFieldsList.length > 0 && (\r\n                                    <ProductMediaLink\r\n                                        icon={<IconBookOpen />}\r\n                                        label={props.InspectionCopy.ButtonText}\r\n                                        target=\"\"\r\n                                        url=\"#DynamicContactFormAnchorLink\"\r\n                                    />\r\n                                )}\r\n                        </div>\r\n                    </div>\r\n\r\n                    <div className=\"product__meta\">\r\n                        <div className=\"product__meta__info\">\r\n                            <span className=\"product__category\">{props.Work.Category}</span>\r\n                            <h1\r\n                                className=\"product__title u-text-word-break-word\"\r\n                                dangerouslySetInnerHTML={{ __html: formattedTitle }}\r\n                            />\r\n\r\n                            {product.Subtitle && <p className=\"product__subtitle\">{product.Subtitle}</p>}\r\n\r\n                            {product.EditorsListLong && (\r\n                                <div className=\"product__editors\">\r\n                                    <span\r\n                                        dangerouslySetInnerHTML={{\r\n                                            __html: product.EditorsListLong\r\n                                        }}\r\n                                    />\r\n\r\n                                    {props.Labels.EditorsListShortAbbreviation && (\r\n                                        <span\r\n                                            className=\"editor-abbreviation\"\r\n                                            dangerouslySetInnerHTML={{\r\n                                                __html: props.Labels.EditorsListShortAbbreviation\r\n                                            }}\r\n                                        />\r\n                                    )}\r\n                                </div>\r\n                            )}\r\n\r\n                            {!product.EditorsListLong && product.AuthorsListLong && (\r\n                                <div className=\"product__authors\">\r\n                                    <span\r\n                                        dangerouslySetInnerHTML={{\r\n                                            __html: product.AuthorsListLong\r\n                                        }}\r\n                                    />\r\n                                </div>\r\n                            )}\r\n\r\n                            {product.SeriesLinks &&\r\n                                product.SeriesLinks.length > 0 &&\r\n                                product.SeriesLinks.map((link, index) => {\r\n                                    return (\r\n                                        <div\r\n                                            key={index}\r\n                                            className=\"product__series-link\"\r\n                                            dangerouslySetInnerHTML={{ __html: link }}\r\n                                        />\r\n                                    );\r\n                                })}\r\n                        </div>\r\n\r\n                        <Tabs>\r\n                            {!!product.Description && (\r\n                                <Tab label={props.Labels.ProductDescriptionText}>\r\n                                    <ViewMoreSection>\r\n                                        <ProductDescriptionErrorBoundary description={product.Description}>\r\n                                            <ProductDescription description={product.Description} />\r\n                                        </ProductDescriptionErrorBoundary>\r\n                                    </ViewMoreSection>\r\n                                </Tab>\r\n                            )}\r\n\r\n                            {product.Reviews.length > 0 && (\r\n                                <Tab label={props.Labels.ProductReviewsTitleText}>\r\n                                    <ProductReviewBlock\r\n                                        productReviews={product.Reviews}\r\n                                        productReviewsTitleText={props.Labels.ProductReviewsTitleText}\r\n                                    />\r\n                                </Tab>\r\n                            )}\r\n\r\n                            {!!product.FreeMaterials && (\r\n                                <Tab label={props.Labels.ExtraMaterialsTab}>\r\n                                    <FreeMaterials freeMaterials={product.FreeMaterials} />\r\n                                </Tab>\r\n                            )}\r\n\r\n                            {product.ShowFacts && (\r\n                                <Tab label={props.Labels.FactsTab}>\r\n                                    <Facts product={product} labels={props.Labels} />\r\n                                </Tab>\r\n                            )}\r\n                        </Tabs>\r\n\r\n                        {product.SystemLinks &&\r\n                            product.SystemLinks.length > 0 &&\r\n                            product.SystemLinks.map((link, index) => {\r\n                                return (\r\n                                    <div\r\n                                        key={index}\r\n                                        className=\"product__product-context\"\r\n                                        dangerouslySetInnerHTML={{ __html: link }}\r\n                                    />\r\n                                );\r\n                            })}\r\n                    </div>\r\n\r\n                    <div className=\"buy-container\">\r\n                        <ProductPicker\r\n                            work={work}\r\n                            showAddTodoButton={props.ShowAddTodoButton}\r\n                            currentProductIndex={currentProductIndex}\r\n                            currentProduct={product}\r\n                            onChange={onChangeProduct}\r\n                            addToBasket={addToBasket}\r\n                            {...props}\r\n                        />\r\n                    </div>\r\n                </div>\r\n\r\n                {props.InspectionCopy &&\r\n                    props.InspectionCopy.ShowInspectionCopyLink &&\r\n                    props.DynamicContactFormViewModel &&\r\n                    props.DynamicContactFormViewModel?.DynamicFieldsList.length > 0 && (\r\n                        <div id=\"DynamicContactFormAnchorLink\">\r\n                            <DynamicContactForm {...formProps} />\r\n                        </div>\r\n                    )}\r\n\r\n                {(product.SameSeriesProducts || product.SameSubjectProducts) && (\r\n                    <div className=\"product-page__sliders\">\r\n                        {product.SameSeriesProducts && (\r\n                            <ProductSlider\r\n                                Works={product.SameSeriesProducts.RelatedProducts}\r\n                                HideWhenEmpty={true}\r\n                                TitleText={product.SameSeriesProducts.TabTitle}\r\n                                ViewAllLink={product.SameSeriesProducts.ViewAllLink}\r\n                                ViewAllLinkText={product.SameSeriesProducts.ViewAllLinkText}\r\n                                Labels={props.Labels}\r\n                                EmptySliderText=\"Ingen produkter\"\r\n                                ProductDeliveryInfo={props.Work.ProductDeliveryInfo}\r\n                            />\r\n                        )}\r\n\r\n                        {product.SameSubjectProducts && (\r\n                            <ProductSlider\r\n                                Works={product.SameSubjectProducts.RelatedProducts}\r\n                                HideWhenEmpty={true}\r\n                                TitleText={product.SameSubjectProducts.TabTitle}\r\n                                ViewAllLink={product.SameSubjectProducts.ViewAllLink}\r\n                                ViewAllLinkText={product.SameSubjectProducts.ViewAllLinkText}\r\n                                Labels={props.Labels}\r\n                                EmptySliderText=\"Ingen produkter\"\r\n                                ProductDeliveryInfo={props.Work.ProductDeliveryInfo}\r\n                            />\r\n                        )}\r\n                    </div>\r\n                )}\r\n            </div>\r\n        </>\r\n    );\r\n};\r\n\r\nexport default productPickerComposer(profileComposer(ProductPage));\r\n","import * as React from \"react\";\r\nimport ProductPage from \"@/ReactComponents/ProductPage/product-page\";\r\n\r\nconst ProductPageView = props => <ProductPage {...props} />;\r\n\r\nexport default ProductPageView;\r\n"],"names":["children","useIsOverflow","callback","useState","isOverflow","setIsOverflow","ref","useRef","useLayoutEffect","hasOverflow","current","scrollHeight","clientHeight","isOpen","setIsOpen","rootClasses","classNames","open","arrowClasses","div","className","button","type","onClick","aria-label","aria-expanded","NoticeList","props","render","noticeArray","this","contentInfoClasses","noIcon","map","item","idx","key","dangerouslySetInnerHTML","__html","Component","Modal","notCloseable","LoadSpinner","role","aria-busy","aria-live","aria-valuetext","span","DropdownCheckboxes","data","dataSource","keyEventHandler","close","handleClickOutside","checkboxSubmitHandler","document","removeEventListener","capture","updateItem","Object","assign","setState","newarr","Label","hidden","id","checked","onChange","classes","isExpanded","dropdownRef","list","selectBtnText","IconEmail","svg","x","y","width","height","viewBox","path","d","Tab","tabIndex","aria-labelledby","label","Tabs","state","isCurrent","counter","setCurrent","bind","onKeyDown","componentDidUpdate","prevProps","initialCurrentIndex","tab","e","tabs","querySelectorAll","tabFocus","availableFocusIndex","forEach","index","disabled","push","setAttribute","length","focus","componentDidMount","querySelector","addEventListener","componentWillUnmount","childTabs","filter","child","tabClasses","tabs__menu__tab","active","isDisabled","aria-selected","aria-controls","labelCount","mapStateToProps","userInfo","profileSelector","loggedIn","loginUrl","logoutUrl","profileLinks","userName","userCreatePending","loginRedirecting","createLoginContent","createProfileUrl","createProfileUniLoginUrl","uniPromptContent","isUniLoggedInOnly","mapDispatchToProps","dispatch","userLoggedIn","profileActions","userLogin","unicConnect","userLogout","userCreateSubmit","userinfo","resolve","reject","apiUrl","getNewsletterProfile","email","profileComposer","connect","productPickerComposer","productPickerWork","productPickerSelector","productPickerProduct","productPickerBasketProductConfig","amount","salesConfigIndex","periodValueIndex","primaryPrice","secondaryPrice","classesValue","isGettingProductPrice","isAdding","basketSelector","basket","setWork","work","productPickerActions","setProductIndex","productIndex","setAmount","quantity","setSalesConfigIndex","setPeriodValueIndex","setClassesValue","classesData","basketAdd","basketItem","basketActions","ProductPickerRadioSelect","clickHandler","preventDefault","event","target","value","currentSalesConfig","Work","Products","product","Id","productConfig","PriceConfigurations","ProductComponent","productDeliveryInfo","ProductDeliveryInfo","classList","selected","inStockClasses","InfoType","InfoTypes","priceClasses","discounted","DiscountedPrice","hasPriceConfiguration","hasProductInfoTextButNoPriceConfiguration","ProductInfoText","Quantity","a","href","ProductPageLink","p","MediaType","StockText","PriceUnit","PrimaryPrice","SecondaryPrice","IsPhysical","DeliveryCostsModalButton","IsBuyable","AllowQuantity","AmountInput","context","Title","min","propTypes","ProductPickerSelectedDetails","tempAmount","showClassSelector","infoModalShow","selectChangeHandler","classSelectorVisible","classSelectorSubmitHandler","openInfoModal","closeInfoModal","objectSelected","ArrayOfChoices","i","UnitValue","UnitTypeCode","getPriceBasisText","c","configs","classOptions","ClassOptions","Options","relevantClasses","RelevantClasses","Classes","IsSchoolLicenseAndRelevantClasses","classCount","preText","includes","studentCount","StudentCount","labels","StudentsLabel","ClassesLabel","after","ClassName","generateString","ShowClassDropdown","Selected","numStudents","Value","reduce","b","PriceBasisText","replace","showPeriodDropdown","selectedPeriodObject","selectedClasses","hasContent","priceBasisNotification","LicenseLabel","LicenseText","LicenseTypeText","hr","BuyableNote","AccessText","AccessPeriodText","AccessRenewText","PriceBasisNotification","table","tbody","AccessLabel","tr","td","AccessPeriodLabel","PeriodOptions","AccessRenewLabel","PriceBasisLabel","ShowClassOptions","obj","expanded","closeFunction","ConfigurationSelect","hasSelectedClasses","btnClasses","btnText","EditSelectedLevels","ChooseSelectedLevelsText","renderSelectClassesButton","ReactSuperSelect","objSelected","placeholder","ChoosePeriodText","initialValue","optionValueKey","optionLabelKey","customOptionTemplateFunction","PriceText","customSelectedValueTemplateFunction","arr","PriceInfoLinkText","toClose","showCloseButton","labelledBy","PriceInfoContentText","ProductPickerSelectedTypelist","selectConfig","productConfigs","hasMoreProductConfigs","showList","conf","strong","ConfigurationSummary","IconArrow","direction","onClose","style","margin","LoginIntroText","onLoginClick","LoginButtonText","CreateProfileUrl","CreateProfileButtonText","ProductPicker","ghModalOpen","loginModalOpen","onChangeHandler","submitHandler","productInBasket","getUpdateInButtonState","toggleLoginModal","onLoginAndAddToBasket","isLoading","currentProduct","indexOf","addToBasket","productId","BasketItems","find","Isbn","basketVersionOfProduct","currentPriceConfig","currentPeriod","sameUnitTypeCode","sameUnitValue","samePeriod","sameAmountAsInBasket","Labels","ProductPickerLabels","putInBasket","PutInBasketText","inBasket","IsInBasketText","canUpdateBasket","UpdateBasketText","noClassesSelected","NoClassesSelectedText","noPeriodSelected","NoPeriodSelectedText","hasPeriodOptions","isPhysicalProduct","AccessFormCode","sameAccessFormInBasket","Count","currentClassesValue","priceConfigUtils","sameClassesInBasket","IsInBasket","PeriodUnitTypeCode","PeriodUnitValue","localStorage","setItem","ADD_TO_BASKET_LOCALSTORAGE_KEY","JSON","stringify","workId","configIndex","basketButtonState","VariantsLabel","currentProductIndex","HideConfigurationDetails","PrimaryPriceText","isTotalButton","SINGLE_USER_LICENSE_CODE","ShouldLogin","SpinnerButton","showAddTodoButton","tracking","LoginModal","ProductDescriptionErrorBoundary","hasError","componentDidCatch","striptags","description","position","padding","cursor","userSelect","join","TrialLicenseMediaTypeList","selectedIndex","trialLicenseProducts","h1","TrialLicenseStatusTitle","trialLicenseProduct","TrialLicenseMediaTypeRadioItem","TrialLicenseStatusText","trialLicenseOrdered","undefined","OrderAccessButtonText","React","fill","xmlns","stroke","strokeWidth","strokeLinecap","icon","IconChevronRight","fillRule","clipRule","strokeLinejoin","TrialLicenseLink","modalOpen","toggleModal","validateLicense","renderTrialLicense","val","TrialLicense","IsUserPermitted","isbn","TrialLicenseProductIsbn","trialLicenseValidate","trialLicenseValidateSuccess","trialLicenseRequestSuccess","trialLicenseError","payload","Product","BasketLineType","TrialAccess","SalesFormCode","add","trialLicense","productTitle","siteName","leadText","OrderViaEmail","LeadText","Email","buttonText","ButtonText","ProductMediaLinkWithCallback","IconBookOpen","OrderTrialAccessText","maxWidth","Url","ModalSpinner","trialLicensePending","trialLicenseErrorMessage","errorMessage","trialLicenseStatus","TrialLicenseProducts","TrialLicenseOrdered","InvalidPermissionText","basketComposer","trialLicenseSelector","trialLicenseRequest","Payload","actions","url","ProductReviewBlock","reviewsArray","productReviews","swiperSettings","infinite","slidesToShow","slidesToScroll","dots","arrows","prevArrow","SliderNavigationButton","arrowDirection","nextArrow","easing","speed","Swiper","review","ReviewText","ReviewAuthor","ReviewSource","ReviewDate","Facts","ProductFacts","fact","Text","fillOpacity","Extra","freeMaterialGroups","freeMaterials","FreeMaterialGroups","GroupType","h3","GroupTitle","GroupMaterials","IconPDF","Description","Extension","circle","cx","cy","r","console","log","setCurrentProductIndex","formProps","DynamicContactFormViewModel","onChangeProduct","useCallback","window","location","origin","history","replaceState","addToBasketItem","getItem","parsedObj","parse","Amount","useEffect","ProductIndex","basketItemFromLocalStorage","removeItem","licenceProduct","formattedTitle","trialLicenseLinkProps","SiteName","CoverImageUrl","img","src","loading","alt","IconLogo","CustomLink","LinkText","LinkUrl","ProductMediaLink","Target","ReadingSampleLink","HasTrialAccess","SampleUrl","IconBars","DigitalProductUrl","IconWebsite","InspectionCopy","ShowInspectionCopyLink","DynamicFieldsList","Category","Subtitle","EditorsListLong","EditorsListShortAbbreviation","AuthorsListLong","SeriesLinks","link","ProductDescriptionText","ViewMoreSection","ProductDescription","Reviews","ProductReviewsTitleText","productReviewsTitleText","FreeMaterials","ExtraMaterialsTab","ShowFacts","FactsTab","SystemLinks","ShowAddTodoButton","DynamicContactForm","SameSeriesProducts","SameSubjectProducts","ProductSlider","Works","RelatedProducts","HideWhenEmpty","TitleText","TabTitle","ViewAllLink","ViewAllLinkText","EmptySliderText","ProductPage"],"sourceRoot":""}