{"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":""}