{"version":3,"sources":["webpack:///../20240219215305/frontend/src/controllers/entities/entity_user_form_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/replace_with_dom_nodes.ts","webpack:///../20240219215305/frontend/src/controllers/forms/button_radio_group_controller.ts","webpack:///../20240219215305/frontend/src/controllers/patterns/form_examples/flash_controller.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/message_threads/message_item_controller.ts","webpack:///../20240219215305/frontend/assets/images/shopping/grade.svg","webpack:///../20240219215305/frontend/src/controllers/patterns/form_examples/error_locations_controller.ts","webpack:///../20240219215305/frontend/src/controllers/forms/checkbox_collection_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/timeago_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/product_category_filter_controller.ts","webpack:///../20240219215305/frontend/src/controllers/navigation/cart_menu_item_controller.ts","webpack:///../20240219215305/frontend/src/controllers/platform_admin/order_management/breakdown_form_controller.ts","webpack:///../20240219215305/frontend/src/lib/app_configuration.ts","webpack:///../20240219215305/frontend/src/controllers/locations/map_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/add_script_tag.ts","webpack:///../20240219215305/frontend/src/helpers/shopping/delivery_date_calendar_helper.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/delivery_date_calendar_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/dropdown_controller.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/message_threads/unread_item_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/purchase_configurator/purchase_configurator_variant_controller.ts","webpack:///../20240219215305/frontend/src/lib/rails.ts","webpack:///../20240219215305/frontend/src/boot.ts","webpack:///../20240219215305/frontend/src/controllers/index.ts","webpack:///../20240219215305/frontend/packs/confinus.ts","webpack:///../20240219215305/frontend/assets/images/shopping/frozen.svg","webpack:///../20240219215305/frontend/src/controllers/shopping/purchase_configurator/quantity_calculator_controller.ts","webpack:///../20240219215305/frontend/src/controllers/forms/select_controller.ts","webpack:///../20240219215305/frontend/src/controllers/platform_admin/order_management/breakdown_remove_item_controller.ts","webpack:///../20240219215305/frontend/assets/images/sparkles.svg","webpack:///../20240219215305/frontend/assets/images/shopping/brand.svg","webpack:///../20240219215305/frontend/src/controllers/patterns/refresh_popup_controller.ts","webpack:///../20240219215305/frontend/src/lib/i18n.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/delivery_date_select_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/snackbar_controller.ts","webpack:///../20240219215305/frontend/src/controllers/util/lineclamp_controller.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/navigable_controller.ts","webpack:///../20240219215305/frontend/src/lib/overlay/toast.ts","webpack:///../20240219215305/frontend/assets sync //.(svg|png|jpe","webpack:///../20240219215305/frontend/src/controllers/activity/list_item_controller.ts","webpack:///../20240219215305/frontend/src/controllers/forms/text_area_controller.ts","webpack:///../20240219215305/frontend/src/helpers/shopping/purchase_configurator_helper.ts","webpack:///../20240219215305/frontend/src/controllers/base/toaster_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/dialog_manager_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/top_app_bar_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/carousel_controller.ts","webpack:///../20240219215305/frontend/assets/images/shopping/flag.svg","webpack:///../20240219215305/frontend/src/controllers/patterns/flash_examples_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/keyboard_key.ts","webpack:///../20240219215305/frontend/src/controllers/base/data_filter_form_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/dialog_controller.ts","webpack:///../20240219215305/frontend/assets/images/cards_logos/amex.svg","webpack:///../20240219215305/frontend/src/lib/util/stringify_escape_quotes.ts","webpack:///../20240219215305/frontend/src/controllers/forms/text_field_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/purchase_configurator_controller.ts","webpack:///../20240219215305/frontend/assets/images/shield.svg","webpack:///../20240219215305/frontend/src/controllers/base/button_controller.ts","webpack:///../20240219215305/frontend/assets/images/confinus-logo.png","webpack:///../20240219215305/frontend/src/controllers/patterns/dialog_examples_controller.ts","webpack:///../20240219215305/frontend/src/lib/controller/base_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/flash_controller.ts","webpack:///../20240219215305/frontend/src/lib/overlay/snackbar.ts","webpack:///../20240219215305/frontend/src/controllers/forms/radio_controller.ts","webpack:///../20240219215305/frontend/assets/images/confinus_logo.png","webpack:///../20240219215305/frontend/assets/images/category_image_placeholder.svg","webpack:///../20240219215305/frontend/src/controllers/shopping/serviceability_dropdown_controller.ts","webpack:///../20240219215305/frontend/src/controllers/entities/entity_form_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/create_custom_event.ts","webpack:///../20240219215305/frontend/src/lib/util/safe_html.ts","webpack:///../20240219215305/frontend/src/controllers/base/pagination_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/table_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/purchase_configurator/add_note_controller.ts","webpack:///../20240219215305/frontend/assets/images/confinus-avatar.png","webpack:///../20240219215305/frontend/src/controllers/forms/toggle_card_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/notifications_controller.ts","webpack:///../20240219215305/frontend/assets/images/confinus-avatar-black.png","webpack:///../20240219215305/frontend/src/controllers/base/table/row_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/product_navigation_controller.ts","webpack:///../20240219215305/frontend/src/lib/overlay/dialog.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/purchase_configurator/uom_pricing_details_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/product_lightbox_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/click_to_copy_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/carts/cart_item_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/table/cell_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/delivery_cut_off_pill_controller.ts","webpack:///../20240219215305/frontend/src/controllers/forms/checkbox_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/table/header_cell_controller.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/message_threads/select_toggle_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/product_navigation_tier_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/sidebar_filters_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/serialize.ts","webpack:////home/deploy/hautegrub-production/shared/node_modules/moment/locale sync ^\\.\\/.*$","webpack:///../20240219215305/frontend/src/controllers/layouts/message_threads/unread_messages_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/notifications_emitter_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/drawer_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/track_hover.ts","webpack:///../20240219215305/frontend/src/lib/util/add_parameter_to_url.ts","webpack:///../20240219215305/frontend/assets/images/shopping/tag.svg","webpack:///../20240219215305/frontend/src/controllers/form_controller.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/message_threads/assignee_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/form_validation_messages.ts","webpack:///../20240219215305/frontend/src/lib/controller/form_field_controller.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/message_threads/dynamic_messages_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/parse_datetime_attr.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/product_category_filters_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/set_element_hidden.ts","webpack:///../20240219215305/frontend/src/controllers/layouts/registration/step1_controller.ts","webpack:///../20240219215305/frontend/src/lib/util/set_element_required.ts","webpack:///../20240219215305/frontend/src/lib/util/form_validators.ts","webpack:///../20240219215305/frontend/src/controllers/form_control_controller.ts","webpack:///../20240219215305/frontend/src/lib/axios.ts","webpack:///../20240219215305/frontend/src/controllers/platform_admin/order_management/input_final_details_confirmation_controller.ts","webpack:///../20240219215305/frontend/src/controllers/base/drawer_sub_menu_controller.ts","webpack:///../20240219215305/frontend/src/controllers sync /_controller/.(ts)$/","webpack:///../20240219215305/frontend/src/controllers/base/button_toast_dismiss_controller.ts","webpack:///../20240219215305/frontend/src/controllers/shopping/purchase_configurator/extra_info_controller.ts","webpack:///../20240219215305/frontend/assets/images/iconmonstr-candy-6.svg","webpack:///../20240219215305/frontend/assets/images/shopping/delivery.svg","webpack:///../20240219215305/frontend/assets/images/shopping/question-mark.svg","webpack:///../20240219215305/frontend/src/controllers/platform_admin/catalog_management/price_edit_controller.ts","webpack:///../20240219215305/frontend/src/controllers/forms/switch_controller.ts","webpack:///../20240219215305/frontend/src/controllers/patterns/toaster_examples_controller.ts"],"names":["HIDDEN_CLASS","EntityUserFormController","this","handleEmailChange","handlePasswordChange","data","get","emailFieldTarget","value","originalEmail","emailConfirmationFieldTarget","required","emailConfirmationContainerTarget","classList","remove","add","passwordFieldTarget","passwordConfirmationFieldTarget","passwordConfirmationContainerTarget","originalValue","BaseController","targets","replaceContentsWithChildren","parent","children","node","firstChild","removeChild","emptyNode","childrenArray","Array","isArray","fragment","document","createDocumentFragment","forEach","child","appendChild","SELECTED_BUTTON_CLASS_NAME","ButtonRadioGroupController","evt","buttonControllers","bc","element","currentTarget","theme","THEME","Primary","variant","VARIANT","Contained","applyClasses","Secondary","Outlined","removeClasses","getSpecificChildControllers","ButtonController","FormFieldController","FormExamplesFlashController","detail","valid","preamble","errors","fc","flashController","hide","errorMessages","map","err","message","renderHeadingWithListContent","reveal","getSpecificChildController","FlashController","MessageItemController","Number","module","exports","ErrorLocationsController","target","errorMessageTarget","errorMessageTargetForFormField","e","join","textContent","firstNameTarget","firstNameErrorMessageTarget","lastNameTarget","lastNameErrorMessageTarget","emailTarget","emailErrorMessageTarget","agreeTarget","agreeErrorMessageTarget","CheckboxCollectionController","showingMore","onChildControllerConnect","checkbox","CheckboxController","contains","checked","code","generateErrorMessage","checkboxControllers","find","field","toggle","showMoreLinkTarget","innerText","TimeagoController","onConnect","timeStampString","timestamp","parseInt","render","finish","clearTimeout","timeoutId","timeout","Date","now","newAgo","format","currentAgo","window","setTimeout","bind","ProductCategoryFilterController","items","parseItems","itemsStr","JSON","parse","disabled","selectController","empty","newOptions","set","stringify","length","newHtml","emptyOption","category","i","n","reduce","previous","current","options","markAsSafeHTML","SelectController","CartMenuItemController","dialogMDC","MDCDialog","dialogTarget","destroy","isOpen","preventDefault","hideDialog","href","anchorTarget","showDialog","fallbackHref","getRequiredDataAttrs","contentHref","placeholder","safelySetInnerHTML","dialogContentTarget","open","axios","headers","Accept","then","resp","location","close","BreakdownFormController","rowId","rowToToggle","TableRowController","rc","id","config","MapController","attachMapScript","onMapReady","createMap","addOverlays","addPoints","onDisconnect","googleMap","getElementById","__mapInitialised","mapInitialised","key","scriptTag","createElement","type","async","defer","src","getElementsByTagName","addScriptTag","createCustomEvent","dispatchEvent","callback","addEventListener","readyListener","removeEventListener","google","maps","Map","mapContainerTarget","center","mapCenter","zoom","pointsData","Marker","position","lat","lng","title","company_name","name","setMap","regionsData","region","paths","coordinates","flatMap","polygon","path","point","LatLng","Polygon","centerData","error","dates","dateStrings","strDate","sameDates","time1","time2","setHours","DeliveryDateCalendarController","defaultDate","maxDate","minDate","enableDates","enableDaysOfWeek","disableDates","disableDaysOfWeek","altInput","altFormat","disableDatesArr","enableDatesArr","dataAttributes","getRequiredDataAttrAsJSON","flatpickrOpts","disable","date","includes","getDay","some","disabledDate","enable","onChange","selectedDates","dateStr","instance","dateSelectEvent","selectedDate","input","onReady","formatDate","enabledDate","datePicker","flatpickr","datepickerTarget","BOTTOM_START","MDCMenuSurfaceFoundation","Corner","DropdownController","menu","dispatchSelectedEvent","item","index","customEvt","MDCMenu","menuTarget","setAnchorCorner","listen","unlisten","UnreadItemController","PurchaseConfiguratorVariantController","isCurrent","classToToggle","alwaysTrue","Rails","confirm","customConfirm","confirmLabel","getAttribute","cancelLabel","actions","action","content","defaultAction","onClosing","closeReason","click","tippy","querySelectorAll","el","Choices","searchResultLimit","removeItemButton","delimiter","editItems","Chartjs","plugins","unregister","ChartDataLabels","Chart","Chartkick","application","context","urlParams","URLSearchParams","search","register","ChartRegressions","helpers","merge","defaults","global","datalabels","backgroundColor","dataset","borderColor","borderWidth","borderRadius","color","font","weight","start","ActiveStorage","Application","require","load","definitionsFromContext","Trix","PurchaseConfiguratorQuantityCalculatorController","handleFieldsetInput","fallbackDisplay","currency","extraChargeMultiplier","priceMultiplier","quantityType","sizeExcludedFromCalculation","other","quantity","quantityTarget","size","hasSizeTarget","sizeTarget","undefined","totalPrice","calculateTotalPriceForDisplay","locale","i18n","extraInfoControllers","c","updateValue","fieldsetTarget","removeAttribute","setAttribute","enableInputs","disableInputs","price","totalPriceTarget","PurchaseConfiguratorQuantityExtraInfoController","handleChangeEvent","selectedIndex","nativeControl","confinusSelectElement","disabledClassName","getElementsByClassName","BreakdownRemoveItemController","toggleInput","dispatchRemoveEvent","inputTarget","getRequiredDataAttr","RefreshPopupController","DeliveryDateSelectController","stopPropagation","formTarget","submit","SnackbarController","snackbarMDC","MDCSnackbar","actionText","actionHandler","labelTarget","actionButton","createActionButton","actionsContainerTarget","text","buttonEl","LineClampController","originalText","shouldActOnResize","clamp","handleResizeDebounced","debounce","handleResize","resetText","targetHeight","getBoundingClientRect","height","shave","NavigableController","drawerController","DrawerController","showToast","opts","dismissAllToasts","dismissSingleToast","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","keys","Object","resolve","ListItemController","TextAreaController","textareaMDC","MDCTextField","containerTarget","useNativeValidation","ZERO","BIG_ZERO","Big","totalPriceBig","quantityBig","parseQuantity","sizeBig","parseSize","priceMultiplierBig","parseQuantityPriceMultiplier","extraChargeMultiplierBig","times","div","calculateTotalPrice","parseFloat","toFixed","toLocaleString","style","calculateExtraInfoAmountForDisplay","multiplier","sizeCalculationPerformDivision","isNullOrBigZero","multiplierBig","extraInfoAmountBig","quantityRaw","newPositiveBigOrNull","sizeRaw","multiplierRaw","big","gte","lte","eq","DOM_NAMESPACE","NOTIFICATION_CLASSNAME","NOTIFICATION_ACTIVE_CLASSNAME","NOTIFICATION_DISMISSED_CLASSNAME","ToasterController","createNotification","notification","toastTimeout","Infinity","timerId","dismissNotification","dismissTimerId","toString","insertBefore","from","reverse","idx","animationName","startsWith","raw","next","nextNotificationId","getRemoteContent","remoteContent","getContent","errorMessage","generic_server_error","url","response","notificationId","DialogManagerController","show","dialogVariant","closeDialog","TopAppBarController","topAppBarMDC","MDCTopAppBar","CarouselController","carousel","perView","innerWidth","desired","Swiper","slidesPerView","centeredSlides","spaceBetween","navigation","nextEl","prevEl","FlashExamplesController","Keys","DataFilterFormController","reloadWithQueryParam","mode","onClose","d","defaultPrevented","Enter","keyCode","keyWasPressed","removeParameterFromQueryString","params","addParametersToQueryString","DialogController","dispatchClosingEvent","dispatchLifecycleEvent","dispatchClosedEvent","dispatchOpeningEvent","rawContent","nodes","createTitle","createActions","createContent","replaceContents","surfaceTarget","applyVariantClassesToTarget","sections","filteredSections","filter","v","heading","trim","contentContainer","container","buttonTitle","buttonAction","isDefaultAction","button","isDefault","buttonClassNames","push","buttonLabelEl","stringifyEscapeQuotes","replace","TextFieldController","textfieldMDC","PurchaseConfiguratorController","controller","chosenVariant","chosenVariantId","xhr","responseURL","split","slice","showSnackbar","variantControllers","vc","VARIANT_CLASS_NAMES","Raised","Text","THEME_CLASS_NAMES","ALL_THEME_CLASS_NAMES","values","ALL_VARIANT_CLASS_NAMES","disconnector","has","buttonMDC","MDCRipple","classNames","cn","t","DialogExamplesController","initializeReceipt","CONNECTION_EVENT","DISCONNECTION_EVENT","connectors","disconnectors","connectionDisconnectors","childControllerConnectors","childControllerDisconnectors","childControllers","Set","emitConnectionEvent","identifier","emitDisconnectionEvent","handleControllerConnectedEvent","findController","cb","handleControllerDisconnectedEvent","runConnector","connector","runDisconnector","onInitialize","clear","fn","ControllerClass","controllers","result","tagName","toLowerCase","parentElement","getControllerForElementAndIdentifier","found","missing","attrs","Controller","VISIBLE_CLASS","COLLAPSED_CLASS","showFlashMessage","removeInitialClass","headingNode","createHeading","listNode","listItemNode","p","RadioController","radio","MDCRadio","formField","MDCFormField","ACTIVE_CLASS","ServiceabilityDropdownController","activateDropdown","addActiveClass","deactivateDropdown","removeActiveClass","activateTimedToaster","timeToCutOff","showTimedToaster","secondsBeforeRun","activateDismissableToaster","showDismissableToaster","countdownRefreshPopup","showRefreshPopup","dropdownButtonTarget","ids","currentPage","refreshPopupMode","timeToActivateDropdown","timeToActivateTimedToaster","timeToActivateDismissableToaster","activateTimedToasterTimerId","calculateTimeout","activateDismissableToasterTimerId","activateDropdownTimerId","deactivateDropdownTimerId","popupTimerId","initialiseRefreshDialog","timeoutDelay","timeoutInSeconds","minutesBeforeRun","timeToCutOffStr","EntityFormController","handleOtherPropertyTypeChanges","handleEmailChanges","inputEmailTarget","blockEmailConfirmationTarget","visibility","inputEmailConfirmationTarget","focus","checkboxOtherTarget","blockCustomTypeTarget","inputCustomTypeTarget","CustomEvent","bubbles","cancelable","createEvent","initCustomEvent","html","__safe","innerHTML","PaginationController","pageSize","pageSizeParamName","pageSizeLabelTarget","TableController","dataTableMDC","MDCDataTable","getFormElementValueByName","form","namePrefix","querySelector","AddNoteController","findParentElementByTagName","notesTarget","chosen_variant","portion_size","delivery_date","getElementsByName","lightboxContentHref","lightboxPlaceholder","setImmediate","notes","triggerButtonTarget","encodeURIComponent","ToggleCardController","NotificationsController","cableConsumer","ActionCable","createConsumer","subscriptions","create","channel","received","handleNewMessage","connected","disconnected","connect","disconnect","countContent","countTarget","currentCount","incrementCounter","DISABLED_CLASS","hasExpandButtonTarget","handleExpandClick","toggleExpandButton","dispatchExpandEvent","ACTIVE_ITEM_CLASS","BACKDROP_CLASS","LIST_SHOWN_CLASS","supportsTouch","navigator","msMaxTouchPoints","ProductNavigationController","tierControllers","backdropActive","currentPath","ProductNavigationTierController","tier","parseKeyAttribute","same","isMobile","closeNavigation","selectCategory","itemSelected","trackHover","htmlClass","isLastTier","tierHtml","dropdownTarget","insertAdjacentHTML","pop","primaryCategoryListTarget","searchTarget","hideSearch","addBackdrop","backdropTarget","clearCategoriesTo","clearPreviousActiveItem","navigationTarget","toggleActive","emittedController","controllerOfTier","k","appendTier","activeItem","tierTarget","targetElement","parentNode","rest","closingHandler","PurchaseConfiguratorUomPricingDetailsController","ProductLightboxController","ClickToCopyController","selectText","range","createRange","selectNodeContents","selection","getSelection","removeAllRanges","addRange","execCommand","CartItemController","lightboxController","handleDialogClosing","deleteCartItem","showPurchaseConfigurator","reload","TableCellController","DeliveryCutOffPillController","activateElement","deactivateElement","timeToActivateElement","MINUTES_BEFORE_RUN","activateTimerId","inactivateTimerId","MDCCheckbox","indeterminate","TableHeaderCellController","sort_by","sortKey","sorted_direction","nextSortDirection","sortDirection","SelectToggleController","sharedSelectTarget","privateSelectTarget","parentController","parseParentController","parseTier","parentCategory","parseParentCategory","tierSelected","itemsToRender","s","seeAllHtml","u","renderItems","sic","arrowHtml","actionHtml","itemHtml","categoryStr","SidebarFiltersController","serializedForm","serialized","elements","option","selected","serialize","queryString","removeHashesFromQueryString","DynamicMessagesController","messageControllers","itemsTarget","minHeight","message_thread_uid","fetchUnread","messageThreadUid","unreadUrl","addNotification","alert","threadNotification","threadUid","removeItem","prependNotificationNode","sentAt","parseDateTime","afterNode","firstItemSentBefore","scope","parts","qs","shared_inbox_uid","indexOf","splice","NotificationsEmitterController","sender_user_uid","event","ALLOWED_CLASSES","MDCDismissibleDrawerFoundation","cssClasses","MODAL","DISMISSIBLE","drawer","hasAllowedClassName","drawerMDC","MDCDrawer","className","eventType","timer","str","hashKeys","hashKey","FormController","FormControlController","autoValidation","performValidation","stopImmediatePropagation","onSubmissionPrevented","formElement","onValidated","harvestInvalids","invalidFields","hasInvalidFields","emitValidationEvent","focusControl","formFieldControllers","validate","messages","form_invalid_preamble","AssigneeController","RAILS_I18N_MESSAGE_REGEX","generateFormValidationMessage","variables","m","$1","handleValidationResponse","fieldControl","controlErrors","formControlElement","customMessageKey","defaultMessageKey","rawMessage","generateDefaultMessage","fieldControlTarget","isValid","parsedErrors","parseErrorMessages","helperTextContent","emitFormFieldValidatedEvent","errorResponse","missingValue","wrongLength","outOfRange","patternMismatch","typeMismatch","label","hasContainerTarget","invalidClassName","hasHelperTextTarget","helperTextTarget","addMessage","uid","previousSeen","beforeNode","firstItemSentAfter","messagesTarget","scrollToBottom","removeAuthorsSeen","fetchMessage","event_type","scrollTop","scrollHeight","messageNodes","messageType","lastMessageNode","technicalNodes","senderId","senderUid","match","exec","ProductCategoryFiltersController","lastSelectedUid","selectedValues","currentUid","newPathname","pathname","order_by","newSelectedCategory","nextTierController","tc","setElementHidden","hidden","RegistrationStep1Controller","toggleConsumerPropertyTypeOtherTextFieldControl","consumerPropertyTypeOtherCheckboxTarget","consumerPropertyTypeOtherTextFieldContainerTarget","setElementRequired","consumerPropertyTypeOtherTextFieldTarget","PATTERNS","email","month","number","time","NO_ERRORS","listening","touched","handleInputEvent","handleFocusEvent","handleBlurEvent","validationErrors","every","setCustomValidity","hasAttribute","shouldAutoValidate","setupEventListeners","teardownEventListeners","missingValueError","outOfRangeError","patternMismatchError","typeMismatchError","wrongLengthError","radioAttributes","mapCheckableAttributes","attr","missingCheckboxValue","max","min","gt","lt","num","pattern","chosenPattern","RegExp","parsed","isNaN","normalised","csrfMetaTag","head","csrfToken","common","InputFinalDetailsConfirmationController","submitTarget","checkboxTarget","BASE_CLASSNAME","DrawerSubMenuController","ButtonToastDismiss","toastId","PurchaseConfiguratorExtraInfoController","valueDisplay","val","valueTarget","PriceEditController","SwitchController","mdcSwitch","handleFormValidatedBeforeConfirm","isFormValid","confirmMessage","confirmAction","cancelAction","toggleSwitch","submitForm","MDCSwitch","validateEvt","ToastExamplesController"],"mappings":"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","file":"js/confinus-7f5b8d505ff5d043f4c2.chunk.js","sourcesContent":["import BaseController from 'src/lib/controller/base_controller';\n\nconst HIDDEN_CLASS = 'cnf-display--none';\n\nexport default class EntityUserFormController extends BaseController {\n public static targets = [\n 'emailField', 'emailConfirmationField', 'emailConfirmationContainer',\n 'passwordField', 'passwordConfirmationField', 'passwordConfirmationContainer'\n ];\n\n private declare readonly emailFieldTarget: HTMLInputElement;\n private declare readonly emailConfirmationFieldTarget: HTMLInputElement;\n private declare readonly emailConfirmationContainerTarget: HTMLBaseElement;\n\n private declare readonly passwordFieldTarget: HTMLInputElement;\n private declare readonly passwordConfirmationFieldTarget: HTMLInputElement;\n private declare readonly passwordConfirmationContainerTarget: HTMLBaseElement;\n\n public onInitialize() {\n this.handleEmailChange();\n this.handlePasswordChange();\n\n return super.onInitialize();\n }\n\n public handleEmailChange() {\n if (this.data.get('alwaysShowEmailConfirmation')) {\n return;\n }\n const emailFieldValue = this.emailFieldTarget.value;\n if (emailFieldValue !== this.originalEmail) {\n this.emailConfirmationFieldTarget.required = true;\n return this.emailConfirmationContainerTarget.classList.remove(HIDDEN_CLASS);\n }\n this.emailConfirmationFieldTarget.required = false;\n this.emailConfirmationContainerTarget.classList.add(HIDDEN_CLASS);\n }\n\n public handlePasswordChange() {\n const fieldValue = this.passwordFieldTarget.value;\n if (fieldValue != '') {\n this.passwordConfirmationFieldTarget.required = true;\n return this.passwordConfirmationContainerTarget.classList.remove(HIDDEN_CLASS);\n }\n this.passwordConfirmationFieldTarget.required = false;\n this.passwordConfirmationContainerTarget.classList.add(HIDDEN_CLASS);\n }\n\n private get originalEmail(): string | null {\n const originalValue = this.data.get('originalEmail');\n if (originalValue === null) {\n return originalValue;\n }\n return originalValue as string;\n }\n}\n","export function replaceContentsWithChildren(parent: Node, children: Node | Node[]): Node {\n // Remove the existing children\n emptyNode(parent);\n\n const childrenArray = Array.isArray(children) ? children : [children];\n\n // Create a document fragment to contain all the child nodes\n const fragment = document.createDocumentFragment();\n childrenArray.forEach(child => {\n fragment.appendChild(child);\n });\n\n // Append all at once (only one DOM touch here)\n parent.appendChild(fragment);\n\n return parent;\n}\n\nfunction emptyNode(node: Node) {\n // https://jsperf.com/innerhtml-vs-removechild/37\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n}\n","import ButtonController, { THEME, VARIANT } from 'src/controllers/base/button_controller';\nimport BaseController from 'src/lib/controller/base_controller';\nimport FormFieldController from 'src/lib/controller/form_field_controller';\n\nconst SELECTED_BUTTON_CLASS_NAME = 'cnf-button-group__button--selected';\n\nexport default class ButtonRadioGroupController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n public handleChange(evt: Event) {\n this.buttonControllers.forEach(bc => {\n if (bc.element === evt.currentTarget) {\n // This button should be selected.\n bc.theme = THEME.Primary;\n bc.variant = VARIANT.Contained;\n bc.applyClasses([SELECTED_BUTTON_CLASS_NAME]);\n } else {\n // This is a deselected button.\n bc.theme = THEME.Secondary;\n bc.variant = VARIANT.Outlined;\n bc.removeClasses([SELECTED_BUTTON_CLASS_NAME]);\n }\n });\n // We want to change the selected button.\n }\n\n protected get invalidClassName() {\n return 'cnf-button-group--invalid';\n }\n\n private get buttonControllers(): ButtonController[] {\n return this.getSpecificChildControllers(ButtonController);\n }\n}\n","import { IFormFieldError, IFormValidationEvent } from 'src/types';\n\nimport FlashController from 'src/controllers/base/flash_controller';\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport default class FormExamplesFlashController extends BaseController {\n public handleFormValidatedEvent(evt: IFormValidationEvent) {\n const {\n detail: { valid, preamble, errors },\n } = evt;\n\n const fc = this.flashController;\n if (fc) {\n if (valid) {\n fc.hide();\n } else {\n // Show the flash box.\n // TODO this might be best wrapped up in a utility component.\n const errorMessages = errors.map(err => err.message);\n fc.renderHeadingWithListContent(preamble, errorMessages);\n fc.reveal();\n }\n }\n }\n\n private get flashController() {\n return this.getSpecificChildController(FlashController);\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class MessageItemController extends BaseController {\n public get sentAt(): number {\n return Number(this.data.get('sentAt'));\n }\n\n public get senderUid(): string {\n return this.data.get('senderUid')!;\n }\n\n public get messageType(): string {\n return this.data.get('messageType') || 'Message';\n }\n\n public get eventType(): string | null {\n return this.data.get('eventType');\n }\n\n public get uid(): string {\n return this.data.get('messageUid')!;\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/grade-3af618f58c2baf53980cc8a67ca80b6f.svg\";","import BaseController from 'src/lib/controller/base_controller';\nimport { IFormFieldValidationEvent } from 'src/types';\n\nexport default class ErrorLocationsController extends BaseController {\n public static targets = [\n 'firstName',\n 'firstNameErrorMessage',\n 'lastName',\n 'lastNameErrorMessage',\n 'email',\n 'emailErrorMessage',\n 'agree',\n 'agreeErrorMessage',\n ];\n\n private declare readonly firstNameTarget: HTMLInputElement;\n private declare readonly firstNameErrorMessageTarget: HTMLParagraphElement;\n private declare readonly lastNameTarget: HTMLInputElement;\n private declare readonly lastNameErrorMessageTarget: HTMLParagraphElement;\n private declare readonly emailTarget: HTMLInputElement;\n private declare readonly emailErrorMessageTarget: HTMLParagraphElement;\n private declare readonly agreeTarget: HTMLInputElement;\n private declare readonly agreeErrorMessageTarget: HTMLParagraphElement;\n\n public handleFieldValidatedEvent(evt: IFormFieldValidationEvent) {\n const { detail, target } = evt;\n const errorMessageTarget = this.errorMessageTargetForFormField(target);\n if (errorMessageTarget) {\n const message = !detail.valid ? detail.errors.map(e => e.message).join(', ') : '';\n errorMessageTarget.textContent = message;\n }\n }\n\n private errorMessageTargetForFormField(target: HTMLElement): HTMLParagraphElement | null {\n switch (target) {\n case this.firstNameTarget:\n return this.firstNameErrorMessageTarget;\n case this.lastNameTarget:\n return this.lastNameErrorMessageTarget;\n case this.emailTarget:\n return this.emailErrorMessageTarget;\n case this.agreeTarget:\n return this.agreeErrorMessageTarget;\n default:\n return null;\n }\n }\n}\n","import CheckboxController from 'src/controllers/forms/checkbox_controller';\nimport FormFieldController from 'src/lib/controller/form_field_controller';\n\nexport default class CheckboxCollectionController extends FormFieldController {\n public static targets = ['showMoreLink'];\n\n private declare readonly showMoreLinkTarget: HTMLElement;\n\n private showingMore = false;\n\n public onInitialize() {\n this.onChildControllerConnect((checkbox) => {\n if (checkbox instanceof CheckboxController) {\n const classList = checkbox.element.classList;\n if (classList.contains('cnf-checkbox-collection--hidden')) {\n if (checkbox.checked) {\n classList.remove('cnf-display--none');\n }\n }\n }\n });\n\n return super.onInitialize();\n }\n\n public validate() {\n if (!this.data.get('required')) {\n return {\n errors: [],\n valid: true,\n };\n }\n return {\n errors: [\n {\n code: 'missingValue',\n message: this.generateErrorMessage('validationMessageRequired', 'blank'),\n },\n ],\n valid: !!this.checkboxControllers.find(field => field.checked),\n };\n }\n\n public showMore() {\n this.checkboxControllers.forEach((checkbox) => {\n const classList = checkbox.element.classList;\n if (classList.contains('cnf-checkbox-collection--hidden')) {\n if (checkbox.checked) {\n classList.remove('cnf-display--none');\n } else {\n classList.toggle('cnf-display--none');\n }\n }\n });\n this.showingMore = !this.showingMore;\n this.showMoreLinkTarget.innerText = this.showingMore ? 'Show less...' : 'Show more...';\n }\n\n protected get invalidClassName() {\n return 'mdc-checkbox--invalid';\n }\n\n private get checkboxControllers() {\n return this.getSpecificChildControllers(CheckboxController);\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { format } from 'timeago.js';\n\nexport default class TimeagoController extends BaseController {\n private timeoutId!: number;\n private currentAgo!: string;\n private timestamp!: number;\n\n public onInitialize() {\n this.onConnect(() => {\n const timeStampString = this.data.get('timestamp') || '';\n this.timestamp = parseInt(timeStampString, 10);\n this.render();\n return () => {\n this.finish();\n };\n });\n\n return super.onInitialize();\n }\n\n private finish() {\n clearTimeout(this.timeoutId);\n }\n\n private render() {\n // Tick every minute if date is older than 1 minute, tick every second otherwise\n const timeout = Date.now() - this.timestamp > 60000 ? 60000 : 1000;\n const newAgo = format(this.timestamp);\n\n if (this.currentAgo !== newAgo) {\n this.element.textContent = newAgo;\n this.currentAgo = newAgo;\n }\n\n this.timeoutId = window.setTimeout(this.render.bind(this), timeout);\n }\n}\n","import SelectController from 'src/controllers/forms/select_controller';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\nimport { ICategory } from 'src/types';\n\nexport default class ProductCategoryFilterController extends BaseController {\n public items!: ICategory[];\n\n public onInitialize() {\n this.items = this.parseItems();\n return super.onInitialize();\n }\n\n public set disabled(disabled: boolean) {\n if (disabled) {\n this.selectController.empty();\n }\n\n this.selectController.disabled = disabled;\n }\n\n public set options(newOptions: ICategory[]) {\n this.data.set('categories', JSON.stringify(newOptions));\n this.items = newOptions;\n\n if (newOptions.length === 0) {\n this.disabled = true;\n return;\n }\n\n const newHtml =\n this.selectController.emptyOption +\n newOptions\n .map(category => ``)\n .reduce((previous, current) => (previous += current));\n\n this.selectController.options = markAsSafeHTML(newHtml);\n this.disabled = false;\n }\n\n public get value(): string {\n return this.selectController.value;\n }\n\n private get selectController(): SelectController {\n return this.getSpecificChildController(SelectController) as SelectController;\n }\n\n private parseItems(): ICategory[] {\n const itemsStr = this.data.get('categories');\n\n if (itemsStr !== null) {\n return JSON.parse(itemsStr) as ICategory[];\n }\n\n return [] as ICategory[];\n }\n}\n","import { MDCDialog } from '@material/dialog/index';\n\nimport axios from 'src/lib/axios';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { markAsSafeHTML, safelySetInnerHTML } from 'src/lib/util/safe_html';\n\nexport default class CartMenuItemController extends BaseController {\n public static targets = ['anchor', 'dialog', 'dialogContent'];\n\n private declare readonly anchorTarget: HTMLAnchorElement;\n private declare readonly dialogTarget: HTMLDivElement;\n private declare readonly dialogContentTarget: HTMLDivElement;\n\n private dialogMDC: MDCDialog | null = null;\n\n public onInitialize() {\n this.onConnect(() => {\n const dialogMDC = new MDCDialog(this.dialogTarget);\n this.dialogMDC = dialogMDC;\n\n return () => {\n dialogMDC.destroy();\n this.dialogMDC = null;\n };\n });\n return super.onInitialize();\n }\n\n public handleClick(e: MouseEvent) {\n if (this.dialogMDC!.isOpen) {\n e.preventDefault();\n return void this.hideDialog();\n }\n\n const { href } = this.anchorTarget;\n if (href) {\n e.preventDefault();\n this.showDialog(href);\n }\n }\n\n private showDialog(fallbackHref: string) {\n const [contentHref, placeholder] = this.getRequiredDataAttrs('contentHref', 'placeholder');\n\n // Set the placeholder and open the dialog box\n safelySetInnerHTML(this.dialogContentTarget, markAsSafeHTML(placeholder));\n this.dialogMDC!.open();\n\n // Fetch the real content.\n // Once it has landed, render it out\n axios\n .get(contentHref, { headers: { Accept: 'text/fragment' } })\n .then(resp => {\n // May have been closed in the meantime\n if (this.dialogMDC!.isOpen) {\n safelySetInnerHTML(this.dialogContentTarget, markAsSafeHTML(resp.data));\n }\n })\n .catch(e => {\n // May have been closed in the meantime\n if (this.dialogMDC!.isOpen) {\n this.hideDialog();\n }\n // TODO maybe want to show an error here?\n console.warn(e);\n window.location.href = fallbackHref;\n });\n }\n\n private hideDialog() {\n this.dialogMDC!.close();\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nimport TableRowController from 'src/controllers/base/table/row_controller';\n\nexport default class BreakdownFormController extends BaseController {\n public toggleDisableRow(evt: CustomEvent<{ rowId: string }>) {\n const { rowId } = evt.detail;\n const rowControllers = this.getSpecificChildControllers(TableRowController);\n const rowToToggle = rowControllers.find(rc => rc.id === rowId);\n if (rowToToggle) {\n rowToToggle.disabled = !rowToToggle.disabled;\n }\n }\n}\n","const config: { [key: string]: any } = {};\n\nexport function setAppConfiguration(key: string, value: any) {\n config[key] = value;\n}\n\nexport function getAppConfiguration(key: string) {\n return config[key];\n}\n","import { getAppConfiguration, setAppConfiguration } from 'src/lib/app_configuration';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { addScriptTag } from 'src/lib/util/add_script_tag';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { IMapCompanyLocation, IMapOverlay, IMapPoint } from 'src/types';\n\n// Hacky quick solution to show a map - need to turn this info a proper component\n// and there maybe issues with inline styles and CSP...\n// FIXME: is a XSS waiting to happen with user specified name for locations etc?\nexport default class MapController extends BaseController {\n public static targets = ['mapContainer'];\n\n private declare readonly mapContainerTarget: HTMLDivElement;\n\n private googleMap!: google.maps.Map | null;\n\n // Note: we should also consider adjusting zoom to fit all placed geometry\n // https://developers.google.com/maps/documentation/javascript/examples/layer-data-dragndrop\n\n public onInitialize() {\n this.attachMapScript();\n\n this.onConnect(() => {\n this.onMapReady(() => {\n this.createMap();\n this.addOverlays();\n this.addPoints();\n });\n });\n\n this.onDisconnect(() => {\n this.googleMap = null;\n });\n\n return super.onInitialize();\n }\n\n private attachMapScript() {\n if (document.getElementById('google-maps-script-tag')) {\n return;\n }\n window.__mapInitialised = this.mapInitialised.bind(this);\n const key = this.data.get('api-key');\n const src = `https://maps.googleapis.com/maps/api/js?key=${key}&callback=__mapInitialised`;\n addScriptTag(src, {\n async: true,\n defer: true,\n id: 'google-maps-script-tag',\n });\n }\n\n private mapInitialised() {\n setAppConfiguration('mapHasLoaded', true);\n const evt = createCustomEvent('google-maps-script:ready');\n document.dispatchEvent(evt);\n }\n\n private onMapReady(callback: () => void) {\n if (getAppConfiguration('mapHasLoaded')) {\n return callback();\n }\n const readyListener = () => {\n callback();\n document.removeEventListener('google-maps-script:ready', readyListener);\n };\n document.addEventListener('google-maps-script:ready', readyListener);\n }\n\n private createMap() {\n this.googleMap = new google.maps.Map(this.mapContainerTarget, {\n center: this.mapCenter,\n zoom: parseInt(this.data.get('zoom') || '10', 10),\n });\n }\n\n private addPoints() {\n const pointsData = this.data.get('points');\n if (!pointsData) {\n return;\n }\n try {\n const points = JSON.parse(pointsData) as IMapCompanyLocation[];\n points.forEach(location => {\n const marker = new google.maps.Marker({\n position: { lat: location.lat, lng: location.lng },\n title: `${location.company_name} (${location.name})`,\n });\n marker.setMap(this.googleMap);\n });\n } catch (e) {\n console.error('Could not render the map points', e.message);\n }\n }\n\n // https://coderwall.com/p/49ygrg/geojson-multipolygon-to-google-maps-polygon\n private addOverlays() {\n const regionsData = this.data.get('overlays');\n if (!regionsData) {\n return;\n }\n try {\n const regions = JSON.parse(regionsData) as IMapOverlay[];\n regions.forEach(region => {\n const paths = region.coordinates.flatMap(polygon => {\n return polygon.flatMap(path => {\n return path.map(point => {\n // Important: the lat/lng are vice-versa in GeoJSON\n return new google.maps.LatLng(point[1], point[0]);\n });\n });\n });\n const mapPolygon = new google.maps.Polygon({ paths });\n mapPolygon.setMap(this.googleMap);\n });\n } catch (e) {\n console.error('Could not render the map overlays', e.message);\n }\n }\n\n private get mapCenter() {\n const centerData = this.data.get('center');\n if (!centerData) {\n return;\n }\n try {\n const center = JSON.parse(centerData) as IMapPoint;\n return { lat: center.lat, lng: center.lng };\n } catch (error) {\n return { lat: 33.6265064, lng: -84.5319427 };\n }\n }\n}\n","/**\n * Creates a custom DOM event.\n * TODO use a polyfill instead of this.\n *\n * @param href the URL of the script\n * @param defer if the script should defer execution till page loaded\n * @param async if the script load should be async\n */\n\nexport interface IAddScriptOptions {\n defer?: boolean;\n async?: boolean;\n id?: string;\n}\n\nexport function addScriptTag(href: string, options: IAddScriptOptions = {}) {\n const scriptTag = document.createElement('script');\n scriptTag.type = 'text/javascript';\n if (options.async) {\n scriptTag.async = true;\n }\n if (options.defer) {\n scriptTag.async = true;\n }\n if (options.id) {\n scriptTag.id = options.id;\n }\n scriptTag.src = href;\n document.getElementsByTagName('head')[0].appendChild(scriptTag);\n}\n","import { Instance } from 'flatpickr/dist/types/instance';\nimport { createCustomEvent } from '../../lib/util/create_custom_event';\n\nexport interface IDataAttributes {\n defaultDate: string;\n maxDate: string;\n minDate: string;\n\n enableDates: string[];\n enableDaysOfWeek: number[];\n\n disableDates: string[];\n disableDaysOfWeek: number[];\n\n altInput: boolean;\n altFormat: string;\n}\n\nexport function buildFlatpickrOptions({\n defaultDate,\n maxDate,\n minDate,\n enableDates,\n enableDaysOfWeek,\n disableDates,\n disableDaysOfWeek,\n altInput,\n altFormat,\n}: IDataAttributes) {\n const disableDatesArr = dates(disableDates);\n const enableDatesArr = dates(enableDates);\n const options = {\n altFormat,\n altInput,\n defaultDate,\n disable: [\n (date: Date): boolean => {\n if (disableDatesArr.length === 0 && disableDaysOfWeek.length === 0) {\n return false;\n }\n\n return (\n disableDaysOfWeek.includes(date.getDay()) ||\n disableDatesArr.some((disabledDate: Date) => sameDates(disabledDate, date))\n );\n },\n ],\n enable: [],\n maxDate,\n minDate,\n onChange: (selectedDates: Date[], dateStr: string, instance: Instance) => {\n const dateSelectEvent = createCustomEvent('cnf:delivery-date-selected', {\n selectedDate: selectedDates[0],\n });\n\n instance.input.dispatchEvent(dateSelectEvent);\n },\n onReady: (selectedDates: Date[], dateStr: string, instance: Instance) => {\n if (defaultDate && instance.altInput) {\n instance.altInput.value = instance.formatDate(new Date(defaultDate), altFormat);\n }\n },\n };\n\n // Will override 'disable' option if specified instantly\n if (enableDatesArr.length > 0 || enableDaysOfWeek.length > 0) {\n options.enable = [\n (date: Date): boolean => {\n return (\n enableDaysOfWeek.includes(date.getDay()) ||\n enableDatesArr.some((enabledDate: Date) => sameDates(enabledDate, date))\n );\n },\n ];\n }\n\n return options;\n}\n\nfunction dates(dateStrings: string[]): Date[] {\n return dateStrings.map((strDate: string) => new Date(strDate));\n}\n\nfunction sameDates(time1: Date, time2: Date): boolean {\n const date1 = new Date(time1).setHours(0, 0, 0, 0);\n const date2 = new Date(time2).setHours(0, 0, 0, 0);\n\n return date1 === date2;\n}\n","import flatpickr from 'flatpickr';\nimport { Instance } from 'flatpickr/dist/types/instance';\nimport {\n buildFlatpickrOptions,\n IDataAttributes,\n} from 'src/helpers/shopping/delivery_date_calendar_helper';\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport default class DeliveryDateCalendarController extends BaseController {\n public static targets = ['datepicker'];\n\n private declare readonly datepickerTarget: HTMLInputElement;\n\n private datePicker!: Instance | null;\n\n public onInitialize() {\n this.onConnect(() => {\n const dataAttributes = this.getRequiredDataAttrAsJSON('data');\n\n // Build flatpickr instance\n const flatpickrOpts = buildFlatpickrOptions(dataAttributes);\n this.datePicker = flatpickr(this.datepickerTarget, flatpickrOpts);\n\n return () => {\n this.datePicker!.destroy();\n this.datePicker = null;\n };\n });\n\n return super.onInitialize();\n }\n\n public open() {\n if (this.datePicker) {\n this.datePicker!.open();\n }\n }\n\n public close() {\n if (this.datePicker) {\n this.datePicker!.destroy();\n }\n }\n}\n","import { MDCMenuSurfaceFoundation } from '@material/menu-surface/index';\nimport { MDCMenu } from '@material/menu/index';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { MDCMenuItemSelectedEvent } from 'src/types';\n\nconst BOTTOM_START = MDCMenuSurfaceFoundation.Corner.BOTTOM_START;\n\nexport default class DropdownController extends BaseController {\n public static targets = ['menu'];\n\n private declare readonly menuTarget: HTMLDivElement;\n\n private menu: MDCMenu | null = null;\n\n public onInitialize() {\n this.onConnect(() => {\n const menu = new MDCMenu(this.menuTarget);\n menu.setAnchorCorner(BOTTOM_START);\n menu.listen('MDCMenu:selected', this.dispatchSelectedEvent);\n\n this.menu = menu;\n\n return () => {\n menu.unlisten('MDCMenu:selected', this.dispatchSelectedEvent);\n menu.destroy();\n\n this.menu = null;\n };\n });\n\n return super.onInitialize();\n }\n\n public toggleMenu() {\n if (this.menu) {\n this.menu.open = !this.menu.open;\n }\n }\n\n public openMenu() {\n if (this.menu && !this.menu.open) {\n this.menu.open = true;\n }\n }\n\n public closeMenu() {\n if (this.menu && this.menu.open) {\n this.menu.open = false;\n }\n }\n\n private dispatchSelectedEvent = (evt: Event) => {\n const {\n detail: { item, index },\n } = evt as MDCMenuItemSelectedEvent;\n const customEvt = createCustomEvent('cnf-menu:selected', {\n id: this.element.id,\n index,\n item,\n });\n this.element.dispatchEvent(customEvt);\n };\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class UnreadItemController extends BaseController {\n public static targets = ['ago'];\n\n // private declare readonly agoTarget: HTMLElement;\n\n public get sentAt(): number {\n return Number(this.data.get('sentAt'));\n }\n\n public get threadUid(): string {\n return this.data.get('threadUid')!;\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default abstract class PurchaseConfiguratorVariantController extends BaseController {\n public get id() {\n return this.data.get('variantId');\n }\n\n public set isCurrent(isCurrent: boolean) {\n const classToToggle = 'shopping__purchase-configurator__variant-details--current';\n // IE11 don't support second parameter in classList.toggle(classNmae, condition)\n isCurrent\n ? this.element.classList.add(classToToggle)\n : this.element.classList.remove(classToToggle);\n }\n}\n","import Rails from '@rails/ujs';\nimport { showDialog } from './overlay/dialog';\nimport { markAsSafeHTML } from './util/safe_html';\n\nimport { DialogLifecycleEvent } from 'src/types';\n\nconst alwaysTrue = () => true;\n\nconst customConfirm = (message: string, element: HTMLElement) => {\n // Listen for the dialog closing event.\n // If the closeReason corresponds to the 'confirm' action, then allow the confirm through.\n function handleDialogClosing({ detail: { closeReason } }: DialogLifecycleEvent) {\n if (closeReason === 'confirm') {\n // Song and dance to re-submit the original action.\n Rails.confirm = alwaysTrue;\n element.click();\n Rails.confirm = customConfirm;\n }\n }\n\n // Reveal the custom dialog.\n // TODO integrate with i18n module\n const confirmLabel = element.getAttribute('data-confirm-yes') || 'OK';\n const cancelLabel = element.getAttribute('data-confirm-no') || 'Cancel';\n showDialog({\n actions: [\n {\n action: 'cancel',\n title: cancelLabel,\n },\n {\n action: 'confirm',\n title: confirmLabel,\n },\n ],\n content: markAsSafeHTML(message),\n defaultAction: 'cancel',\n onClosing: handleDialogClosing,\n });\n\n // Interaction with dialog happens asynchronously,\n // so we need to initially return false to prevent submission.\n return false;\n};\n\nRails.confirm = customConfirm;\n\nexport default Rails;\n","import * as ActiveStorage from 'activestorage';\nimport Rails from './lib/rails';\n\nimport prepareControllers from './controllers';\n\nimport ahoy from 'ahoy.js';\nimport flatpickr from 'flatpickr';\n\nimport tippy from 'tippy.js';\nimport 'tippy.js/dist/tippy.css';\n\ntippy('[data-tippy-content]');\n\nimport Choices from 'choices.js';\ndocument\n .querySelectorAll('[data-select-searchable]')\n .forEach((el) => new Choices(el as HTMLSelectElement, { searchResultLimit: 8 }));\n\ndocument\n .querySelectorAll('[data-select-multiple-tags]')\n .forEach(\n (el) => new Choices(el as HTMLSelectElement, { removeItemButton: true, searchResultLimit: 8 })\n );\n\ndocument.querySelectorAll('[data-input-multiple-tags]').forEach(\n (el) =>\n new Choices(el as HTMLInputElement, {\n delimiter: ',',\n editItems: true,\n removeItemButton: true,\n })\n);\n\nimport Chartjs from 'chart.js';\nimport Chartkick from 'chartkick';\nimport ChartDataLabels from 'chartjs-plugin-datalabels';\nimport { ChartRegressions } from 'chartjs-plugin-regression';\nChartjs.plugins.unregister(ChartDataLabels);\n\n(window as any).Chart = Chartjs;\n(window as any).Chartkick = Chartkick;\n\n// Init charts\nconst urlParams = new URLSearchParams(window.location.search);\nif (urlParams.get('trendline')) {\n // (Chartjs.defaults.global.plugins as any).regressions = {\n // type: ['linear', 'polynomial'],\n // line: { color: 'blue', width: 3 },\n // onCompleteCalculation: function callback(chart){ console.log(\"complete\", chart)}\n // };\n Chartjs.plugins.register(ChartRegressions);\n // (Chartjs.defaults.global.plugins as any).trendline = {};\n // Chartjs.plugins.register({\n // id: 'trendline',\n // beforeInit: function (chart: any) {\n // chart.trendline = (Chartjs.defaults.global.plugins as any).trendline;\n // },\n // afterRender: function (chart: Chart) {\n // if (chart.config.type !== 'line') {\n // return;\n // }\n // chart.data.datasets.forEach(function (dataset, index) {\n // const datasetMeta = chart.getDatasetMeta(index);\n //\n // var lastIndex = dataset.data.length - 1;\n // var startPos = datasetMeta.data[0]._model.x;\n // var endPos = datasetMeta.data[lastIndex]._model.x;\n //\n // let trendStart = 0;\n // let trendEnd = 0;\n // dataset.data.forEach(function(data, index) {\n // if (data == null) return;\n // console.log(data, index);\n // });\n //\n //\n // var yScale;\n // var xScale;\n // for (var axis in chart.scales) {\n // if ( axis[0] == 'x')\n // xScale = chart.scales[axis];\n // else\n // yScale = chart.scales[axis];\n // if ( xScale && yScale ) break;\n // }\n // var x1 = startPos;\n // var x2 = endPos;\n // var y1 = yScale.getPixelForValue(trendStart);\n // var y2 = yScale.getPixelForValue(trendEnd);\n //\n //\n // var drawBottom = datasetMeta.controller.chart.chartArea.bottom;\n // var chartWidth = datasetMeta.controller.chart.width;\n //\n // if(y1 > drawBottom) { // Left side is below zero\n // var diff = y1 - drawBottom;\n // var lineHeight = y1 - y2;\n // var overlapPercentage = diff / lineHeight;\n // var addition = chartWidth * overlapPercentage;\n //\n // y1 = drawBottom;\n // x1 = (x1 + addition);\n // } else if(y2 > drawBottom) { // right side is below zero\n // var diff = y2 - drawBottom;\n // var lineHeight = y2 - y1;\n // var overlapPercentage = diff / lineHeight;\n // var subtraction = chartWidth - (chartWidth * overlapPercentage);\n //\n // y2 = drawBottom;\n // x2 = chartWidth - (x2 - subtraction);\n // }\n //\n // const ctx = chart.ctx;\n // ctx.lineWidth = 3;\n // ctx.setLineDash([2, 3]);\n // ctx.beginPath();\n // ctx.moveTo(x1, y1);\n // ctx.lineTo(x2, y2);\n // ctx.strokeStyle = 'rgba(169,169,169, .6)';\n // ctx.stroke();\n // });\n // },\n // });\n}\n\nif (urlParams.get('datalabels')) {\n Chartjs.plugins.register(ChartDataLabels);\n\n Chartjs.helpers.merge((Chartjs.defaults.global.plugins as any).datalabels, {\n backgroundColor: function (context: any) {\n return context.dataset.backgroundColor;\n },\n borderColor: 'white',\n borderWidth: 2,\n borderRadius: 4,\n color: 'white',\n font: { weight: 'bold' },\n // formatter: Math.round\n });\n}\n\n// Initialise the front end framework\nconsole.debug('[Boot] Prepare Confinus client side');\n\nconsole.debug('[Boot] Prepare Rails client side libraries');\n// Start Rails client side components\nRails.start();\nActiveStorage.start();\n\nconsole.debug('[Boot] Register Confinus JS Components');\n// Prepare client side controllers\nprepareControllers();\n\n// Set up action text\nimport Trix from 'trix';\nimport actiontext from '@rails/actiontext';\nimport Chart from 'chart.js';\n(window as any).Trix = Trix;\n","import { Application } from 'stimulus';\nimport { definitionsFromContext } from 'stimulus/webpack-helpers';\n\nexport default function prepareControllers() {\n const application = Application.start();\n const context = require.context('.', true, /_controller\\.(ts)$/);\n application.load(definitionsFromContext(context));\n}\n","// Polyfills\n// TODO investigate 'legacy' and 'modern' bundles so that babel/preset-env can produce a smaller JS filesize for better browsers\nimport 'core-js/stable';\nimport 'element-closest/browser';\nimport 'regenerator-runtime/runtime';\n\n// Styles\nimport './confinus.scss';\n\n// https://prograils.com/posts/adding-webpacker-legacy-rails-app\n// We must reference all static assets to allow us to source them in Rails too\nrequire.context('../assets', true, /\\.(svg|png|jpe?g|gif|ico|woff2?|eot|ttf)$/im);\n\n// All the front end system is started here\nimport 'src/boot';\n","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/frozen-fc87ede955e5bc8d92973d380028e16f.svg\";","import { IFormFieldValidationEvent } from 'src/types';\n\nimport PurchaseConfiguratorVariantController from 'src/controllers/shopping/purchase_configurator/purchase_configurator_variant_controller';\nimport { calculateTotalPriceForDisplay } from 'src/helpers/shopping/purchase_configurator_helper';\nimport i18n from 'src/lib/i18n';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport PurchaseConfiguratorQuantityExtraInfoController from './extra_info_controller';\n\ninterface IDataAttributes {\n fallbackDisplay: string;\n extraChargeMultiplier: string | number;\n priceMultiplier: string | number;\n quantityType: 'float' | 'integer';\n sizeExcludedFromCalculation?: boolean;\n currency: string;\n variantId: number;\n}\n\nabstract class BasePurchaseConfiguratorQuantityCalculatorController extends PurchaseConfiguratorVariantController {\n public readonly fieldsetTarget!: HTMLFieldSetElement;\n public readonly quantityTarget!: HTMLInputElement;\n public readonly quantityErrorTarget!: HTMLParagraphElement;\n public readonly sizeTarget!: HTMLInputElement | HTMLSelectElement;\n public readonly hasSizeTarget!: boolean;\n public readonly sizeErrorTarget!: HTMLParagraphElement;\n public readonly hasSizeErrorTarget!: boolean;\n public readonly totalPriceTarget!: HTMLSpanElement;\n}\n\nexport default class PurchaseConfiguratorQuantityCalculatorController extends (PurchaseConfiguratorVariantController as typeof BasePurchaseConfiguratorQuantityCalculatorController) {\n public static targets = [\n 'fieldset',\n 'quantity',\n 'quantityError',\n 'size',\n 'sizeError',\n 'totalPrice',\n ];\n\n public onInitialize() {\n this.onConnect(() => {\n this.handleFieldsetInput();\n });\n\n return super.onInitialize();\n }\n\n public set isCurrent(isCurrent: boolean) {\n super.isCurrent = isCurrent;\n if (isCurrent) {\n this.enableInputs();\n } else {\n this.disableInputs();\n }\n }\n\n public handleFieldsetInput() {\n // Hard code something in case the data attr parsing goes belly-up\n let fallbackDisplay = '-';\n\n try {\n const {\n currency,\n extraChargeMultiplier,\n priceMultiplier,\n quantityType,\n sizeExcludedFromCalculation,\n ...other\n } = this.getRequiredDataAttrAsJSON('quantityData');\n\n // We can now get the real fallback display to use\n fallbackDisplay = other.fallbackDisplay;\n\n // Grab the actual values from the UI\n const quantity = this.quantityTarget.value;\n const size = this.hasSizeTarget ? this.sizeTarget.value : undefined;\n\n // Generate and set the total price\n const totalPrice = calculateTotalPriceForDisplay({\n currency,\n extraChargeMultiplier,\n locale: i18n.locale,\n priceMultiplier,\n quantity,\n quantityType,\n size,\n sizeExcludedFromCalculation,\n });\n\n this.totalPrice = totalPrice !== null ? totalPrice : fallbackDisplay;\n\n // Update the info sections, if any\n this.extraInfoControllers.forEach(c =>\n c.updateValue({ quantity, quantityType, size, fallbackDisplay })\n );\n } catch (e) {\n // Ru-roh, something's gone wrong when parsing the attributes\n // TODO handle this error: show the user somehow\n console.warn(e);\n this.totalPrice = fallbackDisplay;\n }\n }\n\n private set totalPrice(price: string) {\n this.totalPriceTarget.textContent = price;\n }\n\n private get extraInfoControllers() {\n return this.getSpecificChildControllers(\n PurchaseConfiguratorQuantityExtraInfoController\n );\n }\n\n private enableInputs() {\n // Rails-UJS will support the automatic removal of input data from within disabled fieldsets soon.\n // For now we need to disable inner inputs manually.\n // We don't care about disabling through the MDC instance, since the inputs will be hidden anyway, so styling changes don't matter.\n this.fieldsetTarget.removeAttribute('disabled');\n\n // TODO we can remove this hack once Rails has support for not serializing form inputs inside disabled fieldsets\n // https://github.com/rails/rails/pull/36764\n this.quantityTarget.removeAttribute('disabled');\n if (this.hasSizeTarget) {\n this.sizeTarget.removeAttribute('disabled');\n }\n }\n\n private disableInputs() {\n // Rails-UJS will support the automatic removal of input data from within disabled fieldsets soon.\n // For now we need to disable inner inputs manually.\n // We don't care about disabling through the MDC instance, since the inputs will be hidden anyway, so styling changes don't matter.\n this.fieldsetTarget.setAttribute('disabled', 'disabled');\n\n // TODO we can remove this hack once Rails has support for not serializing form inputs inside disabled fieldsets\n // https://github.com/rails/rails/pull/36764\n this.quantityTarget.setAttribute('disabled', 'disabled');\n if (this.hasSizeTarget) {\n this.sizeTarget.setAttribute('disabled', 'disabled');\n }\n }\n}\n","// import { MDCSelect } from '@material/select/index';\n\nimport { ISafeHTMLContent } from 'src/types';\n\nimport FormFieldController from 'src/lib/controller/form_field_controller';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { markAsSafeHTML, safelySetInnerHTML } from 'src/lib/util/safe_html';\n\nexport default class SelectController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n public onInitialize() {\n this.onConnect(() => {\n this.nativeControl.addEventListener('change', this.handleChangeEvent);\n return () => {\n this.nativeControl.removeEventListener('change', this.handleChangeEvent);\n };\n });\n\n return super.onInitialize();\n }\n\n public set disabled(disabled: boolean) {\n this.confinusSelectElement.classList.toggle(this.disabledClassName, disabled);\n this.nativeControl.disabled = disabled;\n }\n\n public set options(options: ISafeHTMLContent) {\n safelySetInnerHTML(this.nativeControl, options);\n }\n\n public get emptyOption() {\n return '';\n }\n\n public get value(): string {\n return this.nativeControl.value;\n }\n\n public empty() {\n this.options = markAsSafeHTML(this.emptyOption);\n }\n\n protected get invalidClassName() {\n return 'cnf-select--invalid';\n }\n\n protected get disabledClassName() {\n return 'cnf-select--disabled';\n }\n\n private get nativeControl() {\n return this.element.getElementsByClassName(\n 'cnf-select__native-control'\n )[0] as HTMLSelectElement;\n }\n\n private get confinusSelectElement() {\n return this.element.getElementsByClassName('cnf-select')[0] as HTMLDivElement;\n }\n\n private handleChangeEvent = (evt: Event) => {\n const name = this.data.get('name');\n const target = evt.target as HTMLSelectElement;\n const customEvt = createCustomEvent('cnf-select:change', {\n name,\n index: target.selectedIndex,\n value: target.value,\n });\n this.element.dispatchEvent(customEvt);\n };\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\n\nexport default class BreakdownRemoveItemController extends BaseController {\n public static targets = ['input'];\n\n private declare readonly inputTarget: HTMLInputElement;\n\n public handleRemoveIconClick() {\n this.toggleInput();\n this.dispatchRemoveEvent();\n }\n\n private get rowId() {\n return this.getRequiredDataAttr('rowId');\n }\n\n private dispatchRemoveEvent() {\n const evt = createCustomEvent('breakdown-form:disable-toggled', {\n rowId: this.rowId,\n });\n this.element.dispatchEvent(evt);\n }\n\n private toggleInput() {\n if (this.inputTarget.value === 'true') {\n this.inputTarget.value = 'false';\n } else {\n this.inputTarget.value = 'true';\n }\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/sparkles-43c09a65be8ece382b329919da0e3240.svg\";","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/brand-173bea87e55643feae13b424423fccfd.svg\";","import BaseController from 'src/lib/controller/base_controller';\nimport { showDialog } from 'src/lib/overlay/dialog';\n\nexport default class RefreshPopupController extends BaseController {\n public showRefreshPopup() {\n showDialog({\n contentHref: '/marketplace/reminders/refresh-page',\n });\n }\n}\n","export default window.i18n;\n","import DeliveryDateCalendarController from 'src/controllers/shopping/delivery_date_calendar_controller';\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport default class DeliveryDateSelectController extends BaseController {\n public static targets = ['form'];\n\n private declare readonly formTarget: HTMLFormElement;\n\n public showCalendar(evt: Event) {\n const calendarController = this.getSpecificChildController(\n DeliveryDateCalendarController\n );\n calendarController!.open();\n }\n\n public dateSelected(evt: Event) {\n evt.stopPropagation();\n this.formTarget.submit();\n }\n}\n","import { MDCSnackbar } from '@material/snackbar/index';\n\nimport BaseController from 'src/lib/controller/base_controller';\nimport { replaceContentsWithChildren } from 'src/lib/util/replace_with_dom_nodes';\n\nimport { SnackbarShowEvent } from 'src/types';\n\nconst DEFAULT_TIMEOUT = 6000;\n\nexport default class SnackbarController extends BaseController {\n public static targets = ['label', 'actionsContainer'];\n\n private declare readonly labelTarget: HTMLDivElement;\n private declare readonly actionsContainerTarget: HTMLDivElement;\n\n private snackbarMDC: MDCSnackbar | null = null;\n\n public onInitialize() {\n this.onConnect(() => {\n const snackbarMDC = new MDCSnackbar(this.element);\n this.snackbarMDC = snackbarMDC;\n\n if (this.data.get('showInitial')) {\n this.reveal();\n }\n\n return () => {\n snackbarMDC.destroy();\n this.snackbarMDC = null;\n };\n });\n\n return super.onInitialize();\n }\n\n public handleShowEvent(evt: SnackbarShowEvent) {\n const {\n detail: { message, actionText, actionHandler, timeout },\n } = evt;\n if (message) {\n // Setup our DOM structure\n this.labelTarget.textContent = message;\n if (actionText) {\n const actionButton = this.createActionButton(actionText, actionHandler);\n replaceContentsWithChildren(this.actionsContainerTarget, actionButton);\n }\n this.reveal(timeout);\n }\n }\n\n private reveal(timeout = DEFAULT_TIMEOUT) {\n const snackbarMDC = this.snackbarMDC!;\n snackbarMDC.open();\n setTimeout(() => snackbarMDC.close(), timeout);\n }\n\n private createActionButton(text: string, action?: string) {\n const buttonEl = document.createElement('button');\n buttonEl.classList.add('mdc-button', 'mdc-snackbar__action');\n buttonEl.setAttribute('type', 'button');\n if (action) {\n buttonEl.setAttribute('data-action', action);\n }\n buttonEl.textContent = text;\n return buttonEl;\n }\n}\n","import debounce from 'lodash.debounce';\nimport shave from 'shave';\n\nimport BaseController from 'src/lib/controller/base_controller';\n\nconst DEBOUNCE_TIMEOUT_MS = 200;\n\nexport default class LineClampController extends BaseController {\n private originalText: string | null = null;\n private shouldActOnResize = false;\n\n public onInitialize() {\n this.onConnect(() => {\n this.originalText = this.element.textContent;\n this.clamp();\n\n const handleResizeDebounced = debounce(this.handleResize.bind(this), DEBOUNCE_TIMEOUT_MS);\n window.addEventListener('resize', handleResizeDebounced);\n this.shouldActOnResize = true;\n\n return () => {\n this.resetText();\n this.shouldActOnResize = false;\n window.removeEventListener('resize', handleResizeDebounced);\n };\n });\n\n return super.onInitialize();\n }\n\n public clamp() {\n // Use the height of the element set by the stylesheet\n const targetHeight = this.element.getBoundingClientRect().height;\n shave(this.element, targetHeight);\n }\n\n private handleResize() {\n if (this.shouldActOnResize) {\n // Reset the text first - in case the window is now wider than before\n this.resetText();\n this.clamp();\n }\n }\n\n private resetText() {\n this.element.textContent = this.originalText;\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nimport DrawerController from 'src/controllers/base/drawer_controller';\n\nexport default class NavigableController extends BaseController {\n public handleNavButtonClick(evt: Event) {\n const drawerController = this.getSpecificChildController(DrawerController);\n if (drawerController) {\n evt.preventDefault();\n drawerController.toggle();\n }\n }\n}\n","import { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { IToastDismissOptions, IToastShowOptions } from 'src/types';\n\nexport function showToast(opts: IToastShowOptions) {\n const evt = createCustomEvent('cnf-toast:show', opts);\n window.dispatchEvent(evt);\n}\n\nexport function dismissAllToasts() {\n const evt = createCustomEvent('cnf-toast:dismissAll');\n window.dispatchEvent(evt);\n}\n\nexport function dismissSingleToast(opts: IToastDismissOptions) {\n const evt = createCustomEvent('cnf-toast:dismiss', opts);\n window.dispatchEvent(evt);\n}\n","var map = {\n\t\"./images/cards_logos/amex.svg\": \"L0L7\",\n\t\"./images/category_image_placeholder.svg\": \"TLSL\",\n\t\"./images/confinus-avatar-black.png\": \"f75i\",\n\t\"./images/confinus-avatar.png\": \"d1t7\",\n\t\"./images/confinus-logo.png\": \"Q5fj\",\n\t\"./images/confinus_logo.png\": \"RO2F\",\n\t\"./images/iconmonstr-candy-6.svg\": \"yESg\",\n\t\"./images/shield.svg\": \"PaNi\",\n\t\"./images/shopping/brand.svg\": \"BkNQ\",\n\t\"./images/shopping/delivery.svg\": \"yWLZ\",\n\t\"./images/shopping/flag.svg\": \"KJTo\",\n\t\"./images/shopping/frozen.svg\": \"9HR0\",\n\t\"./images/shopping/grade.svg\": \"/a2f\",\n\t\"./images/shopping/question-mark.svg\": \"yyIK\",\n\t\"./images/shopping/tag.svg\": \"r+Qm\",\n\t\"./images/sparkles.svg\": \"BawQ\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"GeFs\";","import BaseController from 'src/lib/controller/base_controller';\nimport { showDialog } from 'src/lib/overlay/dialog.ts';\n\nexport default class ListItemController extends BaseController {\n public openDialog() {\n const id = this.data.get('id');\n if (id == null) {\n return;\n }\n\n showDialog({\n actions: [\n {\n action: 'cancel',\n title: 'OK',\n },\n ],\n contentHref: `/platform/reports/audit_logs/${id}`,\n title: `System activity number ${id} logged`,\n });\n }\n}\n","import { MDCTextField } from '@material/textfield/index';\nimport FormFieldController from 'src/lib/controller/form_field_controller';\n\nexport default class TextAreaController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n public onInitialize() {\n this.onConnect(() => {\n const textareaMDC = new MDCTextField(this.containerTarget);\n\n // Turn off native form validation. We'll be handling this ourselves.\n textareaMDC.useNativeValidation = false;\n\n return () => {\n textareaMDC.destroy();\n };\n });\n\n return super.onInitialize();\n }\n\n protected get invalidClassName() {\n return 'mdc-text-field--invalid';\n }\n}\n","import Big from 'big.js';\n\ninterface ITotalPriceOpts {\n extraChargeMultiplier: string | number;\n priceMultiplier: string | number;\n quantity: string;\n quantityType: string;\n size?: string;\n sizeExcludedFromCalculation?: boolean;\n}\n\ninterface ITotalPriceForDisplayOpts extends ITotalPriceOpts {\n currency: string;\n locale: string;\n}\n\ninterface IExtraInfoAmountForDisplayOpts {\n locale: string;\n multiplier: string | number;\n quantity: string;\n quantityType: string;\n size?: string;\n sizeCalculationPerformDivision?: boolean;\n sizeExcludedFromCalculation?: boolean;\n}\n\nconst ZERO = Number(0);\nconst BIG_ZERO = new Big(0);\n\nexport function calculateTotalPriceForDisplay(opts: ITotalPriceForDisplayOpts): string | null {\n const { currency, locale, ...priceFactors } = opts;\n\n const totalPriceBig = calculateTotalPrice(priceFactors);\n const totalPriceNumber = totalPriceBig !== null ? Number.parseFloat(totalPriceBig.toFixed(2)) : 0;\n\n return totalPriceNumber.toLocaleString(locale, {\n currency,\n style: 'currency',\n });\n}\n\nexport function calculateExtraInfoAmountForDisplay({\n locale,\n multiplier,\n quantity,\n quantityType,\n size,\n sizeCalculationPerformDivision,\n sizeExcludedFromCalculation,\n}: IExtraInfoAmountForDisplayOpts) {\n const quantityBig = parseQuantity(quantity, quantityType);\n if (isNullOrBigZero(quantityBig)) {\n return ZERO.toLocaleString(locale);\n }\n\n const sizeBig = parseSize(size, sizeExcludedFromCalculation);\n if (isNullOrBigZero(sizeBig)) {\n return ZERO.toLocaleString(locale);\n }\n\n const multiplierBig = parseQuantityPriceMultiplier(multiplier);\n if (isNullOrBigZero(multiplierBig)) {\n return ZERO.toLocaleString(locale);\n }\n\n // Use big.js to perform arithmetic, to prevent floating point rounding errors\n let extraInfoAmountBig = multiplierBig.times(quantityBig!);\n extraInfoAmountBig = sizeCalculationPerformDivision\n ? extraInfoAmountBig.div(sizeBig)\n : extraInfoAmountBig.times(sizeBig);\n\n // Format for display\n const extraInfoAmountNumber = Number.parseFloat(extraInfoAmountBig.toFixed(2));\n return extraInfoAmountNumber.toLocaleString(locale);\n}\n\nfunction calculateTotalPrice({\n extraChargeMultiplier,\n priceMultiplier,\n quantity,\n quantityType,\n size,\n sizeExcludedFromCalculation,\n}: ITotalPriceOpts): Big | null {\n const quantityBig = parseQuantity(quantity, quantityType);\n if (quantityBig === null) {\n return null;\n }\n\n const sizeBig = parseSize(size, sizeExcludedFromCalculation);\n const priceMultiplierBig = parseQuantityPriceMultiplier(priceMultiplier);\n const extraChargeMultiplierBig = parseQuantityPriceMultiplier(extraChargeMultiplier);\n\n // Use big.js to perform arithmetic, to prevent floating point rounding errors\n const totalMultiplierBig = priceMultiplierBig.add(extraChargeMultiplierBig);\n return totalMultiplierBig\n .times(quantityBig)\n .times(sizeBig)\n .div(100);\n}\n\nfunction parseQuantity(quantityRaw: string, quantityType: string): Big | null {\n switch (quantityType) {\n case 'float': {\n return newPositiveBigOrNull(quantityRaw);\n }\n\n case 'integer': {\n if (quantityRaw.includes('.')) {\n // Can't parse a decimal number as an integer.\n return null;\n }\n return newPositiveBigOrNull(quantityRaw);\n }\n\n default:\n // quantityType not recognised\n throw new Error(\n `quantityType '${quantityType || '\"\"'}' is invalid, should be 'float' or 'integer'`\n );\n }\n}\n\nfunction parseSize(sizeRaw?: string, sizeExcludedFromCalculation?: boolean): Big {\n // Intentionally double equals to check for undefined and null\n if (sizeRaw == null || sizeExcludedFromCalculation) {\n return new Big(1);\n }\n return newPositiveBigOrNull(sizeRaw) || new Big(1);\n}\n\nfunction parseQuantityPriceMultiplier(multiplierRaw: string | number): Big {\n const multiplierBig = newPositiveBigOrNull(multiplierRaw);\n if (multiplierBig === null) {\n // This is an error that the user cannot recover from.\n throw new Error(`multiplier was not a positive number: ${multiplierRaw || '\"\"'}`);\n }\n\n return multiplierBig;\n}\n\nfunction newPositiveBigOrNull(input: string | number): Big | null {\n if (typeof input === 'string' && input.length === 0) {\n return null;\n }\n try {\n const big = new Big(input);\n // TODO: max value should probably come from configuration\n return big.gte(0) && big.lte(1000000) ? big : null;\n } catch (error) {\n return null;\n }\n}\n\nfunction isNullOrBigZero(input: Big | null) {\n return input === null || BIG_ZERO.eq(input);\n}\n","import axios from 'src/lib/axios';\nimport BaseController from 'src/lib/controller/base_controller';\nimport i18n from 'src/lib/i18n';\nimport { markAsSafeHTML, safelySetInnerHTML } from 'src/lib/util/safe_html';\nimport {\n IHTMLElementAnimationEndEvent,\n ISafeHTMLContent,\n ToastDismissEvent,\n ToastShowEvent,\n} from 'src/types';\n\ntype NotificationElement = HTMLLIElement;\n\nconst DOM_NAMESPACE = 'cnf-toaster';\n\nconst NOTIFICATION_CLASSNAME = `${DOM_NAMESPACE}__notification`;\nconst NOTIFICATION_ACTIVE_CLASSNAME = `${NOTIFICATION_CLASSNAME}--active`;\nconst NOTIFICATION_DISMISSED_CLASSNAME = `${NOTIFICATION_CLASSNAME}--dismissed`;\n\nconst DEFAULT_DISMISS_AFTER_MS = 3000;\nconst DISMISS_ALL_STAGGER_MS = 50;\n\nexport default class ToasterController extends BaseController {\n public async handleShowEvent(evt: ToastShowEvent) {\n const {\n detail: { content, timeout, contentHref },\n } = evt;\n const notification = await this.createNotification(content, contentHref);\n const toastTimeout = timeout || DEFAULT_DISMISS_AFTER_MS;\n if (toastTimeout !== Infinity) {\n const timerId = window.setTimeout(\n () => this.dismissNotification(notification.id),\n toastTimeout\n );\n notification.dataset.dismissTimerId = timerId.toString();\n }\n // .prepend() not available in IE11\n // this.element.prepend(notification);\n this.element.insertBefore(notification, this.element.firstChild);\n\n notification.addEventListener('click', () => {\n this.dismissNotification(notification.id);\n });\n\n notification.addEventListener('touchend', () => {\n this.dismissNotification(notification.id);\n });\n\n // Ensure fadeIn happens on next paint\n window.setTimeout(() => notification.classList.add(NOTIFICATION_ACTIVE_CLASSNAME), 50);\n }\n\n public handleDismissAllEvent() {\n // This isn't exactly the 'stimulus way' - we should probably be using targets instead.\n // But, it works.\n Array.from(this.element.getElementsByClassName(NOTIFICATION_CLASSNAME))\n .reverse() // Bottom notification should disappear first\n .forEach((node, idx) => {\n const el = node as NotificationElement;\n clearTimeout(+el.dataset.dismissTimerId!);\n setTimeout(() => this.dismissNotification(el.id), idx * DISMISS_ALL_STAGGER_MS);\n });\n }\n\n public handleDismissSingleEvent(evt: ToastDismissEvent) {\n const {\n detail: { id },\n } = evt;\n this.dismissNotification(id);\n }\n\n public handleAnimationEnd({ target, animationName }: IHTMLElementAnimationEndEvent) {\n if (\n animationName === 'cnf-toaster__bounce-out' &&\n target !== null &&\n target.id.startsWith(DOM_NAMESPACE) &&\n target.classList.contains(NOTIFICATION_DISMISSED_CLASSNAME)\n ) {\n // .remove() not available in IE11\n // target.remove();\n this.element.removeChild(target);\n }\n }\n\n private nextNotificationId() {\n const raw = this.data.get('currentNotificationId');\n if (raw === null) {\n throw new Error('currentNotificationId data attribute is not present');\n }\n\n const parsed = parseInt(raw, 10);\n const next = parsed + 1;\n\n this.data.set('currentNotificationId', `${next}`);\n return `${DOM_NAMESPACE}-${next}`;\n }\n\n private async createNotification(\n content: ISafeHTMLContent | undefined,\n contentHref: string | undefined\n ): Promise {\n const notification = document.createElement('li');\n notification.id = this.nextNotificationId();\n notification.classList.add(NOTIFICATION_CLASSNAME);\n\n if (contentHref) {\n // TODO: What if contentHref already has a query string parameters?\n const remoteContent = await this.getRemoteContent(\n `${contentHref}?toast_id=${notification.id}`\n );\n safelySetInnerHTML(notification, remoteContent);\n } else if (content) {\n safelySetInnerHTML(notification, content);\n }\n\n return notification;\n }\n\n private getRemoteContent(contentHref: string): Promise {\n return this.getContent(contentHref).catch(err => {\n console.warn(err);\n const errorMessage = i18n.errors.generic_server_error;\n return markAsSafeHTML(errorMessage);\n });\n }\n\n private getContent(url: string): Promise {\n return axios\n .get(url, {\n headers: {\n 'Content-Type': 'text/html',\n },\n })\n .then(response => markAsSafeHTML(response.data));\n }\n\n private dismissNotification(notificationId: string) {\n // Only try to dismiss the notification if it is still in the DOM,\n // and it is not being dismissed\n const notification = document.getElementById(notificationId);\n if (notification && notification.classList.contains(NOTIFICATION_ACTIVE_CLASSNAME)) {\n notification.classList.add(NOTIFICATION_DISMISSED_CLASSNAME);\n notification.classList.remove(NOTIFICATION_ACTIVE_CLASSNAME);\n }\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { closeDialog, showDialog } from 'src/lib/overlay/dialog.ts';\nimport { IDialogLifecycleEventDetail } from 'src/types';\n\nexport default class DialogManagerController extends BaseController {\n public handleButtonClick() {\n const action = this.getRequiredDataAttr('action');\n switch (action) {\n case 'show':\n this.show();\n break;\n case 'save':\n this.close({ closeReason: 'save' });\n break;\n case 'close':\n this.close();\n break;\n }\n }\n\n private show() {\n const [href, dialogVariant] = this.getRequiredDataAttrs('href', 'dialogVariant');\n showDialog({\n contentHref: href,\n dialogVariant,\n });\n }\n\n private close(opts?: IDialogLifecycleEventDetail) {\n closeDialog(opts);\n }\n}\n","import { MDCTopAppBar } from '@material/top-app-bar/index';\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport default class TopAppBarController extends BaseController {\n public onInitialize() {\n this.onConnect(() => {\n const topAppBarMDC = new MDCTopAppBar(this.element);\n return () => {\n topAppBarMDC.destroy();\n };\n });\n\n return super.onInitialize();\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport Swiper from 'swiper';\n\nexport default class CarouselController extends BaseController {\n private carousel?: Swiper = undefined;\n\n public onInitialize() {\n this.onConnect(() => {\n this.element.classList.remove('cnf-display--none');\n const perView = window.innerWidth > 600 ? 3 : 1.25;\n const desired = this.data.get('slidesPerView');\n this.carousel = new Swiper(this.element as HTMLElement, {\n slidesPerView: desired ? parseFloat(this.data.get('slidesPerView')!) : perView,\n centeredSlides: true,\n spaceBetween: 16,\n navigation: {\n nextEl: '.swiper-button-next',\n prevEl: '.swiper-button-prev',\n },\n });\n });\n\n return super.onInitialize();\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/flag-fa8582346de14c96b955ca23a7599d85.svg\";","import FlashController from 'src/controllers/base/flash_controller';\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport default class FlashExamplesController extends BaseController {\n public toggleFlash() {\n const fc = this.flashController;\n if (fc) {\n fc.text = 'Hello from a toggled flash box';\n fc.toggle();\n }\n }\n\n public revealBriefly() {\n const fc = this.flashController;\n if (fc) {\n fc.text = 'Hello from a revealed flash box';\n fc.reveal(1000);\n }\n }\n\n private get flashController() {\n return this.getSpecificChildController(FlashController);\n }\n}\n","export enum Keys {\n Enter,\n}\n\nexport function keyWasPressed(evt: KeyboardEvent, key: Keys): boolean {\n switch (key) {\n case Keys.Enter:\n return evt.key === 'Enter' || evt.keyCode === 13;\n default:\n return false;\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport {\n addParametersToQueryString,\n removeParameterFromQueryString,\n} from 'src/lib/util/add_parameter_to_url';\nimport { Keys, keyWasPressed } from 'src/lib/util/keyboard_key';\nimport { MDCSelectChangeEvent } from 'src/types';\nimport flatpickr from 'flatpickr';\nimport { Instance } from 'flatpickr/dist/types/instance';\n\nexport default class DataFilterFormController extends BaseController {\n public handleFilterChange({ detail: { name, value } }: MDCSelectChangeEvent) {\n this.reloadWithQueryParam(name, value);\n }\n\n public handleCheckedFilterChange(evt: Event) {\n const { name, checked } = evt.target as HTMLInputElement;\n this.reloadWithQueryParam(name, checked ? 'true' : undefined);\n }\n\n public handleToggleGrid() {\n this.reloadWithQueryParam('table_mode', this.data.get('grid') === 'true' ? 'table' : 'grid');\n }\n\n public handleRangePicker(evt: Event) {\n const datePicker = flatpickr(evt.target as HTMLInputElement, {\n mode: 'range',\n onClose: (selectedDates: Date[], dateStr: string, instance: Instance) => {\n if (selectedDates.length == 2) {\n this.reloadWithQueryParam(\n 'custom_range',\n selectedDates\n .map((d) => {\n return instance.formatDate(new Date(d), 'Y-m-d');\n })\n .join('_')\n );\n }\n },\n });\n datePicker.open();\n }\n\n // https://medium.com/@uistephen/keyboardevent-key-for-cross-browser-key-press-check-61dbad0a067a\n public handleSearchInputKeydown(evt: KeyboardEvent) {\n if (evt.defaultPrevented) {\n return;\n }\n const enterPressed = keyWasPressed(evt, Keys.Enter);\n if (enterPressed) {\n // Stop form submission\n evt.preventDefault();\n\n // Take the name/value pair from the input and set on the query string\n const { name, value } = evt.target as HTMLInputElement;\n this.reloadWithQueryParam(name, value);\n }\n }\n\n private reloadWithQueryParam(name: string, value?: string) {\n if (value === undefined) {\n window.location.search = removeParameterFromQueryString(window.location.search, name);\n } else {\n const params = {\n [name]: value,\n };\n window.location.search = addParametersToQueryString(window.location.search, params);\n }\n }\n}\n","import { MDCDialog } from '@material/dialog/index';\n\nimport axios from 'src/lib/axios';\nimport BaseController from 'src/lib/controller/base_controller';\nimport i18n from 'src/lib/i18n';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { replaceContentsWithChildren } from 'src/lib/util/replace_with_dom_nodes';\nimport { markAsSafeHTML, safelySetInnerHTML } from 'src/lib/util/safe_html';\n\nimport {\n DialogShowEvent,\n IDialogAction,\n IDialogLifecycleEventDetail,\n ISafeHTMLContent,\n MDCDialogClosedEvent,\n} from 'src/types';\n\ninterface IContentsNode {\n title?: Node;\n content?: Node;\n actions?: Node;\n}\n\ninterface IContentOptions {\n rawContent?: boolean;\n}\n\nexport default class DialogController extends BaseController {\n public static targets = ['surface'];\n\n private declare readonly surfaceTarget: HTMLDivElement;\n\n private dialogMDC: MDCDialog | null = null;\n\n public onInitialize() {\n this.onConnect(() => {\n const dialogMDC = new MDCDialog(this.element);\n dialogMDC.listen('MDCDialog:closing', this.dispatchClosingEvent);\n dialogMDC.listen('MDCDialog:closed', this.dispatchClosedEvent);\n dialogMDC.listen('MDCDialog:opening', this.dispatchOpeningEvent);\n\n if (this.data.get('showInitial')) {\n this.reveal();\n }\n\n this.dialogMDC = dialogMDC;\n\n return () => {\n dialogMDC.destroy();\n this.dialogMDC = null;\n };\n });\n\n return super.onInitialize();\n }\n\n public handleCloseEvent(evt: MDCDialogClosedEvent | IDialogLifecycleEventDetail) {\n const action = (evt as any).detail?.closeReason || (evt as any).detail?.action;\n this.close(action);\n }\n\n // Reveal the dialog by calling:\n // window.dispatchEvent(new CustomEvent('cnf-dialog:show', { detail: { message } }));\n public async handleShowEvent(evt: Event) {\n const {\n detail: {\n title,\n content,\n contentHref,\n dialogVariant = 'regular',\n rawContent,\n placeholder,\n actions,\n defaultAction,\n },\n } = evt as DialogShowEvent;\n\n const nodes: IContentsNode = {};\n if (title) {\n nodes.title = this.createTitle(title);\n }\n\n if (actions) {\n nodes.actions = this.createActions(actions, defaultAction);\n }\n\n if (content) {\n nodes.content = this.createContent(content, { rawContent });\n } else if (contentHref && !placeholder) {\n nodes.content = this.createContent(await this.getContent(contentHref), { rawContent });\n this.dispatchLifecycleEvent('loaded');\n } else if (contentHref && placeholder) {\n nodes.content = this.createContent(placeholder);\n this.getContent(contentHref)\n .then(c => {\n nodes.content = this.createContent(c, { rawContent });\n this.dispatchLifecycleEvent('loaded');\n })\n .catch(err => {\n console.warn(err);\n const errorMessage = i18n.errors.generic_server_error;\n nodes.content = this.createContent(markAsSafeHTML(errorMessage));\n })\n .finally(() => {\n this.replaceContents(this.surfaceTarget, nodes);\n this.dispatchLifecycleEvent('loaded');\n });\n }\n\n this.replaceContents(this.surfaceTarget, nodes);\n this.applyVariantClassesToTarget(dialogVariant, this.surfaceTarget);\n this.reveal();\n }\n\n public get isOpen() {\n return this.dialogMDC!.isOpen;\n }\n\n private reveal() {\n this.dialogMDC!.open();\n }\n\n private close(action?: string) {\n this.dialogMDC!.close(action);\n }\n\n private applyVariantClassesToTarget(variant: string, target: HTMLDivElement) {\n if (variant && target) {\n target.classList.remove('mdc-dialog__surface--regular', 'mdc-dialog__surface--narrow');\n target.classList.add(`mdc-dialog__surface--${variant}`);\n }\n }\n\n private replaceContents(target: HTMLDivElement, sections: IContentsNode) {\n const filteredSections = [sections.title, sections.content, sections.actions].filter(\n v => !!v\n ) as Node[];\n replaceContentsWithChildren(target, filteredSections);\n }\n\n private async getContent(url: string): Promise {\n return axios\n .get(url, {\n headers: {\n 'Content-Type': 'text/html',\n },\n })\n .then(response => markAsSafeHTML(response.data));\n }\n\n private createTitle(title: string) {\n const heading = document.createElement('h2');\n heading.classList.add('mdc-dialog__title');\n heading.id = `${this.element.id}-title`;\n heading.textContent = title.trim();\n return heading;\n }\n\n private createContent(content: ISafeHTMLContent, options: IContentOptions = {}) {\n const contentContainer = document.createElement('div');\n contentContainer.id = `${this.element.id}-content`;\n if (!options.rawContent) {\n contentContainer.classList.add('mdc-dialog__content');\n }\n\n // We likely want to allow arbitrary HTML here so that the dialog content can be formatted appropriately, and allow things like other MDC components to be rendered inside.\n // The problem with allowing arbitrary HTML to be rendered is that it opens the possibility of a XSS attack.\n // To try and mitigate this issue, we ask that the developer explicitly wraps the content inside an object with a `__safe` property.\n // Of course, this can't guarantee that a developer is passing safe content, but it at least gets them thinking about the dangers of XSS when pushing content to be displayed.\n // https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)\n safelySetInnerHTML(contentContainer, content);\n\n return contentContainer;\n }\n\n private createActions(actions: IDialogAction[], defaultAction?: string) {\n const container = document.createElement('footer');\n container.classList.add('mdc-dialog__actions');\n\n actions.forEach(({ title: buttonTitle, action: buttonAction }) => {\n const isDefaultAction = actions.length === 1 || buttonAction === defaultAction;\n const button = this.createActionButton(buttonTitle, buttonAction, isDefaultAction);\n container.appendChild(button);\n });\n\n return container;\n }\n\n private createActionButton(title: string, action: string, isDefault: boolean) {\n const buttonEl = document.createElement('button');\n const buttonClassNames = ['mdc-button', 'mdc-dialog__button'];\n if (isDefault) {\n buttonClassNames.push('mdc-dialog__button--default');\n }\n buttonEl.classList.add(...buttonClassNames);\n buttonEl.setAttribute('type', 'button');\n buttonEl.setAttribute('data-mdc-dialog-action', action);\n\n const buttonLabelEl = document.createElement('span');\n buttonLabelEl.classList.add('mdc-button__label');\n buttonEl.textContent = title;\n\n buttonEl.appendChild(buttonLabelEl);\n return buttonEl;\n }\n\n private dispatchClosingEvent = (evt: Event) => {\n const {\n detail: { action },\n } = evt as MDCDialogClosedEvent;\n this.dispatchLifecycleEvent('closing', action);\n };\n\n private dispatchClosedEvent = (evt: Event) => {\n const {\n detail: { action },\n } = evt as MDCDialogClosedEvent;\n this.dispatchLifecycleEvent('closed', action);\n };\n\n private dispatchOpeningEvent = (evt: Event) => {\n const {\n detail: { action },\n } = evt as MDCDialogClosedEvent;\n this.dispatchLifecycleEvent('opening', action);\n };\n\n private dispatchLifecycleEvent(type: string, closeReason?: string) {\n const detail: IDialogLifecycleEventDetail = {\n closeReason,\n };\n const evt = createCustomEvent(`cnf-dialog:${type}`, detail);\n window.dispatchEvent(evt);\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/cards_logos/amex-83a6330906b2439b053f0d5b1f7ee64f.svg\";","export function stringifyEscapeQuotes(element: any): string {\n return JSON.stringify(element).replace(/'/g, ''');\n}\n","import { MDCTextField } from '@material/textfield/index';\nimport FormFieldController from 'src/lib/controller/form_field_controller';\n\nexport default class TextFieldController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n public onInitialize() {\n this.onConnect(() => {\n const textfieldMDC = new MDCTextField(this.containerTarget);\n\n // Turn off native form validation. We'll be handling this ourselves.\n textfieldMDC.useNativeValidation = false;\n\n return () => {\n textfieldMDC.destroy();\n };\n });\n\n return super.onInitialize();\n }\n\n protected get invalidClassName() {\n return 'mdc-text-field--invalid';\n }\n}\n","import { AjaxResponseEvent } from 'src/types';\n\nimport PurchaseConfiguratorVariantController from 'src/controllers/shopping/purchase_configurator/purchase_configurator_variant_controller';\nimport BaseController from 'src/lib/controller/base_controller';\nimport i18n from 'src/lib/i18n';\nimport { closeDialog } from 'src/lib/overlay/dialog';\nimport { showSnackbar } from 'src/lib/overlay/snackbar';\nimport { showToast } from 'src/lib/overlay/toast';\nimport { markAsSafeHTML, safelySetInnerHTML } from 'src/lib/util/safe_html';\nimport axios from 'src/lib/axios';\n\nexport default class PurchaseConfiguratorController extends BaseController {\n public static targets = ['form'];\n\n // private declare readonly formTarget: HTMLFormElement;\n\n public onInitialize() {\n // Ensure that all fields except for the chosen variant are initialized as disabled.\n // Child controllers will connect after this one, so we listen for them here.\n // TODO we can remove this hack once Rails has support for not serializing form inputs inside disabled fieldsets\n // https://github.com/rails/rails/pull/36764\n this.onChildControllerConnect((controller: BaseController) => {\n if (controller instanceof PurchaseConfiguratorVariantController) {\n const chosenVariant = this.getRequiredDataAttr('chosenVariant');\n controller.isCurrent = controller.id === chosenVariant;\n }\n });\n\n return super.onInitialize();\n }\n\n public handleVariantChanged(evt: Event) {\n const { value: chosenVariantId } = evt.target as HTMLInputElement;\n this.chosenVariant = chosenVariantId;\n }\n\n public handleCancelButton(evt: Event) {\n evt.preventDefault();\n // trigger event which parent should listen for\n closeDialog();\n }\n\n public formSubmitSuccess(evt: AjaxResponseEvent) {\n const [data, status, xhr] = evt.detail;\n closeDialog();\n\n const location = xhr.responseURL\n .split('/')\n .slice(3, 7)\n .join('/');\n // Trigger update of total price\n axios\n .get(`/${location}/carts/total`, { headers: { Accept: 'text/fragment' } })\n .then(resp => {\n const element = document.getElementById('top-app-bar__cart-estimated-total');\n if (element) {\n safelySetInnerHTML(element, markAsSafeHTML(resp.data));\n }\n })\n .catch(e => {\n console.warn(e);\n });\n\n showToast({\n content: markAsSafeHTML(xhr.response),\n });\n }\n\n public formSubmitError(evt: AjaxResponseEvent) {\n const [data, status, xhr] = evt.detail;\n // TODO show this in a flash container somewhere\n const response = JSON.parse(xhr.response);\n console.warn(response);\n showSnackbar({\n message: response.message || i18n.errors.generic_server_error,\n timeout: 5000,\n });\n }\n\n private set chosenVariant(chosenVariantId: string) {\n this.variantControllers.forEach(vc => {\n vc.isCurrent = vc.id === chosenVariantId;\n });\n }\n\n private get variantControllers() {\n return this.getSpecificChildControllers(\n PurchaseConfiguratorVariantController\n );\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/shield-adf10e36a560bbd32328d007f73d501d.svg\";","import { MDCRipple } from '@material/ripple/index';\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport enum THEME {\n Primary,\n Secondary,\n}\n\nexport enum VARIANT {\n Contained,\n Raised,\n Outlined,\n Text,\n}\n\nconst VARIANT_CLASS_NAMES = {\n Contained: ['mdc-button--unelevated', 'cnf-button--filled', 'cnf-button--unelevated'],\n Outlined: ['mdc-button--outlined', 'cnf-button--outlined'],\n Raised: ['mdc-button--raised', 'cnf-button--filled', 'cnf-button--raised'],\n Text: ['cnf-button--text'],\n};\n\nconst THEME_CLASS_NAMES = {\n Primary: ['cnf-button--primary'],\n Secondary: ['cnf-button--secondary'],\n};\n\nconst ALL_THEME_CLASS_NAMES = Object.values(THEME_CLASS_NAMES).flatMap(v => v);\nconst ALL_VARIANT_CLASS_NAMES = Object.values(VARIANT_CLASS_NAMES).flatMap(v => v);\n\nexport default class ButtonController extends BaseController {\n public onInitialize() {\n this.onConnect(() => {\n let disconnector;\n if (this.data.has('ripple')) {\n const buttonMDC = new MDCRipple(this.element);\n disconnector = () => {\n buttonMDC.destroy();\n };\n }\n\n return disconnector;\n });\n\n return super.onInitialize();\n }\n\n public set theme(t: THEME) {\n this.removeClasses(ALL_THEME_CLASS_NAMES);\n\n switch (t) {\n case THEME.Primary:\n this.applyClasses(THEME_CLASS_NAMES.Primary);\n break;\n case THEME.Secondary:\n this.applyClasses(THEME_CLASS_NAMES.Secondary);\n break;\n }\n }\n\n public set variant(v: VARIANT) {\n this.removeClasses(ALL_VARIANT_CLASS_NAMES);\n\n switch (v) {\n case VARIANT.Contained:\n this.applyClasses(VARIANT_CLASS_NAMES.Contained);\n break;\n case VARIANT.Raised:\n this.applyClasses(VARIANT_CLASS_NAMES.Raised);\n break;\n case VARIANT.Outlined:\n this.applyClasses(VARIANT_CLASS_NAMES.Outlined);\n break;\n case VARIANT.Text:\n this.applyClasses(VARIANT_CLASS_NAMES.Text);\n break;\n }\n }\n\n public set disabled(disabled: boolean) {\n if (disabled) {\n this.element.setAttribute('disabled', 'disabled');\n } else {\n this.element.removeAttribute('disabled');\n }\n }\n\n public applyClasses(classNames: string[]) {\n // IE11 don't support multiple params in classList.add() func\n classNames.forEach(cn => this.element.classList.add(cn));\n }\n\n public removeClasses(classNames: string[]) {\n // IE11 don't support multiple params in classList.remove() func\n classNames.forEach(cn => this.element.classList.remove(cn));\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/confinus-logo-1fd32e180fdfd14986c159f89c664d30.png\";","import BaseController from 'src/lib/controller/base_controller';\nimport { showDialog } from 'src/lib/overlay/dialog.ts';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\n\nexport default class DialogExamplesController extends BaseController {\n public showAlertDialog() {\n showDialog({\n actions: [\n {\n action: 'close',\n title: 'Awesome',\n },\n ],\n content: markAsSafeHTML(`Chuck Norris can compile syntax errors.`),\n onClosing: () => console.log('dialog closed.'),\n title: 'An alert',\n });\n }\n\n public showConfirmDialog() {\n showDialog({\n actions: [\n {\n action: 'cancel',\n title: 'No way!',\n },\n {\n action: 'ok',\n title: 'Awesome',\n },\n ],\n content: markAsSafeHTML(`When Chuck Norris claps his hands, the sun turns off.`),\n defaultAction: 'ok',\n onClosing: e => console.log('dialog closed with reason: ' + e.detail.closeReason),\n title: 'Confirm',\n });\n }\n\n public showSimpleDialog() {\n showDialog({\n content: markAsSafeHTML(`Simple dialogs have no action buttons`),\n title: 'A simple dialog',\n });\n }\n\n public showRemoteContentDialog() {\n showDialog({\n contentHref: '/design-system/test_fragment',\n title: 'The example.com page content dialog',\n });\n }\n\n public showRemoteContentDialogWithPlaceholder() {\n showDialog({\n contentHref: '/design-system/test_fragment',\n placeholder: markAsSafeHTML(`

...

...

`),\n title: 'The example.com page content dialog',\n });\n }\n}\n","import { Controller, ControllerConstructor } from 'stimulus';\n\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\n\ninterface IControllerConnectionEvent\n extends CustomEvent<{\n identifier: string;\n }> {\n target: Element;\n}\n\ntype DisconnectorFn = () => void;\ntype ConnectorFn = () => DisconnectorFn | void;\ntype ChildControllerConnectorFn = (controller: BaseController) => void;\n\n// Intentionally an object so that === will compare against this exact reference.\n// We could use a Symbol here, but IE11 will barf and I don't think it merits a full on polyfill.\nconst initializeReceipt = {};\n\nconst CONNECTION_EVENT = 'cnf:controller:connected';\nconst DISCONNECTION_EVENT = 'cnf:controller:disconnected';\n\nexport default abstract class BaseController extends Controller {\n private connectors: ConnectorFn[] = [];\n private disconnectors: DisconnectorFn[] = [];\n private connectionDisconnectors: DisconnectorFn[] = [];\n\n private childControllerConnectors: ChildControllerConnectorFn[] = [];\n private childControllerDisconnectors: ChildControllerConnectorFn[] = [];\n\n private childControllers: Set = new Set();\n\n /**\n * These lifecycle methods are provided by Stimulus.\n * We won't use these directly, instead we will call helpers which make it easier and safer to hook in to the controller lifecyle.\n */\n public initialize() {\n const receipt = this.onInitialize();\n if (receipt !== initializeReceipt) {\n // If we get here, it means that a subclass did not call `super.onInitialize()`.\n // This guard therefore ensures that every subclass should call `super.onInitialize()`.\n throw new Error(\n `onInitialize was implemented in ${this.identifier} without a call to super.onInitialize.`\n );\n }\n }\n\n public connect() {\n // Run all connectors. If any return disconnectors, cache them for later use.\n this.connectionDisconnectors = this.connectors.reduce(this.runConnector, []);\n }\n\n public disconnect() {\n // Run any permanent disconnectors.\n this.disconnectors.forEach(this.runDisconnector);\n\n // Run any disconnectors that were returned from connectors,\n // and clear the cache ready for the next run.\n this.connectionDisconnectors.forEach(this.runDisconnector);\n this.connectionDisconnectors = [];\n\n // Clear out any child controllers.\n this.childControllers.clear();\n }\n\n // Instead of using the lifecycle methods above, we'll use these.\n\n // This is called by `initialize`.\n public onInitialize() {\n this.onConnect(() => {\n let disconnector;\n\n // Listen for a connection event from an element further down in the DOM tree.\n this.element.addEventListener(CONNECTION_EVENT, this.handleControllerConnectedEvent);\n this.element.addEventListener(DISCONNECTION_EVENT, this.handleControllerDisconnectedEvent);\n\n // Remove the local cache when the child disconnects.\n disconnector = () => {\n this.emitDisconnectionEvent();\n this.element.removeEventListener(CONNECTION_EVENT, this.handleControllerConnectedEvent);\n this.element.removeEventListener(\n DISCONNECTION_EVENT,\n this.handleControllerDisconnectedEvent\n );\n };\n\n // Emit a connection event up through the DOM tree.\n // Workaround https://github.com/stimulusjs/stimulus/issues/222\n setTimeout(this.emitConnectionEvent, 0);\n\n return disconnector;\n });\n\n // This receipt is checked by `initialize`.\n // This ensures that any implementing method must call down the prototype chain,\n // so that initializers are not skipped.\n // https://github.com/Microsoft/TypeScript/issues/21388#issuecomment-360214959\n return initializeReceipt;\n }\n\n /**\n * Adds a 'connector' function, which is run when the controller is connected.\n * This connector function can optionally return a 'disconnector' function,\n * which will be run when the controller is disconnected.\n * This couples the connect/disconnect lifecycle together for a particular operation.\n * (Inspired in part by the `useEffect` React hook).\n *\n * @param fn a connector function, when run optionally returns a 'disconnector' function\n */\n public onConnect(fn: ConnectorFn) {\n this.connectors.push(fn);\n }\n\n /**\n * Adds a 'disconnector' function, which is run when the controller is disconnected.\n *\n * @param fn a disconnector function\n */\n public onDisconnect(fn: DisconnectorFn) {\n this.disconnectors.push(fn);\n }\n\n /**\n * Adds a 'connector' function, which is run when a child controller is connected.\n * A child controller is defined as a controller which connects to a child DOM element.\n *\n * @param fn a connector function\n */\n public onChildControllerConnect(fn: ChildControllerConnectorFn) {\n this.childControllerConnectors.push(fn);\n }\n\n /**\n * Adds a 'disconnector' function, which is run when a child controller is disconnected.\n * A child controller is defined as a controller which connects to a child DOM element.\n *\n * @param fn a disconnector function\n */\n public onChildControllerDisconnect(fn: ChildControllerConnectorFn) {\n this.childControllerDisconnectors.push(fn);\n }\n\n /**\n * Finds all child controllers that are instances of the passed class.\n * @param ControllerClass controller class to use to find\n */\n public getSpecificChildControllers(\n // Need to allow the `| Function` so that abstract classes can be used as the `ControllerClass` argument\n // https://github.com/Microsoft/TypeScript/issues/5843\n // tslint:disable-next-line ban-types\n ControllerClass: ControllerConstructor | Function\n ): T[] {\n const controllers: T[] = [];\n this.childControllers.forEach(c => {\n if (c instanceof ControllerClass) {\n controllers.push(c as T);\n }\n });\n return controllers;\n }\n\n /**\n * Finds the first child controller that is an instance of the passed class.\n * @param ControllerClass controller class to use to find\n */\n public getSpecificChildController(\n // Need to allow the `| Function` so that abstract classes can be used as the `ControllerClass` argument\n // https://github.com/Microsoft/TypeScript/issues/5843\n // tslint:disable-next-line ban-types\n ControllerClass: ControllerConstructor | Function\n ): T | null {\n const result = Array.from(this.childControllers).find(c => c instanceof ControllerClass);\n return result ? (result as T) : null;\n }\n\n public findParentElementByTagName(el: Element, tagName: string) {\n tagName = tagName.toLowerCase();\n\n while (el && el.parentElement) {\n el = el.parentElement;\n if (el.tagName && el.tagName.toLowerCase() === tagName) {\n return el;\n }\n }\n return null;\n }\n\n // ---\n\n protected findController(element: Element, identifier: string): BaseController | null {\n // It would be more performant to pass the whole controller through the custom event,\n // so then it doesn't need to be looked up here every time the event is received.\n // I'm not sure how well a class sends via a DOM event, though!\n const controller = this.application.getControllerForElementAndIdentifier(element, identifier);\n return controller instanceof BaseController ? controller : null;\n }\n\n protected getRequiredDataAttr(key: string): string {\n const value = this.data.get(key);\n if (!value) {\n throw new Error(`${key} data attribute must be set for controller ${this.identifier}`);\n }\n return value;\n }\n\n protected getRequiredDataAttrs(...attrs: string[]): string[] {\n const found: string[] = [];\n const missing: string[] = [];\n\n attrs.forEach(key => {\n const value = this.data.get(key);\n if (!value) {\n missing.push(key);\n } else {\n found.push(value);\n }\n });\n\n if (missing.length === 1) {\n throw new Error(`${missing[0]} data attribute must be set for controller ${this.identifier}`);\n } else if (missing.length > 1) {\n throw new Error(\n `${missing.join(', ')} data attributes must be set for controller ${this.identifier}`\n );\n }\n\n return found;\n }\n\n protected getRequiredDataAttrAsJSON(key: string): T {\n const value = this.data.get(key);\n if (!value) {\n throw new Error(`${key} data attribute must be set for controller ${this.identifier}`);\n }\n try {\n return JSON.parse(value);\n } catch (e) {\n throw new Error(\n `${key} data attribute for controller ${this.identifier} was not valid JSON: ${e.message}`\n );\n }\n }\n\n // ---\n\n private emitConnectionEvent = () => {\n const evt = createCustomEvent(CONNECTION_EVENT, {\n identifier: this.identifier,\n });\n this.element.dispatchEvent(evt);\n };\n\n private emitDisconnectionEvent = () => {\n const evt = createCustomEvent(DISCONNECTION_EVENT, {\n identifier: this.identifier,\n });\n this.element.dispatchEvent(evt);\n };\n\n private handleControllerConnectedEvent = (evt: Event) => {\n const {\n target,\n detail: { identifier },\n } = evt as IControllerConnectionEvent;\n const controller = this.findController(target, identifier);\n if (controller && controller !== this) {\n this.childControllers.add(controller);\n this.childControllerConnectors.forEach(cb => cb(controller));\n }\n };\n\n private handleControllerDisconnectedEvent = (evt: Event) => {\n const {\n target,\n detail: { identifier },\n } = evt as IControllerConnectionEvent;\n const controller = this.findController(target, identifier);\n if (controller && controller !== this) {\n this.childControllers.delete(controller);\n this.childControllerDisconnectors.forEach(cb => cb(controller));\n }\n };\n\n private runConnector = (disconnectors: DisconnectorFn[], connector: ConnectorFn) => {\n const d = connector();\n if (typeof d === 'function') {\n disconnectors.push(d);\n }\n return disconnectors;\n };\n\n private runDisconnector = (d: DisconnectorFn) => {\n d();\n };\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { replaceContentsWithChildren } from 'src/lib/util/replace_with_dom_nodes';\nimport {SnackbarShowEvent} from 'src/types';\n\nconst INITIAL_CLASS = 'cnf-flash-message-bar--initially-invisible';\nconst VISIBLE_CLASS = 'cnf-flash-message-bar--visible';\nconst COLLAPSED_CLASS = 'cnf-flash-message-bar--collapsed';\nconst TEXT_CLASS = 'mdc-typography--subtitle1';\n\nexport default class FlashController extends BaseController {\n public onInitialize() {\n this.onConnect(() => {\n if (this.data.get('showInitial')) {\n this.reveal();\n }\n });\n\n return super.onInitialize();\n }\n\n public handleCloseEvent() {\n this.hide();\n }\n\n // Reveal by calling:\n // window.dispatchEvent(new CustomEvent('cnf-flash:show', { detail: { message } }));\n public async handleShowEvent(evt: Event) {\n const {\n detail: { message, timeout },\n } = evt as SnackbarShowEvent;\n this.showFlashMessage(message, timeout);\n }\n\n public get isRevealed() {\n return this.element.classList.contains(VISIBLE_CLASS);\n }\n\n public set text(text: string) {\n const p = document.createElement('p');\n p.classList.add(TEXT_CLASS);\n p.textContent = text;\n this.content = p;\n }\n\n public renderHeadingWithListContent(heading: string, items: string[]) {\n const headingNode = this.createHeading(heading);\n\n const listNode = document.createElement('ul');\n items.forEach(item => {\n const listItemNode = document.createElement('li');\n listItemNode.textContent = item;\n listNode.appendChild(listItemNode);\n });\n\n this.content = [headingNode, listNode];\n }\n\n public showFlashMessage = (text: string, timeout?: number) => {\n this.text = text;\n this.reveal(timeout);\n };\n\n public reveal = (timeout?: number) => {\n this.removeInitialClass();\n this.element.classList.add(VISIBLE_CLASS);\n this.element.classList.remove(COLLAPSED_CLASS);\n if (timeout) {\n setTimeout(this.hide, timeout);\n }\n };\n\n public hide = () => {\n this.element.classList.remove(VISIBLE_CLASS);\n };\n\n public toggle = () => {\n this.removeInitialClass();\n this.element.classList.toggle(VISIBLE_CLASS);\n };\n\n private removeInitialClass() {\n this.element.classList.remove(INITIAL_CLASS);\n }\n\n private createHeading(content: string) {\n const heading = document.createElement('h2');\n heading.classList.add('mdc-typography--headline7');\n heading.classList.add('cnf-flash-message-bar__heading');\n heading.textContent = content;\n return heading;\n }\n\n private set content(children: Node | Node[]) {\n replaceContentsWithChildren(this.element, children);\n }\n}\n","import { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { ISnackbarShowOptions } from 'src/types';\n\nexport function showSnackbar(opts: ISnackbarShowOptions) {\n const evt = createCustomEvent('cnf-snackbar:show', opts);\n window.dispatchEvent(evt);\n}\n","import { MDCFormField } from '@material/form-field/index';\nimport { MDCRadio } from '@material/radio/index';\nimport FormFieldController from 'src/lib/controller/form_field_controller';\n\n// TODO need a radio group for validation.\nexport default class RadioController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n public onInitialize() {\n this.onConnect(() => {\n let disconnector;\n\n if (this.data.has('ripple')) {\n const radio = new MDCRadio(this.containerTarget);\n const formField = new MDCFormField(this.element);\n formField.input = radio;\n\n disconnector = () => {\n formField.destroy();\n radio.destroy();\n };\n }\n\n return disconnector;\n });\n\n return super.onInitialize();\n }\n\n protected get invalidClassName() {\n return 'mdc-radio--invalid';\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/confinus_logo-074efe43f3bd6dc831b158ba709566a9.png\";","module.exports = __webpack_public_path__ + \"media/assets/images/category_image_placeholder-beea7efa264ea9abbd9d60619d3cd018.svg\";","import BaseController from 'src/lib/controller/base_controller';\nimport { showDialog } from 'src/lib/overlay/dialog';\nimport { showToast } from 'src/lib/overlay/toast';\n\ntype RefreshPopupMode = 'inactive' | 'countdown' | 'show_immediately';\n\nconst ACTIVE_CLASS = 'shopping__product-serviceability-dropdown__button--active';\nconst DROPDOWN_MINUTES_BEFORE_RUN = 60;\nconst TIMED_TOASTER_MINUTES_BEFORE_RUN = 30;\nconst TIMED_TOASTER_DISPLAY_UNTIL_IN_MINUTES = 11;\nconst DISMISSABLE_TOASTER_MINUTES_BEFORE_RUN = 10;\nconst DISMISSABLE_TOASTER_DISPLAY_UNTIL_IN_MINUTES = 1;\nconst REFRESH_POPUP_SHOW_IMMEDIATELY_DELAY = 2;\n\nexport default class ServiceabilityDropdownController extends BaseController {\n public static targets = ['dropdownButton'];\n\n private declare readonly dropdownButtonTarget: HTMLElement;\n\n public onInitialize() {\n this.onConnect(() => {\n const timeToCutOff = this.timeToCutOff;\n const refreshPopupMode = this.refreshPopupMode;\n\n if (timeToCutOff !== null && timeToCutOff > 0) {\n const timeToActivateDropdown =\n timeToCutOff - this.secondsBeforeRun(DROPDOWN_MINUTES_BEFORE_RUN);\n const timeToActivateTimedToaster =\n timeToCutOff - this.secondsBeforeRun(TIMED_TOASTER_MINUTES_BEFORE_RUN);\n const timeToActivateDismissableToaster =\n timeToCutOff - this.secondsBeforeRun(DISMISSABLE_TOASTER_MINUTES_BEFORE_RUN);\n const activateTimedToasterTimerId = this.activateTimedToaster(\n timeToCutOff,\n this.calculateTimeout(timeToActivateTimedToaster)\n );\n const activateDismissableToasterTimerId = this.activateDismissableToaster(\n timeToCutOff,\n this.calculateTimeout(timeToActivateDismissableToaster)\n );\n\n const activateDropdownTimerId = this.activateDropdown(\n this.calculateTimeout(timeToActivateDropdown)\n );\n const deactivateDropdownTimerId = this.deactivateDropdown(\n this.calculateTimeout(timeToCutOff)\n );\n\n const popupTimerId = this.initialiseRefreshDialog(refreshPopupMode, timeToCutOff);\n\n return () => {\n clearTimeout(activateDropdownTimerId);\n clearTimeout(deactivateDropdownTimerId);\n clearTimeout(activateTimedToasterTimerId);\n clearTimeout(activateDismissableToasterTimerId);\n clearTimeout(popupTimerId);\n };\n }\n });\n\n return super.onInitialize();\n }\n\n private initialiseRefreshDialog(refreshPopupMode: RefreshPopupMode, timeToCutOff: number) {\n if (refreshPopupMode === 'inactive') {\n return;\n }\n\n const timeoutDelay =\n refreshPopupMode === 'countdown' ? timeToCutOff : REFRESH_POPUP_SHOW_IMMEDIATELY_DELAY;\n return this.countdownRefreshPopup(this.calculateTimeout(timeoutDelay));\n }\n\n private activateDropdown = (timeout: number) => {\n if (timeout <= 0) {\n this.addActiveClass();\n return;\n }\n return window.setTimeout(this.addActiveClass, timeout);\n };\n\n private deactivateDropdown = (timeout: number) => {\n if (timeout <= 0) {\n return;\n }\n return window.setTimeout(this.removeActiveClass, timeout);\n };\n\n private activateTimedToaster = (timeToCutOff: number, timeout: number) => {\n if (timeout > 0) {\n return window.setTimeout(this.showTimedToaster, timeout);\n }\n if (timeToCutOff > this.secondsBeforeRun(TIMED_TOASTER_DISPLAY_UNTIL_IN_MINUTES)) {\n return window.setTimeout(this.showTimedToaster, 2000);\n }\n };\n\n private activateDismissableToaster = (timeToCutOff: number, timeout: number) => {\n if (timeout > 0) {\n return window.setTimeout(this.showDismissableToaster, timeout);\n }\n if (timeToCutOff > this.secondsBeforeRun(DISMISSABLE_TOASTER_DISPLAY_UNTIL_IN_MINUTES)) {\n return window.setTimeout(this.showDismissableToaster, 2000);\n }\n };\n\n private countdownRefreshPopup = (timeout: number) => {\n if (timeout <= 0) {\n return;\n }\n return window.setTimeout(this.showRefreshPopup, timeout);\n };\n\n private showTimedToaster = () => {\n showToast({\n contentHref: '/marketplace/reminders/hurry-up',\n timeout: 30000,\n });\n };\n\n private showDismissableToaster() {\n showToast({\n contentHref: '/marketplace/reminders/last-chance',\n timeout: Infinity,\n });\n }\n\n private calculateTimeout(timeoutInSeconds: number) {\n return timeoutInSeconds * 1000;\n }\n\n private secondsBeforeRun(minutesBeforeRun: number) {\n return minutesBeforeRun * 60;\n }\n\n private addActiveClass = () => {\n this.dropdownButtonTarget.classList.add(ACTIVE_CLASS);\n };\n\n private removeActiveClass = () => {\n this.dropdownButtonTarget.classList.remove(ACTIVE_CLASS);\n };\n\n private showRefreshPopup = () => {\n const ids = this.data.get('cartUid');\n const currentPage = this.data.get('currentPage');\n const href = `/marketplace/reminders/refresh-page?cart_uid=${ids}¤t_page=${currentPage}`;\n showDialog({\n contentHref: href,\n });\n };\n\n private get timeToCutOff(): number | null {\n const timeToCutOffStr = this.data.get('timeToCutOff');\n return timeToCutOffStr !== null ? parseInt(timeToCutOffStr, 10) : null;\n }\n\n private get refreshPopupMode(): RefreshPopupMode {\n const refreshPopupMode = this.data.get('refreshPopupMode');\n switch (refreshPopupMode) {\n case 'show_immediately':\n case 'countdown':\n return refreshPopupMode;\n default:\n return 'inactive';\n }\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class EntityFormController extends BaseController {\n public static targets = [\n 'checkboxOther',\n 'blockCustomType',\n 'inputCustomType',\n 'inputEmail',\n 'blockEmailConfirmation',\n 'inputEmailConfirmation',\n ];\n\n private declare readonly checkboxOtherTarget: HTMLInputElement;\n private declare readonly inputCustomTypeTarget: HTMLInputElement;\n private declare readonly blockCustomTypeTarget: HTMLDivElement;\n private declare readonly inputEmailTarget: HTMLInputElement;\n private declare readonly blockEmailConfirmationTarget: HTMLDivElement;\n private declare readonly inputEmailConfirmationTarget: HTMLInputElement;\n\n public onInitialize() {\n this.handleOtherPropertyTypeChanges(false);\n this.handleEmailChanges();\n\n return super.onInitialize();\n }\n\n public handleEmailChanges() {\n if (this.inputEmailTarget.value === this.data.get('originalEmail')) {\n this.blockEmailConfirmationTarget.style.visibility = 'hidden';\n this.inputEmailConfirmationTarget.disabled = true;\n } else {\n this.inputEmailConfirmationTarget.disabled = false;\n this.inputEmailConfirmationTarget.parentElement!.classList.remove('mdc-text-field--disabled');\n this.blockEmailConfirmationTarget.style.visibility = 'visible';\n }\n }\n\n public handleOtherPropertyTypeChanges(focus = true) {\n if (this.checkboxOtherTarget.checked) {\n this.blockCustomTypeTarget.classList.remove('cnf-hidden');\n if (focus) {\n this.inputCustomTypeTarget.focus();\n }\n } else {\n this.blockCustomTypeTarget.classList.add('cnf-hidden');\n }\n }\n}\n","/**\n * Creates a custom DOM event.\n * TODO use a polyfill instead of this.\n *\n * @param name name of the event\n * @param data data to be sent with the custom event\n */\nexport function createCustomEvent(name: string, data?: object) {\n if (typeof CustomEvent === 'function') {\n // Modern browsers\n return new CustomEvent(name, {\n bubbles: true,\n cancelable: false,\n detail: data,\n });\n }\n // IE\n const evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(name, true, false, data);\n return evt;\n}\n","import { ISafeHTMLContent } from 'src/types';\n\n/**\n * Explicitly marks HTML content as 'safe'.\n * This attempts to mitigate the possibility of XSS by creating an extra hoop for the developer to jump through when using `innerHTML`.\n *\n * @param html HTML content to mark as safe\n */\nexport function markAsSafeHTML(html: string): ISafeHTMLContent {\n return {\n __safe: true,\n content: html,\n };\n}\n\n/**\n * Proxies to the element's `innerHTML` method, ensuring that the content that is being set has previously been marked as 'safe'.\n *\n * @param el element to set innerHTML\n * @param safe safe content to set as innerHTML\n */\nexport function safelySetInnerHTML(el: Element, { __safe, content }: ISafeHTMLContent) {\n // It's temping to modify the Element's prototype here with a new `safelySetInnerHTML` method, but...\n // http://perfectionkills.com/whats-wrong-with-extending-the-dom/\n if (!__safe) {\n throw new Error(\n 'This content could not be displayed as it has not been marked as safe. Content must be explicitly marked as safe to try and reduce the likelihood of a XSS attack.'\n );\n }\n el.innerHTML = content; // tslint:disable-line no-inner-html\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { addParametersToQueryString } from 'src/lib/util/add_parameter_to_url';\nimport { MDCMenuItemSelectedEvent } from 'src/types';\n\nexport default class PaginationController extends BaseController {\n public static targets = ['pageSizeLabel'];\n\n private declare readonly pageSizeLabelTarget: HTMLDivElement;\n\n public handlePageSizeChange(evt: Event) {\n const {\n detail: { item },\n } = evt as MDCMenuItemSelectedEvent;\n const pageSize = item.getAttribute('data-page-size');\n if (pageSize) {\n const params = {\n [this.pageSizeParamName]: pageSize,\n };\n\n // Optimistically update UI\n this.pageSizeLabelTarget.innerText = pageSize;\n\n // Redirect\n // TODO this probably should be the responsibility of a higher-level component.\n window.location.search = addParametersToQueryString(window.location.search, params);\n }\n }\n\n private get pageSizeParamName() {\n return this.data.get('pageSizeParameterName') || 'page_size';\n }\n}\n","import { MDCDataTable } from '@material/data-table/index';\n\nimport BaseController from 'src/lib/controller/base_controller';\n\nexport default class TableController extends BaseController {\n public onInitialize() {\n this.onConnect(() => {\n const dataTableMDC = new MDCDataTable(this.element);\n return () => {\n dataTableMDC.destroy();\n };\n });\n\n return super.onInitialize();\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { closeDialog, showDialog } from 'src/lib/overlay/dialog.ts';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\nimport { addParametersToQueryString } from 'src/lib/util/add_parameter_to_url';\n\nfunction getFormElementValueByName(\n form: Element,\n namePrefix: string,\n name: string,\n checked: boolean = false\n) {\n const el = form.querySelector(`input[name='${namePrefix}[${name}]']${checked ? ':checked' : ''}`);\n return el ? (el as HTMLInputElement).value : '';\n}\n\nexport default class AddNoteController extends BaseController {\n public static targets = ['notes', 'triggerButton'];\n\n private declare readonly notesTarget: HTMLInputElement;\n private declare readonly triggerButtonTarget: HTMLInputElement;\n\n public handleButtonClick(evt: Event) {\n // Stop propagation: prevent any clicks leaking out\n evt.preventDefault();\n evt.stopPropagation();\n\n let params = {};\n if (this.data.get('lightbox') === 'true') {\n const namePrefix = this.data.get('formName');\n const form = this.findParentElementByTagName(this.notesTarget, 'form');\n if (!form || !namePrefix) return;\n\n params = {\n chosen_variant: getFormElementValueByName(form, namePrefix, 'chosen_variant', true),\n portion_size: getFormElementValueByName(form, namePrefix, 'portion_size'),\n quantity: getFormElementValueByName(form, namePrefix, 'quantity'),\n delivery_date: getFormElementValueByName(form, namePrefix, 'delivery_date'),\n };\n }\n\n // Show the dialog\n const [contentHref, placeholder] = this.getRequiredDataAttrs('contentHref', 'placeholder');\n showDialog({\n onClosing: e => {\n if (e.detail.closeReason === 'save') {\n this.notesTarget.value = (document.getElementsByName(\n 'order_note[note]'\n )[0] as HTMLInputElement).value;\n }\n\n if (this.data.get('lightbox') === 'true') {\n // Reopen the lightbox of the product\n const [lightboxContentHref, lightboxPlaceholder] = this.getRequiredDataAttrs(\n 'lightboxContentHref',\n 'placeholder'\n );\n closeDialog();\n return setImmediate(() => {\n return showDialog({\n contentHref: `${lightboxContentHref}?${addParametersToQueryString('', {\n notes: this.notesTarget.value,\n ...params,\n })}`,\n placeholder: markAsSafeHTML(lightboxPlaceholder),\n });\n });\n }\n\n if (this.notesTarget.value) {\n // tslint:disable-next-line:no-inner-html\n this.triggerButtonTarget.getElementsByClassName('cnf-link-with-icon')[0].innerHTML =\n 'assignmentEdit note';\n } else {\n // tslint:disable-next-line:no-inner-html\n this.triggerButtonTarget.getElementsByClassName('cnf-link-with-icon')[0].innerHTML =\n 'content_pasteAdd a note to vendor';\n }\n },\n contentHref: contentHref + '?note=' + encodeURIComponent(this.notesTarget.value),\n placeholder: markAsSafeHTML(placeholder),\n });\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/confinus-avatar-c7c61e27bcb589164e6db22c7d6dccf0.png\";","import FormFieldController from 'src/lib/controller/form_field_controller';\n\nexport default class ToggleCardController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n // TODO change when removing old components\n protected get invalidClassName() {\n return 'cnf-toggle-card--invalid';\n }\n}\n","import ActionCable from 'actioncable';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { INotificationData } from 'src/types';\n\nexport default class NotificationsController extends BaseController {\n public static targets = ['count'];\n\n private declare readonly countTarget: HTMLDivElement;\n\n public onInitialize() {\n const cableConsumer = ActionCable.createConsumer();\n\n cableConsumer.subscriptions.create(\n {\n channel: 'NotificationsChannel',\n },\n\n {\n received: (data: INotificationData) => {\n this.handleNewMessage(data);\n },\n\n connected: () => {\n return;\n },\n disconnected: () => {\n return;\n },\n }\n );\n\n this.onConnect(() => {\n cableConsumer.connect();\n\n return () => {\n cableConsumer.disconnect();\n };\n });\n\n return super.onInitialize();\n }\n\n public incrementCounter() {\n this.element.classList.add('cnf-messages__topbar-notifications--unread');\n const countContent = this.countTarget.innerText;\n const currentCount = countContent.length === 0 ? 0 : parseInt(countContent, 10);\n this.countTarget.innerText = (currentCount + 1).toString();\n }\n\n public handleNewMessage(data: INotificationData) {\n this.incrementCounter();\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/confinus-avatar-black-9b7853698c14f05eb1ab4e962976ca64.png\";","import BaseController from 'src/lib/controller/base_controller';\n\nconst DISABLED_CLASS = 'cnf-data-table__row--disabled';\n\nexport default class TableRowController extends BaseController {\n public static targets = ['expandButton'];\n\n // private declare readonly expandButtonTarget: HTMLSpanElement;\n private declare readonly hasExpandButtonTarget: boolean;\n\n public get id() {\n return this.getRequiredDataAttr('id');\n }\n\n public get disabled() {\n return this.element.classList.contains(DISABLED_CLASS);\n }\n\n public set disabled(disabled: boolean) {\n if (disabled) {\n this.element.classList.add(DISABLED_CLASS);\n } else {\n this.element.classList.remove(DISABLED_CLASS);\n }\n }\n\n public get index() {\n return this.data.get('index');\n }\n\n public handleRowClick(e: MouseEvent) {\n const href = this.data.get('href');\n if (href) {\n window.location.href = href;\n } else if (this.hasExpandButtonTarget) {\n this.handleExpandClick(e);\n }\n }\n\n public handleExpandClick(e: MouseEvent) {\n // Stop this propagating up to the table row\n e.stopPropagation();\n\n // TODO expand/contract the panel\n // We need to push this up to the table controller so it knows which panel to expand + contract\n // This is complicated by the fact that tables have a required structure tbody -> tr\n this.toggleExpandButton();\n this.dispatchExpandEvent();\n }\n\n public toggleExpandButton() {\n // this.expandButtonTarget.classList.toggle('mdl-data-table__row__expand-button--rotated');\n }\n\n private dispatchExpandEvent() {\n // const evt = createCustomEvent('cnf-table-row:expand', {\n // identifier: this.identifier,\n // index: this.data.get('index'),\n // });\n // this.element.dispatchEvent(evt);\n }\n}\n","import ProductNavigationTierController from 'src/controllers/shopping/product_navigation_tier_controller';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { stringifyEscapeQuotes } from 'src/lib/util/stringify_escape_quotes';\nimport trackHover from 'src/lib/util/track_hover';\nimport { IControllerWithItems, INavigationCategory } from 'src/types';\n\nconst ACTIVE_ITEM_CLASS = 'active';\nconst BACKDROP_CLASS = 'shopping__product-navigation__overlay';\nconst LIST_SHOWN_CLASS = 'shopping__product-navigation__list--shown';\nconst supportsTouch = 'ontouchstart' in window || navigator.msMaxTouchPoints;\n\nexport default class ProductNavigationController extends BaseController {\n public static targets = [\n 'dropdown',\n 'backdrop',\n 'navigation',\n 'mobileButton',\n 'primaryCategoryList',\n 'search',\n ];\n\n private declare readonly dropdownTarget: HTMLElement;\n private declare readonly backdropTarget: HTMLElement;\n private declare readonly navigationTarget: HTMLElement;\n private declare readonly mobileButtonTarget: HTMLElement;\n private declare readonly primaryCategoryListTarget: HTMLElement;\n private declare readonly searchTarget: HTMLElement;\n\n public items!: INavigationCategory[];\n\n private tierControllers: ProductNavigationTierController[] = [];\n private backdropActive: boolean = false;\n private currentPath: { target?: HTMLBaseElement; tier: number; key: string }[] = [];\n\n public onInitialize() {\n this.items = this.parseItems();\n this.onDisconnect(() => {\n this.tierControllers = [];\n });\n\n this.onChildControllerConnect((controller: BaseController) => {\n if (controller instanceof ProductNavigationTierController) {\n this.tierControllers.push(controller);\n }\n });\n\n return super.onInitialize();\n }\n\n public tierSelected(e: Event, tier = 0) {\n const key = this.parseKeyAttribute(e);\n const target = e.target as HTMLBaseElement;\n const same = this.currentPath.length > 0 && this.currentPath[this.currentPath.length - 1].tier === tier;\n if (!same) {\n this.currentPath.push({ target, tier, key });\n }\n\n if (e.type === 'mouseover' && !supportsTouch) {\n trackHover('mouseleave', target, () => {\n this.selectCategory(tier, key);\n this.itemSelected(tier, target);\n });\n } else if (e.type === 'touchend' && same && !this.isMobile) {\n // If on a tablet device when you tap on the parent category again it will close, however tapping on any other\n // category a second time, then don't prevent default and navigate to that page\n if (tier === 0) {\n e.preventDefault();\n this.closeNavigation();\n }\n } else if (e.type === 'touchend') {\n // This is what happens on a mobile device\n if (this.selectCategory(tier, key).length > 0) {\n e.preventDefault();\n this.itemSelected(tier, target);\n }\n }\n }\n\n public appendTier(items: INavigationCategory[], parent: INavigationCategory) {\n const tier = this.tierControllers.length + 1;\n if (!items.length) {\n return;\n }\n const htmlClass = !this.isMobile && this.isLastTier(items.slice(0, 9)) ? 'last-tier' : 'regular-tier';\n const tierHtml = `\n
    \n
\n `;\n this.dropdownTarget.insertAdjacentHTML('beforeend', tierHtml);\n }\n\n public get isMobile() {\n return window.innerWidth < 840;\n }\n\n public backMenu(e: Event) {\n if (this.currentPath.length == 1) {\n this.closeNavigation();\n } else if (this.currentPath.length > 1) {\n this.currentPath.pop();\n const previous = this.currentPath[this.currentPath.length - 1];\n if (previous!.tier === -1) {\n this.primaryCategoryListTarget.classList.add(LIST_SHOWN_CLASS);\n }\n this.selectCategory(previous!.tier, previous!.key);\n }\n }\n\n public showSearch(e: Event) {\n this.closeNavigation();\n this.searchTarget.classList.toggle(LIST_SHOWN_CLASS);\n setImmediate(() => {\n this.searchTarget.getElementsByTagName('input')[0].focus();\n });\n }\n\n public hideSearch() {\n this.searchTarget.classList.remove(LIST_SHOWN_CLASS);\n }\n\n public showMenu(e: Event) {\n this.hideSearch();\n if (this.currentPath.length > 0) {\n this.closeNavigation();\n } else {\n this.currentPath.push({ tier: -1, key: '' });\n this.primaryCategoryListTarget.classList.add(LIST_SHOWN_CLASS);\n this.addBackdrop();\n }\n }\n\n public isLastTier(items: INavigationCategory[]) {\n if (items.find(o => o.i.length !== 0)) {\n return false;\n }\n return true;\n }\n\n public closeNavigation(): any {\n this.backdropTarget.classList.remove(BACKDROP_CLASS);\n this.primaryCategoryListTarget.classList.remove(LIST_SHOWN_CLASS);\n this.clearCategoriesTo(0);\n this.clearPreviousActiveItem(0);\n this.backdropActive = false;\n this.currentPath = [];\n }\n\n public closeNavigationWithTimeout() {\n trackHover('mouseenter', this.navigationTarget, this.closeNavigation.bind(this));\n }\n\n private itemSelected(tier: number, target: HTMLElement) {\n this.toggleActive(tier, target);\n this.primaryCategoryListTarget.classList.remove(LIST_SHOWN_CLASS);\n this.addBackdrop();\n }\n\n private selectCategory(tier: number, key: string | null): INavigationCategory[] {\n if (key == null) {\n this.clearCategoriesTo(0);\n return [];\n }\n\n this.clearCategoriesTo(tier);\n const emittedController = this.controllerOfTier(tier);\n if (emittedController !== undefined) {\n const items = emittedController.items;\n const category = items.find(el => el.k === key);\n\n if (category !== undefined) {\n this.appendTier(category.i, category);\n return category.i;\n }\n }\n return [];\n }\n\n private clearPreviousActiveItem(tier: number) {\n let activeItem = null;\n\n const tierTarget = this.controllerOfTier(tier);\n if (tierTarget !== null && tierTarget !== undefined) {\n activeItem = tierTarget.element.getElementsByClassName(ACTIVE_ITEM_CLASS);\n\n if (activeItem !== null && activeItem[0]) {\n activeItem[0].classList.remove(ACTIVE_ITEM_CLASS);\n }\n }\n }\n\n private toggleActive(tier: number, target: HTMLElement | null): void {\n this.clearPreviousActiveItem(tier);\n\n if (target !== null && target.parentElement !== null) {\n const targetElement = tier === 0 ? target : target.parentElement;\n if (targetElement.classList.contains(ACTIVE_ITEM_CLASS)) {\n targetElement.classList.remove(ACTIVE_ITEM_CLASS);\n } else {\n targetElement.classList.add(ACTIVE_ITEM_CLASS);\n }\n }\n }\n\n private elementIsActive(element: HTMLBaseElement) {\n return element.classList.contains(ACTIVE_ITEM_CLASS);\n }\n\n private clearCategoriesTo(tier: number): void {\n this.tierControllers.slice(tier).forEach(c => {\n if (c.element !== null && c.element.parentNode !== null) {\n c.element.parentNode.removeChild(c.element);\n }\n this.tierControllers.pop();\n });\n }\n\n private controllerOfTier(tier: number): IControllerWithItems {\n if (tier === 0) {\n return this;\n }\n\n return this.tierControllers[tier - 1] as IControllerWithItems;\n }\n\n private parseItems(): INavigationCategory[] {\n const itemsStr = this.data.get('categories');\n\n if (itemsStr !== null) {\n return JSON.parse(itemsStr) as INavigationCategory[];\n }\n\n return [] as INavigationCategory[];\n }\n\n private parseKeyAttribute(e: Event): string {\n if (e !== null && e !== undefined) {\n const target = e.target as HTMLBaseElement;\n return target.getAttribute('key') || '';\n }\n\n return '';\n }\n\n private addBackdrop() {\n if (this.backdropActive === true) {\n return;\n }\n this.backdropTarget.classList.add(BACKDROP_CLASS);\n this.backdropActive = true;\n }\n}\n","import { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { DialogLifecycleEvent, IDialogLifecycleEventDetail, IDialogShowOptions } from 'src/types';\n\nexport function showDialog(opts: IDialogShowOptions) {\n const { onClosing, ...rest } = opts;\n function closingHandler(e: Event) {\n window.removeEventListener('cnf-dialog:closing', closingHandler);\n if (onClosing) {\n onClosing(e as DialogLifecycleEvent);\n }\n }\n\n window.addEventListener('cnf-dialog:closing', closingHandler);\n\n const evt = createCustomEvent('cnf-dialog:open', rest);\n window.dispatchEvent(evt);\n}\n\nexport function closeDialog(opts?: IDialogLifecycleEventDetail) {\n const evt = createCustomEvent('cnf-dialog:close', opts);\n window.dispatchEvent(evt);\n}\n","import PurchaseConfiguratorVariantController from 'src/controllers/shopping/purchase_configurator/purchase_configurator_variant_controller';\n\n// Just here to connect up to the correct ERB view.\n// Inherits all behaviour from the base class.\nexport default class PurchaseConfiguratorUomPricingDetailsController extends PurchaseConfiguratorVariantController {}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { showDialog } from 'src/lib/overlay/dialog.ts';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\n\nexport default class ProductLightboxController extends BaseController {\n public handleButtonClick(evt: Event) {\n // Stop propagation: prevent any clicks leaking out\n evt.preventDefault();\n evt.stopPropagation();\n\n // Show the dialog\n const [contentHref, placeholder] = this.getRequiredDataAttrs('contentHref', 'placeholder');\n showDialog({\n contentHref,\n placeholder: markAsSafeHTML(placeholder),\n });\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { showSnackbar } from 'src/lib/overlay/snackbar';\n\nexport default class ClickToCopyController extends BaseController {\n public copy() {\n this.selectText();\n showSnackbar({ message: 'Copied!', timeout: 1000 });\n }\n\n private selectText() {\n const range = document.createRange();\n range.selectNodeContents(this.element);\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n document.execCommand('copy');\n selection.removeAllRanges();\n }\n}\n","import { DialogLifecycleEvent } from 'src/types';\n\nimport ProductLightboxController from 'src/controllers/shopping/product_lightbox_controller';\nimport axios from 'src/lib/axios';\nimport BaseController from 'src/lib/controller/base_controller';\nimport { closeDialog, showDialog } from 'src/lib/overlay/dialog';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\n\nexport default class CartItemController extends BaseController {\n private lightboxController: ProductLightboxController | null = null;\n\n public onInitialize() {\n this.onChildControllerConnect((controller: BaseController) => {\n if (controller instanceof ProductLightboxController) {\n this.lightboxController = controller;\n }\n });\n\n this.onDisconnect(() => {\n this.lightboxController = null;\n });\n\n return super.onInitialize();\n }\n\n public edit() {\n if (this.lightboxController !== null) {\n this.lightboxController.showPurchaseConfigurator();\n }\n }\n\n public removalWithoutConfirm() {\n this.deleteCartItem();\n }\n\n public showRemovalConfirm() {\n showDialog({\n actions: [\n {\n action: 'cancel',\n title: 'No',\n },\n {\n action: 'ok',\n title: 'Yes',\n },\n ],\n content: markAsSafeHTML(`Are you sure that you want to delete this item?`),\n defaultAction: 'ok',\n onClosing: this.handleDialogClosing,\n });\n }\n\n private handleDialogClosing = ({ detail: { closeReason } }: DialogLifecycleEvent) => {\n if (closeReason === 'ok') {\n this.deleteCartItem();\n } else {\n closeDialog();\n }\n };\n\n private deleteCartItem() {\n const url = this.data.get('url');\n\n if (url === null) {\n return;\n }\n\n axios\n .delete(url)\n .then(() => {\n window.location.reload();\n })\n .catch((e: Error) => {\n console.log(e.message);\n });\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class TableCellController extends BaseController {\n public handleLinkClick(e: MouseEvent) {\n // This is called when the anchor itself was clicked.\n // We don't want this to be handled by JS, to preserve ctrl-click etc.\n e.stopPropagation();\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nconst ACTIVE_CLASS = 'shopping__delivery-cut-off-pill--active';\nconst MINUTES_BEFORE_RUN = 30;\nconst SECONDS_BEFORE_RUN = MINUTES_BEFORE_RUN * 60;\n\nexport default class DeliveryCutOffPillController extends BaseController {\n public onInitialize() {\n this.onConnect(() => {\n const timeToCutOff = this.timeToCutOff;\n if (timeToCutOff !== null && timeToCutOff > 0) {\n const timeToActivateElement = timeToCutOff - SECONDS_BEFORE_RUN;\n const activateTimerId = this.activateElement(this.calculateTimeout(timeToActivateElement));\n const inactivateTimerId = this.deactivateElement(this.calculateTimeout(timeToCutOff));\n return () => {\n clearTimeout(activateTimerId);\n clearTimeout(inactivateTimerId);\n };\n }\n });\n\n return super.onInitialize();\n }\n\n public activateElement = (timeout: number) => {\n let timerId: any;\n if (timeout > 0) {\n timerId = setTimeout(this.addActiveClass, timeout);\n } else {\n this.addActiveClass();\n }\n return timerId || null;\n };\n\n public deactivateElement = (timeout: number) => {\n let timerId: any;\n if (timeout > 0) {\n timerId = setTimeout(this.removeActiveClass, timeout);\n }\n return timerId;\n };\n\n public calculateTimeout(timeoutInSeconds: number) {\n return timeoutInSeconds * 1000;\n }\n\n public addActiveClass = () => {\n this.element.classList.add(ACTIVE_CLASS);\n };\n\n public removeActiveClass = () => {\n this.element.classList.remove(ACTIVE_CLASS);\n };\n\n private get timeToCutOff(): number | null {\n const timeToCutOff = this.data.get('timeToCutOff') as any;\n if (timeToCutOff === null) {\n return timeToCutOff;\n }\n return timeToCutOff as number;\n }\n}\n","import { MDCCheckbox } from '@material/checkbox/index';\nimport { MDCFormField } from '@material/form-field/index';\n\nimport FormFieldController from 'src/lib/controller/form_field_controller';\n\nexport default class CheckboxController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n private checkbox!: MDCCheckbox | null;\n\n public onInitialize() {\n this.onConnect(() => {\n const checkbox = new MDCCheckbox(this.containerTarget);\n this.checkbox = checkbox;\n const formField = new MDCFormField(this.element);\n\n if (this.data.has('ripple')) {\n formField.input = checkbox;\n }\n\n if (this.data.has('indeterminate')) {\n checkbox.indeterminate = true;\n }\n\n return () => {\n formField.destroy();\n checkbox.destroy();\n this.checkbox = null;\n };\n });\n\n return super.onInitialize();\n }\n\n public get checked() {\n return this.checkbox!.checked;\n }\n\n protected get invalidClassName() {\n return 'mdc-checkbox--invalid';\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { addParametersToQueryString } from 'src/lib/util/add_parameter_to_url';\n\nexport default class TableHeaderCellController extends BaseController {\n public handleSortableClick() {\n const params = {\n sort_by: this.sortKey,\n sorted_direction: this.nextSortDirection,\n };\n window.location.search = addParametersToQueryString(window.location.search, params);\n }\n\n private get sortKey() {\n return this.getRequiredDataAttr('sortKey');\n }\n\n private get sortDirection() {\n return this.data.get('sortedDirection');\n }\n\n private get nextSortDirection() {\n return this.sortDirection === 'desc' ? 'asc' : 'desc';\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class SelectToggleController extends BaseController {\n public static targets = ['privateSelect', 'sharedSelect'];\n\n private declare readonly privateSelectTarget: HTMLSelectElement;\n private declare readonly sharedSelectTarget: HTMLSelectElement;\n\n public clearSharedSelect() {\n this.sharedSelectTarget.selectedIndex = 0;\n }\n\n public clearPrivateSelect() {\n this.privateSelectTarget.selectedIndex = 0;\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { INavigationCategory } from 'src/types';\nimport ProductNavigationController from './product_navigation_controller';\n\nexport default class ProductNavigationTierController extends BaseController {\n public items = [] as INavigationCategory[];\n private tier = 1;\n private parentController!: ProductNavigationController;\n private parentCategory!: INavigationCategory;\n\n public onInitialize() {\n this.onConnect(() => {\n this.parentController = this.parseParentController();\n this.tier = this.parseTier();\n this.items = this.parseItems();\n this.parentCategory = this.parseParentCategory();\n\n this.render();\n\n return () => {\n if (this.element !== null && this.element.parentNode !== null) {\n this.element.parentNode.removeChild(this.element);\n }\n };\n });\n\n return super.onInitialize();\n }\n\n public itemHovered(e: Event) {\n this.parentController.tierSelected(e, this.tier);\n }\n\n public get isMobile() {\n return window.innerWidth < 840;\n }\n\n private render(): void {\n let itemsToRender = this.items.filter((i) => i.s);\n\n if (this.isMobile) {\n const seeAllHtml = `\n
  • \n shopping--product-navigation#backMenu\">< Back\n
  • \n
  • \n See all ${this.parentCategory.n}\n
  • \n `;\n this.element.insertAdjacentHTML('beforeend', seeAllHtml);\n this.renderItems(itemsToRender);\n return;\n }\n // Truncate to first 9 items if there are parent categories present & add placeholder\n if (itemsToRender.length > 9 && itemsToRender.find(el => el.sic > 0) !== undefined) {\n itemsToRender = itemsToRender.slice(0, 9);\n this.renderItems(itemsToRender);\n\n const seeAllHtml = `\n
  • \n See all\n
  • \n `;\n\n this.element.insertAdjacentHTML('beforeend', seeAllHtml);\n return;\n }\n\n this.renderItems(itemsToRender.slice(0, 9));\n\n if (itemsToRender.length > 10) {\n this.parentController.appendTier(this.items.slice(9), this.parentCategory);\n }\n }\n\n private renderItems(items: INavigationCategory[]) {\n items.forEach(item => {\n let arrowHtml = '';\n let actionHtml = '';\n\n if (item.sic > 0) {\n arrowHtml = 'keyboard_arrow_right';\n actionHtml = `mouseover->shopping--product-navigation-tier#itemHovered\n touchend->shopping--product-navigation-tier#itemHovered\n ${this.tier}Selected click->shopping--product-navigation-tier#itemHovered`;\n }\n\n const itemHtml = `\n
  • \n ${item.n}\n ${arrowHtml}\n
  • \n `;\n\n this.element.insertAdjacentHTML('beforeend', itemHtml);\n });\n }\n\n private parseParentCategory(): INavigationCategory {\n const categoryStr = this.data.get('parentCategory');\n\n if (categoryStr !== null) {\n return JSON.parse(categoryStr) as INavigationCategory;\n }\n return {} as INavigationCategory;\n }\n\n private parseParentController(): ProductNavigationController {\n return this.application.controllers.find(controller => {\n return controller.context.identifier === 'shopping--product-navigation';\n }) as ProductNavigationController;\n }\n\n private parseItems(): INavigationCategory[] {\n const itemsStr = this.data.get('items');\n\n if (itemsStr !== null) {\n return JSON.parse(itemsStr) as INavigationCategory[];\n }\n return [] as INavigationCategory[];\n }\n\n private parseTier(): number {\n return parseInt(this.data.get('tier') as string, 10);\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { removeHashesFromQueryString } from 'src/lib/util/add_parameter_to_url';\nimport { serialize } from 'src/lib/util/serialize';\n\nexport default class SidebarFiltersController extends BaseController {\n public static targets = ['form'];\n\n private declare readonly formTarget: HTMLFormElement;\n\n // Override reseting other parameters on form submit via GET method - build request url explicitly\n public submit(e: Event) {\n e.preventDefault();\n\n const serializedForm = serialize(this.formTarget);\n\n // reset query string parameters\n const queryString = removeHashesFromQueryString(\n window.location.search,\n 'ft',\n 'utf8'\n );\n\n window.location.search = queryString + '&' + serializedForm;\n }\n}\n","/*!\n * Serialize all form data into a query string\n * (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} form The form to serialize\n * @return {String} The serialized form data\n */\nexport function serialize(form: HTMLFormElement): string {\n // Setup our serialized data\n const serialized = [];\n\n // Loop through each field in the form\n for (const field of form.elements) {\n // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\n if (\n !field.name ||\n field.disabled ||\n field.type === 'file' ||\n field.type === 'reset' ||\n field.type === 'submit' ||\n field.type === 'button'\n ) {\n continue;\n }\n\n // If a multi-select, get all selections\n if (field.type === 'select-multiple') {\n for (const option of field.options) {\n if (!option.selected) {\n continue;\n }\n\n serialized.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(option.value));\n }\n }\n\n // Convert field data to a query string\n else if ((field.type !== 'checkbox' && field.type !== 'radio') || field.checked) {\n serialized.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value));\n }\n }\n return serialized.join('&');\n}\n","var map = {\n\t\"./af\": \"a2iI\",\n\t\"./af.js\": \"a2iI\",\n\t\"./ar\": \"qPzD\",\n\t\"./ar-dz\": \"zLJo\",\n\t\"./ar-dz.js\": \"zLJo\",\n\t\"./ar-kw\": \"XFf8\",\n\t\"./ar-kw.js\": \"XFf8\",\n\t\"./ar-ly\": \"XRYT\",\n\t\"./ar-ly.js\": \"XRYT\",\n\t\"./ar-ma\": \"DUVZ\",\n\t\"./ar-ma.js\": \"DUVZ\",\n\t\"./ar-sa\": \"aoIg\",\n\t\"./ar-sa.js\": \"aoIg\",\n\t\"./ar-tn\": \"C4dg\",\n\t\"./ar-tn.js\": \"C4dg\",\n\t\"./ar.js\": \"qPzD\",\n\t\"./az\": \"6EVF\",\n\t\"./az.js\": \"6EVF\",\n\t\"./be\": \"hT6L\",\n\t\"./be.js\": \"hT6L\",\n\t\"./bg\": \"3kDF\",\n\t\"./bg.js\": \"3kDF\",\n\t\"./bm\": \"Oets\",\n\t\"./bm.js\": \"Oets\",\n\t\"./bn\": \"9arh\",\n\t\"./bn-bd\": \"A7s9\",\n\t\"./bn-bd.js\": \"A7s9\",\n\t\"./bn.js\": \"9arh\",\n\t\"./bo\": \"QKt9\",\n\t\"./bo.js\": \"QKt9\",\n\t\"./br\": \"Z0Yu\",\n\t\"./br.js\": \"Z0Yu\",\n\t\"./bs\": \"NF+/\",\n\t\"./bs.js\": \"NF+/\",\n\t\"./ca\": \"oxlq\",\n\t\"./ca.js\": \"oxlq\",\n\t\"./cs\": \"GOkH\",\n\t\"./cs.js\": \"GOkH\",\n\t\"./cv\": \"Xq1I\",\n\t\"./cv.js\": \"Xq1I\",\n\t\"./cy\": \"Uk8F\",\n\t\"./cy.js\": \"Uk8F\",\n\t\"./da\": \"RGez\",\n\t\"./da.js\": \"RGez\",\n\t\"./de\": \"dcWW\",\n\t\"./de-at\": \"hDZd\",\n\t\"./de-at.js\": \"hDZd\",\n\t\"./de-ch\": \"I6A3\",\n\t\"./de-ch.js\": \"I6A3\",\n\t\"./de.js\": \"dcWW\",\n\t\"./dv\": \"kKHv\",\n\t\"./dv.js\": \"kKHv\",\n\t\"./el\": \"y9oP\",\n\t\"./el.js\": \"y9oP\",\n\t\"./en-au\": \"VZI1\",\n\t\"./en-au.js\": \"VZI1\",\n\t\"./en-ca\": \"WyKH\",\n\t\"./en-ca.js\": \"WyKH\",\n\t\"./en-gb\": \"kX2B\",\n\t\"./en-gb.js\": \"kX2B\",\n\t\"./en-ie\": \"bv26\",\n\t\"./en-ie.js\": \"bv26\",\n\t\"./en-il\": \"VXHX\",\n\t\"./en-il.js\": \"VXHX\",\n\t\"./en-in\": \"5DGX\",\n\t\"./en-in.js\": \"5DGX\",\n\t\"./en-nz\": \"TqiD\",\n\t\"./en-nz.js\": \"TqiD\",\n\t\"./en-sg\": \"QdAY\",\n\t\"./en-sg.js\": \"QdAY\",\n\t\"./eo\": \"78n2\",\n\t\"./eo.js\": \"78n2\",\n\t\"./es\": \"3/23\",\n\t\"./es-do\": \"PHxP\",\n\t\"./es-do.js\": \"PHxP\",\n\t\"./es-mx\": \"2Qp6\",\n\t\"./es-mx.js\": \"2Qp6\",\n\t\"./es-us\": \"f4S9\",\n\t\"./es-us.js\": \"f4S9\",\n\t\"./es.js\": \"3/23\",\n\t\"./et\": \"ULdE\",\n\t\"./et.js\": \"ULdE\",\n\t\"./eu\": \"VGI5\",\n\t\"./eu.js\": \"VGI5\",\n\t\"./fa\": \"sT8a\",\n\t\"./fa.js\": \"sT8a\",\n\t\"./fi\": \"W0+E\",\n\t\"./fi.js\": \"W0+E\",\n\t\"./fil\": \"3Nny\",\n\t\"./fil.js\": \"3Nny\",\n\t\"./fo\": \"7nUs\",\n\t\"./fo.js\": \"7nUs\",\n\t\"./fr\": \"/xps\",\n\t\"./fr-ca\": \"Yh7a\",\n\t\"./fr-ca.js\": \"Yh7a\",\n\t\"./fr-ch\": \"BOH5\",\n\t\"./fr-ch.js\": \"BOH5\",\n\t\"./fr.js\": \"/xps\",\n\t\"./fy\": \"Ezr8\",\n\t\"./fy.js\": \"Ezr8\",\n\t\"./ga\": \"mjyf\",\n\t\"./ga.js\": \"mjyf\",\n\t\"./gd\": \"8d+C\",\n\t\"./gd.js\": \"8d+C\",\n\t\"./gl\": \"16NB\",\n\t\"./gl.js\": \"16NB\",\n\t\"./gom-deva\": \"Ez1N\",\n\t\"./gom-deva.js\": \"Ez1N\",\n\t\"./gom-latn\": \"HEoh\",\n\t\"./gom-latn.js\": \"HEoh\",\n\t\"./gu\": \"2qHU\",\n\t\"./gu.js\": \"2qHU\",\n\t\"./he\": \"byTR\",\n\t\"./he.js\": \"byTR\",\n\t\"./hi\": \"w+LK\",\n\t\"./hi.js\": \"w+LK\",\n\t\"./hr\": \"VIfZ\",\n\t\"./hr.js\": \"VIfZ\",\n\t\"./hu\": \"+rhA\",\n\t\"./hu.js\": \"+rhA\",\n\t\"./hy-am\": \"e0gR\",\n\t\"./hy-am.js\": \"e0gR\",\n\t\"./id\": \"oHi4\",\n\t\"./id.js\": \"oHi4\",\n\t\"./is\": \"+rdI\",\n\t\"./is.js\": \"+rdI\",\n\t\"./it\": \"7SJw\",\n\t\"./it-ch\": \"+ca1\",\n\t\"./it-ch.js\": \"+ca1\",\n\t\"./it.js\": \"7SJw\",\n\t\"./ja\": \"RwFu\",\n\t\"./ja.js\": \"RwFu\",\n\t\"./jv\": \"IC88\",\n\t\"./jv.js\": \"IC88\",\n\t\"./ka\": \"+/n2\",\n\t\"./ka.js\": \"+/n2\",\n\t\"./kk\": \"fSdL\",\n\t\"./kk.js\": \"fSdL\",\n\t\"./km\": \"+HR8\",\n\t\"./km.js\": \"+HR8\",\n\t\"./kn\": \"i1JG\",\n\t\"./kn.js\": \"i1JG\",\n\t\"./ko\": \"I/c7\",\n\t\"./ko.js\": \"I/c7\",\n\t\"./ku\": \"dXjs\",\n\t\"./ku.js\": \"dXjs\",\n\t\"./ky\": \"lLDN\",\n\t\"./ky.js\": \"lLDN\",\n\t\"./lb\": \"GqJX\",\n\t\"./lb.js\": \"GqJX\",\n\t\"./lo\": \"dPAL\",\n\t\"./lo.js\": \"dPAL\",\n\t\"./lt\": \"Ukyy\",\n\t\"./lt.js\": \"Ukyy\",\n\t\"./lv\": \"tDlX\",\n\t\"./lv.js\": \"tDlX\",\n\t\"./me\": \"ZqHZ\",\n\t\"./me.js\": \"ZqHZ\",\n\t\"./mi\": \"lCM3\",\n\t\"./mi.js\": \"lCM3\",\n\t\"./mk\": \"6Aks\",\n\t\"./mk.js\": \"6Aks\",\n\t\"./ml\": \"vlzl\",\n\t\"./ml.js\": \"vlzl\",\n\t\"./mn\": \"Fp72\",\n\t\"./mn.js\": \"Fp72\",\n\t\"./mr\": \"SkMt\",\n\t\"./mr.js\": \"SkMt\",\n\t\"./ms\": \"mL0s\",\n\t\"./ms-my\": \"e1zB\",\n\t\"./ms-my.js\": \"e1zB\",\n\t\"./ms.js\": \"mL0s\",\n\t\"./mt\": \"ybXX\",\n\t\"./mt.js\": \"ybXX\",\n\t\"./my\": \"q0/+\",\n\t\"./my.js\": \"q0/+\",\n\t\"./nb\": \"Skil\",\n\t\"./nb.js\": \"Skil\",\n\t\"./ne\": \"BZIV\",\n\t\"./ne.js\": \"BZIV\",\n\t\"./nl\": \"cHpQ\",\n\t\"./nl-be\": \"/AaI\",\n\t\"./nl-be.js\": \"/AaI\",\n\t\"./nl.js\": \"cHpQ\",\n\t\"./nn\": \"tdPS\",\n\t\"./nn.js\": \"tdPS\",\n\t\"./oc-lnc\": \"V7/c\",\n\t\"./oc-lnc.js\": \"V7/c\",\n\t\"./pa-in\": \"Leu7\",\n\t\"./pa-in.js\": \"Leu7\",\n\t\"./pl\": \"2tjr\",\n\t\"./pl.js\": \"2tjr\",\n\t\"./pt\": \"s5gh\",\n\t\"./pt-br\": \"11uw\",\n\t\"./pt-br.js\": \"11uw\",\n\t\"./pt.js\": \"s5gh\",\n\t\"./ro\": \"1goK\",\n\t\"./ro.js\": \"1goK\",\n\t\"./ru\": \"1wnn\",\n\t\"./ru.js\": \"1wnn\",\n\t\"./sd\": \"CZVp\",\n\t\"./sd.js\": \"CZVp\",\n\t\"./se\": \"oATu\",\n\t\"./se.js\": \"oATu\",\n\t\"./si\": \"eS8R\",\n\t\"./si.js\": \"eS8R\",\n\t\"./sk\": \"FKnK\",\n\t\"./sk.js\": \"FKnK\",\n\t\"./sl\": \"mKUj\",\n\t\"./sl.js\": \"mKUj\",\n\t\"./sq\": \"Vd3B\",\n\t\"./sq.js\": \"Vd3B\",\n\t\"./sr\": \"vWrn\",\n\t\"./sr-cyrl\": \"J+Ca\",\n\t\"./sr-cyrl.js\": \"J+Ca\",\n\t\"./sr.js\": \"vWrn\",\n\t\"./ss\": \"m1+p\",\n\t\"./ss.js\": \"m1+p\",\n\t\"./sv\": \"crXW\",\n\t\"./sv.js\": \"crXW\",\n\t\"./sw\": \"gy9L\",\n\t\"./sw.js\": \"gy9L\",\n\t\"./ta\": \"5I0Q\",\n\t\"./ta.js\": \"5I0Q\",\n\t\"./te\": \"jpr6\",\n\t\"./te.js\": \"jpr6\",\n\t\"./tet\": \"+/Ps\",\n\t\"./tet.js\": \"+/Ps\",\n\t\"./tg\": \"BXtU\",\n\t\"./tg.js\": \"BXtU\",\n\t\"./th\": \"QUVj\",\n\t\"./th.js\": \"QUVj\",\n\t\"./tk\": \"BJXl\",\n\t\"./tk.js\": \"BJXl\",\n\t\"./tl-ph\": \"sSXk\",\n\t\"./tl-ph.js\": \"sSXk\",\n\t\"./tlh\": \"AwWf\",\n\t\"./tlh.js\": \"AwWf\",\n\t\"./tr\": \"WKIg\",\n\t\"./tr.js\": \"WKIg\",\n\t\"./tzl\": \"FVQL\",\n\t\"./tzl.js\": \"FVQL\",\n\t\"./tzm\": \"/MfB\",\n\t\"./tzm-latn\": \"d/fj\",\n\t\"./tzm-latn.js\": \"d/fj\",\n\t\"./tzm.js\": \"/MfB\",\n\t\"./ug-cn\": \"LM8Y\",\n\t\"./ug-cn.js\": \"LM8Y\",\n\t\"./uk\": \"cY93\",\n\t\"./uk.js\": \"cY93\",\n\t\"./ur\": \"c1Je\",\n\t\"./ur.js\": \"c1Je\",\n\t\"./uz\": \"Ad4x\",\n\t\"./uz-latn\": \"BNcf\",\n\t\"./uz-latn.js\": \"BNcf\",\n\t\"./uz.js\": \"Ad4x\",\n\t\"./vi\": \"msAF\",\n\t\"./vi.js\": \"msAF\",\n\t\"./x-pseudo\": \"oK7w\",\n\t\"./x-pseudo.js\": \"oK7w\",\n\t\"./yo\": \"zIDj\",\n\t\"./yo.js\": \"zIDj\",\n\t\"./zh-cn\": \"kDBA\",\n\t\"./zh-cn.js\": \"kDBA\",\n\t\"./zh-hk\": \"SoEy\",\n\t\"./zh-hk.js\": \"SoEy\",\n\t\"./zh-mo\": \"O90w\",\n\t\"./zh-mo.js\": \"O90w\",\n\t\"./zh-tw\": \"Dgp9\",\n\t\"./zh-tw.js\": \"Dgp9\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"pJYS\";","import { AxiosResponse } from 'axios';\nimport qs from 'querystringify';\nimport UnreadItemController from 'src/controllers/layouts/message_threads/unread_item_controller';\nimport axios from 'src/lib/axios';\nimport BaseController from 'src/lib/controller/base_controller';\nimport parseDateTime from 'src/lib/util/parse_datetime_attr';\nimport { IPathWithSharedInbox, NotificationEvent } from 'src/types';\n\nexport default class DynamicMessagesController extends BaseController {\n public static targets = ['items'];\n\n private declare readonly itemsTarget: HTMLDivElement;\n\n private messageControllers: UnreadItemController[] = [];\n\n public onInitialize() {\n this.onConnect(() => {\n if ('InstallTrigger' in window) {\n this.itemsTarget.style.minHeight = '0';\n }\n });\n\n this.onDisconnect(() => {\n this.messageControllers = [];\n });\n\n this.onChildControllerConnect((controller: BaseController) => {\n if (controller instanceof UnreadItemController) {\n this.messageControllers.push(controller);\n }\n });\n\n return super.onInitialize();\n }\n\n public load(e: CustomEvent): void {\n const {\n detail: { message },\n } = e as NotificationEvent;\n if (message.message_thread_uid !== this.data.get('thread-uid')) {\n this.fetchUnread(message.message_thread_uid);\n }\n }\n\n private fetchUnread(messageThreadUid: string): void {\n axios\n .get(this.unreadUrl(messageThreadUid))\n .then((response: AxiosResponse) => response.data)\n .then(html => this.addNotification(html, messageThreadUid))\n .catch((e: Error) => {\n alert(e.message);\n });\n }\n\n private addNotification(html: string, messageThreadUid: string) {\n const threadNotification = this.messageControllers.find(\n (controller: UnreadItemController) => controller.threadUid === messageThreadUid\n );\n\n if (threadNotification) {\n // Notification item exsists, remove old content\n this.removeItem(threadNotification);\n }\n\n this.prependNotificationNode(html);\n }\n\n private prependNotificationNode(html: string) {\n const sentAt = parseDateTime(html);\n const afterNode = this.firstItemSentBefore(sentAt);\n\n afterNode\n ? afterNode.scope.element.insertAdjacentHTML('beforebegin', html)\n : this.itemsTarget.insertAdjacentHTML('afterbegin', html);\n }\n\n private unreadUrl(messageThreadUid: string): string {\n let url = `/account/messages/threads/${messageThreadUid}/messages/unread`;\n const parts = qs.parse(window.location.search) as IPathWithSharedInbox;\n\n if (parts.shared_inbox_uid) {\n url += `?shared_inbox_uid=${parts.shared_inbox_uid}`;\n }\n\n return url;\n }\n\n private firstItemSentBefore(sentAt: number): UnreadItemController | undefined {\n return this.messageControllers.find(\n (controller: UnreadItemController) => controller.sentAt < sentAt\n );\n }\n\n private removeItem(controller: UnreadItemController) {\n const index = this.messageControllers.indexOf(controller);\n controller.scope.element.remove();\n this.messageControllers.splice(index, 1);\n }\n}\n","import { INotificationData } from 'src/types';\nimport { createCustomEvent } from '../../lib/util/create_custom_event';\nimport NotificationsController from './notifications_controller';\n\nexport default class NotificationsEmitterController extends NotificationsController {\n public handleNewMessage(data: INotificationData) {\n const { message } = data;\n if (\n message.sender_user_uid !== this.data.get('current-user-uid') &&\n message.type === 'Message'\n ) {\n this.incrementCounter();\n }\n\n const event = createCustomEvent('notification', data);\n window.dispatchEvent(event);\n }\n}\n","import { MDCDismissibleDrawerFoundation, MDCDrawer } from '@material/drawer/index';\nimport BaseController from 'src/lib/controller/base_controller';\n\nconst ALLOWED_CLASSES = [\n MDCDismissibleDrawerFoundation.cssClasses.MODAL,\n MDCDismissibleDrawerFoundation.cssClasses.DISMISSIBLE,\n];\n\nexport default class DrawerController extends BaseController {\n private drawer: MDCDrawer | null = null;\n\n private get hasAllowedClassName() {\n return ALLOWED_CLASSES.some(className => this.element.classList.contains(className));\n }\n\n public onInitialize() {\n this.onConnect(() => {\n if (!this.hasAllowedClassName) {\n return;\n }\n\n const drawerMDC = new MDCDrawer(this.element);\n this.drawer = drawerMDC;\n\n return () => {\n drawerMDC.destroy();\n this.drawer = null;\n };\n });\n\n return super.onInitialize();\n }\n\n public toggle() {\n if (this.drawer) {\n this.drawer.open = !this.drawer.open;\n }\n }\n}\n","const DEFAULT_TIMEOUT = 300;\n\nexport default function trackHover(\n eventType: string,\n target: HTMLBaseElement | HTMLElement,\n callback: () => void,\n timeout = DEFAULT_TIMEOUT\n) {\n target.addEventListener(eventType, () => {\n global.clearTimeout(timer);\n });\n\n const timer = setTimeout(callback, timeout);\n}\n","import qs from 'query-string';\n\ninterface IParams {\n [key: string]: string;\n}\n\nexport function addParametersToQueryString(str: string, params: IParams) {\n return qs.stringify({\n ...qs.parse(str),\n ...params,\n });\n}\n\nexport function removeParameterFromQueryString(str: string, key: string) {\n const search = qs.parse(str) as IParams;\n delete search[key];\n return qs.stringify(search);\n}\n\nexport function removeHashesFromQueryString(str: string, ...hashKeys: string[]) {\n const search = qs.parse(str) as IParams;\n for (const hashKey of hashKeys) {\n for (const key in search) {\n if (key.split('[')[0] === hashKey) {\n delete search[key];\n }\n }\n }\n\n return qs.stringify(search);\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/tag-8ed903e7fb93f854f7fc4c8a1cefddd1.svg\";","import {\n CustomFormSubmissionEvent,\n IFormFieldError,\n IFormFieldValidationResponse,\n ValidateFormFieldsEvent,\n} from 'src/types';\n\nimport BaseController from 'src/lib/controller/base_controller';\nimport FormFieldController from 'src/lib/controller/form_field_controller';\nimport i18n from 'src/lib/i18n';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\n\nimport FormControlController from './form_control_controller';\n\nexport default class FormController extends BaseController {\n public onInitialize() {\n this.onConnect(() => {\n // Disable HTML5 validation, we will handle that ourselves.\n this.element.setAttribute('novalidate', 'true');\n return () => {\n this.element.removeAttribute('novalidate');\n };\n });\n\n // Ensure all form controls under this form are auto-validated\n // The control will take care of reversing this when it disconnects\n this.onChildControllerConnect((controller: BaseController) => {\n if (controller instanceof FormControlController) {\n controller.autoValidation = true;\n }\n });\n\n return super.onInitialize();\n }\n\n public handleSubmitEvent(evt: Event) {\n const hasInvalidFields = this.performValidation();\n if (hasInvalidFields) {\n // At least one field was invalid.\n // Prevent form submission.\n evt.preventDefault();\n\n // Ensure that the event doesn't propagate.\n // Without this, if data-disable-with is set on the submit button,\n // the button will be disabled even if the form is invalid.\n evt.stopPropagation();\n\n // Ensure any other submission handlers on this form element are skipped\n evt.stopImmediatePropagation();\n }\n }\n\n public handleCustomSubmitEvent(evt: Event) {\n // This event is meant for our eyes only.\n evt.stopPropagation();\n\n const {\n detail: { onSubmissionPrevented },\n } = evt as CustomFormSubmissionEvent;\n\n const hasInvalidFields = this.performValidation();\n if (hasInvalidFields) {\n onSubmissionPrevented();\n } else {\n this.formElement.submit();\n }\n }\n\n public handleValidateFieldsEvent(evt: Event) {\n // This event is meant for our eyes only.\n evt.stopPropagation();\n\n const {\n detail: { onValidated },\n } = evt as ValidateFormFieldsEvent;\n\n const hasInvalidFields = this.performValidation();\n onValidated(!hasInvalidFields);\n }\n\n private get formElement(): HTMLFormElement {\n return this.element as HTMLFormElement;\n }\n\n private get formFieldControllers(): FormFieldController[] {\n return this.getSpecificChildControllers(FormFieldController);\n }\n\n private performValidation(): boolean {\n // Validate all fields.\n const { invalidFields, errorMessages } = this.harvestInvalids();\n\n const hasInvalidFields = invalidFields.length > 0;\n\n // Issue an event to say that the entire form was validated.\n // This allows higher controllers the opportunity to display\n // an overall summary of the fields that are in error.\n this.emitValidationEvent({\n errors: errorMessages,\n valid: !hasInvalidFields,\n });\n\n if (hasInvalidFields) {\n // At least one field was invalid.\n // Focus the first field that is in error.\n invalidFields[0].focusControl();\n }\n\n return hasInvalidFields;\n }\n\n private harvestInvalids() {\n let invalidFields: FormFieldController[] = [];\n let errorMessages: IFormFieldError[] = [];\n\n this.formFieldControllers.forEach(fc => {\n if (fc.disabled) {\n // Don't validate any disabled fields.\n return;\n }\n const { valid, errors } = fc.validate();\n if (!valid) {\n invalidFields = [...invalidFields, fc];\n errorMessages = [...errorMessages, ...errors];\n }\n });\n\n return {\n errorMessages,\n invalidFields,\n };\n }\n\n private emitValidationEvent({ errors, valid }: IFormFieldValidationResponse) {\n const evt = createCustomEvent('cnf-form:validated', {\n errors,\n preamble: i18n.errors.messages.form_invalid_preamble,\n valid,\n });\n this.element.dispatchEvent(evt);\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class AssigneeController extends BaseController {\n public static targets = ['form'];\n\n private declare readonly formTarget: HTMLFormElement;\n\n public submitForm() {\n this.formTarget.submit();\n }\n}\n","interface IValidationMessageVariables {\n [key: string]: string;\n}\n\nconst RAILS_I18N_MESSAGE_REGEX = /%{([\\s\\S]+?)}/g;\n\nexport function generateFormValidationMessage(\n message: string,\n variables: IValidationMessageVariables = {}\n) {\n return message.replace(RAILS_I18N_MESSAGE_REGEX, (m, $1) => variables[$1] || '');\n}\n","import {\n FormControlElement,\n IFormControlErrors,\n IFormControlValidationEvent,\n IFormFieldError,\n} from 'src/types';\n\nimport FormControlController from 'src/controllers/form_control_controller';\nimport i18n from 'src/lib/i18n';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { generateFormValidationMessage } from 'src/lib/util/form_validation_messages';\n\nimport BaseController from './base_controller';\n\nexport default abstract class FormFieldController extends BaseController {\n // Since this is an abstract class, and our classes are transpiled down to ES5,\n // we need to make sure these are explicitly hoisted by calling the following in the subclass:\n // public static targets = FormFieldController.targets;\n public static targets = ['container', 'helperText'];\n\n protected declare readonly containerTarget: HTMLDivElement;\n protected declare readonly hasContainerTarget: HTMLDivElement;\n protected declare readonly helperTextTarget: HTMLParagraphElement;\n protected declare readonly hasHelperTextTarget: boolean;\n\n // Override with the 'invalid' class name modifier for this form field.\n protected abstract get invalidClassName(): string;\n\n public handleControlValidatedEvent(evt: IFormControlValidationEvent) {\n const {\n target,\n detail: { errors, valid },\n } = evt;\n this.handleValidationResponse(target, valid, errors);\n }\n\n public validate() {\n // Ask the form control to carry out the validation.\n const fc = this.fieldControl;\n const { valid, errors: controlErrors } = fc.validate();\n\n // Convert the errors into human-readable and return.\n const errors = this.handleValidationResponse(fc.formControlElement, valid, controlErrors);\n return {\n errors,\n valid,\n };\n }\n\n public focusControl() {\n // Proxy through to field_control.\n this.fieldControl.focusControl();\n }\n\n public get disabled() {\n // Proxy through to field_control.\n // May need to override/augment on a case-by-case basis.\n return this.fieldControl.disabled;\n }\n\n protected set valid(isValid: boolean) {\n this.element.classList.toggle('cnf-form-field--invalid', !isValid);\n if (this.hasContainerTarget) {\n this.containerTarget.classList.toggle(this.invalidClassName, !isValid);\n }\n }\n\n protected generateErrorMessage(customMessageKey: string, defaultMessageKey: string, values = {}) {\n const rawMessage =\n this.data.get(customMessageKey) || this.generateDefaultMessage(defaultMessageKey);\n return generateFormValidationMessage(rawMessage, values);\n }\n\n private get fieldControl(): FormControlController {\n const fieldControl = this.getSpecificChildController(\n FormControlController\n );\n if (!fieldControl) {\n throw new Error(\n 'Could not find a form control child inside this form field. Please check the DOM structure.'\n );\n }\n return fieldControl;\n }\n\n private handleValidationResponse(\n fieldControlTarget: FormControlElement,\n isValid: boolean,\n errors: IFormControlErrors\n ) {\n this.valid = isValid;\n const parsedErrors = this.parseErrorMessages(errors);\n this.helperTextContent = parsedErrors.length > 0 ? parsedErrors[0].message : '';\n\n // Push out an event that a higher controller can respond to\n this.emitFormFieldValidatedEvent(fieldControlTarget, isValid, parsedErrors);\n\n return parsedErrors;\n }\n\n private set helperTextContent(content: string) {\n if (this.hasHelperTextTarget) {\n this.helperTextTarget.textContent = content;\n }\n }\n\n private parseErrorMessages(errors: IFormControlErrors): IFormFieldError[] {\n const errorResponse = [];\n if (errors.missingValue) {\n errorResponse.push({\n code: 'missingValue',\n message: this.generateErrorMessage('validationMessageRequired', 'blank'),\n });\n }\n if (errors.wrongLength === 'over') {\n errorResponse.push({\n code: 'lengthOver',\n message: this.generateErrorMessage('validationMessageLengthOver', 'invalid'),\n });\n }\n if (errors.wrongLength === 'under') {\n errorResponse.push({\n code: 'lengthUnder',\n message: this.generateErrorMessage('validationMessageLengthUnder', 'invalid'),\n });\n }\n if (errors.outOfRange === 'over') {\n errorResponse.push({\n code: 'rangeOver',\n message: this.generateErrorMessage('validationMessageRangeOver', 'invalid'),\n });\n }\n if (errors.outOfRange === 'under') {\n errorResponse.push({\n code: 'rangeUnder',\n message: this.generateErrorMessage('validationMessageRangeUnder', 'invalid'),\n });\n }\n // Pattern matching comes last.\n // Numerical values often have a pattern attribute to bring up the correct on-screen keyboard,\n // but in many cases we'd rather the (more specific) range message be displayed first.\n if (errors.patternMismatch) {\n errorResponse.push({\n code: 'patternMismatch',\n message: this.generateErrorMessage('validationMessagePatternMismatch', 'invalid'),\n });\n }\n if (errors.typeMismatch) {\n errorResponse.push({\n code: 'typeMismatch',\n message: this.generateErrorMessage('validationMessageTypeMismatch', 'invalid'),\n });\n }\n return errorResponse;\n }\n\n private generateDefaultMessage(key: string) {\n return `${this.label} ${i18n.errors.messages[key]}`;\n }\n\n private get label() {\n const label = this.data.get('label');\n if (!label) {\n throw new Error(`${this.identifier} should define a label attribute`);\n }\n return label;\n }\n\n private emitFormFieldValidatedEvent(\n target: FormControlElement,\n valid: boolean,\n errors: IFormFieldError[]\n ) {\n const evt = createCustomEvent('cnf-form-field:validated', {\n errors,\n valid,\n });\n target.dispatchEvent(evt);\n }\n}\n","import { AxiosResponse } from 'axios';\nimport MessageItemController from 'src/controllers/layouts/message_threads/message_item_controller';\nimport axios from 'src/lib/axios';\nimport BaseController from 'src/lib/controller/base_controller';\nimport parseDateTime from 'src/lib/util/parse_datetime_attr';\nimport { NotificationEvent } from 'src/types';\n\nexport default class DynamicMessagesController extends BaseController {\n public static targets = ['messages'];\n\n private declare readonly messagesTarget: HTMLElement;\n\n private messageControllers: MessageItemController[] = [];\n\n public onInitialize() {\n this.onConnect(() => {\n // Fix missing scroll in Mozilla\n if ('InstallTrigger' in window) {\n this.messagesTarget.style.minHeight = '0';\n }\n\n this.scrollToBottom();\n });\n\n this.onDisconnect(() => {\n this.messageControllers = [];\n });\n\n this.onChildControllerConnect((controller: BaseController) => {\n if (controller instanceof MessageItemController) {\n this.messageControllers.push(controller);\n this.removeAuthorsSeen();\n }\n });\n\n return super.onInitialize();\n }\n\n public load(e: CustomEvent): void {\n const {\n detail: { message },\n } = e as NotificationEvent;\n if (message.message_thread_uid === this.data.get('thread-uid')) {\n this.fetchMessage(message.uid, message.type, message.event_type);\n }\n }\n\n private fetchMessage(uid: string, type: string, eventType: string): void {\n axios\n .get(`/account/messages/messages/${uid}`)\n .then((response: AxiosResponse) => response.data)\n .then((html: string) => this.addMessage(html, type, eventType, uid))\n .catch((e: Error) => {\n alert(e.message);\n });\n }\n\n private addMessage = (html: string, type: string, eventType: string, uid: string) => {\n if (type === 'EventMessage' && eventType === 'messages_seen') {\n const previousSeen = this.messageControllers.find((controller: MessageItemController) => {\n return uid === controller.uid;\n });\n\n if (previousSeen) {\n this.removeItem(previousSeen);\n }\n }\n\n // Action Cable may not preserve order of new messages, restoring order\n const sentAt = parseDateTime(html);\n const beforeNode = this.firstItemSentAfter(sentAt);\n\n beforeNode\n ? beforeNode.scope.element.insertAdjacentHTML('beforebegin', html)\n : this.messagesTarget.insertAdjacentHTML('beforeend', html);\n\n this.scrollToBottom();\n };\n\n private scrollToBottom(): void {\n const listNode = this.element.children[0];\n listNode.scrollTop = listNode.scrollHeight;\n }\n\n // Time ago time entries:\n\n private firstItemSentAfter(sentAt: number): MessageItemController | undefined {\n return this.messageControllers.find(\n (controller: MessageItemController) => controller.sentAt > sentAt\n );\n }\n\n // Removes notification that last message was seen about it's author\n private removeAuthorsSeen(): void {\n const messageNodes = this.messageControllers.filter(\n (controller: MessageItemController) => controller.messageType === 'Message'\n );\n\n const lastMessageNode = messageNodes[messageNodes.length - 1];\n const technicalNodes = this.messageControllers.filter(\n (controller: MessageItemController) => controller.messageType === 'EventMessage'\n );\n\n if (!(lastMessageNode && technicalNodes)) {\n return;\n }\n\n const senderId = lastMessageNode.senderUid;\n\n for (const node of technicalNodes) {\n if (node.senderUid === senderId) {\n this.removeItem(node);\n }\n }\n }\n\n private removeItem(controller: MessageItemController) {\n const index = this.messageControllers.indexOf(controller);\n controller.scope.element.remove();\n this.messageControllers.splice(index, 1);\n }\n}\n","/**\n * Helpers for ordering notification items by sent_at attribute value.\n */\n\nexport default function parseDateTime(html: string): number {\n const sentAtRegex = /datetime=\"(.*)\"\\s/g;\n const match = sentAtRegex.exec(html);\n\n return match ? Number(match[1]) : 0;\n}\n","import ProductCategoryFilterController from 'src/controllers/shopping/product_category_filter_controller';\nimport BaseController from 'src/lib/controller/base_controller';\nimport {\n addParametersToQueryString,\n removeParameterFromQueryString,\n} from 'src/lib/util/add_parameter_to_url';\nimport { MDCSelectChangeEvent } from 'src/types';\nimport { ICategory } from 'src/types';\n\nexport default class ProductCategoryFiltersController extends BaseController {\n public items!: ICategory[];\n\n public onInitialize() {\n this.items = this.parseItems();\n return super.onInitialize();\n }\n\n public tier0Selected({ detail: { index } }: MDCSelectChangeEvent) {\n this.tierSelected(index, 0);\n }\n\n public tier1Selected({ detail: { index } }: MDCSelectChangeEvent) {\n this.tierSelected(index, 1);\n }\n\n public tier2Selected({ detail: { index } }: MDCSelectChangeEvent) {\n this.tierSelected(index, 2);\n }\n\n public tier3Selected({ detail: { index } }: MDCSelectChangeEvent) {\n this.tierSelected(index, 3);\n }\n\n public submit(e: Event) {\n e.preventDefault();\n const lastSelectedUid =\n this.selectedValues[this.selectedValues.length - 1] || this.data.get('rootSluggedId')!;\n\n if (lastSelectedUid !== this.currentUid) {\n const newPathname = window.location.pathname.replace(this.currentUid, lastSelectedUid);\n // Remove the paging parameters\n window.location.href =\n newPathname + '?' + removeParameterFromQueryString(window.location.search, 'page');\n }\n }\n\n public embeddedSubmit(e: Event) {\n e.preventDefault();\n\n const lastSelectedUid =\n this.selectedValues[this.selectedValues.length - 1] || this.data.get('rootSluggedId')!;\n\n if (lastSelectedUid !== this.currentUid) {\n const newPathname = '/marketplace/categories/' + lastSelectedUid;\n window.location.pathname = newPathname;\n }\n }\n\n public reorder({ detail: { value } }: MDCSelectChangeEvent) {\n if (value) {\n const params = { order_by: value };\n window.location.search = addParametersToQueryString(window.location.search, params);\n } else {\n window.location.search = removeParameterFromQueryString(window.location.search, 'order_by');\n }\n }\n\n private tierSelected(index: number, tier: number) {\n const newSelectedCategory = this.tierControllers[tier].items[index - 1];\n const nextTierControllers = this.tierControllers.slice(tier + 1);\n\n for (const tierController of nextTierControllers) {\n tierController.disabled = true;\n }\n\n if (index > 0 && newSelectedCategory) {\n console.log(nextTierControllers.length);\n if (tier < this.tierControllers.length && newSelectedCategory.c?.length) {\n // Set options for next input\n const nextTierController = this.tierControllers[tier + 1];\n nextTierController.options = newSelectedCategory.c;\n nextTierController.disabled = false;\n }\n }\n }\n\n private parseItems(): ICategory[] {\n const itemsStr = this.data.get('categories');\n\n if (itemsStr !== null) {\n return JSON.parse(itemsStr) as ICategory[];\n }\n\n return [] as ICategory[];\n }\n\n private get currentUid(): string {\n const categoryAndQuery = window.location.pathname.split('/').pop() || '';\n return categoryAndQuery.split('?').pop() || '';\n }\n\n private get selectedValues(): string[] {\n return this.tierControllers.map(tc => tc.value).filter(v => !!v);\n }\n\n private get tierControllers(): ProductCategoryFilterController[] {\n return this.getSpecificChildControllers(\n ProductCategoryFilterController\n ) as ProductCategoryFilterController[];\n }\n}\n","export function hideElement(element: Element) {\n setElementHidden(element, true);\n}\n\nexport function unhideElement(element: Element) {\n setElementHidden(element, false);\n}\n\nexport function setElementHidden(element: Element, hidden: boolean) {\n element.classList.toggle('cnf-hidden', hidden);\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { hideElement, setElementHidden, unhideElement } from 'src/lib/util/set_element_hidden';\nimport { setElementRequired } from 'src/lib/util/set_element_required';\n\nexport default class RegistrationStep1Controller extends BaseController {\n public static targets = [\n 'consumerChoices',\n 'consumerPropertyTypeOtherCheckbox',\n 'consumerPropertyTypeOtherTextFieldContainer',\n 'consumerPropertyTypeOtherTextField',\n ];\n\n // private declare readonly consumerChoicesTarget: HTMLDivElement;\n private declare readonly consumerPropertyTypeOtherCheckboxTarget: HTMLInputElement;\n private declare readonly consumerPropertyTypeOtherTextFieldContainerTarget: HTMLDivElement;\n private declare readonly consumerPropertyTypeOtherTextFieldTarget: HTMLInputElement;\n\n public onInitialize() {\n this.onConnect(() => {\n this.toggleConsumerPropertyTypeOtherTextFieldControl(\n this.consumerPropertyTypeOtherCheckboxTarget.checked\n );\n });\n\n return super.onInitialize();\n }\n\n public handleConsumerPropertyTypeOtherCheckboxToggle(evt: Event) {\n const { checked } = evt.target as HTMLInputElement;\n this.toggleConsumerPropertyTypeOtherTextFieldControl(checked);\n }\n\n private toggleConsumerPropertyTypeOtherTextFieldControl(reveal: boolean) {\n setElementHidden(this.consumerPropertyTypeOtherTextFieldContainerTarget, !reveal);\n setElementRequired(this.consumerPropertyTypeOtherTextFieldTarget, reveal);\n }\n}\n","export function setElementRequired(element: Element, required = false) {\n if (required) {\n element.setAttribute('required', '');\n } else {\n element.removeAttribute('required');\n }\n}\n","// Inspired heavily by https://github.com/cferdinandi/bouncer\nexport interface IValueRequiredAttributes {\n required: boolean;\n value: string;\n}\n\nexport interface ICheckableValueRequiredAttributes {\n required: boolean;\n checked: boolean;\n}\n\nexport interface IPatternMismatchAttributes {\n pattern: string | null;\n type: string;\n value: string;\n}\n\nexport interface IOutOfRangeAttributes {\n min: string | null;\n max: string | null;\n lt: string | null;\n gt: string | null;\n value: string;\n}\n\nexport interface IWrongLengthAttributes {\n min: string | null;\n max: string | null;\n value: string;\n}\n\nexport interface ITypeMismatchAttributes {\n type: string | null;\n value: string;\n}\n\ninterface IPatternType {\n [key: string]: RegExp;\n}\ntype RangeResponseType = false | 'over' | 'under';\n\nconst PATTERNS: IPatternType = {\n color: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,\n date: /(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))/,\n email: /^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c[\\x00-\\x7f])*\\x5d))*(\\.\\w{2,})+$/,\n month: /^(?:(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])))$/,\n number: /^(?:[-+]?[0-9]*[.,]?[0-9]+)$/,\n time: /^(?:(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]))$/,\n url: /^(?:(?:https?|HTTPS?|ftp|FTP):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/,\n};\n\nexport function missingValue(attrs: IValueRequiredAttributes): boolean {\n return attrs.required && !attrs.value.length;\n}\n\nexport function missingCheckboxValue(attrs: ICheckableValueRequiredAttributes): boolean {\n return attrs.required && !attrs.checked;\n}\n\nexport function missingRadioValue(attrs: ICheckableValueRequiredAttributes[]): boolean {\n // Any is required && none are checked\n return attrs.some(attr => attr.required) && attrs.every(attr => !attr.checked);\n}\n\nexport function patternMismatch(attrs: IPatternMismatchAttributes): boolean {\n const { pattern, type, value } = attrs;\n\n // Make sure field has value\n if (!value) {\n return false;\n }\n\n // TODO since we are dynamically creating a regex, there's a possibility this could cause a Regex DOS.\n // We could alleviate this through a package such as https://github.com/davisjam/safe-regex\n // Not including at present as currently we are in charge of the field pattern passed in\n // (it will most likely be the value from `pattern=\"\"` on a HTML element)\n const chosenPattern = pattern ? new RegExp('^(?:' + pattern + ')$') : PATTERNS[type];\n if (!chosenPattern) {\n return false;\n }\n\n return !value.match(chosenPattern);\n}\nexport function outOfRange(attrs: IOutOfRangeAttributes): RangeResponseType {\n const { max, min, gt, lt, value } = attrs;\n\n // Make sure field has value\n if (!value) {\n return false;\n }\n\n // Check validity\n const num = parseFloat(value);\n\n // Check that the value is not less than or equal to the gt\n if (gt !== null && num <= parseFloat(gt)) {\n return 'under';\n }\n // Check that value is not greater than or equal to the lt\n if (lt !== null && num >= parseFloat(lt)) {\n return 'over';\n }\n // Check that the value is not less than the min\n if (gt === null && min !== null && num < parseFloat(min)) {\n return 'under';\n }\n // Check that value is not greater than the max\n if (lt === null && max !== null && num > parseFloat(max)) {\n return 'over';\n }\n return false;\n}\n\nexport function wrongLength(attrs: IWrongLengthAttributes): RangeResponseType {\n const { max, min, value } = attrs;\n\n // Make sure field has value\n if (!value) {\n return false;\n }\n\n // Check validity\n const { length } = value;\n if (max !== null && length > parseFloat(max)) {\n return 'over';\n }\n if (min !== null && length < parseFloat(min)) {\n return 'under';\n }\n return false;\n}\n\nexport function typeMismatch(attrs: ITypeMismatchAttributes): boolean {\n const { type, value } = attrs;\n\n // Make sure field has value\n if (!value) {\n return false;\n }\n\n // Check for the type\n switch (type) {\n case 'number': {\n // Mismatch if we can't parse it as a float\n const parsed = parseFloat(value);\n return Number.isNaN(parsed);\n }\n case 'boolean': {\n // Mismatch if the value isn't 'true' or 'false'\n const normalised = value.toLowerCase().trim();\n return normalised !== 'true' && normalised !== 'false';\n }\n default:\n // Never a mismatch\n return false;\n }\n}\n","import { FormControlElement, IFormControlErrors, IFormControlValidationResponse } from 'src/types';\n\nimport BaseController from 'src/lib/controller/base_controller';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport {\n missingCheckboxValue,\n missingRadioValue,\n missingValue,\n outOfRange,\n patternMismatch,\n typeMismatch,\n wrongLength,\n} from 'src/lib/util/form_validators';\n\nconst NO_ERRORS: IFormControlErrors = {\n missingValue: false,\n outOfRange: false,\n patternMismatch: false,\n typeMismatch: false,\n wrongLength: false,\n};\n\nexport default class FormControlController extends BaseController {\n // TODO state management in stimulus should be in the DOM\n private listening: boolean = false;\n private touched: boolean = false;\n\n public onInitialize() {\n this.onDisconnect(() => {\n this.autoValidation = false;\n });\n return super.onInitialize();\n }\n\n public set autoValidation(shouldAutoValidate: boolean) {\n // By default, a form control will not validate itself on input/blur.\n // This is an opt-in arrangement by calling this setter.\n // Typically this is done by a parent form controller so that\n // form controls are only validated when they are part of a form.\n if (shouldAutoValidate) {\n this.setupEventListeners();\n } else {\n this.teardownEventListeners();\n }\n }\n\n public validate() {\n const errors = this.validationErrors;\n const valid = Object.values(errors).every(e => e === false);\n\n if (!valid) {\n this.formControlElement.setCustomValidity('invalid');\n }\n\n this.touched = true;\n this.emitValidationEvent({ errors, valid });\n\n return { errors, valid };\n }\n\n public focusControl() {\n const el = this.formControlElement;\n el.focus();\n }\n\n public get formControlElement() {\n return this.element as FormControlElement;\n }\n\n public get disabled() {\n return this.element.hasAttribute('disabled');\n }\n\n private get validationErrors(): IFormControlErrors {\n if (this.disabled) {\n // If the form field is disabled, it won't be sent to the server.\n // So, let's not validate it.\n return { ...NO_ERRORS };\n }\n\n // Validations TODO: (http://parsleyjs.org/doc/index.html#validators)\n // - check / mincheck / maxcheck (e.g. at least 2 checkboxes)\n // - equalto (another control, e.g. confirm password)\n return {\n missingValue: this.missingValueError,\n outOfRange: this.outOfRangeError,\n patternMismatch: this.patternMismatchError,\n typeMismatch: this.typeMismatchError,\n wrongLength: this.wrongLengthError,\n };\n }\n\n private emitValidationEvent({ errors, valid }: IFormControlValidationResponse) {\n const evt = createCustomEvent('cnf-form-control:validated', {\n errors,\n valid,\n });\n this.element.dispatchEvent(evt);\n }\n\n private setupEventListeners() {\n if (this.listening) {\n // Don't want to set these up again!\n return;\n }\n\n this.element.addEventListener('input', this.handleInputEvent);\n this.element.addEventListener('focus', this.handleFocusEvent);\n this.element.addEventListener('blur', this.handleBlurEvent);\n this.listening = true;\n }\n\n private teardownEventListeners() {\n if (!this.listening) {\n // Nothing to do.\n return;\n }\n\n this.element.removeEventListener('input', this.handleInputEvent);\n this.element.removeEventListener('blur', this.handleBlurEvent);\n this.listening = false;\n }\n\n private handleInputEvent = () => {\n if (this.touched) {\n this.validate();\n }\n };\n\n private handleFocusEvent = () => {\n if (this.formControlElement.value) {\n this.touched = true;\n }\n };\n\n private handleBlurEvent = () => {\n this.validate();\n };\n\n private get missingValueError() {\n const el = this.formControlElement;\n switch (el.type) {\n case 'radio': {\n const inputGroup = Array.from(document.getElementsByTagName('input'));\n const radioGroup = inputGroup.filter(\n input => input.getAttribute('name') === el.getAttribute('name')\n );\n const radioAttributes = radioGroup.map(this.mapCheckableAttributes);\n return missingRadioValue(radioAttributes);\n }\n case 'checkbox': {\n const checkboxAttributes = this.mapCheckableAttributes(el as HTMLInputElement);\n return missingCheckboxValue(checkboxAttributes);\n }\n default:\n return missingValue({\n required: el.hasAttribute('required'),\n value: el.value,\n });\n }\n }\n\n private get outOfRangeError() {\n const el = this.formControlElement;\n const attributes = {\n gt: this.data.get('validate-gt'),\n lt: this.data.get('validate-lt'),\n max: el.getAttribute('max'),\n min: el.getAttribute('min'),\n value: el.value,\n };\n return outOfRange(attributes);\n }\n\n private get patternMismatchError() {\n const el = this.formControlElement;\n const attributes = {\n pattern: el.getAttribute('pattern'),\n type: el.type,\n value: el.value,\n };\n return patternMismatch(attributes);\n }\n\n private get wrongLengthError() {\n const el = this.formControlElement;\n const attributes = {\n max: el.getAttribute('maxlength'),\n min: el.getAttribute('minlength'),\n value: el.value,\n };\n return wrongLength(attributes);\n }\n\n private get typeMismatchError() {\n const el = this.formControlElement;\n const attributes = {\n type: this.data.get('validate-type'),\n value: el.value,\n };\n return typeMismatch(attributes);\n }\n\n private mapCheckableAttributes(field: HTMLInputElement) {\n return {\n checked: field.checked,\n required: field.hasAttribute('required'),\n };\n }\n}\n","import axios from 'axios';\n\nconst csrfMetaTag = document.head.querySelector('[name=\"csrf-token\"]');\nconst csrfToken = (csrfMetaTag && csrfMetaTag.getAttribute('content')) || '';\n\nexport default axios.create({\n headers: {\n common: {\n 'X-CSRF-TOKEN': csrfToken,\n },\n },\n});\n","import BaseController from 'src/lib/controller/base_controller';\n\nexport default class InputFinalDetailsConfirmationController extends BaseController {\n public static targets = ['checkbox', 'submit'];\n\n private declare readonly submitTarget: HTMLButtonElement;\n private declare readonly checkboxTarget: HTMLInputElement;\n\n public handleConfirmationChanges() {\n this.submitTarget.disabled = !this.checkboxTarget.checked;\n }\n}\n","import BaseController from 'src/lib/controller/base_controller';\n\nconst BASE_CLASSNAME = 'cnf-drawer__sub-menu';\n\nexport default class DrawerSubMenuController extends BaseController {\n public toggleAccordion() {\n for (const d of document.getElementsByClassName(BASE_CLASSNAME)) {\n if (d != this.element) {\n d.classList.remove(`${BASE_CLASSNAME}--active`);\n }\n }\n this.element.classList.toggle(`${BASE_CLASSNAME}--active`);\n }\n}\n","var map = {\n\t\"./activity/list_item_controller.ts\": \"GgPu\",\n\t\"./base/button_controller.ts\": \"PhSj\",\n\t\"./base/button_toast_dismiss_controller.ts\": \"xMTQ\",\n\t\"./base/carousel_controller.ts\": \"JicM\",\n\t\"./base/click_to_copy_controller.ts\": \"iXLy\",\n\t\"./base/data_filter_form_controller.ts\": \"KT5s\",\n\t\"./base/dialog_controller.ts\": \"L0F5\",\n\t\"./base/dialog_manager_controller.ts\": \"Ixlw\",\n\t\"./base/drawer_controller.ts\": \"qHwe\",\n\t\"./base/drawer_sub_menu_controller.ts\": \"wtMk\",\n\t\"./base/dropdown_controller.ts\": \"7uNO\",\n\t\"./base/flash_controller.ts\": \"QjNd\",\n\t\"./base/notifications_controller.ts\": \"e7J+\",\n\t\"./base/notifications_emitter_controller.ts\": \"pz/x\",\n\t\"./base/pagination_controller.ts\": \"brCN\",\n\t\"./base/snackbar_controller.ts\": \"Dy2L\",\n\t\"./base/table/cell_controller.ts\": \"jVaU\",\n\t\"./base/table/header_cell_controller.ts\": \"kLII\",\n\t\"./base/table/row_controller.ts\": \"fubN\",\n\t\"./base/table_controller.ts\": \"cO/V\",\n\t\"./base/timeago_controller.ts\": \"3DLR\",\n\t\"./base/toaster_controller.ts\": \"HTI9\",\n\t\"./base/top_app_bar_controller.ts\": \"JVS8\",\n\t\"./entities/entity_form_controller.ts\": \"XpCF\",\n\t\"./entities/entity_user_form_controller.ts\": \"+GVN\",\n\t\"./form_control_controller.ts\": \"wCaq\",\n\t\"./form_controller.ts\": \"rFBg\",\n\t\"./forms/button_radio_group_controller.ts\": \"+hn/\",\n\t\"./forms/checkbox_collection_controller.ts\": \"1vq7\",\n\t\"./forms/checkbox_controller.ts\": \"k0Wf\",\n\t\"./forms/radio_controller.ts\": \"R9wh\",\n\t\"./forms/select_controller.ts\": \"B3M+\",\n\t\"./forms/switch_controller.ts\": \"zkUa\",\n\t\"./forms/text_area_controller.ts\": \"GiiL\",\n\t\"./forms/text_field_controller.ts\": \"OxFB\",\n\t\"./forms/toggle_card_controller.ts\": \"dc8s\",\n\t\"./layouts/message_threads/assignee_controller.ts\": \"tUn1\",\n\t\"./layouts/message_threads/dynamic_messages_controller.ts\": \"uCgc\",\n\t\"./layouts/message_threads/message_item_controller.ts\": \"/IwV\",\n\t\"./layouts/message_threads/select_toggle_controller.ts\": \"n2gU\",\n\t\"./layouts/message_threads/unread_item_controller.ts\": \"83Dz\",\n\t\"./layouts/message_threads/unread_messages_controller.ts\": \"pSzq\",\n\t\"./layouts/navigable_controller.ts\": \"F+vx\",\n\t\"./layouts/registration/step1_controller.ts\": \"vqG9\",\n\t\"./locations/map_controller.ts\": \"6JbG\",\n\t\"./navigation/cart_menu_item_controller.ts\": \"3jXA\",\n\t\"./patterns/dialog_examples_controller.ts\": \"Q8bg\",\n\t\"./patterns/flash_examples_controller.ts\": \"KOUH\",\n\t\"./patterns/form_examples/error_locations_controller.ts\": \"0WBE\",\n\t\"./patterns/form_examples/flash_controller.ts\": \"+rlf\",\n\t\"./patterns/refresh_popup_controller.ts\": \"By9p\",\n\t\"./patterns/toaster_examples_controller.ts\": \"znUL\",\n\t\"./platform_admin/catalog_management/price_edit_controller.ts\": \"z5Jt\",\n\t\"./platform_admin/order_management/breakdown_form_controller.ts\": \"44jU\",\n\t\"./platform_admin/order_management/breakdown_remove_item_controller.ts\": \"BPA9\",\n\t\"./platform_admin/order_management/input_final_details_confirmation_controller.ts\": \"woUB\",\n\t\"./shopping/carts/cart_item_controller.ts\": \"jCJI\",\n\t\"./shopping/delivery_cut_off_pill_controller.ts\": \"jtf6\",\n\t\"./shopping/delivery_date_calendar_controller.ts\": \"7inA\",\n\t\"./shopping/delivery_date_select_controller.ts\": \"Cu8P\",\n\t\"./shopping/product_category_filter_controller.ts\": \"3X8Q\",\n\t\"./shopping/product_category_filters_controller.ts\": \"vmrt\",\n\t\"./shopping/product_lightbox_controller.ts\": \"iTY3\",\n\t\"./shopping/product_navigation_controller.ts\": \"gptF\",\n\t\"./shopping/product_navigation_tier_controller.ts\": \"nS0L\",\n\t\"./shopping/purchase_configurator/add_note_controller.ts\": \"cZWq\",\n\t\"./shopping/purchase_configurator/extra_info_controller.ts\": \"y5SM\",\n\t\"./shopping/purchase_configurator/purchase_configurator_variant_controller.ts\": \"8AeY\",\n\t\"./shopping/purchase_configurator/quantity_calculator_controller.ts\": \"9KhN\",\n\t\"./shopping/purchase_configurator/uom_pricing_details_controller.ts\": \"hqoG\",\n\t\"./shopping/purchase_configurator_controller.ts\": \"PG3t\",\n\t\"./shopping/serviceability_dropdown_controller.ts\": \"WlX/\",\n\t\"./shopping/sidebar_filters_controller.ts\": \"oIUy\",\n\t\"./util/lineclamp_controller.ts\": \"ELt5\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"xLpA\";","import BaseController from 'src/lib/controller/base_controller';\nimport { dismissSingleToast } from 'src/lib/overlay/toast';\n\nexport default class ButtonToastDismiss extends BaseController {\n public handleButtonClick() {\n const toastId = this.getRequiredDataAttr('toastId');\n dismissSingleToast({ id: toastId });\n }\n}\n","import PurchaseConfiguratorVariantController from 'src/controllers/shopping/purchase_configurator/purchase_configurator_variant_controller';\nimport { calculateExtraInfoAmountForDisplay } from 'src/helpers/shopping/purchase_configurator_helper';\nimport i18n from 'src/lib/i18n';\n\ninterface IDataAttributes {\n multiplier: string | number;\n sizeExcludedFromCalculation?: boolean;\n sizeCalculationPerformDivision?: boolean;\n}\n\ninterface IUpdateValueOptions {\n quantity: string;\n quantityType: string;\n size?: string;\n fallbackDisplay: string;\n}\n\nabstract class BasePurchaseConfiguratorExtraInfoController extends PurchaseConfiguratorVariantController {\n public readonly valueTarget!: HTMLSpanElement;\n}\n\nexport default class PurchaseConfiguratorExtraInfoController extends (PurchaseConfiguratorVariantController as typeof BasePurchaseConfiguratorExtraInfoController) {\n public static targets = ['value'];\n\n public updateValue({ quantity, quantityType, size, fallbackDisplay }: IUpdateValueOptions) {\n let valueDisplay = null;\n\n try {\n const {\n multiplier,\n sizeExcludedFromCalculation,\n sizeCalculationPerformDivision,\n } = this.getRequiredDataAttrAsJSON('data');\n valueDisplay = calculateExtraInfoAmountForDisplay({\n locale: i18n.locale,\n multiplier,\n quantity,\n quantityType,\n size,\n sizeCalculationPerformDivision,\n sizeExcludedFromCalculation,\n });\n } catch (e) {\n // Ru-roh, something's gone wrong when parsing the attributes\n // TODO handle this error: show the user somehow?\n console.warn(e);\n }\n\n // Set the value, or the fallback\n this.value = valueDisplay !== null ? valueDisplay : fallbackDisplay;\n }\n\n private set value(val: string) {\n this.valueTarget.textContent = val;\n }\n}\n","module.exports = __webpack_public_path__ + \"media/assets/images/iconmonstr-candy-6-5fbc1931c549aec2030bd8da499036b4.svg\";","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/delivery-c6fa78127844a06314f05e16bc72db38.svg\";","module.exports = __webpack_public_path__ + \"media/assets/images/shopping/question-mark-bc561791204497a9cc99ff1a33eb6e5e.svg\";","import BaseController from 'src/lib/controller/base_controller';\nimport { showDialog } from 'src/lib/overlay/dialog.ts';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\n\nexport default class PriceEditController extends BaseController {\n public handleButtonClick(evt: Event) {\n // Stop propagation: prevent any clicks leaking out\n evt.preventDefault();\n evt.stopPropagation();\n\n // Show the dialog\n const [contentHref, placeholder] = this.getRequiredDataAttrs('contentHref', 'placeholder');\n showDialog({\n contentHref,\n placeholder: markAsSafeHTML(placeholder),\n });\n }\n}\n","import { MDCFormField } from '@material/form-field/index';\nimport { MDCSwitch } from '@material/switch/index';\n\nimport FormFieldController from 'src/lib/controller/form_field_controller';\nimport { showDialog } from 'src/lib/overlay/dialog.ts';\nimport { createCustomEvent } from 'src/lib/util/create_custom_event';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\nimport { DialogLifecycleEvent } from 'src/types';\n\nexport default class SwitchController extends FormFieldController {\n public static targets = FormFieldController.targets;\n\n private mdcSwitch?: MDCSwitch;\n\n public onInitialize() {\n this.onConnect(() => {\n const mdcSwitch = new MDCSwitch(this.containerTarget);\n const formField = new MDCFormField(this.element);\n\n if (this.data.has('ripple')) {\n formField.input = mdcSwitch;\n }\n\n this.mdcSwitch = mdcSwitch;\n\n return () => {\n formField.destroy();\n mdcSwitch.destroy();\n this.mdcSwitch = undefined;\n };\n });\n\n return super.onInitialize();\n }\n\n public handleChange() {\n if (this.data.has('submitOnChange')) {\n if (!this.data.has('confirmOnSubmit')) {\n // We can submit this right away.\n this.submitForm();\n return;\n }\n\n // Check if the form is valid - if it is, pop open a confirmation dialog.\n const validateEvt = createCustomEvent('cnf:form-validate', {\n onValidated: this.handleFormValidatedBeforeConfirm,\n });\n this.element.dispatchEvent(validateEvt);\n }\n }\n\n protected get invalidClassName() {\n return 'mdc-switch--invalid';\n }\n\n private handleFormValidatedBeforeConfirm = (isFormValid: boolean) => {\n if (isFormValid) {\n // Show the confirmation dialog, using the text sent in via data attributes.\n const confirmMessage = this.data.get('confirmOnSubmit');\n\n // TODO i18n\n const confirmAction = this.data.get('confirmOnSubmitYes') || 'Confirm';\n const cancelAction = this.data.get('confirmOnSubmitNo') || 'Cancel';\n\n showDialog({\n actions: [\n {\n action: 'cancel',\n title: cancelAction,\n },\n {\n action: 'confirm',\n title: confirmAction,\n },\n ],\n content: markAsSafeHTML(confirmMessage!),\n defaultAction: 'cancel',\n onClosing: this.handleDialogClosing,\n });\n } else {\n this.toggleSwitch();\n }\n };\n\n private handleDialogClosing = ({ detail: { closeReason } }: DialogLifecycleEvent) => {\n if (closeReason === 'confirm') {\n // Submit the form.\n this.submitForm();\n } else {\n // Go back to previous state\n this.toggleSwitch();\n }\n };\n\n private submitForm = () => {\n // Ask the parent controller to submit the form.\n const evt = createCustomEvent('cnf:form-submit', {\n onSubmissionPrevented: this.toggleSwitch,\n });\n this.element.dispatchEvent(evt);\n };\n\n private toggleSwitch = () => {\n this.mdcSwitch!.checked = !this.mdcSwitch!.checked;\n };\n}\n","import BaseController from 'src/lib/controller/base_controller';\nimport { dismissAllToasts, dismissSingleToast, showToast } from 'src/lib/overlay/toast';\nimport { markAsSafeHTML } from 'src/lib/util/safe_html';\n\nconst complexToastHTML = `\n
    \n

    Title

    \n

    This is a toast with HTML content.

    \n
    \n`;\n\nexport default class ToastExamplesController extends BaseController {\n public showSimpleToast() {\n showToast({\n content: markAsSafeHTML('Here is a simple toast notification message.'),\n });\n }\n\n public showHtmlToast() {\n showToast({\n content: markAsSafeHTML(complexToastHTML),\n });\n }\n\n public showCustomTimeToast() {\n showToast({\n content: markAsSafeHTML('This toast will hide after 1500 ms.'),\n timeout: 15000,\n });\n }\n\n public showInifiniteToast() {\n showToast({\n content: markAsSafeHTML('This toast will be here forever (until dismissed).'),\n timeout: Infinity,\n });\n }\n public showRemoteToast() {\n showToast({\n contentHref: '/design-system/test_toast',\n timeout: Infinity,\n });\n }\n\n public dismissAllToasts() {\n dismissAllToasts();\n }\n}\n"],"sourceRoot":""}