{"version":3,"sources":["product-list.js"],"names":["window","document","html","documentElement","ww","innerWidth","innerHeight","getWinSet","addEventListener","throttle","isMobile","deviceDetect","test","navigator","userAgent","classList","add","remove","match","on","filterPanel","querySelector","$filterBody","$","filterBtn","filterBtnStatus","filterPanelClassOpen","filterTextShow","dataset","show","filterTextHide","hide","filterPanelIsOpen","filterCookieKey","filterCookieStatus","localStorage","getItem","filterPanelShow","docDisableScroll","setTimeout","scrollTop","focus","innerText","setItem","filterPanelHide","docEnableScroll","JSON","parse","querySelectorAll","forEach","item","scrollBreakpoint","matchMedia","scrollBreakpointChecker","matches","addListener","filterWrapper","contains","_this","this","filterClear","filterGroup","filterInput","filterHasCountPoint","filterClassHide","filterCountArr","hasFilter","Object","defineProperty","oldValue","get","set","value","configurable","filterCountChange","count","countEl","countNum","every","val","group","index","inputs","filter","input","checked","filterUpdate","filterInit"],"mappings":"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","file":"../product-list.min.js","sourcesContent":["(function(window, document) {\r\n\t/* ----------------------------------- [START] Windows Setting */\r\n\tconst html = document.documentElement;\r\n\tlet ww = window.innerWidth;\r\n\tlet wh = window.innerHeight;\r\n\tfunction getWinSet() {\r\n\t\tww = window.innerWidth;\r\n\t\twh = window.innerHeight;\r\n\t}\r\n\twindow.addEventListener('load', getWinSet);\r\n\twindow.addEventListener('resize', throttle(getWinSet, 50, 100));\r\n\t/* ----------------------------------- [END] Windows Setting */\r\n\r\n\t/* ----------------------------------- [START] 取得裝置判斷 */\r\n\t// 取得裝置判斷\r\n\tvar isMobile = false;\r\n\tvar isTablet = false;\r\n\tvar isPhone = false;\r\n\tvar deviceDetect = function () {\r\n\t\t// IsPhone\r\n\t\tisPhone = ww <= 640;\r\n\r\n\t\t// IsMobile\r\n\t\t// 防止測試時一直用開發者工具Resize出現Bug\r\n\t\tisMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n\t\tif (isMobile) html.classList.add('is-mobile');\r\n\t\telse html.classList.remove('is-mobile');\r\n\r\n\t\t// IsTablet\r\n\t\tif (navigator.userAgent.match(/Android/i)) {\r\n\t\t\tif (!navigator.userAgent.match(/Mobile/i)) {\r\n\t\t\t\tisTablet = true;\r\n\t\t\t}\r\n\t\t} else if (navigator.userAgent.match(/BlackBerry|iPad|Opera Mini|IEMobile/i)) {\r\n\t\t\tisTablet = true;\r\n\t\t}\r\n\t};\r\n\tdeviceDetect();\r\n\ton(window, 'resize', throttle(deviceDetect, 50, 100));\r\n\t/* ----------------------------------- [END] 取得裝置判斷 */\r\n\r\n\t/* ---------------------------------------- [START] 篩選開關操作 */\r\n\tconst filterPanel = document.querySelector('#pd-filter-panel');\r\n\tconst $filterBody = $('.fixed-panel__body');\r\n\tconst filterBtn = document.querySelector('#button-filter');\r\n\tconst filterBtnStatus = filterBtn.querySelector('.status');\r\n\tconst filterPanelClassOpen = 'is-open';\r\n\r\n\tconst filterTextShow = filterBtn.dataset.show; // 「顯示篩選」的「顯示」文字\r\n\tconst filterTextHide = filterBtn.dataset.hide; // 「隱藏篩選」的「隱藏」文字\r\n\r\n\tlet filterPanelIsOpen = false; // 篩選面板是否關閉\r\n\r\n\t// 讀取 Storage 紀錄\r\n\tconst filterCookieKey = 'filter-is-open';\r\n\tlet filterCookieStatus = localStorage.getItem(filterCookieKey) || false;\r\n\tif (typeof filterCookieStatus === 'string') {\r\n\t\tfilterCookieStatus = JSON.parse(filterCookieStatus);\r\n\t}\r\n\r\n\t// 如果是Open則開啟\r\n\tif (!isMobile && ww >= 1024 && filterCookieStatus) {\r\n\t\tfilterPanelShow();\r\n\t}\r\n\r\n\t// 顯示面板\r\n\tfunction filterPanelShow() {\r\n\t\t// 關閉Scroll\r\n\t\tif (isMobile && ww < 1024) {\r\n\t\t\twindow.docDisableScroll && docDisableScroll();\r\n\r\n\t\t\t\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\t$filterBody.scrollTop(0);\r\n\t\t\t\t$filterBody.focus();\r\n\t\t\t}, 20);\r\n\t\t}\r\n\t\tfilterPanelIsOpen = true;\r\n\t\tfilterPanel.classList.add(filterPanelClassOpen);\r\n\t\tfilterBtnStatus.innerText = filterTextHide;\r\n\t\tlocalStorage.setItem(filterCookieKey, filterPanelIsOpen);\r\n\t}\r\n\r\n\t// 隱藏面板\r\n\tfunction filterPanelHide() {\r\n\t\t// 開啟Scroll\r\n\t\tif (isMobile && ww < 1024) {\r\n\t\t\twindow.docEnableScroll && docEnableScroll();\r\n\t\t}\r\n\t\t\r\n\t\tfilterPanelIsOpen = false;\r\n\t\tfilterPanel.classList.remove(filterPanelClassOpen);\r\n\t\tfilterBtnStatus.innerText = filterTextShow;\r\n\t\tlocalStorage.setItem(filterCookieKey, filterPanelIsOpen);\r\n\t}\r\n\r\n\t// 開關篩選面板\r\n\tfilterBtn.addEventListener('click', function() {\r\n\t\tif (!filterPanelIsOpen) {\r\n\t\t\tfilterPanelShow();\r\n\t\t} else {\r\n\t\t\tfilterPanelHide();\r\n\t\t}\r\n\t});\r\n\r\n\t// 展開面板內出現的關閉按鈕\r\n\tfilterPanel.querySelectorAll('[data-close]').forEach((item) => {\r\n\t\titem.addEventListener('click', function() {\r\n\t\t\tfilterPanelHide();\r\n\t\t});\r\n\t});\r\n\t/* ---------------------------------------- [END] 篩選開關操作 */\r\n\r\n\t/* ---------------------------------------- [START] Scroll Enabled */\r\n\t// 因為開關會鎖 ScrollBar ,如果使用者 Resize 1024+ 就會造成無法 Scroll 問題\r\n\tconst scrollBreakpoint = window.matchMedia('(min-width: 1024px)');\r\n\tconst scrollBreakpointChecker = function() {\r\n\t\tif (scrollBreakpoint.matches) {\r\n\t\t\t// Large\r\n\t\t\twindow.docEnableScroll && docEnableScroll();\r\n\t\t} else if (filterPanelIsOpen) {\r\n\t\t\twindow.docDisableScroll && docDisableScroll();\r\n\t\t}\r\n\t}\r\n\twindow.addEventListener('load', function() {\r\n\t\tscrollBreakpointChecker();\r\n\t\tscrollBreakpoint.addListener(scrollBreakpointChecker);\r\n\t});\r\n\t/* ---------------------------------------- [END] Scroll Enabled */\r\n\r\n\t/* ---------------------------------------- [START] 篩選項目操作(數量計算、全部清除) */\r\n\tconst filterWrapper = document.querySelector('#pd-filter');\r\n\t\r\n\tfunction filterInit() {\r\n\t\tconst _this = this;\r\n\t\tconst filterClear = document.querySelector('#pd-filter-clear');\r\n\t\tconst filterGroup = filterWrapper.querySelectorAll('.pd-filter__group');\r\n\t\tconst filterInput = filterWrapper.querySelectorAll('input');\r\n\t\tconst filterHasCountPoint = filterBtn.querySelector('.point');\r\n\t\tconst filterClassHide = 'hide';\r\n\t\tconst filterCountArr = [];\r\n\r\n\t\tlet hasFilter = false; // 確認是否有項目 => 控制 All 顯示隱藏\r\n\r\n\t\tObject.defineProperty(_this, 'hasFilter', {\r\n\t\t\toldValue: false,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn hasFilter\r\n\t\t\t},\r\n\t\t\tset: function(value) {\r\n\t\t\t\tif (this.oldValue !== value) {\r\n\t\t\t\t\thasFilter = value;\r\n\t\t\t\t\tthis.oldValue = value;\r\n\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\tfilterClear.classList.remove(filterClassHide);\r\n\t\t\t\t\t\tfilterHasCountPoint.classList.remove(filterClassHide);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfilterClear.classList.add(filterClassHide);\r\n\t\t\t\t\t\tfilterHasCountPoint.classList.add(filterClassHide);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tconfigurable: false,\r\n\t\t});\r\n\r\n\t\t// 更改計數\r\n\t\tconst filterCountChange = function(count, countEl, countNum) {\r\n\t\t\tcountNum.innerText = count;\r\n\r\n\t\t\tif (count === 0) {\r\n\t\t\t\tcountEl.classList.add(filterClassHide);\r\n\t\t\t} else {\r\n\t\t\t\tcountEl.classList.remove(filterClassHide);\r\n\t\t\t}\r\n\r\n\t\t\tif (filterCountArr.every(val => val === 0)) {\r\n\t\t\t\t_this.hasFilter = false;\r\n\t\t\t} else {\r\n\t\t\t\t_this.hasFilter = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 以一個 Group 為單位\r\n\t\tfilterGroup.forEach( function(group, index) {\r\n\t\t\tconst inputs = group.querySelectorAll('input');\r\n\t\t\tconst countEl = group.querySelector('.pd-filter__count');\r\n\t\t\tconst countNum = countEl.querySelector('.num');\r\n\t\t\tlet count = 0; // 計算有幾項\r\n\r\n\t\t\t// 定義在 Group 上\r\n\t\t\tgroup.filter = {\r\n\t\t\t\tinputs,\r\n\t\t\t\tcountEl,\r\n\t\t\t\tcountNum,\r\n\t\t\t};\r\n\r\n\t\t\t// 設定 Count 的 Get, Set 事件\r\n\t\t\tObject.defineProperty(group.filter, 'count', {\r\n\t\t\t\tget: function() {\r\n\t\t\t\t\treturn count\r\n\t\t\t\t},\r\n\t\t\t\tset: function(value) {\r\n\t\t\t\t\tcount = value;\r\n\r\n\t\t\t\t\tfilterCountArr[index] = count;\r\n\t\t\t\t\tfilterCountChange(count, countEl, countNum);\r\n\t\t\t\t},\r\n\t\t\t\tconfigurable: false,\r\n\t\t\t});\r\n\r\n\t\t\t// 以一個 Input 為單位\r\n\t\t\tinputs.forEach((input) => {\r\n\t\t\t\tif (input.checked) {\r\n\t\t\t\t\tgroup.filter.count++\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinput.addEventListener('change', function() {\r\n\t\t\t\t\tif (this.checked) {\r\n\t\t\t\t\t\tgroup.filter.count++\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tgroup.filter.count--\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\t// 全部清除 點擊\r\n\t\tfilterClear.addEventListener('click', function() {\r\n\t\t\t// 延遲,移除原本是 true 的項目\r\n\t\t\tsetTimeout(()=> {\r\n\t\t\t\t// Group 讀取\r\n\t\t\t\tfilterGroup.forEach( function(group) {\r\n\t\t\t\t\tgroup.filter.count = 0;\r\n\t\t\t\t\tfilterCountChange(0, group.filter.countEl, group.filter.countNum);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// 取消全部項目\r\n\t\t\t\tfilterInput.forEach((input) => {\r\n\t\t\t\t\tinput.checked = false;\r\n\t\t\t\t});\r\n\t\t\t}, 50);\r\n\t\t});\r\n\r\n\t\t// Count 更新(全部重新讀取)\r\n\t\tfunction update() {\r\n\t\t\tfilterGroup.forEach( function(group) {\r\n\t\t\t\tlet count = 0;\r\n\t\t\t\t// 以一個 Input 為單位\r\n\t\t\t\tgroup.filter.inputs.forEach((input) => {\r\n\t\t\t\t\tif (input.checked) {\r\n\t\t\t\t\t\tcount++\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tgroup.filter.count = count;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\twindow.filterUpdate = update;\r\n\t}\r\n\r\n\twindow.addEventListener('load', function() {\r\n\t\tif (filterWrapper && filterWrapper.classList.contains('js-filter')) {\r\n\t\t\tfilterInit();\r\n\t\t}\r\n\t});\r\n\t/* ---------------------------------------- [END] 篩選項目操作(數量計算、全部清除) */\r\n})(window, document);\r\n"],"sourceRoot":"../../src/"}