1import { parseLocalDateTime } from '../../../common/scripts/utility/date.js'; 2/** 3 * åä»ã¹ãã¼ã¿ã¹ã®è¡¨ç¤ºå¶å¾¡ 4 */ 5export class RegistrationStateIndicator { 6 elements; 7 /** 8 * ç¾å¨æ¥æï¼ããã¤ã¹æå»ï¼ 9 */ 10 #now = new Date(); 11 /** 12 * åä»éå§æ¥æï¼è¦ç´ ãã¨ï¼ 13 */ 14 #startAtByElement = new WeakMap(); 15 /** 16 * åä»çµäºæ¥æï¼è¦ç´ ãã¨ï¼ 17 */ 18 #endAtByElement = new WeakMap(); 19 /** 20 * ã©ãã«ç¨ã®ãã³ãã¬ã¼ãè¦ç´ 21 */ 22 #labelTemplates; 23 /** 24 * @constructor 25 * @param elements æ©è½ã®èµ·ç¹ã¨ãªãè¦ç´ 26 */ 27 constructor(elements) { 28 this.elements = elements; 29 this.#labelTemplates = document.querySelectorAll('.fn-registration-label__template'); 30 } 31 init() { 32 this.#indexScheduleByElement(); 33 this.#renderAll(); 34 } 35 /** 36 * éå§æ¥æã»çµäºæ¥æãåå¾ãã¦`Date`ã«å¤æãã`WeakMap`ã«æ ¼ç´ 37 */ 38 #indexScheduleByElement() { 39 for (const element of this.elements) { 40 const startRaw = element.dataset.registrationStart; 41 const endRaw = element.dataset.registrationEnd; 42 const startAt = parseLocalDateTime(startRaw); 43 const endAt = parseLocalDateTime(endRaw); 44 if (startAt) { 45 this.#startAtByElement.set(element, startAt); 46 } 47 if (endAt) { 48 this.#endAtByElement.set(element, endAt); 49 } 50 } 51 } 52 /** 53 * ãã¹ã¦ã®è¦ç´ ã«å¯¾ãã¦ç¶æ å¤å® â ã©ãã«æç» 54 */ 55 #renderAll() { 56 for (const element of this.elements) { 57 const state = this.#resolveStateFor(element); 58 this.#renderLabelFor(element, state); 59 } 60 } 61 /** 62 * å¢çå¤å® 63 * - none: éå§æ¥æã¾ãã¯çµäºæ¥æãæªè¨å® 64 * - open:`start <= now < end` 65 * - closed:`now >= end` 66 * - upcoming:`now < start` 67 */ 68 #resolveStateFor(element) { 69 const now = this.#now; 70 const start = this.#startAtByElement.get(element); 71 const end = this.#endAtByElement.get(element); 72 if (!start || !end) { 73 return 'none'; 74 } 75 if (start && now < start) { 76 return 'upcoming'; 77 } 78 if (end && now >= end) { 79 return 'closed'; 80 } 81 return 'open'; 82 } 83 /** 84 * ç¶æ ã«å¿ãã¦ä¸è¦ã©ãã«ãåé¤ãã`DocumentFragment`ãè¿ã 85 */ 86 #chooseLabelFragment(state, id) { 87 // NOTE: æ¥ææªè¨å®ï¼noneï¼ã¾ãã¯åä»åï¼upcomingï¼ã¯ã©ãã«æ¿å ¥ããªã 88 if (!this.#labelTemplates.length || 89 state === 'none' || 90 state === 'upcoming') { 91 return null; 92 } 93 const template = this.#getTemplateByID(id); 94 // NOTE: ãã³ãã¬ã¼ããè¦ã¤ãããªãã£ãå ´åã¯ã©ãã«æ¿å ¥ããªã 95 if (!template) { 96 return null; 97 } 98 const fragment = template.content.cloneNode(true); 99 const openLabel = fragment.querySelector('.fn-registration-label__open'); 100 const closedLabel = fragment.querySelector('.fn-registration-label__closed'); 101 if (!openLabel || !closedLabel) { 102 return null; 103 } 104 if (state === 'closed') { 105 openLabel.remove(); 106 } 107 else { 108 closedLabel.remove(); 109 } 110 return fragment; 111 } 112 /** 113 * `DocumentFragment`ãæ¿å ¥ä½ç½®ã«å¿ãã¦`slot`ã«è¿½å 114 */ 115 #renderLabelFor(element, state) { 116 const slot = element.querySelector('.fn-registration-label__slot'); 117 if (!slot) { 118 return; 119 } 120 const fragment = this.#chooseLabelFragment(state, element.dataset.templateId); 121 if (!fragment) { 122 return; 123 } 124 const insertFirst = slot.classList.contains('fn-registration-label__insertFirst'); 125 if (insertFirst) { 126 slot.insertBefore(fragment, slot.firstElementChild); 127 } 128 else { 129 slot.appendChild(fragment); 130 } 131 } 132 /** 133 * æå®IDã«å¯¾å¿ãããã³ãã¬ã¼ãè¦ç´ ãè¿ã 134 */ 135 #getTemplateByID(id) { 136 const templates = Array.from(this.#labelTemplates); 137 if (!id) { 138 return templates.find((template) => !template.hasAttribute('id')); 139 } 140 return templates.find((template) => template.id === id); 141 } 142} 143(() => { 144 const elements = document.querySelectorAll('.js-registration-label'); 145 if (elements.length === 0) { 146 return; 147 } 148 const registrationStateIndicator = new RegistrationStateIndicator(elements); 149 registrationStateIndicator.init(); 150})();
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.