PageSourceSearch

https://www.sensegarn.no/theme/585b2d0b90d52983255f1c4de6ae885f/js…/flow-yarn-recipe-creator.js?1790942145

js sensegarn.no collected 2026-10-05 00:57:16 UTC 13,787 bytes, 8 lines download raw bytes

1(()=>{"use strict";var e={156:e=>{var t=function(e){var t;return!!e&&"object"==typeof e&&"[object RegExp]"!==(t=Object.prototype.toString.call(e))&&"[object Date]"!==t&&e.$$typeof!==r},r="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function i(e,t){return!1!==t.clone&&t.isMergeableObject(e)?o(Array.isArray(e)?[]:{},e,t):e}function a(e,t,r){return e.concat(t).map(function(e){return i(e,r)})}function n(e){return Object.keys(e).concat(Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter(function(t){return Object.propertyIsEnumerable.call(e,t)}):[])}function s(e,t){try{return t in e}catch(e){return!1}}function o(e,r,l){(l=l||{}).arrayMerge=l.arrayMerge||a,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=i;var c,u,h=Array.isArray(r);return h!==Array.isArray(e)?i(r,l):h?l.arrayMerge(e,r,l):(u={},(c=l).isMergeableObject(e)&&n(e).forEach(function(t){u[t]=i(e[t],c)}),n(r).forEach(function(t){(!s(e,t)||Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))&&(s(e,t)&&c.isMergeableObject(r[t])?u[t]=(function(e,t){if(!t.customMerge)return o;var r=t.customMerge(e);return"function"==typeof r?r:o})(t,c)(e[t],r[t],c):u[t]=i(r[t],c))}),u)}o.all=function(e,t){if(!Array.isArray(e))throw Error("first argument should be an array");return e.reduce(function(e,r){return o(e,r,t)},{})},e.exports=o}},t={};function r(i){var a=t[i];if(void 0!==a)return a.exports;var n=t[i]={exports:{}};return e[i](n,n.exports,r),n.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var i=r(156),a=r.n(i);class n{static ucFirst(e){return e.charAt(0).toUpperCase()+e.slice(1)}static lcFirst(e){return e.charAt(0).toLowerCase()+e.slice(1)}static toDashCase(e){return e.replace(/([A-Z])/g,"-$1").replace(/^-/,"").toLowerCase()}static toLowerCamelCase(e,t){let r=n.toUpperCamelCase(e,t);return n.lcFirst(r)}static toUpperCamelCase(e,t){return t?e.split(t).map(e=>n.ucFirst(e.toLowerCase())).join(""):n.ucFirst(e.toLowerCase())}static parsePrimitive(e){try{return/^\d+(.|,)\d+$/.test(e)&&(e=e.replace(",",".")),JSON.parse(e)}catch(t){return e.toString()}}}class s{constructor(e=document){this._el=e,e.$emitter=this,this._listeners=[]}publish(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=new CustomEvent(e,{detail:t,cancelable:r});return this.el.dispatchEvent(i),i}subscribe(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=this,a=e.split("."),n=r.scope?t.bind(r.scope):t;if(r.once&&!0===r.once){let t=n;n=function(r){i.unsubscribe(e),t(r)}}return this.el.addEventListener(a[0],n),this.listeners.push({splitEventName:a,opts:r,cb:n}),!0}unsubscribe(e){let t=e.split(".");return this.listeners=this.listeners.reduce((e,r)=>([...r.splitEventName].sort().toString()===t.sort().toString()?this.el.removeEventListener(r.splitEventName[0],r.cb):e.push(r),e),[]),!0}reset(){return this.listeners.forEach(e=>{this.el.removeEventListener(e.splitEventName[0],e.cb)}),this.listeners=[],!0}get el(){return this._el}set el(e){this._el=e}get listeners(){return this._listeners}set listeners(e){this._listeners=e}}class o{constructor(e,t={},r=!1){if(!(e instanceof Node)){console.warn(`There is no valid element given while trying to create a plugin instance for "${r}".`);return}this.el=e,this.$emitter=new s(this.el),this._pluginName=this._getPluginName(r),this.options=this._mergeOptions(t),this._initialized=!1,this._registerInstance(),this._init()}init(){console.warn(`The "init" method for the plugin "${this._pluginName}" is not defined. The plugin will not be initialized.`)}update(){}_init(){this._initialized||(this.init(),this._initialized=!0)}_update(){this._initialized&&this.update()}_mergeOptions(e){let t=[this.constructor.options,this.options,e];return t.push(this._getConfigFromDataAttribute()),t.push(this._getOptionsFromDataAttribute()),a().all(t.filter(e=>e instanceof Object&&!(e instanceof Array)).map(e=>e||{}))}_getConfigFromDataAttribute(){let e={};if("function"!=typeof this.el.getAttribute)return e;let t=n.toDashCase(this._pluginName),r=this.el.getAttribute(`data-${t}-config`);return r?window.PluginConfigManager.get(this._pluginName,r):e}_getOptionsFromDataAttribute(){let e={};if("function"!=typeof this.el.getAttribute)return e;let t=n.toDashCase(this._pluginName),r=this.el.getAttribute(`data-${t}-options`);if(r)try{return JSON.parse(r)}catch(e){console.error(`The data attribute "data-${t}-options" could not be parsed to json: ${e.message}`)}return e}_registerInstance(){window.PluginManager.getPluginInstancesFromElement(this.el).set(this._pluginName,this),window.PluginManager.getPlugin(this._pluginName,!1).get("instances").push(this)}_getPluginName(e){return e||(e=this.constructor.name),e}}class l{static isNode(e){return"object"==typeof e&&null!==e&&(e===document||e===window||e instanceof Node)}static hasAttribute(e,t){if(!l.isNode(e))throw Error("The element must be a valid HTML Node!");return"function"==typeof e.hasAttribute&&e.hasAttribute(t)}static getAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!1===l.hasAttribute(e,t))throw Error(`The required property "${t}" does not exist!`);
1if("function"!=typeof e.getAttribute){if(r)throw Error("This node doesn't support the getAttribute function!");return}return e.getAttribute(t)}static getDataAttribute(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2],i=t.replace(/^data(|-)/,""),a=n.toLowerCamelCase(i,"-");if(!l.isNode(e)){if(r)throw Error("The passed node is not a valid HTML Node!");return}if(void 0===e.dataset){if(r)throw Error("This node doesn't support the dataset attribute!");return}let s=e.dataset[a];if(void 0===s){if(r)throw Error(`The required data attribute "${t}" does not exist on ${e}!`);return s}return n.parsePrimitive(s)}static querySelector(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!l.isNode(e))throw Error("The parent node is not a valid HTML Node!");let i=e.querySelector(t)||!1;if(r&&!1===i)throw Error(`The required element "${t}" does not exist in parent node!`);return i}static querySelectorAll(e,t){let r=!(arguments.length>2)||void 0===arguments[2]||arguments[2];if(r&&!l.isNode(e))throw Error("The parent node is not a valid HTML Node!");let i=e.querySelectorAll(t);if(0===i.length&&(i=!1),r&&!1===i)throw Error(`At least one item of "${t}" must exist in parent node!`);return i}static getFocusableElements(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.body,t=`
2            input:not([tabindex^="-"]):not([disabled]):not([type="hidden"]),
3            select:not([tabindex^="-"]):not([disabled]),
4            textarea:not([tabindex^="-"]):not([disabled]),
5            button:not([tabindex^="-"]):not([disabled]),
6            a[href]:not([tabindex^="-"]):not([disabled]),
7            [tabindex]:not([tabindex^="-"]):not([disabled])
8        `;return e.querySelectorAll(t)}static getFirstFocusableElement(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.body;return this.getFocusableElements(e)[0]}static getLastFocusableElement(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,t=this.getFocusableElements(e);return t[t.length-1]}}window.PluginManager.register("FlowYarnRecipeCreator",class extends o{init(){this.sizeSelect=l.querySelector(this.el,".size-select"),this.variants=l.querySelectorAll(this.el,".yarn-variant"),this.totalPriceElement=l.querySelector(this.el,".total-price-value"),this.recipeQtySelector=l.querySelector(this.el,".recipe-qty-selector"),this.recipeTotalPriceElement=l.querySelector(this.el,".recipe-total-price"),this.unavailableMessage=l.querySelector(this.el,".yarn-unavailable-message",!1),this.physicalPrintCheckbox=document.querySelector(".flow-physical-print-checkbox"),this.buyButton=this.findBuyButton(),this.registerEventListeners(),this.updateTotalPrice(),this.updateBuyButtonState()}findBuyButton(){let e=this.el.closest("form");return e?l.querySelector(e,".btn-buy",!1):null}checkYarnAvailability(){let e=l.querySelectorAll(this.el,".yarn-current",!1);if(!e)return!0;for(let t of e)if("false"===t.dataset.available)return!1;return!0}updateBuyButtonState(){let e=this.checkYarnAvailability();this.buyButton&&(this.buyButton.disabled=!e),this.unavailableMessage&&(e?this.unavailableMessage.classList.add("d-none"):this.unavailableMessage.classList.remove("d-none"))}registerEventListeners(){if(this.sizeSelect&&this.sizeSelect.addEventListener("change",this.onSizeSelectChange.bind(this)),this.registerQtySelectors(),this.registerVariantChangeClick(),this.registerAlternativeChangeClick(),this.recipeQtySelector){let e=l.querySelector(this.recipeQtySelector,".js-btn-minus"),t=l.querySelector(this.recipeQtySelector,".product-detail-quantity-input"),r=l.querySelector(this.recipeQtySelector,".js-btn-plus");t&&(t.addEventListener("keydown",e=>this.handleKeyDown(e,t)),t.addEventListener("change",e=>{this.updateRecipeTotalPrice(t),this.updateTotalPrice()})),r&&r.addEventListener("click",()=>{this.changeQuantity(t,"stepUp"),this.updateRecipeTotalPrice(t),this.updateTotalPrice()}),e&&e.addEventListener("click",()=>{this.changeQuantity(t,"stepDown"),this.updateRecipeTotalPrice(t),this.updateTotalPrice()})}this.physicalPrintCheckbox&&this.physicalPrintCheckbox.addEventListener("change",()=>{this.updateTotalPrice()})}
8registerVariantChangeClick(){this.variants.forEach(e=>{let t=l.querySelectorAll(e,".js-variant-change-button",!1);t&&t.forEach(t=>{t.addEventListener("click",this.onVariantChangeButtonClick.bind(this,t,e))})})}onVariantChangeButtonClick(e,t){let r=e.dataset.id,i=l.querySelector(t,".js-quantity-selector",!1),a=i?i.value:e.dataset.qty;fetch(`/flow/yarn/${r}/${a}`).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.text()}).then(r=>{let i=new DOMParser().parseFromString(r,"text/html").querySelector(".yarn-current"),a=l.querySelector(t,".yarn-current");a&&i&&(a.innerHTML=i.innerHTML,a.dataset.available=i.dataset.available),l.querySelector(t,".yarn-variation.selected",!1)?.classList.remove("selected"),e.classList.add("selected"),this.registerQtySelectors(),this.updateTotalPrice(),this.updateBuyButtonState()}).catch(e=>{console.error("Error fetching yarn-current:",e)})}registerQtySelectors(){let e=l.querySelectorAll(this.el,".yarn-qty-selectors",!1);e&&e.forEach(e=>{let t=l.querySelector(e,".js-btn-minus"),r=l.querySelector(e,".product-detail-quantity-input"),i=l.querySelector(e,".js-btn-plus");r&&(r.addEventListener("keydown",e=>this.handleKeyDown(e,r)),r.addEventListener("change",e=>{this.updateYarnTotalPrice(r),this.updateTotalPrice()})),i&&i.addEventListener("click",()=>{this.changeQuantity(r,"stepUp"),this.updateYarnTotalPrice(r),this.updateTotalPrice()}),t&&t.addEventListener("click",()=>{this.changeQuantity(r,"stepDown"),this.updateYarnTotalPrice(r),this.updateTotalPrice()})})}handleKeyDown(e,t){"Enter"===e.key&&(e.preventDefault(),this.triggerChange(t),this.updateYarnTotalPrice(t),this.updateTotalPrice())}changeQuantity(e,t){let r=e.value;e[t](),e.value!==r&&(this.triggerChange(e),this.updateYarnTotalPrice(e),this.updateTotalPrice())}triggerChange(e){let t=new Event("change",{bubbles:!0,cancelable:!1});e.dispatchEvent(t)}onSizeSelectChange(e){let t=e.currentTarget.value;
8this.variants.forEach(e=>{let r=e.querySelector(".js-quantity-selector"),i=JSON.parse(e.dataset.amounts);r&&(r.value=i[t]),this.updateYarnTotalPrice(r),this.updateTotalPrice()})}updateYarnTotalPrice(e){if(!e)return;let t=e.closest(".yarn-variant");if(!t)return;let r=l.querySelector(t,".yarn-total-price",!1);if(r&&e){let t=parseFloat(r.dataset.unitPrice),i=parseInt(e.value,10),a=r.dataset.currencySymbol;r.innerHTML=`${(t*i).toFixed(0)}${a}`}}updateRecipeTotalPrice(e){let t=parseFloat(e.dataset.unitPrice),r=parseInt(e.value,10),i=e.dataset.currencySymbol;this.recipeTotalPriceElement.innerHTML=`${(t*r).toFixed(0)}${i}`}updateTotalPrice(){let e=0;if(this.variants.forEach(t=>{let r=l.querySelector(t,".js-quantity-selector",!1),i=l.querySelector(t,".yarn-total-price",!1);if(i&&r){let t=parseFloat(i.dataset.unitPrice)*parseInt(r.value,10),a=i.dataset.currencySymbol;i.innerHTML=`${t.toFixed(0)}${a}`,e+=t}}),this.recipeQtySelector){let t=l.querySelector(this.recipeQtySelector,".product-detail-quantity-input");if(t){let r=parseFloat(t.dataset.unitPrice),i=parseInt(t.value,10);e+=r*i}}if(this.physicalPrintCheckbox&&this.physicalPrintCheckbox.checked){let t=parseFloat(this.physicalPrintCheckbox.dataset.surcharge);isNaN(t)||(e+=t)}if(this.totalPriceElement){let t=this.totalPriceElement.dataset.currencySymbol;this.totalPriceElement.innerHTML=`${e.toFixed(0)}${t}`}}
8registerAlternativeChangeClick(){this.variants.forEach(e=>{let t=l.querySelectorAll(e,".js-alternative-change-button",!1);t&&t.forEach(t=>{t.addEventListener("click",this.onAlternativeChangeButtonClick.bind(this,t,e))})})}onAlternativeChangeButtonClick(e,t){let r=e.dataset.id,i=l.querySelector(t,".js-quantity-selector",!1),a=i?i.value:e.dataset.qty;fetch(`/flow/yarn/alternative/${r}/${a}`,{method:"POST",body:JSON.stringify({alternatives:t.dataset.alternatives})}).then(e=>{if(!e.ok)throw Error(`HTTP ${e.status}`);return e.text()}).then(e=>{let r=new DOMParser().parseFromString(e,"text/html").querySelector(".yarn-variant");t.innerHTML=r.innerHTML}).then(()=>{this.registerVariantChangeClick(),this.registerAlternativeChangeClick(),this.registerQtySelectors(),this.updateTotalPrice(),this.updateBuyButtonState()}).catch(e=>{console.error("Failed to update yarn alternative:",e)})}},"[data-flow-yarn-recipe-creator]")})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.