1/** 2 * AJEC3 Snow Monkey Forms å ¥åè£å© 3 * 4 * - éµä¾¿çªå· â 使èªåå ¥åï¼Yubinbangoï¼ 5 * - ã¡ã¼ã«ã¢ãã¬ã¹ï¼ç¢ºèªï¼ã®ä¸è´ãã§ã㯠6 * - textarea ã®æåæ°ã«ã¦ã³ã¿ã¼ 7 * - éä¿¡ãã¿ã³ã®äºåº¦æ¼ã鲿¢ï¼ãã¼ãã£ã³ã°è¡¨ç¤ºï¼ 8 * - å ¨è§æ°å â åè§æ°åã®èªå夿ï¼é»è©±çªå·ã»éµä¾¿çªå·ï¼ 9 * - inputmode 屿§ã®æ³¨å ¥ï¼SMF ã¯ãããã¯å±æ§ã¨ãã¦ãµãã¼ãããªãã®ã§ JS ã§ä»ä¸ï¼ 10 * - aria-required / aria-invalid ã®èªåä»ä¸ 11 * - ä¼å¡ç¤¾ãé¸ã¶æ¬ï¼ä»äºã®ä¾é ¼ãã©ã¼ã ï¼: 鏿ä¸ã®è¡¨ç¤ºã»é¸ã¶ããã®ãããã¢ããï¼ç¤¾åã»åæ±ãåéã§ 12 * çµãè¾¼ã¿ï¼ã»?member=ID ããã®åæé¸æã»ç¢ºèªç»é¢ã§ã®ç¨®å¥ãã¨ã®è¡¨ç¤º 13 * 14 * ## è¨è¨ä¸ã®æ³¨æï¼éå»ã«ããã£ãã®ã§ã¡ã¢ï¼ 15 * 16 * SMF 㯠async submit å¾ã«ãã©ã¼ã æ¬ä½ã JS ã§å·®ãæ¿ãããscreen ã 17 * input â confirm â complete ã¨é·ç§»ããéãinput/textarea è¦ç´ 㯠18 * æ¯åæ°ãããã®ã«ç½®æãããããã®ãããåå DOMContentLoaded ã§ä¸åº¦ã ããã§ã¯ 19 * ä¸ååã§ãscreen é·ç§»ãã¨ã«åã¨ã³ãã³ã¹ããå¿ è¦ãããã 20 * 21 * ãã ã MutationObserver ã childList+subtree ã§å¼µã£ã¦ããã® callback ã® 22 * ä¸ã§ DOM ã追å ããï¼ä¾: æåæ°ã«ã¦ã³ã¿ã¼è¦ç´ ã® appendï¼ã¨ãèªåã®è¿½å ã 23 * èªåã® observer ãåçºç«ãã㦠**ç¡éã«ã¼ã** ããã 24 * 25 * 対ç1: ç£è¦ã¯ `attributeFilter: ['data-screen']` ã«éå®ï¼childList ãè¦ãªãï¼ 26 * 対ç2: å setup 颿°ã¯ idempotentãåæåæ¸ã¿ã®è¦ç´ ã«ã¯ dataset ãã©ã° 27 * ï¼ä¾: data-ajec3-counter-initï¼ãä»ãã¦äºéé©ç¨ãé²ã 28 * 対ç3: ä¸åº¦ãã¤ã³ãããã¤ãã³ããªã¹ãã¼ãåãè¦ç´ ã«éè¤ãã¤ã³ãããªã 29 */ 30(function () { 31 'use strict'; 32 33 var HP_GUARD = 'ajec3Init'; 34 35 // ------------------------------------------------------------------ 36 // Yubinbango: éµä¾¿çªå· â 使èªåå ¥å 37 // ------------------------------------------------------------------ 38 // Yubinbango 㯠form è¦ç´ ã h-adrãéµä¾¿çªå· input ã p-postal-codeã 39 // 使 input ã p-region/p-locality/p-street-address ã¨èªèããã 40 // SMF ã¯ãããã®ã¯ã©ã¹ãä»ããªãã®ã§ JS ã§è£ãã 41 function setupYubinbango() { 42 document.querySelectorAll('.snow-monkey-form').forEach(function (form) { 43 if (form.dataset.ajec3YubinInit === '1') return; 44 45 var postcode = form.querySelector('input[name="postcode"], input[name="postal"], input[name="zip"]'); 46 var address = form.querySelector('input[name="address"]'); 47 if (!postcode || !address) { 48 return; 49 } 50 51 form.dataset.ajec3YubinInit = '1'; 52 53 postcode.classList.add('p-postal-code'); 54 address.classList.add('p-region', 'p-locality', 'p-street-address'); 55 56 if (!form.classList.contains('h-adr')) { 57 form.classList.add('h-adr'); 58 var country = document.createElement('span'); 59 country.className = 'p-country-name'; 60 country.style.display = 'none'; 61 country.textContent = 'Japan'; 62 form.insertBefore(country, form.firstChild); 63 } 64 65 // Yubinbango ã®ã¤ã³ã¹ã¿ã³ã¹ã¯1ãã©ã¼ã ã«ã¤ã1度ã ãçæ 66 if (typeof window.YubinBango !== 'undefined' && typeof window.YubinBango.MicroformatDom === 'function') { 67 try { new window.YubinBango.MicroformatDom(); } catch (e) { /* noop */ } 68 } 69 }); 70 } 71 72 // ------------------------------------------------------------------ 73 // ã¡ã¼ã«ä¸è´ãã§ã㯠74 // ------------------------------------------------------------------ 75 function setupEmailMatch() { 76 document.querySelectorAll('.snow-monkey-form').forEach(function (form) { 77 var email = form.querySelector('input[name="email"]'); 78 var confirm = form.querySelector('input[name="email_confirm"]'); 79 if (!email || !confirm) return; 80 // åã confirm è¦ç´ ã«ä½åº¦ããªã¹ãã¼ãå¼µããªã 81 if (confirm.dataset.ajec3EmailMatchInit === '1') return; 82 confirm.dataset.ajec3EmailMatchInit = '1'; 83 84 var errorEl = null; 85 function ensureErrorEl() { 86 if (errorEl && errorEl.isConnected) return errorEl; 87 errorEl = document.createElement('div'); 88 errorEl.className = 'smf-error-messages ajec3-email-mismatch'; 89 errorEl.style.display = 'none'; 90 errorEl.textContent = 'ã¡ã¼ã«ã¢ãã¬ã¹ãä¸è´ãã¦ãã¾ãã'; 91 var wrap = confirm.closest('.smf-item__controls') || confirm.parentNode; 92 wrap.appendChild(errorEl); 93 return errorEl; 94 } 95 96 function check() { 97 if (!confirm.value) { 98 if (errorEl) errorEl.style.display = 'none'; 99 confirm.removeAttribute('aria-invalid'); 100 return; 101 } 102 var mismatch = email.value && email.value !== confirm.value; 103 ensureErrorEl().style.display = mismatch ? '' : 'none'; 104 if (mismatch) { 105 confirm.setAttribute('aria-invalid', 'true'); 106 } else { 107 confirm.removeAttribute('aria-invalid'); 108 } 109 } 110 111 email.addEventListener('blur', check); 112 confirm.addEventListener('blur', check); 113 confirm.addEventListener('input', check); 114 }); 115 } 116 117 // ------------------------------------------------------------------ 118 // textarea æåæ°ã«ã¦ã³ã¿ã¼ 119 // ------------------------------------------------------------------ 120 function setupTextareaCounter() { 121 document.querySelectorAll('.snow-monkey-form textarea').forEach(function (ta) { 122 if (ta.dataset.ajec3CounterInit === '1') return; 123 124 var max = parseInt(ta.getAttribute('maxlength') || '0', 10); 125 if (!max) return; 126 127 ta.dataset.ajec3CounterInit = '1'; 128 129 var counter = document.createElement('div'); 130 counter.className = 'ajec3-char-counter'; 131 counter.setAttribute('aria-live', 'polite'); 132 // æåæ°ã«ã¦ã³ã¿ã¼ã¯ textarea ã® parentNode ã®å å¼ã¨ãã¦æ¿å ¥
133 // ï¼parentNode.appendChild ã 㨠textarea ã®å¾ãã«å ¥ã£ã¦å¦¥å½ï¼ 134 ta.parentNode.appendChild(counter); 135 136 function update() { 137 var len = ta.value.length; 138 counter.textContent = len + ' / ' + max + ' æå'; 139 counter.classList.toggle('is-near-limit', len >= max * 0.9); 140 counter.classList.toggle('is-over-limit', len >= max); 141 } 142 ta.addEventListener('input', update); 143 update(); 144 }); 145 } 146 147 // ------------------------------------------------------------------ 148 // éä¿¡ãã¿ã³ã®ãã¼ãã£ã³ã°/äºåº¦æ¼ã鲿¢ï¼ã¤ãã³ãå§ä»»ããã¤ã³ã1åã®ã¿ï¼ 149 // ------------------------------------------------------------------ 150 var submitLoadingBound = false; 151 function setupSubmitLoading() { 152 if (submitLoadingBound) return; 153 submitLoadingBound = true; 154 155 document.addEventListener('click', function (e) { 156 var t = e.target; 157 if (!t || !t.matches) return; 158 if (!t.matches('.smf-button-control__control[data-action="send"]')) return; 159 if (t.disabled) return; 160 161 var original = t.textContent; 162 t.classList.add('is-loading'); 163 t.textContent = 'éä¿¡ä¸â¦'; 164 t.disabled = true; 165 // 30 ç§å¾ã«ãã§ã¤ã«ã»ã¼ãã§å¾©å¸°ï¼é信失ææã®ä½æã®ããï¼ 166 setTimeout(function () { 167 t.disabled = false; 168 t.classList.remove('is-loading'); 169 t.textContent = original; 170 }, 30000); 171 }, true); 172 } 173 174 // ------------------------------------------------------------------ 175 // å ¨è§âåè§ï¼é»è©±çªå·ã»éµä¾¿çªå·ï¼ 176 // ------------------------------------------------------------------ 177 function zenToHan(str) { 178 return str 179 .replace(/[ï¼-ï¼]/g, function (c) { 180 return String.fromCharCode(c.charCodeAt(0) - 0xFEE0); 181 }) 182 .replace(/[ã¼ï¼ââ]/g, '-'); 183 } 184 function setupZenkakuToHankaku() { 185 document.querySelectorAll( 186 '.snow-monkey-form input[name="tel"], ' + 187 '.snow-monkey-form input[name="phone"], ' + 188 '.snow-monkey-form input[name="fax"], ' + 189 '.snow-monkey-form input[name="postcode"], ' + 190 '.snow-monkey-form input[name="postal"], ' + 191 '.snow-monkey-form input[name="zip"]' 192 ).forEach(function (el) { 193 if (el.dataset.ajec3ZenHanInit === '1') return; 194 el.dataset.ajec3ZenHanInit = '1'; 195 196 el.addEventListener('blur', function () { 197 var v = zenToHan(el.value); 198 if (v !== el.value) el.value = v; 199 }); 200 }); 201 } 202 203 // ------------------------------------------------------------------ 204 // inputmode 屿§ã®æ³¨å ¥ + aria-required 205 // ------------------------------------------------------------------ 206 var INPUTMODE_MAP = { 207 email: 'email', 208 tel: 'tel', 209 phone: 'tel', 210 fax: 'tel', 211 url: 'url', 212 website: 'url', 213 postcode: 'numeric', 214 postal: 'numeric', 215 zip: 'numeric' 216 }; 217 function enhanceInputAttributes() { 218 document.querySelectorAll('.snow-monkey-form input, .snow-monkey-form textarea').forEach(function (el) { 219 var name = el.getAttribute('name'); 220 if (INPUTMODE_MAP[name] && !el.hasAttribute('inputmode')) { 221 el.setAttribute('inputmode', INPUTMODE_MAP[name]); 222 } 223 var validations = el.getAttribute('data-validations') || ''; 224 if (validations.indexOf('required') !== -1 && !el.hasAttribute('aria-required')) { 225 el.setAttribute('aria-required', 'true'); 226 } 227 }); 228 } 229 230 // ------------------------------------------------------------------ 231 // ä¼å¡ç¤¾ãé¸ã¶æ¬ï¼ä»äºã®ä¾é ¼ãã©ã¼ã ã鏿è¢ã¯ inc/form-members.php ãä¼å¡ã®æç¨¿ããä½ãï¼ 232 // ------------------------------------------------------------------ 233 // SMF ãæããä¼å¡ç¨®å¥ãã¨ã®ãã§ãã¯ããã¯ã¹ã¯ç»é¢ã§ã¯é ãï¼éä¿¡ã¨ç¢ºèªç»é¢ã«ã¯ãã®ã¾ã¾ä½¿ãï¼ã 234 // 代ããã«ã鏿ä¸ã®ä¼ç¤¾ï¼Ãã§å¤ããï¼ãã¨ãä¸è¦§ããé¸ã¶ããã¿ã³ãåºãããã¿ã³ã§éããããã¢ãã 235 // ï¼<dialog>ãã¹ããã¯å ¨ç»é¢ï¼ã§ã社åã»åæ±ãåéã§çµãè¾¼ã¿ãªããé¸ã¶ããããã¢ããã®ãã§ãã¯ã¯ 236 // ãã®å ´ã§ SMF ã®ãã§ãã¯ããã¯ã¹ã«å ¥ããï¼éä¿¡ãããã®ã¯ SMF ã®ã»ãï¼ã 237 // - ?member=IDï¼ä¼å¡ç¤¾ã®è©³ç´°ãã¼ã¸ã®ãã¿ã³ï¼ããã®åæãã§ãã¯ããã¼ã¸ãéããæåã®1åã ã 238 // - 確èªç»é¢: é¸ã°ããä¼ç¤¾ã種å¥ãã¨ã«ä¸¦ã¹ãä½ãé¸ã°ãã¦ããªããã°ãæå®ãªãã 239 // - <dialog> ã使ããªãã»éä¸ã§å¤±æããã¨ãã¯ãhtml ã® ajec3-members-js ã¯ã©ã¹ãå¤ã㦠240 // SMF ã®ãã§ãã¯ããã¯ã¹ä¸è¦§ã«æ»ãï¼ã¯ã©ã¹ã¯ inc/form-members.php ã head ã§ä»ããï¼ 241 // SMF ã¯ç»é¢ãå¤ãããã³ã« .smf-placeholder ã®ä¸èº«ã ããå ¥ãæ¿ããã®ã§ãè¶³ããé¨å㯠placeholder ã®å¤ã«ç½®ãã 242 // åæ±ãåéã»å¾æåéã»ç´¹ä»ãã¼ã¸ã® URL 㯠window.ajec3FormMembersï¼inc/form-members.phpï¼ã 243 var memberPreselectDone = false;
244 var memberUid = 0; 245 var MEMBER_ICON_CLOSE = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M6 6l12 12M18 6L6 18"/></svg>'; 246 var MEMBER_ICON_EXT = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 4h6v6"/><path d="M20 4l-9 9"/><path d="M18 14v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5"/></svg>'; 247 248 function memberEl(tag, className, text) { 249 var el = document.createElement(tag); 250 if (className) el.className = className; 251 if (text) el.textContent = text; 252 return el; 253 } 254 255 function normalizeMemberName(s) { 256 s = String(s || ''); 257 if (s.normalize) s = s.normalize('NFKC'); 258 return s.toLowerCase().replace(/\s+/g, ''); 259 } 260 261 function memberData() { 262 var d = window.ajec3FormMembers; 263 return { 264 members: (d && d.members) || {}, 265 tags: (d && d.tags) || [] 266 }; 267 } 268 269 function memberBoxes(item) { 270 return [].slice.call(item.querySelectorAll('.smf-placeholder input[type="checkbox"]')); 271 } 272 273 function memberBox(item, value) { 274 value = String(value || '').trim(); 275 if (!/^\d+$/.test(value)) return null; 276 return item.querySelector('.smf-placeholder input[type="checkbox"][value="' + value + '"]'); 277 } 278 279 function memberCount(item) { 280 return memberBoxes(item).filter(function (box) { return box.checked; }).length; 281 } 282 283 // ãããã¢ããã使ããªãã¨ãã»å¤±æããã¨ã㯠SMF ã®ãã§ãã¯ããã¯ã¹ä¸è¦§ã«æ»ã 284 function memberFallback() { 285 document.documentElement.classList.remove('ajec3-members-js'); 286 } 287 288 // ãã©ã¼ã å´: 鏿ä¸ã®ä¼ç¤¾ï¼ãããï¼ã¨ä»¶æ° 289 function updateMemberSummary(item, ui) { 290 var checked = memberBoxes(item).filter(function (box) { return box.checked; }); 291 ui.chips.textContent = ''; 292 checked.forEach(function (box) { 293 var label = box.closest('label'); 294 var name = label ? label.textContent.trim() : box.value; 295 var ph = box.closest('.smf-placeholder'); 296 var legend = ph ? ph.querySelector('legend') : null; 297 var chip = memberEl('li', 'ajec3-members__chip'); 298 var remove = memberEl('button', 'ajec3-members__chip-remove'); 299 remove.type = 'button'; 300 remove.innerHTML = MEMBER_ICON_CLOSE; 301 remove.setAttribute('data-member-value', box.value); 302 remove.setAttribute('aria-label', name + 'ãå¤ã'); 303 chip.appendChild(memberEl('span', 'ajec3-members__chip-name', name)); 304 if (legend) chip.appendChild(memberEl('span', 'ajec3-members__chip-group', legend.textContent.trim())); 305 chip.appendChild(remove); 306 ui.chips.appendChild(chip); 307 }); 308 ui.chips.hidden = !checked.length; 309 ui.status.textContent = checked.length ? 'é¸æä¸ ' + checked.length + '社' : 'ã¾ã é¸ã°ãã¦ãã¾ãã'; 310 ui.status.classList.toggle('is-none', !checked.length); 311 ui.open.lastChild.textContent = checked.length ? '追å ã»å¤æ´ãã' : 'ä¸è¦§ããé¸ã¶'; 312 } 313 314 // ãããã¢ãã: ä»¶æ°ã¨ããã¹ã¦å¤ãã 315 function updateMemberDialogCount(item, ui) { 316 var count = memberCount(item); 317 ui.dialog.count.textContent = count ? 'é¸æä¸ ' + count + '社' : 'ã¾ã é¸ã°ãã¦ãã¾ãã'; 318 ui.dialog.count.classList.toggle('is-none', !count); 319 ui.dialog.clear.hidden = !count; 320 } 321 322 // ãããã¢ããã®ä¸è¦§ãããã¾ã® SMF ã®ãã§ãã¯ããã¯ã¹ããä½ãç´ãï¼ä¿®æ£ã»å ¥åã¨ã©ã¼ã§æãç´ããã¦ãåãï¼ 323 function renderMemberRows(item, ui) { 324 var data = memberData(); 325 var tagNames = {};
326 data.tags.forEach(function (t) { tagNames[t.slug] = t.name; }); 327 var groups = ui.dialog.groups; 328 groups.textContent = ''; 329 330 [].slice.call(item.querySelectorAll('.smf-placeholder')).forEach(function (ph) { 331 var boxes = [].slice.call(ph.querySelectorAll('input[type="checkbox"]')); 332 if (!boxes.length) return; 333 var legend = ph.querySelector('legend'); 334 var section = memberEl('section', 'ajec3-members-dialog__group'); 335 var heading = memberEl('h3', 'ajec3-members-dialog__group-title', legend ? legend.textContent.trim() : ''); 336 heading.appendChild(memberEl('span', 'ajec3-members-dialog__group-count', boxes.length + '社')); 337 var list = memberEl('ul', 'ajec3-members-dialog__list'); 338 339 boxes.forEach(function (box) { 340 var info = data.members[box.value] || {}; 341 var label = box.closest('label'); 342 var name = label ? label.textContent.trim() : box.value; 343 var row = memberEl('li', 'ajec3-members-dialog__row'); 344 row.setAttribute('data-value', box.value); 345 row.setAttribute('data-name', normalizeMemberName(name)); 346 row.setAttribute('data-tags', (info.tags || []).join(' ')); 347 row.classList.toggle('is-checked', box.checked); 348 349 var pick = memberEl('label', 'ajec3-members-dialog__pick'); 350 var check = memberEl('input', 'ajec3-members-dialog__check'); 351 check.type = 'checkbox'; 352 check.value = box.value; 353 check.checked = box.checked; 354 var text = memberEl('span', 'ajec3-members-dialog__text'); 355 text.appendChild(memberEl('span', 'ajec3-members-dialog__name', name)); 356 var specialty = data.tags.filter(function (t) { return (info.specialty || []).indexOf(t.slug) !== -1; }); 357 if (specialty.length) { 358 var specs = memberEl('span', 'ajec3-members-dialog__specs'); 359 specs.appendChild(memberEl('span', 'visually-hidden', '徿åéï¼')); 360 specialty.forEach(function (t) { 361 var spec = memberEl('span', 'ajec3-members-dialog__spec', tagNames[t.slug]); 362 spec.setAttribute('data-slug', t.slug); 363 specs.appendChild(spec); 364 }); 365 text.appendChild(specs); 366 } 367 pick.appendChild(check); 368 pick.appendChild(text); 369 row.appendChild(pick); 370 371 if (info.url) { 372 var more = memberEl('a', 'ajec3-members-dialog__more'); 373 more.href = info.url; 374 more.target = '_blank'; 375 more.rel = 'noopener'; 376 more.setAttribute('aria-label', name + 'ã®ç´¹ä»ãã¼ã¸ï¼æ°ããã¿ãã§éãã¾ãï¼'); 377 more.innerHTML = '<span aria-hidden="true">ç´¹ä»</span>' + MEMBER_ICON_EXT; 378 row.appendChild(more); 379 } 380 list.appendChild(row); 381 }); 382 383 section.appendChild(heading); 384 section.appendChild(list); 385 groups.appendChild(section); 386 }); 387 } 388 389 // ãããã¢ãã: 社åï¼é¨åä¸è´ï¼ã¨åæ±ãåéï¼é¸ãã ã©ãããæ±ãä¼ç¤¾ãä¼å¡ä¸è¦§ã®çµãè¾¼ã¿ã¨åãï¼ 390 function filterMemberRows(ui) { 391 var q = normalizeMemberName(ui.dialog.search.value); 392 var tags = [].slice.call(ui.dialog.tags.querySelectorAll('[aria-pressed="true"]')).map(function (b) { 393 return b.getAttribute('data-tag'); 394 }); 395 var any = false; 396 [].slice.call(ui.dialog.groups.querySelectorAll('.ajec3-members-dialog__group')).forEach(function (section) { 397 var visible = 0; 398 [].slice.call(section.querySelectorAll('.ajec3-members-dialog__row')).forEach(function (row) { 399 var rowTags = (row.getAttribute('data-tags') || '').split(' '); 400 var hit = (!q || row.getAttribute('data-name').indexOf(q) !== -1) && 401 (!tags.length || tags.some(function (t) { return rowTags.indexOf(t) !== -1; })); 402 row.hidden = !hit; 403 if (hit) visible++; 404 }); 405 section.hidden = !visible; 406 if (visible) any = true; 407 }); 408 ui.dialog.empty.hidden = any; 409 } 410 411 function buildMemberDialog(item, ui) { 412 var id = 'ajec3-members-dialog-' + (++memberUid); 413 var d = { 414 el: memberEl('dialog', 'ajec3-members-dialog'), 415 search: memberEl('input', 'ajec3-members-dialog__search'), 416 tags: memberEl('div', 'ajec3-members-dialog__tags'), 417 body: memberEl('div', 'ajec3-members-dialog__body'), 418 groups: memberEl('div', 'ajec3-members-dialog__groups'), 419 empty: memberEl('p', 'ajec3-members-dialog__empty', 'æ¡ä»¶ã«åãä¼å¡ç¤¾ãããã¾ããã'), 420 count: memberEl('p', 'ajec3-members-dialog__count'), 421 clear: memberEl('button', 'ajec3-members-dialog__clear', 'ãã¹ã¦å¤ã'), 422 done: memberEl('button', 'ajec3-members-dialog__done', '決å®ãã') 423 }; 424 d.el.setAttribute('aria-labelledby', id + '-title'); 425 426 var head = memberEl('div', 'ajec3-members-dialog__head'); 427 var headText = memberEl('div', 'ajec3-members-dialog__head-text'); 428 var title = memberEl('h2', 'ajec3-members-dialog__title', 'ä¾é ¼ãããä¼å¡ç¤¾ãé¸ã¶'); 429 title.id = id + '-title'; 430 headText.appendChild(title); 431 headText.appendChild(memberEl('p', 'ajec3-members-dialog__lead', 'è¤æ°é¸ã¹ã¾ãã社åãåæ±ãåéã§çµãè¾¼ãã¾ãã')); 432 var close = memberEl('button', 'ajec3-members-dialog__close'); 433 close.type = 'button'; 434 close.setAttribute('aria-label', 'éãã'); 435 close.innerHTML = MEMBER_ICON_CLOSE; 436 head.appendChild(headText); 437 head.appendChild(close); 438 439 var filters = memberEl('div', 'ajec3-members-dialog__filters'); 440 d.search.type = 'search'; 441 d.search.placeholder = '社åã§çµãè¾¼ã'; 442 d.search.autocomplete = 'off'; 443 d.search.setAttribute('aria-label', 'ä¼å¡ç¤¾ã社åã§çµãè¾¼ã'); 444 filters.appendChild(d.search); 445 var data = memberData(); 446 if (data.tags.length) { 447 d.tags.setAttribute('role', 'group'); 448 d.tags.setAttribute('aria-label', 'åæ±ãåéã§çµãè¾¼ã');
449 data.tags.forEach(function (t) { 450 var tag = memberEl('button', 'ajec3-members-dialog__tag', t.name); 451 tag.type = 'button'; 452 tag.setAttribute('data-tag', t.slug); 453 tag.setAttribute('aria-pressed', 'false'); 454 d.tags.appendChild(tag); 455 }); 456 filters.appendChild(d.tags); 457 } 458 459 d.empty.hidden = true; 460 d.body.appendChild(d.groups); 461 d.body.appendChild(d.empty); 462 463 var foot = memberEl('div', 'ajec3-members-dialog__foot'); 464 d.count.setAttribute('aria-live', 'polite'); 465 d.clear.type = 'button'; 466 d.done.type = 'button'; 467 foot.appendChild(d.count); 468 foot.appendChild(d.clear); 469 foot.appendChild(d.done); 470 471 d.el.appendChild(head); 472 d.el.appendChild(filters); 473 d.el.appendChild(d.body); 474 d.el.appendChild(foot); 475 document.body.appendChild(d.el); 476 477 close.addEventListener('click', function () { d.el.close(); }); 478 d.done.addEventListener('click', function () { d.el.close(); }); 479 d.search.addEventListener('input', function () { filterMemberRows(ui); }); 480 d.tags.addEventListener('click', function (e) { 481 var tag = e.target.closest ? e.target.closest('[data-tag]') : null; 482 if (!tag) return; 483 tag.setAttribute('aria-pressed', tag.getAttribute('aria-pressed') === 'true' ? 'false' : 'true'); 484 filterMemberRows(ui); 485 }); 486 d.groups.addEventListener('change', function (e) { 487 var check = e.target; 488 if (!check || check.type !== 'checkbox') return; 489 var box = memberBox(item, check.value); 490 if (box) box.checked = check.checked; 491 var row = check.closest('.ajec3-members-dialog__row'); 492 if (row) row.classList.toggle('is-checked', check.checked); 493 updateMemberDialogCount(item, ui); 494 updateMemberSummary(item, ui); 495 }); 496 d.clear.addEventListener('click', function () { 497 memberBoxes(item).forEach(function (box) { box.checked = false; }); 498 [].slice.call(d.groups.querySelectorAll('.ajec3-members-dialog__check')).forEach(function (check) { 499 check.checked = false; 500 check.closest('.ajec3-members-dialog__row').classList.remove('is-checked'); 501 }); 502 updateMemberDialogCount(item, ui); 503 updateMemberSummary(item, ui); 504 d.search.focus(); 505 }); 506 // èæ¯ï¼ãããã¢ããã®å¤ï¼ãæ¼ãããéãããä¸ã§æ¼ãã¦å¤ã§é¢ããï¼æå鏿ãªã©ï¼ã¨ãã¯éããªã 507 var downOnBackdrop = false; 508 d.el.addEventListener('pointerdown', function (e) { downOnBackdrop = e.target === d.el; }); 509 d.el.addEventListener('click', function (e) { 510 if (downOnBackdrop && e.target === d.el) d.el.close(); 511 downOnBackdrop = false; 512 }); 513 d.el.addEventListener('close', function () { 514 document.documentElement.classList.remove('ajec3-modal-open'); 515 updateMemberSummary(item, ui); 516 ui.open.focus(); 517 }); 518 return d; 519 } 520 521 function openMemberDialog(item, ui) { 522 if (!ui.dialog) ui.dialog = buildMemberDialog(item, ui); 523 renderMemberRows(item, ui); 524 filterMemberRows(ui); 525 updateMemberDialogCount(item, ui); 526 document.documentElement.classList.add('ajec3-modal-open'); 527 ui.dialog.el.showModal(); 528 } 529 530 function buildMemberPicker(item) { 531 var controls = item.querySelector('.smf-item__controls'); 532 if (!controls || !memberBoxes(item).length) return null; 533 if (typeof window.HTMLDialogElement !== 'function' || 534 typeof document.createElement('dialog').showModal !== 'function') { 535 memberFallback(); 536 return null; 537 } 538 539 var ui = { 540 bar: memberEl('div', 'ajec3-members__bar'), 541 status: memberEl('p', 'ajec3-members__status'), 542 open: memberEl('button', 'ajec3-members__open'), 543 chips: memberEl('ul', 'ajec3-members__chips'), 544 none: memberEl('p', 'ajec3-members__none', 'æå®ãªã'), 545 dialog: null 546 }; 547 ui.status.setAttribute('aria-live', 'polite'); 548 ui.chips.setAttribute('aria-label', '鏿ä¸ã®ä¼å¡ç¤¾'); 549 ui.open.type = 'button'; 550 ui.open.setAttribute('aria-haspopup', 'dialog'); 551 ui.open.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M9 6h11M9 12h11M9 18h11M4 6h.01M4 12h.01M4 18h.01"/></svg><span></span>'; 552 ui.none.hidden = true; 553 ui.bar.appendChild(ui.status); 554 ui.bar.appendChild(ui.open); 555 ui.bar.appendChild(ui.chips); 556 controls.insertBefore(ui.bar, controls.firstChild); 557 controls.appendChild(ui.none); 558 559 ui.open.addEventListener('click', function () { openMemberDialog(item, ui); }); 560 ui.chips.addEventListener('click', function (e) { 561 var remove = e.target.closest ? e.target.closest('[data-member-value]') : null; 562 if (!remove) return; 563 var box = memberBox(item, remove.getAttribute('data-member-value')); 564 if (box) box.checked = false;
565 updateMemberSummary(item, ui); 566 ui.open.focus(); // æ¼ãããããã¯æ¶ããã®ã§ããã©ã¼ã«ã¹ã¯ãä¸è¦§ããé¸ã¶ã㸠567 }); 568 return ui; 569 } 570 571 function preselectMembers(item) { 572 var raw = ''; 573 try { 574 raw = new URLSearchParams(window.location.search).get('member') || ''; 575 } catch (e) { 576 return; 577 } 578 raw.split(',').forEach(function (value) { 579 var box = memberBox(item, value); 580 if (box) box.checked = true; 581 }); 582 } 583 584 function renderMemberConfirm(item, ui) { 585 var any = false; 586 [].slice.call(item.querySelectorAll('.smf-placeholder')).forEach(function (ph) { 587 var picked = ph.querySelector('input[type="hidden"]'); 588 ph.hidden = !picked; 589 if (!picked) return; 590 any = true; 591 var box = ph.firstElementChild; 592 if (box && ph.dataset.ajec3Legend && !box.querySelector('.ajec3-members__group')) { 593 box.insertBefore(memberEl('span', 'ajec3-members__group', ph.dataset.ajec3Legend), box.firstChild); 594 } 595 }); 596 ui.none.hidden = any; 597 } 598 599 function setupMemberPicker() { 600 document.querySelectorAll('.snow-monkey-form .ajec3-members-item').forEach(function (item) { 601 var form = item.closest('.snow-monkey-form'); 602 // åæãã§ãã¯ã¯ãããã¢ããã使ããªãï¼ä¸è¦§ã®ã¾ã¾ï¼ã¨ããå¹ããã 603 if (!memberPreselectDone && memberBoxes(item).length) { 604 memberPreselectDone = true; 605 preselectMembers(item); 606 } 607 var ui = item.ajec3Members || (item.ajec3Members = buildMemberPicker(item)); 608 if (!ui) return; 609 610 if (form && form.getAttribute('data-screen') === 'confirm') { 611 renderMemberConfirm(item, ui); 612 return; 613 } 614 if (!memberBoxes(item).length) return; // SMF ã®æç»å¾ ã¡ 615 616 ui.none.hidden = true; 617 [].slice.call(item.querySelectorAll('.smf-placeholder')).forEach(function (ph) { 618 ph.hidden = false; 619 var legend = ph.querySelector('legend'); 620 if (legend) ph.dataset.ajec3Legend = legend.textContent.trim(); 621 }); 622 updateMemberSummary(item, ui); 623 }); 624 } 625 626 function runMemberPicker() { 627 try { 628 setupMemberPicker(); 629 } catch (e) { 630 memberFallback(); 631 if (window.console && console.error) { 632 console.error('[ajec3-forms-enhance] setupMemberPicker failed:', e); 633 } 634 } 635 } 636 637 // ------------------------------------------------------------------ 638 // ç»é¢é·ç§»æã¹ã¯ãã¼ã«ï¼data-screen 屿§ã®ã¿ç£è¦ãchildList ã¯è¦ãªãï¼ 639 // ------------------------------------------------------------------ 640 function setupScreenObserver() { 641 document.querySelectorAll('.snow-monkey-form').forEach(function (form) { 642 if (form.dataset.ajec3ScreenObsInit === '1') return; 643 form.dataset.ajec3ScreenObsInit = '1'; 644 645 var observer = new MutationObserver(function () { 646 var screen = form.getAttribute('data-screen'); 647 // ç»é¢ãå¤ãã£ããã¹ã¯ãã¼ã« 648 if (screen === 'confirm' || screen === 'complete') { 649 var rect = form.getBoundingClientRect(); 650 if (rect.top < 0) { 651 window.scrollTo({ 652 top: rect.top + window.pageYOffset - 24, 653 behavior: 'smooth' 654 }); 655 } 656 } 657 // SMF ãå ¥åç»é¢ãæãç´ããæãå·®ãæ¿ããããè¦ç´ ã«åé©ç¨ããå¿ è¦ãããã 658 // childList ãç£è¦ããªãã®ã§ãç»é¢åæ¿ã奿©ã«åã¨ã³ãã³ã¹ããã 659 // data-screen 㯠SMF ãè¿ã method ãã®ãã®ãæåã®è¡¨ç¤ºã¯ inputã 660 // 確èªç»é¢ãããä¿®æ£ãããã§æ»ã㨠backãå ¥åã¨ã©ã¼ã§æ»ã㨠invalid ã«ãªãã 661 if (screen === 'input' || screen === 'back' || screen === 'invali
661d') { 662 // 次ã®ãã¤ã¯ãã¿ã¹ã¯ã§å®è¡ï¼å±æ§æ´æ°ç´å¾ã« DOM å·®ãæ¿ãå®äºããå ´åã®ããï¼ 663 setTimeout(function () { 664 enhanceInputAttributes(); 665 setupEmailMatch(); 666 setupTextareaCounter(); 667 setupZenkakuToHankaku(); 668 runMemberPicker(); 669 }, 0); 670 } 671 if (screen === 'confirm') { 672 setTimeout(function () { 673 runMemberPicker(); 674 }, 0); 675 } 676 }); 677 // â ï¸ childList ã¯çµ¶å¯¾ã«ç£è¦ããªããç£è¦ããã¨ã«ã¦ã³ã¿ã¼è¿½å ãªã©ã§ç¡éã«ã¼ãããã 678 observer.observe(form, { attributes: true, attributeFilter: ['data-screen'] }); 679 }); 680 } 681 682 // ------------------------------------------------------------------ 683 // èµ·å: å setup ã try/catch ã§å ã¿ã1ã¤ã®å¤±æã§å ¨ä½ãæ¢ã¾ããªãããã«ãã 684 // ------------------------------------------------------------------ 685 function safeRun(fn, name) { 686 try { 687 fn(); 688 } catch (e) { 689 if (window.console && console.error) { 690 console.error('[ajec3-forms-enhance] ' + name + ' failed:', e); 691 } 692 } 693 } 694 695 function initAll() { 696 safeRun(setupYubinbango, 'setupYubinbango'); 697 safeRun(setupEmailMatch, 'setupEmailMatch'); 698 safeRun(setupTextareaCounter, 'setupTextareaCounter'); 699 safeRun(setupSubmitLoading, 'setupSubmitLoading'); 700 safeRun(setupZenkakuToHankaku, 'setupZenkakuToHankaku'); 701 safeRun(enhanceInputAttributes, 'enhanceInputAttributes'); 702 runMemberPicker(); 703 safeRun(setupScreenObserver, 'setupScreenObserver'); 704 } 705 706 if (document.readyState === 'loading') { 707 document.addEventListener('DOMContentLoaded', initAll); 708 } else { 709 initAll(); 710 } 711})();
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.