function getOrderInstructionIdList(itemInfo) { // ささげ備考1になんらかの文字列が設定されていたら、ガットテンションとみなす。 const suitableTension = itemInfo?.sasageRemarks1; //#245626-1 const markingSku = itemInfo?.remarks3; if (suitableTension) { // ガット加工のオーダー指示選択肢(VGT0,VGT1)を選ぶ return ['VGT0', 'VGT1']; } if (/[A-Z0-9]{18}/.test(markingSku)) { // マーキングのSKUが指定されていたらそのSKUをオーダー指示としてみなす。 return [markingSku]; } if (itemInfo?.displayItemTagList?.length > 1) { return itemInfo?.displayItemTagList.map((tag) => tag.tagId); } return []; } function getOrderInstructionIdListInItemDetail() { // 商品詳細ページのItemInfoからオーダー指示用の属性として使用する情報だけ渡す。 return getOrderInstructionIdList({ sasageRemarks1: "", remarks3: "", }); } document.querySelectorAll('[data-cart-button]').forEach(function (button) { // カート投入ボタンの各エレメントのdata属性としてオーダー加工ボタンの情報をセットする。 button.dataset.instruction = getOrderInstructionIdListInItemDetail().length > 0; }); // オーダー加工指示用の品番個別のデータ function decorateOrderInstructionInvokeData(target) { // "101:42-60,102:45-63,103:48-68,104:50-70" // ガットテンションの文字列を解析したうえで、第2引数に指定した表示サイズIDのmin,maxを返却する。 function parseSuitableTension(text, sizeId) { const tensionMap = text.split(/\s*,\s*/).reduce((map, elm) => { const kv = elm.split(':', 2); if (kv.length >= 2) { const minmax = kv[1].split(/\s*-\s*/); if (minmax.length >= 2) { map[kv[0]] = { min: minmax[0], max: minmax[1] }; } else if (minmax.length >= 1) { map[kv[0]] = { min: minmax[0], max: minmax[0] }; } } return map; }, {}); return tensionMap[sizeId]; } // オーダー指示の選択肢をバリエーションIDごとに動的に設定する際にコールバックされる。 function getOptionsCallback(item, variations, selectedValues, variation) { // ガットの適正テンション if (variation.id === 'tension' && item.additionalInfo['suitableTension']) { const tensionInfo = parseSuitableTension(item.additionalInfo['suitableTension'], item.sizeId); if (!tensionInfo) { return []; } const min = parseInt(tensionInfo.min); const max = parseInt(tensionInfo.max); const options = []; for (let i = min; i <= max; i += variation.step) { options.push({ value: i.toFixed(variation.fixed) }); } return options; } } // 発生元のページ別にオーダ加工指示モーダルの起動データの定義を部分的に上書きする。 if (target.page_type == 'product_detail') { return Object.assign({}, target, { instructionIds: getOrderInstructionIdListInItemDetail(), additionalInfo: { suitableTension: "", }, getOptionsCallback: getOptionsCallback, }); } if (target.page_type == 'cart') { return Object.assign({}, target, { instructionIds: getOrderInstructionIdList(target.orderDetail), additionalInfo: { suitableTension: target.orderDetail?.sasageRemarks1, }, getOptionsCallback: getOptionsCallback, }); } return target; } // オーダー指示モーダルに起動データの上書き定義関数(デコレータ)を設定する。 document.addEventListener('DOMContentLoaded', (event) => { document.dispatchEvent( new CustomEvent('do_set_instruction_decorator', { detail: { invokeDataDecorator: decorateOrderInstructionInvokeData }, }) ); });