| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 var __create = Object.create; 2 var __defProp = Object.defineProperty; 3 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 4 var __getOwnPropNames = Object.getOwnPropertyNames; 5 var __getProtoOf = Object.getPrototypeOf; 6 var __hasOwnProp = Object.prototype.hasOwnProperty; 7 var __commonJS = (cb, mod) => function __require() { 8 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 9 }; 10 var __copyProps = (to, from, except, desc) => { 11 if (from && typeof from === "object" || typeof from === "function") { 12 for (let key of __getOwnPropNames(from)) 13 if (!__hasOwnProp.call(to, key) && key !== except) 14 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 15 } 16 return to; 17 }; 18 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 19 // If the importer is in node compatibility mode or this is not an ESM 20 // file that has been converted to a CommonJS file using a Babel- 21 // compatible transform (i.e. "__esModule" has not been set), then set 22 // "default" to the CommonJS "module.exports" for node compatibility. 23 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 24 mod 25 )); 26 27 // package-external:@wordpress/element 28 var require_element = __commonJS({ 29 "package-external:@wordpress/element"(exports, module) { 30 module.exports = window.wp.element; 31 } 32 }); 33 34 // package-external:@wordpress/data 35 var require_data = __commonJS({ 36 "package-external:@wordpress/data"(exports, module) { 37 module.exports = window.wp.data; 38 } 39 }); 40 41 // package-external:@wordpress/preferences 42 var require_preferences = __commonJS({ 43 "package-external:@wordpress/preferences"(exports, module) { 44 module.exports = window.wp.preferences; 45 } 46 }); 47 48 // package-external:@wordpress/components 49 var require_components = __commonJS({ 50 "package-external:@wordpress/components"(exports, module) { 51 module.exports = window.wp.components; 52 } 53 }); 54 55 // package-external:@wordpress/compose 56 var require_compose = __commonJS({ 57 "package-external:@wordpress/compose"(exports, module) { 58 module.exports = window.wp.compose; 59 } 60 }); 61 62 // package-external:@wordpress/i18n 63 var require_i18n = __commonJS({ 64 "package-external:@wordpress/i18n"(exports, module) { 65 module.exports = window.wp.i18n; 66 } 67 }); 68 69 // package-external:@wordpress/primitives 70 var require_primitives = __commonJS({ 71 "package-external:@wordpress/primitives"(exports, module) { 72 module.exports = window.wp.primitives; 73 } 74 }); 75 76 // vendor-external:react/jsx-runtime 77 var require_jsx_runtime = __commonJS({ 78 "vendor-external:react/jsx-runtime"(exports, module) { 79 module.exports = window.ReactJSXRuntime; 80 } 81 }); 82 83 // package-external:@wordpress/keycodes 84 var require_keycodes = __commonJS({ 85 "package-external:@wordpress/keycodes"(exports, module) { 86 module.exports = window.wp.keycodes; 87 } 88 }); 89 90 // package-external:@wordpress/private-apis 91 var require_private_apis = __commonJS({ 92 "package-external:@wordpress/private-apis"(exports, module) { 93 module.exports = window.wp.privateApis; 94 } 95 }); 96 97 // vendor-external:react 98 var require_react = __commonJS({ 99 "vendor-external:react"(exports, module) { 100 module.exports = window.React; 101 } 102 }); 103 104 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js 105 var require_use_sync_external_store_shim_development = __commonJS({ 106 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) { 107 "use strict"; 108 (function() { 109 function is(x2, y2) { 110 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2; 111 } 112 function useSyncExternalStore$2(subscribe2, getSnapshot) { 113 didWarnOld18Alpha || void 0 === React5.startTransition || (didWarnOld18Alpha = true, console.error( 114 "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release." 115 )); 116 var value = getSnapshot(); 117 if (!didWarnUncachedGetSnapshot) { 118 var cachedValue = getSnapshot(); 119 objectIs(value, cachedValue) || (console.error( 120 "The result of getSnapshot should be cached to avoid an infinite loop" 121 ), didWarnUncachedGetSnapshot = true); 122 } 123 cachedValue = useState23({ 124 inst: { value, getSnapshot } 125 }); 126 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1]; 127 useLayoutEffect2( 128 function() { 129 inst.value = value; 130 inst.getSnapshot = getSnapshot; 131 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 132 }, 133 [subscribe2, value, getSnapshot] 134 ); 135 useEffect17( 136 function() { 137 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 138 return subscribe2(function() { 139 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 140 }); 141 }, 142 [subscribe2] 143 ); 144 useDebugValue(value); 145 return value; 146 } 147 function checkIfSnapshotChanged(inst) { 148 var latestGetSnapshot = inst.getSnapshot; 149 inst = inst.value; 150 try { 151 var nextValue = latestGetSnapshot(); 152 return !objectIs(inst, nextValue); 153 } catch (error) { 154 return true; 155 } 156 } 157 function useSyncExternalStore$1(subscribe2, getSnapshot) { 158 return getSnapshot(); 159 } 160 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 161 var React5 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState23 = React5.useState, useEffect17 = React5.useEffect, useLayoutEffect2 = React5.useLayoutEffect, useDebugValue = React5.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; 162 exports.useSyncExternalStore = void 0 !== React5.useSyncExternalStore ? React5.useSyncExternalStore : shim; 163 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 164 })(); 165 } 166 }); 167 168 // node_modules/use-sync-external-store/shim/index.js 169 var require_shim = __commonJS({ 170 "node_modules/use-sync-external-store/shim/index.js"(exports, module) { 171 "use strict"; 172 if (false) { 173 module.exports = null; 174 } else { 175 module.exports = require_use_sync_external_store_shim_development(); 176 } 177 } 178 }); 179 180 // vendor-external:react-dom 181 var require_react_dom = __commonJS({ 182 "vendor-external:react-dom"(exports, module) { 183 module.exports = window.ReactDOM; 184 } 185 }); 186 187 // node_modules/remove-accents/index.js 188 var require_remove_accents = __commonJS({ 189 "node_modules/remove-accents/index.js"(exports, module) { 190 var characterMap = { 191 "\xC0": "A", 192 "\xC1": "A", 193 "\xC2": "A", 194 "\xC3": "A", 195 "\xC4": "A", 196 "\xC5": "A", 197 "\u1EA4": "A", 198 "\u1EAE": "A", 199 "\u1EB2": "A", 200 "\u1EB4": "A", 201 "\u1EB6": "A", 202 "\xC6": "AE", 203 "\u1EA6": "A", 204 "\u1EB0": "A", 205 "\u0202": "A", 206 "\u1EA2": "A", 207 "\u1EA0": "A", 208 "\u1EA8": "A", 209 "\u1EAA": "A", 210 "\u1EAC": "A", 211 "\xC7": "C", 212 "\u1E08": "C", 213 "\xC8": "E", 214 "\xC9": "E", 215 "\xCA": "E", 216 "\xCB": "E", 217 "\u1EBE": "E", 218 "\u1E16": "E", 219 "\u1EC0": "E", 220 "\u1E14": "E", 221 "\u1E1C": "E", 222 "\u0206": "E", 223 "\u1EBA": "E", 224 "\u1EBC": "E", 225 "\u1EB8": "E", 226 "\u1EC2": "E", 227 "\u1EC4": "E", 228 "\u1EC6": "E", 229 "\xCC": "I", 230 "\xCD": "I", 231 "\xCE": "I", 232 "\xCF": "I", 233 "\u1E2E": "I", 234 "\u020A": "I", 235 "\u1EC8": "I", 236 "\u1ECA": "I", 237 "\xD0": "D", 238 "\xD1": "N", 239 "\xD2": "O", 240 "\xD3": "O", 241 "\xD4": "O", 242 "\xD5": "O", 243 "\xD6": "O", 244 "\xD8": "O", 245 "\u1ED0": "O", 246 "\u1E4C": "O", 247 "\u1E52": "O", 248 "\u020E": "O", 249 "\u1ECE": "O", 250 "\u1ECC": "O", 251 "\u1ED4": "O", 252 "\u1ED6": "O", 253 "\u1ED8": "O", 254 "\u1EDC": "O", 255 "\u1EDE": "O", 256 "\u1EE0": "O", 257 "\u1EDA": "O", 258 "\u1EE2": "O", 259 "\xD9": "U", 260 "\xDA": "U", 261 "\xDB": "U", 262 "\xDC": "U", 263 "\u1EE6": "U", 264 "\u1EE4": "U", 265 "\u1EEC": "U", 266 "\u1EEE": "U", 267 "\u1EF0": "U", 268 "\xDD": "Y", 269 "\xE0": "a", 270 "\xE1": "a", 271 "\xE2": "a", 272 "\xE3": "a", 273 "\xE4": "a", 274 "\xE5": "a", 275 "\u1EA5": "a", 276 "\u1EAF": "a", 277 "\u1EB3": "a", 278 "\u1EB5": "a", 279 "\u1EB7": "a", 280 "\xE6": "ae", 281 "\u1EA7": "a", 282 "\u1EB1": "a", 283 "\u0203": "a", 284 "\u1EA3": "a", 285 "\u1EA1": "a", 286 "\u1EA9": "a", 287 "\u1EAB": "a", 288 "\u1EAD": "a", 289 "\xE7": "c", 290 "\u1E09": "c", 291 "\xE8": "e", 292 "\xE9": "e", 293 "\xEA": "e", 294 "\xEB": "e", 295 "\u1EBF": "e", 296 "\u1E17": "e", 297 "\u1EC1": "e", 298 "\u1E15": "e", 299 "\u1E1D": "e", 300 "\u0207": "e", 301 "\u1EBB": "e", 302 "\u1EBD": "e", 303 "\u1EB9": "e", 304 "\u1EC3": "e", 305 "\u1EC5": "e", 306 "\u1EC7": "e", 307 "\xEC": "i", 308 "\xED": "i", 309 "\xEE": "i", 310 "\xEF": "i", 311 "\u1E2F": "i", 312 "\u020B": "i", 313 "\u1EC9": "i", 314 "\u1ECB": "i", 315 "\xF0": "d", 316 "\xF1": "n", 317 "\xF2": "o", 318 "\xF3": "o", 319 "\xF4": "o", 320 "\xF5": "o", 321 "\xF6": "o", 322 "\xF8": "o", 323 "\u1ED1": "o", 324 "\u1E4D": "o", 325 "\u1E53": "o", 326 "\u020F": "o", 327 "\u1ECF": "o", 328 "\u1ECD": "o", 329 "\u1ED5": "o", 330 "\u1ED7": "o", 331 "\u1ED9": "o", 332 "\u1EDD": "o", 333 "\u1EDF": "o", 334 "\u1EE1": "o", 335 "\u1EDB": "o", 336 "\u1EE3": "o", 337 "\xF9": "u", 338 "\xFA": "u", 339 "\xFB": "u", 340 "\xFC": "u", 341 "\u1EE7": "u", 342 "\u1EE5": "u", 343 "\u1EED": "u", 344 "\u1EEF": "u", 345 "\u1EF1": "u", 346 "\xFD": "y", 347 "\xFF": "y", 348 "\u0100": "A", 349 "\u0101": "a", 350 "\u0102": "A", 351 "\u0103": "a", 352 "\u0104": "A", 353 "\u0105": "a", 354 "\u0106": "C", 355 "\u0107": "c", 356 "\u0108": "C", 357 "\u0109": "c", 358 "\u010A": "C", 359 "\u010B": "c", 360 "\u010C": "C", 361 "\u010D": "c", 362 "C\u0306": "C", 363 "c\u0306": "c", 364 "\u010E": "D", 365 "\u010F": "d", 366 "\u0110": "D", 367 "\u0111": "d", 368 "\u0112": "E", 369 "\u0113": "e", 370 "\u0114": "E", 371 "\u0115": "e", 372 "\u0116": "E", 373 "\u0117": "e", 374 "\u0118": "E", 375 "\u0119": "e", 376 "\u011A": "E", 377 "\u011B": "e", 378 "\u011C": "G", 379 "\u01F4": "G", 380 "\u011D": "g", 381 "\u01F5": "g", 382 "\u011E": "G", 383 "\u011F": "g", 384 "\u0120": "G", 385 "\u0121": "g", 386 "\u0122": "G", 387 "\u0123": "g", 388 "\u0124": "H", 389 "\u0125": "h", 390 "\u0126": "H", 391 "\u0127": "h", 392 "\u1E2A": "H", 393 "\u1E2B": "h", 394 "\u0128": "I", 395 "\u0129": "i", 396 "\u012A": "I", 397 "\u012B": "i", 398 "\u012C": "I", 399 "\u012D": "i", 400 "\u012E": "I", 401 "\u012F": "i", 402 "\u0130": "I", 403 "\u0131": "i", 404 "\u0132": "IJ", 405 "\u0133": "ij", 406 "\u0134": "J", 407 "\u0135": "j", 408 "\u0136": "K", 409 "\u0137": "k", 410 "\u1E30": "K", 411 "\u1E31": "k", 412 "K\u0306": "K", 413 "k\u0306": "k", 414 "\u0139": "L", 415 "\u013A": "l", 416 "\u013B": "L", 417 "\u013C": "l", 418 "\u013D": "L", 419 "\u013E": "l", 420 "\u013F": "L", 421 "\u0140": "l", 422 "\u0141": "l", 423 "\u0142": "l", 424 "\u1E3E": "M", 425 "\u1E3F": "m", 426 "M\u0306": "M", 427 "m\u0306": "m", 428 "\u0143": "N", 429 "\u0144": "n", 430 "\u0145": "N", 431 "\u0146": "n", 432 "\u0147": "N", 433 "\u0148": "n", 434 "\u0149": "n", 435 "N\u0306": "N", 436 "n\u0306": "n", 437 "\u014C": "O", 438 "\u014D": "o", 439 "\u014E": "O", 440 "\u014F": "o", 441 "\u0150": "O", 442 "\u0151": "o", 443 "\u0152": "OE", 444 "\u0153": "oe", 445 "P\u0306": "P", 446 "p\u0306": "p", 447 "\u0154": "R", 448 "\u0155": "r", 449 "\u0156": "R", 450 "\u0157": "r", 451 "\u0158": "R", 452 "\u0159": "r", 453 "R\u0306": "R", 454 "r\u0306": "r", 455 "\u0212": "R", 456 "\u0213": "r", 457 "\u015A": "S", 458 "\u015B": "s", 459 "\u015C": "S", 460 "\u015D": "s", 461 "\u015E": "S", 462 "\u0218": "S", 463 "\u0219": "s", 464 "\u015F": "s", 465 "\u0160": "S", 466 "\u0161": "s", 467 "\u0162": "T", 468 "\u0163": "t", 469 "\u021B": "t", 470 "\u021A": "T", 471 "\u0164": "T", 472 "\u0165": "t", 473 "\u0166": "T", 474 "\u0167": "t", 475 "T\u0306": "T", 476 "t\u0306": "t", 477 "\u0168": "U", 478 "\u0169": "u", 479 "\u016A": "U", 480 "\u016B": "u", 481 "\u016C": "U", 482 "\u016D": "u", 483 "\u016E": "U", 484 "\u016F": "u", 485 "\u0170": "U", 486 "\u0171": "u", 487 "\u0172": "U", 488 "\u0173": "u", 489 "\u0216": "U", 490 "\u0217": "u", 491 "V\u0306": "V", 492 "v\u0306": "v", 493 "\u0174": "W", 494 "\u0175": "w", 495 "\u1E82": "W", 496 "\u1E83": "w", 497 "X\u0306": "X", 498 "x\u0306": "x", 499 "\u0176": "Y", 500 "\u0177": "y", 501 "\u0178": "Y", 502 "Y\u0306": "Y", 503 "y\u0306": "y", 504 "\u0179": "Z", 505 "\u017A": "z", 506 "\u017B": "Z", 507 "\u017C": "z", 508 "\u017D": "Z", 509 "\u017E": "z", 510 "\u017F": "s", 511 "\u0192": "f", 512 "\u01A0": "O", 513 "\u01A1": "o", 514 "\u01AF": "U", 515 "\u01B0": "u", 516 "\u01CD": "A", 517 "\u01CE": "a", 518 "\u01CF": "I", 519 "\u01D0": "i", 520 "\u01D1": "O", 521 "\u01D2": "o", 522 "\u01D3": "U", 523 "\u01D4": "u", 524 "\u01D5": "U", 525 "\u01D6": "u", 526 "\u01D7": "U", 527 "\u01D8": "u", 528 "\u01D9": "U", 529 "\u01DA": "u", 530 "\u01DB": "U", 531 "\u01DC": "u", 532 "\u1EE8": "U", 533 "\u1EE9": "u", 534 "\u1E78": "U", 535 "\u1E79": "u", 536 "\u01FA": "A", 537 "\u01FB": "a", 538 "\u01FC": "AE", 539 "\u01FD": "ae", 540 "\u01FE": "O", 541 "\u01FF": "o", 542 "\xDE": "TH", 543 "\xFE": "th", 544 "\u1E54": "P", 545 "\u1E55": "p", 546 "\u1E64": "S", 547 "\u1E65": "s", 548 "X\u0301": "X", 549 "x\u0301": "x", 550 "\u0403": "\u0413", 551 "\u0453": "\u0433", 552 "\u040C": "\u041A", 553 "\u045C": "\u043A", 554 "A\u030B": "A", 555 "a\u030B": "a", 556 "E\u030B": "E", 557 "e\u030B": "e", 558 "I\u030B": "I", 559 "i\u030B": "i", 560 "\u01F8": "N", 561 "\u01F9": "n", 562 "\u1ED2": "O", 563 "\u1ED3": "o", 564 "\u1E50": "O", 565 "\u1E51": "o", 566 "\u1EEA": "U", 567 "\u1EEB": "u", 568 "\u1E80": "W", 569 "\u1E81": "w", 570 "\u1EF2": "Y", 571 "\u1EF3": "y", 572 "\u0200": "A", 573 "\u0201": "a", 574 "\u0204": "E", 575 "\u0205": "e", 576 "\u0208": "I", 577 "\u0209": "i", 578 "\u020C": "O", 579 "\u020D": "o", 580 "\u0210": "R", 581 "\u0211": "r", 582 "\u0214": "U", 583 "\u0215": "u", 584 "B\u030C": "B", 585 "b\u030C": "b", 586 "\u010C\u0323": "C", 587 "\u010D\u0323": "c", 588 "\xCA\u030C": "E", 589 "\xEA\u030C": "e", 590 "F\u030C": "F", 591 "f\u030C": "f", 592 "\u01E6": "G", 593 "\u01E7": "g", 594 "\u021E": "H", 595 "\u021F": "h", 596 "J\u030C": "J", 597 "\u01F0": "j", 598 "\u01E8": "K", 599 "\u01E9": "k", 600 "M\u030C": "M", 601 "m\u030C": "m", 602 "P\u030C": "P", 603 "p\u030C": "p", 604 "Q\u030C": "Q", 605 "q\u030C": "q", 606 "\u0158\u0329": "R", 607 "\u0159\u0329": "r", 608 "\u1E66": "S", 609 "\u1E67": "s", 610 "V\u030C": "V", 611 "v\u030C": "v", 612 "W\u030C": "W", 613 "w\u030C": "w", 614 "X\u030C": "X", 615 "x\u030C": "x", 616 "Y\u030C": "Y", 617 "y\u030C": "y", 618 "A\u0327": "A", 619 "a\u0327": "a", 620 "B\u0327": "B", 621 "b\u0327": "b", 622 "\u1E10": "D", 623 "\u1E11": "d", 624 "\u0228": "E", 625 "\u0229": "e", 626 "\u0190\u0327": "E", 627 "\u025B\u0327": "e", 628 "\u1E28": "H", 629 "\u1E29": "h", 630 "I\u0327": "I", 631 "i\u0327": "i", 632 "\u0197\u0327": "I", 633 "\u0268\u0327": "i", 634 "M\u0327": "M", 635 "m\u0327": "m", 636 "O\u0327": "O", 637 "o\u0327": "o", 638 "Q\u0327": "Q", 639 "q\u0327": "q", 640 "U\u0327": "U", 641 "u\u0327": "u", 642 "X\u0327": "X", 643 "x\u0327": "x", 644 "Z\u0327": "Z", 645 "z\u0327": "z", 646 "\u0439": "\u0438", 647 "\u0419": "\u0418", 648 "\u0451": "\u0435", 649 "\u0401": "\u0415" 650 }; 651 var chars = Object.keys(characterMap).join("|"); 652 var allAccents = new RegExp(chars, "g"); 653 var firstAccent = new RegExp(chars, ""); 654 function matcher(match2) { 655 return characterMap[match2]; 656 } 657 var removeAccents3 = function(string) { 658 return string.replace(allAccents, matcher); 659 }; 660 var hasAccents = function(string) { 661 return !!string.match(firstAccent); 662 }; 663 module.exports = removeAccents3; 664 module.exports.has = hasAccents; 665 module.exports.remove = removeAccents3; 666 } 667 }); 668 669 // node_modules/fast-deep-equal/es6/index.js 670 var require_es6 = __commonJS({ 671 "node_modules/fast-deep-equal/es6/index.js"(exports, module) { 672 "use strict"; 673 module.exports = function equal(a2, b2) { 674 if (a2 === b2) return true; 675 if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") { 676 if (a2.constructor !== b2.constructor) return false; 677 var length, i2, keys; 678 if (Array.isArray(a2)) { 679 length = a2.length; 680 if (length != b2.length) return false; 681 for (i2 = length; i2-- !== 0; ) 682 if (!equal(a2[i2], b2[i2])) return false; 683 return true; 684 } 685 if (a2 instanceof Map && b2 instanceof Map) { 686 if (a2.size !== b2.size) return false; 687 for (i2 of a2.entries()) 688 if (!b2.has(i2[0])) return false; 689 for (i2 of a2.entries()) 690 if (!equal(i2[1], b2.get(i2[0]))) return false; 691 return true; 692 } 693 if (a2 instanceof Set && b2 instanceof Set) { 694 if (a2.size !== b2.size) return false; 695 for (i2 of a2.entries()) 696 if (!b2.has(i2[0])) return false; 697 return true; 698 } 699 if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) { 700 length = a2.length; 701 if (length != b2.length) return false; 702 for (i2 = length; i2-- !== 0; ) 703 if (a2[i2] !== b2[i2]) return false; 704 return true; 705 } 706 if (a2.constructor === RegExp) return a2.source === b2.source && a2.flags === b2.flags; 707 if (a2.valueOf !== Object.prototype.valueOf) return a2.valueOf() === b2.valueOf(); 708 if (a2.toString !== Object.prototype.toString) return a2.toString() === b2.toString(); 709 keys = Object.keys(a2); 710 length = keys.length; 711 if (length !== Object.keys(b2).length) return false; 712 for (i2 = length; i2-- !== 0; ) 713 if (!Object.prototype.hasOwnProperty.call(b2, keys[i2])) return false; 714 for (i2 = length; i2-- !== 0; ) { 715 var key = keys[i2]; 716 if (!equal(a2[key], b2[key])) return false; 717 } 718 return true; 719 } 720 return a2 !== a2 && b2 !== b2; 721 }; 722 } 723 }); 724 725 // package-external:@wordpress/warning 726 var require_warning = __commonJS({ 727 "package-external:@wordpress/warning"(exports, module) { 728 module.exports = window.wp.warning; 729 } 730 }); 731 732 // package-external:@wordpress/date 733 var require_date = __commonJS({ 734 "package-external:@wordpress/date"(exports, module) { 735 module.exports = window.wp.date; 736 } 737 }); 738 739 // package-external:@wordpress/deprecated 740 var require_deprecated = __commonJS({ 741 "package-external:@wordpress/deprecated"(exports, module) { 742 module.exports = window.wp.deprecated; 743 } 744 }); 745 746 // package-external:@wordpress/core-data 747 var require_core_data = __commonJS({ 748 "package-external:@wordpress/core-data"(exports, module) { 749 module.exports = window.wp.coreData; 750 } 751 }); 752 753 // package-external:@wordpress/editor 754 var require_editor = __commonJS({ 755 "package-external:@wordpress/editor"(exports, module) { 756 module.exports = window.wp.editor; 757 } 758 }); 759 760 // package-external:@wordpress/patterns 761 var require_patterns = __commonJS({ 762 "package-external:@wordpress/patterns"(exports, module) { 763 module.exports = window.wp.patterns; 764 } 765 }); 766 767 // package-external:@wordpress/block-editor 768 var require_block_editor = __commonJS({ 769 "package-external:@wordpress/block-editor"(exports, module) { 770 module.exports = window.wp.blockEditor; 771 } 772 }); 773 774 // routes/pattern-list/stage.tsx 775 import { 776 useParams, 777 useNavigate, 778 useSearch, 779 Link, 780 useInvalidate 781 } from "@wordpress/route"; 782 783 // node_modules/dequal/dist/index.mjs 784 var has = Object.prototype.hasOwnProperty; 785 function find(iter, tar, key) { 786 for (key of iter.keys()) { 787 if (dequal(key, tar)) return key; 788 } 789 } 790 function dequal(foo, bar) { 791 var ctor, len, tmp; 792 if (foo === bar) return true; 793 if (foo && bar && (ctor = foo.constructor) === bar.constructor) { 794 if (ctor === Date) return foo.getTime() === bar.getTime(); 795 if (ctor === RegExp) return foo.toString() === bar.toString(); 796 if (ctor === Array) { 797 if ((len = foo.length) === bar.length) { 798 while (len-- && dequal(foo[len], bar[len])) ; 799 } 800 return len === -1; 801 } 802 if (ctor === Set) { 803 if (foo.size !== bar.size) { 804 return false; 805 } 806 for (len of foo) { 807 tmp = len; 808 if (tmp && typeof tmp === "object") { 809 tmp = find(bar, tmp); 810 if (!tmp) return false; 811 } 812 if (!bar.has(tmp)) return false; 813 } 814 return true; 815 } 816 if (ctor === Map) { 817 if (foo.size !== bar.size) { 818 return false; 819 } 820 for (len of foo) { 821 tmp = len[0]; 822 if (tmp && typeof tmp === "object") { 823 tmp = find(bar, tmp); 824 if (!tmp) return false; 825 } 826 if (!dequal(len[1], bar.get(tmp))) { 827 return false; 828 } 829 } 830 return true; 831 } 832 if (ctor === ArrayBuffer) { 833 foo = new Uint8Array(foo); 834 bar = new Uint8Array(bar); 835 } else if (ctor === DataView) { 836 if ((len = foo.byteLength) === bar.byteLength) { 837 while (len-- && foo.getInt8(len) === bar.getInt8(len)) ; 838 } 839 return len === -1; 840 } 841 if (ArrayBuffer.isView(foo)) { 842 if ((len = foo.byteLength) === bar.byteLength) { 843 while (len-- && foo[len] === bar[len]) ; 844 } 845 return len === -1; 846 } 847 if (!ctor || typeof foo === "object") { 848 len = 0; 849 for (ctor in foo) { 850 if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false; 851 if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false; 852 } 853 return Object.keys(bar).length === len; 854 } 855 } 856 return foo !== foo && bar !== bar; 857 } 858 859 // packages/views/build-module/preference-keys.js 860 function generatePreferenceKey(kind, name, slug) { 861 return `dataviews-$kind}-$name}-$slug}`; 862 } 863 864 // packages/views/build-module/use-view.js 865 var import_element = __toESM(require_element()); 866 var import_data = __toESM(require_data()); 867 var import_preferences = __toESM(require_preferences()); 868 function omit(obj, keys) { 869 const result = { ...obj }; 870 for (const key of keys) { 871 delete result[key]; 872 } 873 return result; 874 } 875 function useView(config) { 876 const { kind, name, slug, defaultView, queryParams, onChangeQueryParams } = config; 877 const preferenceKey = generatePreferenceKey(kind, name, slug); 878 const persistedView = (0, import_data.useSelect)( 879 (select2) => { 880 return select2(import_preferences.store).get( 881 "core/views", 882 preferenceKey 883 ); 884 }, 885 [preferenceKey] 886 ); 887 const { set } = (0, import_data.useDispatch)(import_preferences.store); 888 const baseView = persistedView ?? defaultView; 889 const page = Number(queryParams?.page ?? baseView.page ?? 1); 890 const search = queryParams?.search ?? baseView.search ?? ""; 891 const view = (0, import_element.useMemo)(() => { 892 return { 893 ...baseView, 894 page, 895 search 896 }; 897 }, [baseView, page, search]); 898 const isModified = !!persistedView; 899 const updateView = (0, import_element.useCallback)( 900 (newView) => { 901 const urlParams = { 902 page: newView?.page, 903 search: newView?.search 904 }; 905 const preferenceView = omit(newView, ["page", "search"]); 906 if (onChangeQueryParams && !dequal(urlParams, { page, search })) { 907 onChangeQueryParams(urlParams); 908 } 909 if (!dequal(baseView, preferenceView)) { 910 if (dequal(preferenceView, defaultView)) { 911 set("core/views", preferenceKey, void 0); 912 } else { 913 set("core/views", preferenceKey, preferenceView); 914 } 915 } 916 }, 917 [ 918 onChangeQueryParams, 919 page, 920 search, 921 baseView, 922 defaultView, 923 set, 924 preferenceKey 925 ] 926 ); 927 const resetToDefault = (0, import_element.useCallback)(() => { 928 set("core/views", preferenceKey, void 0); 929 }, [preferenceKey, set]); 930 return { 931 view, 932 isModified, 933 updateView, 934 resetToDefault 935 }; 936 } 937 938 // packages/views/build-module/load-view.js 939 var import_data2 = __toESM(require_data()); 940 var import_preferences2 = __toESM(require_preferences()); 941 942 // packages/dataviews/build-module/components/dataviews/index.js 943 var import_components49 = __toESM(require_components()); 944 var import_element52 = __toESM(require_element()); 945 var import_compose11 = __toESM(require_compose()); 946 947 // packages/dataviews/build-module/components/dataviews-context/index.js 948 var import_element2 = __toESM(require_element()); 949 950 // packages/dataviews/build-module/constants.js 951 var import_i18n = __toESM(require_i18n()); 952 953 // packages/icons/build-module/library/arrow-down.js 954 var import_primitives = __toESM(require_primitives()); 955 var import_jsx_runtime = __toESM(require_jsx_runtime()); 956 var arrow_down_default = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_primitives.Path, { d: "m16.5 13.5-3.7 3.7V4h-1.5v13.2l-3.8-3.7-1 1 5.5 5.6 5.5-5.6z" }) }); 957 958 // packages/icons/build-module/library/arrow-left.js 959 var import_primitives2 = __toESM(require_primitives()); 960 var import_jsx_runtime2 = __toESM(require_jsx_runtime()); 961 var arrow_left_default = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_primitives2.Path, { d: "M20 11.2H6.8l3.7-3.7-1-1L3.9 12l5.6 5.5 1-1-3.7-3.7H20z" }) }); 962 963 // packages/icons/build-module/library/arrow-right.js 964 var import_primitives3 = __toESM(require_primitives()); 965 var import_jsx_runtime3 = __toESM(require_jsx_runtime()); 966 var arrow_right_default = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_primitives3.Path, { d: "m14.5 6.5-1 1 3.7 3.7H4v1.6h13.2l-3.7 3.7 1 1 5.6-5.5z" }) }); 967 968 // packages/icons/build-module/library/arrow-up.js 969 var import_primitives4 = __toESM(require_primitives()); 970 var import_jsx_runtime4 = __toESM(require_jsx_runtime()); 971 var arrow_up_default = /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_primitives4.Path, { d: "M12 3.9 6.5 9.5l1 1 3.8-3.7V20h1.5V6.8l3.7 3.7 1-1z" }) }); 972 973 // packages/icons/build-module/library/block-table.js 974 var import_primitives5 = __toESM(require_primitives()); 975 var import_jsx_runtime5 = __toESM(require_jsx_runtime()); 976 var block_table_default = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_primitives5.Path, { d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM5 4.5h14c.3 0 .5.2.5.5v3.5h-15V5c0-.3.2-.5.5-.5zm8 5.5h6.5v3.5H13V10zm-1.5 3.5h-7V10h7v3.5zm-7 5.5v-4h7v4.5H5c-.3 0-.5-.2-.5-.5zm14.5.5h-6V15h6.5v4c0 .3-.2.5-.5.5z" }) }); 977 978 // packages/icons/build-module/library/category.js 979 var import_primitives6 = __toESM(require_primitives()); 980 var import_jsx_runtime6 = __toESM(require_jsx_runtime()); 981 var category_default = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_primitives6.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)( 982 import_primitives6.Path, 983 { 984 d: "M6 5.5h3a.5.5 0 01.5.5v3a.5.5 0 01-.5.5H6a.5.5 0 01-.5-.5V6a.5.5 0 01.5-.5zM4 6a2 2 0 012-2h3a2 2 0 012 2v3a2 2 0 01-2 2H6a2 2 0 01-2-2V6zm11-.5h3a.5.5 0 01.5.5v3a.5.5 0 01-.5.5h-3a.5.5 0 01-.5-.5V6a.5.5 0 01.5-.5zM13 6a2 2 0 012-2h3a2 2 0 012 2v3a2 2 0 01-2 2h-3a2 2 0 01-2-2V6zm5 8.5h-3a.5.5 0 00-.5.5v3a.5.5 0 00.5.5h3a.5.5 0 00.5-.5v-3a.5.5 0 00-.5-.5zM15 13a2 2 0 00-2 2v3a2 2 0 002 2h3a2 2 0 002-2v-3a2 2 0 00-2-2h-3zm-9 1.5h3a.5.5 0 01.5.5v3a.5.5 0 01-.5.5H6a.5.5 0 01-.5-.5v-3a.5.5 0 01.5-.5zM4 15a2 2 0 012-2h3a2 2 0 012 2v3a2 2 0 01-2 2H6a2 2 0 01-2-2v-3z", 985 fillRule: "evenodd", 986 clipRule: "evenodd" 987 } 988 ) }); 989 990 // packages/icons/build-module/library/check.js 991 var import_primitives7 = __toESM(require_primitives()); 992 var import_jsx_runtime7 = __toESM(require_jsx_runtime()); 993 var check_default = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.Path, { d: "M16.5 7.5 10 13.9l-2.5-2.4-1 1 3.5 3.6 7.5-7.6z" }) }); 994 995 // packages/icons/build-module/library/close-small.js 996 var import_primitives8 = __toESM(require_primitives()); 997 var import_jsx_runtime8 = __toESM(require_jsx_runtime()); 998 var close_small_default = /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_primitives8.Path, { d: "M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z" }) }); 999 1000 // packages/icons/build-module/library/cog.js 1001 var import_primitives9 = __toESM(require_primitives()); 1002 var import_jsx_runtime9 = __toESM(require_jsx_runtime()); 1003 var cog_default = /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_primitives9.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)( 1004 import_primitives9.Path, 1005 { 1006 fillRule: "evenodd", 1007 d: "M10.289 4.836A1 1 0 0111.275 4h1.306a1 1 0 01.987.836l.244 1.466c.787.26 1.503.679 2.108 1.218l1.393-.522a1 1 0 011.216.437l.653 1.13a1 1 0 01-.23 1.273l-1.148.944a6.025 6.025 0 010 2.435l1.149.946a1 1 0 01.23 1.272l-.653 1.13a1 1 0 01-1.216.437l-1.394-.522c-.605.54-1.32.958-2.108 1.218l-.244 1.466a1 1 0 01-.987.836h-1.306a1 1 0 01-.986-.836l-.244-1.466a5.995 5.995 0 01-2.108-1.218l-1.394.522a1 1 0 01-1.217-.436l-.653-1.131a1 1 0 01.23-1.272l1.149-.946a6.026 6.026 0 010-2.435l-1.148-.944a1 1 0 01-.23-1.272l.653-1.131a1 1 0 011.217-.437l1.393.522a5.994 5.994 0 012.108-1.218l.244-1.466zM14.929 12a3 3 0 11-6 0 3 3 0 016 0z", 1008 clipRule: "evenodd" 1009 } 1010 ) }); 1011 1012 // packages/icons/build-module/library/envelope.js 1013 var import_primitives10 = __toESM(require_primitives()); 1014 var import_jsx_runtime10 = __toESM(require_jsx_runtime()); 1015 var envelope_default = /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_primitives10.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)( 1016 import_primitives10.Path, 1017 { 1018 fillRule: "evenodd", 1019 clipRule: "evenodd", 1020 d: "M3 7c0-1.1.9-2 2-2h14a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Zm2-.5h14c.3 0 .5.2.5.5v1L12 13.5 4.5 7.9V7c0-.3.2-.5.5-.5Zm-.5 3.3V17c0 .3.2.5.5.5h14c.3 0 .5-.2.5-.5V9.8L12 15.4 4.5 9.8Z" 1021 } 1022 ) }); 1023 1024 // packages/icons/build-module/library/error.js 1025 var import_primitives11 = __toESM(require_primitives()); 1026 var import_jsx_runtime11 = __toESM(require_jsx_runtime()); 1027 var error_default = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( 1028 import_primitives11.Path, 1029 { 1030 fillRule: "evenodd", 1031 clipRule: "evenodd", 1032 d: "M12.218 5.377a.25.25 0 0 0-.436 0l-7.29 12.96a.25.25 0 0 0 .218.373h14.58a.25.25 0 0 0 .218-.372l-7.29-12.96Zm-1.743-.735c.669-1.19 2.381-1.19 3.05 0l7.29 12.96a1.75 1.75 0 0 1-1.525 2.608H4.71a1.75 1.75 0 0 1-1.525-2.608l7.29-12.96ZM12.75 17.46h-1.5v-1.5h1.5v1.5Zm-1.5-3h1.5v-5h-1.5v5Z" 1033 } 1034 ) }); 1035 1036 // packages/icons/build-module/library/format-list-bullets-rtl.js 1037 var import_primitives12 = __toESM(require_primitives()); 1038 var import_jsx_runtime12 = __toESM(require_jsx_runtime()); 1039 var format_list_bullets_rtl_default = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.Path, { d: "M4 8.8h8.9V7.2H4v1.6zm0 7h8.9v-1.5H4v1.5zM18 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z" }) }); 1040 1041 // packages/icons/build-module/library/format-list-bullets.js 1042 var import_primitives13 = __toESM(require_primitives()); 1043 var import_jsx_runtime13 = __toESM(require_jsx_runtime()); 1044 var format_list_bullets_default = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.Path, { d: "M11.1 15.8H20v-1.5h-8.9v1.5zm0-8.6v1.5H20V7.2h-8.9zM6 13c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-7c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" }) }); 1045 1046 // packages/icons/build-module/library/funnel.js 1047 var import_primitives14 = __toESM(require_primitives()); 1048 var import_jsx_runtime14 = __toESM(require_jsx_runtime()); 1049 var funnel_default = /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.Path, { d: "M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z" }) }); 1050 1051 // packages/icons/build-module/library/link.js 1052 var import_primitives15 = __toESM(require_primitives()); 1053 var import_jsx_runtime15 = __toESM(require_jsx_runtime()); 1054 var link_default = /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_primitives15.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_primitives15.Path, { d: "M10 17.389H8.444A5.194 5.194 0 1 1 8.444 7H10v1.5H8.444a3.694 3.694 0 0 0 0 7.389H10v1.5ZM14 7h1.556a5.194 5.194 0 0 1 0 10.39H14v-1.5h1.556a3.694 3.694 0 0 0 0-7.39H14V7Zm-4.5 6h5v-1.5h-5V13Z" }) }); 1055 1056 // packages/icons/build-module/library/mobile.js 1057 var import_primitives16 = __toESM(require_primitives()); 1058 var import_jsx_runtime16 = __toESM(require_jsx_runtime()); 1059 var mobile_default = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.Path, { d: "M15 4H9c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h6c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm.5 14c0 .3-.2.5-.5.5H9c-.3 0-.5-.2-.5-.5V6c0-.3.2-.5.5-.5h6c.3 0 .5.2.5.5v12zm-4.5-.5h2V16h-2v1.5z" }) }); 1060 1061 // packages/icons/build-module/library/more-vertical.js 1062 var import_primitives17 = __toESM(require_primitives()); 1063 var import_jsx_runtime17 = __toESM(require_jsx_runtime()); 1064 var more_vertical_default = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.Path, { d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" }) }); 1065 1066 // packages/icons/build-module/library/next.js 1067 var import_primitives18 = __toESM(require_primitives()); 1068 var import_jsx_runtime18 = __toESM(require_jsx_runtime()); 1069 var next_default = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_primitives18.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_primitives18.Path, { d: "M6.6 6L5.4 7l4.5 5-4.5 5 1.1 1 5.5-6-5.4-6zm6 0l-1.1 1 4.5 5-4.5 5 1.1 1 5.5-6-5.5-6z" }) }); 1070 1071 // packages/icons/build-module/library/previous.js 1072 var import_primitives19 = __toESM(require_primitives()); 1073 var import_jsx_runtime19 = __toESM(require_jsx_runtime()); 1074 var previous_default = /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_primitives19.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_primitives19.Path, { d: "M11.6 7l-1.1-1L5 12l5.5 6 1.1-1L7 12l4.6-5zm6 0l-1.1-1-5.5 6 5.5 6 1.1-1-4.6-5 4.6-5z" }) }); 1075 1076 // packages/icons/build-module/library/scheduled.js 1077 var import_primitives20 = __toESM(require_primitives()); 1078 var import_jsx_runtime20 = __toESM(require_jsx_runtime()); 1079 var scheduled_default = /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_primitives20.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)( 1080 import_primitives20.Path, 1081 { 1082 fillRule: "evenodd", 1083 clipRule: "evenodd", 1084 d: "M12 18.5a6.5 6.5 0 1 1 0-13 6.5 6.5 0 0 1 0 13ZM4 12a8 8 0 1 1 16 0 8 8 0 0 1-16 0Zm9 1V8h-1.5v3.5h-2V13H13Z" 1085 } 1086 ) }); 1087 1088 // packages/icons/build-module/library/search.js 1089 var import_primitives21 = __toESM(require_primitives()); 1090 var import_jsx_runtime21 = __toESM(require_jsx_runtime()); 1091 var search_default = /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_primitives21.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_primitives21.Path, { d: "M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z" }) }); 1092 1093 // packages/icons/build-module/library/seen.js 1094 var import_primitives22 = __toESM(require_primitives()); 1095 var import_jsx_runtime22 = __toESM(require_jsx_runtime()); 1096 var seen_default = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.Path, { d: "M3.99961 13C4.67043 13.3354 4.6703 13.3357 4.67017 13.3359L4.67298 13.3305C4.67621 13.3242 4.68184 13.3135 4.68988 13.2985C4.70595 13.2686 4.7316 13.2218 4.76695 13.1608C4.8377 13.0385 4.94692 12.8592 5.09541 12.6419C5.39312 12.2062 5.84436 11.624 6.45435 11.0431C7.67308 9.88241 9.49719 8.75 11.9996 8.75C14.502 8.75 16.3261 9.88241 17.5449 11.0431C18.1549 11.624 18.6061 12.2062 18.9038 12.6419C19.0523 12.8592 19.1615 13.0385 19.2323 13.1608C19.2676 13.2218 19.2933 13.2686 19.3093 13.2985C19.3174 13.3135 19.323 13.3242 19.3262 13.3305L19.3291 13.3359C19.3289 13.3357 19.3288 13.3354 19.9996 13C20.6704 12.6646 20.6703 12.6643 20.6701 12.664L20.6697 12.6632L20.6688 12.6614L20.6662 12.6563L20.6583 12.6408C20.6517 12.6282 20.6427 12.6108 20.631 12.5892C20.6078 12.5459 20.5744 12.4852 20.5306 12.4096C20.4432 12.2584 20.3141 12.0471 20.1423 11.7956C19.7994 11.2938 19.2819 10.626 18.5794 9.9569C17.1731 8.61759 14.9972 7.25 11.9996 7.25C9.00203 7.25 6.82614 8.61759 5.41987 9.9569C4.71736 10.626 4.19984 11.2938 3.85694 11.7956C3.68511 12.0471 3.55605 12.2584 3.4686 12.4096C3.42484 12.4852 3.39142 12.5459 3.36818 12.5892C3.35656 12.6108 3.34748 12.6282 3.34092 12.6408L3.33297 12.6563L3.33041 12.6614L3.32948 12.6632L3.32911 12.664C3.32894 12.6643 3.32879 12.6646 3.99961 13ZM11.9996 16C13.9326 16 15.4996 14.433 15.4996 12.5C15.4996 10.567 13.9326 9 11.9996 9C10.0666 9 8.49961 10.567 8.49961 12.5C8.49961 14.433 10.0666 16 11.9996 16Z" }) }); 1097 1098 // packages/icons/build-module/library/unseen.js 1099 var import_primitives23 = __toESM(require_primitives()); 1100 var import_jsx_runtime23 = __toESM(require_jsx_runtime()); 1101 var unseen_default = /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.Path, { d: "M20.7 12.7s0-.1-.1-.2c0-.2-.2-.4-.4-.6-.3-.5-.9-1.2-1.6-1.8-.7-.6-1.5-1.3-2.6-1.8l-.6 1.4c.9.4 1.6 1 2.1 1.5.6.6 1.1 1.2 1.4 1.6.1.2.3.4.3.5v.1l.7-.3.7-.3Zm-5.2-9.3-1.8 4c-.5-.1-1.1-.2-1.7-.2-3 0-5.2 1.4-6.6 2.7-.7.7-1.2 1.3-1.6 1.8-.2.3-.3.5-.4.6 0 0 0 .1-.1.2s0 0 .7.3l.7.3V13c0-.1.2-.3.3-.5.3-.4.7-1 1.4-1.6 1.2-1.2 3-2.3 5.5-2.3H13v.3c-.4 0-.8-.1-1.1-.1-1.9 0-3.5 1.6-3.5 3.5s.6 2.3 1.6 2.9l-2 4.4.9.4 7.6-16.2-.9-.4Zm-3 12.6c1.7-.2 3-1.7 3-3.5s-.2-1.4-.6-1.9L12.4 16Z" }) }); 1102 1103 // packages/dataviews/build-module/constants.js 1104 var OPERATOR_IS_ANY = "isAny"; 1105 var OPERATOR_IS_NONE = "isNone"; 1106 var OPERATOR_IS_ALL = "isAll"; 1107 var OPERATOR_IS_NOT_ALL = "isNotAll"; 1108 var OPERATOR_BETWEEN = "between"; 1109 var OPERATOR_IN_THE_PAST = "inThePast"; 1110 var OPERATOR_OVER = "over"; 1111 var OPERATOR_IS = "is"; 1112 var OPERATOR_IS_NOT = "isNot"; 1113 var OPERATOR_LESS_THAN = "lessThan"; 1114 var OPERATOR_GREATER_THAN = "greaterThan"; 1115 var OPERATOR_LESS_THAN_OR_EQUAL = "lessThanOrEqual"; 1116 var OPERATOR_GREATER_THAN_OR_EQUAL = "greaterThanOrEqual"; 1117 var OPERATOR_BEFORE = "before"; 1118 var OPERATOR_AFTER = "after"; 1119 var OPERATOR_BEFORE_INC = "beforeInc"; 1120 var OPERATOR_AFTER_INC = "afterInc"; 1121 var OPERATOR_CONTAINS = "contains"; 1122 var OPERATOR_NOT_CONTAINS = "notContains"; 1123 var OPERATOR_STARTS_WITH = "startsWith"; 1124 var OPERATOR_ON = "on"; 1125 var OPERATOR_NOT_ON = "notOn"; 1126 var SORTING_DIRECTIONS = ["asc", "desc"]; 1127 var sortArrows = { asc: "\u2191", desc: "\u2193" }; 1128 var sortValues = { asc: "ascending", desc: "descending" }; 1129 var sortLabels = { 1130 asc: (0, import_i18n.__)("Sort ascending"), 1131 desc: (0, import_i18n.__)("Sort descending") 1132 }; 1133 var sortIcons = { 1134 asc: arrow_up_default, 1135 desc: arrow_down_default 1136 }; 1137 var LAYOUT_TABLE = "table"; 1138 var LAYOUT_GRID = "grid"; 1139 var LAYOUT_LIST = "list"; 1140 var LAYOUT_ACTIVITY = "activity"; 1141 var LAYOUT_PICKER_GRID = "pickerGrid"; 1142 var LAYOUT_PICKER_TABLE = "pickerTable"; 1143 1144 // packages/dataviews/build-module/components/dataviews-context/index.js 1145 var DataViewsContext = (0, import_element2.createContext)({ 1146 view: { type: LAYOUT_TABLE }, 1147 onChangeView: () => { 1148 }, 1149 fields: [], 1150 data: [], 1151 paginationInfo: { 1152 totalItems: 0, 1153 totalPages: 0 1154 }, 1155 selection: [], 1156 onChangeSelection: () => { 1157 }, 1158 setOpenedFilter: () => { 1159 }, 1160 openedFilter: null, 1161 getItemId: (item) => item.id, 1162 isItemClickable: () => true, 1163 renderItemLink: void 0, 1164 containerWidth: 0, 1165 containerRef: (0, import_element2.createRef)(), 1166 resizeObserverRef: () => { 1167 }, 1168 defaultLayouts: { list: {}, grid: {}, table: {} }, 1169 filters: [], 1170 isShowingFilter: false, 1171 setIsShowingFilter: () => { 1172 }, 1173 hasInfiniteScrollHandler: false, 1174 config: { 1175 perPageSizes: [] 1176 } 1177 }); 1178 DataViewsContext.displayName = "DataViewsContext"; 1179 var dataviews_context_default = DataViewsContext; 1180 1181 // packages/dataviews/build-module/dataviews-layouts/index.js 1182 var import_i18n20 = __toESM(require_i18n()); 1183 1184 // node_modules/clsx/dist/clsx.mjs 1185 function r(e2) { 1186 var t2, f2, n2 = ""; 1187 if ("string" == typeof e2 || "number" == typeof e2) n2 += e2; 1188 else if ("object" == typeof e2) if (Array.isArray(e2)) { 1189 var o2 = e2.length; 1190 for (t2 = 0; t2 < o2; t2++) e2[t2] && (f2 = r(e2[t2])) && (n2 && (n2 += " "), n2 += f2); 1191 } else for (f2 in e2) e2[f2] && (n2 && (n2 += " "), n2 += f2); 1192 return n2; 1193 } 1194 function clsx() { 1195 for (var e2, t2, f2 = 0, n2 = "", o2 = arguments.length; f2 < o2; f2++) (e2 = arguments[f2]) && (t2 = r(e2)) && (n2 && (n2 += " "), n2 += t2); 1196 return n2; 1197 } 1198 var clsx_default = clsx; 1199 1200 // packages/dataviews/build-module/dataviews-layouts/table/index.js 1201 var import_i18n8 = __toESM(require_i18n()); 1202 var import_components7 = __toESM(require_components()); 1203 var import_element9 = __toESM(require_element()); 1204 var import_keycodes = __toESM(require_keycodes()); 1205 1206 // packages/dataviews/build-module/components/dataviews-selection-checkbox/index.js 1207 var import_components = __toESM(require_components()); 1208 var import_i18n2 = __toESM(require_i18n()); 1209 var import_jsx_runtime24 = __toESM(require_jsx_runtime()); 1210 function DataViewsSelectionCheckbox({ 1211 selection, 1212 onChangeSelection, 1213 item, 1214 getItemId, 1215 titleField, 1216 disabled, 1217 ...extraProps 1218 }) { 1219 const id = getItemId(item); 1220 const checked = !disabled && selection.includes(id); 1221 const selectionLabel = titleField?.getValue?.({ item }) || (0, import_i18n2.__)("(no title)"); 1222 return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)( 1223 import_components.CheckboxControl, 1224 { 1225 className: "dataviews-selection-checkbox", 1226 "aria-label": selectionLabel, 1227 "aria-disabled": disabled, 1228 checked, 1229 onChange: () => { 1230 if (disabled) { 1231 return; 1232 } 1233 onChangeSelection( 1234 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id] 1235 ); 1236 }, 1237 ...extraProps 1238 } 1239 ); 1240 } 1241 1242 // packages/dataviews/build-module/components/dataviews-item-actions/index.js 1243 var import_components2 = __toESM(require_components()); 1244 var import_i18n3 = __toESM(require_i18n()); 1245 var import_element3 = __toESM(require_element()); 1246 var import_data3 = __toESM(require_data()); 1247 var import_compose = __toESM(require_compose()); 1248 1249 // packages/dataviews/build-module/lock-unlock.js 1250 var import_private_apis = __toESM(require_private_apis()); 1251 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 1252 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 1253 "@wordpress/dataviews" 1254 ); 1255 1256 // packages/dataviews/build-module/components/dataviews-item-actions/index.js 1257 var import_jsx_runtime25 = __toESM(require_jsx_runtime()); 1258 var { Menu, kebabCase } = unlock(import_components2.privateApis); 1259 function ButtonTrigger({ 1260 action, 1261 onClick, 1262 items, 1263 variant 1264 }) { 1265 const label = typeof action.label === "string" ? action.label : action.label(items); 1266 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1267 import_components2.Button, 1268 { 1269 disabled: !!action.disabled, 1270 accessibleWhenDisabled: true, 1271 size: "compact", 1272 variant, 1273 onClick, 1274 children: label 1275 } 1276 ); 1277 } 1278 function MenuItemTrigger({ 1279 action, 1280 onClick, 1281 items 1282 }) { 1283 const label = typeof action.label === "string" ? action.label : action.label(items); 1284 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Item, { disabled: action.disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.ItemLabel, { children: label }) }); 1285 } 1286 function ActionModal({ 1287 action, 1288 items, 1289 closeModal 1290 }) { 1291 const label = typeof action.label === "string" ? action.label : action.label(items); 1292 const modalHeader = typeof action.modalHeader === "function" ? action.modalHeader(items) : action.modalHeader; 1293 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1294 import_components2.Modal, 1295 { 1296 title: modalHeader || label, 1297 __experimentalHideHeader: !!action.hideModalHeader, 1298 onRequestClose: closeModal, 1299 focusOnMount: action.modalFocusOnMount ?? true, 1300 size: action.modalSize || "medium", 1301 overlayClassName: `dataviews-action-modal dataviews-action-modal__$kebabCase( 1302 action.id 1303 )}`, 1304 children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(action.RenderModal, { items, closeModal }) 1305 } 1306 ); 1307 } 1308 function ActionsMenuGroup({ 1309 actions, 1310 item, 1311 registry, 1312 setActiveModalAction 1313 }) { 1314 const { primaryActions, regularActions } = (0, import_element3.useMemo)(() => { 1315 return actions.reduce( 1316 (acc, action) => { 1317 (action.isPrimary ? acc.primaryActions : acc.regularActions).push(action); 1318 return acc; 1319 }, 1320 { 1321 primaryActions: [], 1322 regularActions: [] 1323 } 1324 ); 1325 }, [actions]); 1326 const renderActionGroup = (actionList) => actionList.map((action) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1327 MenuItemTrigger, 1328 { 1329 action, 1330 onClick: () => { 1331 if ("RenderModal" in action) { 1332 setActiveModalAction(action); 1333 return; 1334 } 1335 action.callback([item], { registry }); 1336 }, 1337 items: [item] 1338 }, 1339 action.id 1340 )); 1341 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Menu.Group, { children: [ 1342 renderActionGroup(primaryActions), 1343 primaryActions.length > 0 && regularActions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Separator, {}), 1344 renderActionGroup(regularActions) 1345 ] }); 1346 } 1347 function ItemActions({ 1348 item, 1349 actions, 1350 isCompact 1351 }) { 1352 const registry = (0, import_data3.useRegistry)(); 1353 const { primaryActions, eligibleActions } = (0, import_element3.useMemo)(() => { 1354 const _eligibleActions = actions.filter( 1355 (action) => !action.isEligible || action.isEligible(item) 1356 ); 1357 const _primaryActions = _eligibleActions.filter( 1358 (action) => action.isPrimary 1359 ); 1360 return { 1361 primaryActions: _primaryActions, 1362 eligibleActions: _eligibleActions 1363 }; 1364 }, [actions, item]); 1365 if (isCompact) { 1366 return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1367 CompactItemActions, 1368 { 1369 item, 1370 actions: eligibleActions, 1371 isSmall: true, 1372 registry 1373 } 1374 ); 1375 } 1376 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)( 1377 import_components2.__experimentalHStack, 1378 { 1379 spacing: 0, 1380 justify: "flex-end", 1381 className: "dataviews-item-actions", 1382 style: { 1383 flexShrink: 0, 1384 width: "auto" 1385 }, 1386 children: [ 1387 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1388 PrimaryActions, 1389 { 1390 item, 1391 actions: primaryActions, 1392 registry 1393 } 1394 ), 1395 primaryActions.length < eligibleActions.length && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1396 CompactItemActions, 1397 { 1398 item, 1399 actions: eligibleActions, 1400 registry 1401 } 1402 ) 1403 ] 1404 } 1405 ); 1406 } 1407 function CompactItemActions({ 1408 item, 1409 actions, 1410 isSmall, 1411 registry 1412 }) { 1413 const [activeModalAction, setActiveModalAction] = (0, import_element3.useState)( 1414 null 1415 ); 1416 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [ 1417 /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(Menu, { placement: "bottom-end", children: [ 1418 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1419 Menu.TriggerButton, 1420 { 1421 render: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1422 import_components2.Button, 1423 { 1424 size: isSmall ? "small" : "compact", 1425 icon: more_vertical_default, 1426 label: (0, import_i18n3.__)("Actions"), 1427 accessibleWhenDisabled: true, 1428 disabled: !actions.length, 1429 className: "dataviews-all-actions-button" 1430 } 1431 ) 1432 } 1433 ), 1434 /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Menu.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1435 ActionsMenuGroup, 1436 { 1437 actions, 1438 item, 1439 registry, 1440 setActiveModalAction 1441 } 1442 ) }) 1443 ] }), 1444 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1445 ActionModal, 1446 { 1447 action: activeModalAction, 1448 items: [item], 1449 closeModal: () => setActiveModalAction(null) 1450 } 1451 ) 1452 ] }); 1453 } 1454 function PrimaryActions({ 1455 item, 1456 actions, 1457 registry, 1458 buttonVariant 1459 }) { 1460 const [activeModalAction, setActiveModalAction] = (0, import_element3.useState)(null); 1461 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<"); 1462 if (isMobileViewport) { 1463 return null; 1464 } 1465 if (!Array.isArray(actions) || actions.length === 0) { 1466 return null; 1467 } 1468 return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [ 1469 actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1470 ButtonTrigger, 1471 { 1472 action, 1473 onClick: () => { 1474 if ("RenderModal" in action) { 1475 setActiveModalAction(action); 1476 return; 1477 } 1478 action.callback([item], { registry }); 1479 }, 1480 items: [item], 1481 variant: buttonVariant 1482 }, 1483 action.id 1484 )), 1485 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)( 1486 ActionModal, 1487 { 1488 action: activeModalAction, 1489 items: [item], 1490 closeModal: () => setActiveModalAction(null) 1491 } 1492 ) 1493 ] }); 1494 } 1495 1496 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.js 1497 var import_components3 = __toESM(require_components()); 1498 var import_i18n4 = __toESM(require_i18n()); 1499 var import_element4 = __toESM(require_element()); 1500 var import_data4 = __toESM(require_data()); 1501 var import_compose2 = __toESM(require_compose()); 1502 var import_jsx_runtime26 = __toESM(require_jsx_runtime()); 1503 function ActionWithModal({ 1504 action, 1505 items, 1506 ActionTriggerComponent 1507 }) { 1508 const [isModalOpen, setIsModalOpen] = (0, import_element4.useState)(false); 1509 const actionTriggerProps = { 1510 action, 1511 onClick: () => { 1512 setIsModalOpen(true); 1513 }, 1514 items 1515 }; 1516 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [ 1517 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(ActionTriggerComponent, { ...actionTriggerProps }), 1518 isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1519 ActionModal, 1520 { 1521 action, 1522 items, 1523 closeModal: () => setIsModalOpen(false) 1524 } 1525 ) 1526 ] }); 1527 } 1528 function useHasAPossibleBulkAction(actions, item) { 1529 return (0, import_element4.useMemo)(() => { 1530 return actions.some((action) => { 1531 return action.supportsBulk && (!action.isEligible || action.isEligible(item)); 1532 }); 1533 }, [actions, item]); 1534 } 1535 function useSomeItemHasAPossibleBulkAction(actions, data) { 1536 return (0, import_element4.useMemo)(() => { 1537 return data.some((item) => { 1538 return actions.some((action) => { 1539 return action.supportsBulk && (!action.isEligible || action.isEligible(item)); 1540 }); 1541 }); 1542 }, [actions, data]); 1543 } 1544 function BulkSelectionCheckbox({ 1545 selection, 1546 onChangeSelection, 1547 data, 1548 actions, 1549 getItemId 1550 }) { 1551 const selectableItems = (0, import_element4.useMemo)(() => { 1552 return data.filter((item) => { 1553 return actions.some( 1554 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item)) 1555 ); 1556 }); 1557 }, [data, actions]); 1558 const selectedItems = data.filter( 1559 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item) 1560 ); 1561 const areAllSelected = selectedItems.length === selectableItems.length; 1562 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1563 import_components3.CheckboxControl, 1564 { 1565 className: "dataviews-view-table-selection-checkbox", 1566 checked: areAllSelected, 1567 indeterminate: !areAllSelected && !!selectedItems.length, 1568 onChange: () => { 1569 if (areAllSelected) { 1570 onChangeSelection([]); 1571 } else { 1572 onChangeSelection( 1573 selectableItems.map((item) => getItemId(item)) 1574 ); 1575 } 1576 }, 1577 "aria-label": areAllSelected ? (0, import_i18n4.__)("Deselect all") : (0, import_i18n4.__)("Select all") 1578 } 1579 ); 1580 } 1581 function ActionTrigger({ 1582 action, 1583 onClick, 1584 isBusy, 1585 items 1586 }) { 1587 const label = typeof action.label === "string" ? action.label : action.label(items); 1588 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<"); 1589 if (isMobile) { 1590 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1591 import_components3.Button, 1592 { 1593 disabled: isBusy, 1594 accessibleWhenDisabled: true, 1595 label, 1596 icon: action.icon, 1597 size: "compact", 1598 onClick, 1599 isBusy 1600 } 1601 ); 1602 } 1603 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1604 import_components3.Button, 1605 { 1606 disabled: isBusy, 1607 accessibleWhenDisabled: true, 1608 size: "compact", 1609 onClick, 1610 isBusy, 1611 children: label 1612 } 1613 ); 1614 } 1615 var EMPTY_ARRAY = []; 1616 function ActionButton({ 1617 action, 1618 selectedItems, 1619 actionInProgress, 1620 setActionInProgress 1621 }) { 1622 const registry = (0, import_data4.useRegistry)(); 1623 const selectedEligibleItems = (0, import_element4.useMemo)(() => { 1624 return selectedItems.filter((item) => { 1625 return !action.isEligible || action.isEligible(item); 1626 }); 1627 }, [action, selectedItems]); 1628 if ("RenderModal" in action) { 1629 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1630 ActionWithModal, 1631 { 1632 action, 1633 items: selectedEligibleItems, 1634 ActionTriggerComponent: ActionTrigger 1635 }, 1636 action.id 1637 ); 1638 } 1639 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1640 ActionTrigger, 1641 { 1642 action, 1643 onClick: async () => { 1644 setActionInProgress(action.id); 1645 await action.callback(selectedItems, { 1646 registry 1647 }); 1648 setActionInProgress(null); 1649 }, 1650 items: selectedEligibleItems, 1651 isBusy: actionInProgress === action.id 1652 }, 1653 action.id 1654 ); 1655 } 1656 function renderFooterContent(data, actions, getItemId, selection, actionsToShow, selectedItems, actionInProgress, setActionInProgress, onChangeSelection) { 1657 const message2 = selectedItems.length > 0 ? (0, import_i18n4.sprintf)( 1658 /* translators: %d: number of items. */ 1659 (0, import_i18n4._n)( 1660 "%d Item selected", 1661 "%d Items selected", 1662 selectedItems.length 1663 ), 1664 selectedItems.length 1665 ) : (0, import_i18n4.sprintf)( 1666 /* translators: %d: number of items. */ 1667 (0, import_i18n4._n)("%d Item", "%d Items", data.length), 1668 data.length 1669 ); 1670 return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)( 1671 import_components3.__experimentalHStack, 1672 { 1673 expanded: false, 1674 className: "dataviews-bulk-actions-footer__container", 1675 spacing: 3, 1676 children: [ 1677 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1678 BulkSelectionCheckbox, 1679 { 1680 selection, 1681 onChangeSelection, 1682 data, 1683 actions, 1684 getItemId 1685 } 1686 ), 1687 /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "dataviews-bulk-actions-footer__item-count", children: message2 }), 1688 /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)( 1689 import_components3.__experimentalHStack, 1690 { 1691 className: "dataviews-bulk-actions-footer__action-buttons", 1692 expanded: false, 1693 spacing: 1, 1694 children: [ 1695 actionsToShow.map((action) => { 1696 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1697 ActionButton, 1698 { 1699 action, 1700 selectedItems, 1701 actionInProgress, 1702 setActionInProgress 1703 }, 1704 action.id 1705 ); 1706 }), 1707 selectedItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1708 import_components3.Button, 1709 { 1710 icon: close_small_default, 1711 showTooltip: true, 1712 tooltipPosition: "top", 1713 size: "compact", 1714 label: (0, import_i18n4.__)("Cancel"), 1715 disabled: !!actionInProgress, 1716 accessibleWhenDisabled: false, 1717 onClick: () => { 1718 onChangeSelection(EMPTY_ARRAY); 1719 } 1720 } 1721 ) 1722 ] 1723 } 1724 ) 1725 ] 1726 } 1727 ); 1728 } 1729 function FooterContent({ 1730 selection, 1731 actions, 1732 onChangeSelection, 1733 data, 1734 getItemId 1735 }) { 1736 const [actionInProgress, setActionInProgress] = (0, import_element4.useState)( 1737 null 1738 ); 1739 const footerContentRef = (0, import_element4.useRef)(null); 1740 const isMobile = (0, import_compose2.useViewportMatch)("medium", "<"); 1741 const bulkActions = (0, import_element4.useMemo)( 1742 () => actions.filter((action) => action.supportsBulk), 1743 [actions] 1744 ); 1745 const selectableItems = (0, import_element4.useMemo)(() => { 1746 return data.filter((item) => { 1747 return bulkActions.some( 1748 (action) => !action.isEligible || action.isEligible(item) 1749 ); 1750 }); 1751 }, [data, bulkActions]); 1752 const selectedItems = (0, import_element4.useMemo)(() => { 1753 return data.filter( 1754 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item) 1755 ); 1756 }, [selection, data, getItemId, selectableItems]); 1757 const actionsToShow = (0, import_element4.useMemo)( 1758 () => actions.filter((action) => { 1759 return action.supportsBulk && (!isMobile || action.icon) && selectedItems.some( 1760 (item) => !action.isEligible || action.isEligible(item) 1761 ); 1762 }), 1763 [actions, selectedItems, isMobile] 1764 ); 1765 if (!actionInProgress) { 1766 if (footerContentRef.current) { 1767 footerContentRef.current = null; 1768 } 1769 return renderFooterContent( 1770 data, 1771 actions, 1772 getItemId, 1773 selection, 1774 actionsToShow, 1775 selectedItems, 1776 actionInProgress, 1777 setActionInProgress, 1778 onChangeSelection 1779 ); 1780 } else if (!footerContentRef.current) { 1781 footerContentRef.current = renderFooterContent( 1782 data, 1783 actions, 1784 getItemId, 1785 selection, 1786 actionsToShow, 1787 selectedItems, 1788 actionInProgress, 1789 setActionInProgress, 1790 onChangeSelection 1791 ); 1792 } 1793 return footerContentRef.current; 1794 } 1795 function BulkActionsFooter() { 1796 const { 1797 data, 1798 selection, 1799 actions = EMPTY_ARRAY, 1800 onChangeSelection, 1801 getItemId 1802 } = (0, import_element4.useContext)(dataviews_context_default); 1803 return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)( 1804 FooterContent, 1805 { 1806 selection, 1807 onChangeSelection, 1808 data, 1809 actions, 1810 getItemId 1811 } 1812 ); 1813 } 1814 1815 // packages/dataviews/build-module/dataviews-layouts/table/column-header-menu.js 1816 var import_i18n5 = __toESM(require_i18n()); 1817 var import_components4 = __toESM(require_components()); 1818 var import_element5 = __toESM(require_element()); 1819 1820 // packages/dataviews/build-module/utils/get-hideable-fields.js 1821 function getHideableFields(view, fields) { 1822 const togglableFields = [ 1823 view?.titleField, 1824 view?.mediaField, 1825 view?.descriptionField 1826 ].filter(Boolean); 1827 return fields.filter( 1828 (f2) => !togglableFields.includes(f2.id) && f2.type !== "media" && f2.enableHiding !== false 1829 ); 1830 } 1831 1832 // packages/dataviews/build-module/dataviews-layouts/table/column-header-menu.js 1833 var import_jsx_runtime27 = __toESM(require_jsx_runtime()); 1834 var { Menu: Menu2 } = unlock(import_components4.privateApis); 1835 function WithMenuSeparators({ children }) { 1836 return import_element5.Children.toArray(children).filter(Boolean).map((child, i2) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_element5.Fragment, { children: [ 1837 i2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Separator, {}), 1838 child 1839 ] }, i2)); 1840 } 1841 var _HeaderMenu = (0, import_element5.forwardRef)(function HeaderMenu({ 1842 fieldId, 1843 view, 1844 fields, 1845 onChangeView, 1846 onHide, 1847 setOpenedFilter, 1848 canMove = true, 1849 canInsertLeft = true, 1850 canInsertRight = true 1851 }, ref) { 1852 const visibleFieldIds = view.fields ?? []; 1853 const index = visibleFieldIds?.indexOf(fieldId); 1854 const isSorted = view.sort?.field === fieldId; 1855 let isHidable = false; 1856 let isSortable = false; 1857 let canAddFilter = false; 1858 let operators = []; 1859 const field = fields.find((f2) => f2.id === fieldId); 1860 const { setIsShowingFilter } = (0, import_element5.useContext)(dataviews_context_default); 1861 if (!field) { 1862 return null; 1863 } 1864 isHidable = field.enableHiding !== false; 1865 isSortable = field.enableSorting !== false; 1866 const header = field.header; 1867 operators = !!field.filterBy && field.filterBy?.operators || []; 1868 canAddFilter = !view.filters?.some((_filter) => fieldId === _filter.field) && !!(field.hasElements || field.Edit) && field.filterBy !== false && !field.filterBy?.isPrimary; 1869 if (!isSortable && !canMove && !isHidable && !canAddFilter) { 1870 return header; 1871 } 1872 const hiddenFields = getHideableFields(view, fields).filter( 1873 (f2) => !visibleFieldIds.includes(f2.id) 1874 ); 1875 const canInsert = (canInsertLeft || canInsertRight) && !!hiddenFields.length; 1876 return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [ 1877 /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)( 1878 Menu2.TriggerButton, 1879 { 1880 render: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 1881 import_components4.Button, 1882 { 1883 size: "compact", 1884 className: "dataviews-view-table-header-button", 1885 ref, 1886 variant: "tertiary" 1887 } 1888 ), 1889 children: [ 1890 header, 1891 view.sort && isSorted && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { "aria-hidden": "true", children: sortArrows[view.sort.direction] }) 1892 ] 1893 } 1894 ), 1895 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { style: { minWidth: "240px" }, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(WithMenuSeparators, { children: [ 1896 isSortable && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Group, { children: SORTING_DIRECTIONS.map( 1897 (direction) => { 1898 const isChecked = view.sort && isSorted && view.sort.direction === direction; 1899 const value = `$fieldId}-$direction}`; 1900 return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 1901 Menu2.RadioItem, 1902 { 1903 name: "view-table-sorting", 1904 value, 1905 checked: isChecked, 1906 onChange: () => { 1907 onChangeView({ 1908 ...view, 1909 sort: { 1910 field: fieldId, 1911 direction 1912 }, 1913 showLevels: false 1914 }); 1915 }, 1916 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: sortLabels[direction] }) 1917 }, 1918 value 1919 ); 1920 } 1921 ) }), 1922 canAddFilter && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 1923 Menu2.Item, 1924 { 1925 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: funnel_default }), 1926 onClick: () => { 1927 setOpenedFilter(fieldId); 1928 setIsShowingFilter(true); 1929 onChangeView({ 1930 ...view, 1931 page: 1, 1932 filters: [ 1933 ...view.filters || [], 1934 { 1935 field: fieldId, 1936 value: void 0, 1937 operator: operators[0] 1938 } 1939 ] 1940 }); 1941 }, 1942 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n5.__)("Add filter") }) 1943 } 1944 ) }), 1945 (canMove || isHidable || canInsert) && field && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2.Group, { children: [ 1946 canMove && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 1947 Menu2.Item, 1948 { 1949 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: arrow_left_default }), 1950 disabled: index < 1, 1951 onClick: () => { 1952 onChangeView({ 1953 ...view, 1954 fields: [ 1955 ...visibleFieldIds.slice( 1956 0, 1957 index - 1 1958 ) ?? [], 1959 fieldId, 1960 visibleFieldIds[index - 1], 1961 ...visibleFieldIds.slice( 1962 index + 1 1963 ) 1964 ] 1965 }); 1966 }, 1967 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n5.__)("Move left") }) 1968 } 1969 ), 1970 canMove && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 1971 Menu2.Item, 1972 { 1973 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: arrow_right_default }), 1974 disabled: index >= visibleFieldIds.length - 1, 1975 onClick: () => { 1976 onChangeView({ 1977 ...view, 1978 fields: [ 1979 ...visibleFieldIds.slice( 1980 0, 1981 index 1982 ) ?? [], 1983 visibleFieldIds[index + 1], 1984 fieldId, 1985 ...visibleFieldIds.slice( 1986 index + 2 1987 ) 1988 ] 1989 }); 1990 }, 1991 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n5.__)("Move right") }) 1992 } 1993 ), 1994 canInsertLeft && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [ 1995 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n5.__)("Insert left") }) }), 1996 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 1997 Menu2.Item, 1998 { 1999 onClick: () => { 2000 onChangeView({ 2001 ...view, 2002 fields: [ 2003 ...visibleFieldIds.slice( 2004 0, 2005 index 2006 ), 2007 hiddenField.id, 2008 ...visibleFieldIds.slice( 2009 index 2010 ) 2011 ] 2012 }); 2013 }, 2014 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: hiddenField.label }) 2015 }, 2016 hiddenField.id 2017 )) }) 2018 ] }), 2019 canInsertRight && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(Menu2, { children: [ 2020 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n5.__)("Insert right") }) }), 2021 /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 2022 Menu2.Item, 2023 { 2024 onClick: () => { 2025 onChangeView({ 2026 ...view, 2027 fields: [ 2028 ...visibleFieldIds.slice( 2029 0, 2030 index + 1 2031 ), 2032 hiddenField.id, 2033 ...visibleFieldIds.slice( 2034 index + 1 2035 ) 2036 ] 2037 }); 2038 }, 2039 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: hiddenField.label }) 2040 }, 2041 hiddenField.id 2042 )) }) 2043 ] }), 2044 isHidable && field && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)( 2045 Menu2.Item, 2046 { 2047 prefix: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_components4.Icon, { icon: unseen_default }), 2048 onClick: () => { 2049 onHide(field); 2050 onChangeView({ 2051 ...view, 2052 fields: visibleFieldIds.filter( 2053 (id) => id !== fieldId 2054 ) 2055 }); 2056 }, 2057 children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Menu2.ItemLabel, { children: (0, import_i18n5.__)("Hide column") }) 2058 } 2059 ) 2060 ] }) 2061 ] }) }) 2062 ] }); 2063 }); 2064 var ColumnHeaderMenu = _HeaderMenu; 2065 var column_header_menu_default = ColumnHeaderMenu; 2066 2067 // packages/dataviews/build-module/dataviews-layouts/table/column-primary.js 2068 var import_components5 = __toESM(require_components()); 2069 2070 // packages/dataviews/build-module/dataviews-layouts/utils/item-click-wrapper.js 2071 var import_element6 = __toESM(require_element()); 2072 var import_jsx_runtime28 = __toESM(require_jsx_runtime()); 2073 function getClickableItemProps({ 2074 item, 2075 isItemClickable, 2076 onClickItem, 2077 className 2078 }) { 2079 if (!isItemClickable(item) || !onClickItem) { 2080 return { className }; 2081 } 2082 return { 2083 className: className ? `$className} $className}--clickable` : void 0, 2084 role: "button", 2085 tabIndex: 0, 2086 onClick: (event) => { 2087 event.stopPropagation(); 2088 onClickItem(item); 2089 }, 2090 onKeyDown: (event) => { 2091 if (event.key === "Enter" || event.key === "" || event.key === " ") { 2092 event.stopPropagation(); 2093 onClickItem(item); 2094 } 2095 } 2096 }; 2097 } 2098 function ItemClickWrapper({ 2099 item, 2100 isItemClickable, 2101 onClickItem, 2102 renderItemLink, 2103 className, 2104 children, 2105 ...extraProps 2106 }) { 2107 if (!isItemClickable(item)) { 2108 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className, ...extraProps, children }); 2109 } 2110 if (renderItemLink) { 2111 const renderedElement = renderItemLink({ 2112 item, 2113 className: `$className} $className}--clickable`, 2114 ...extraProps, 2115 children 2116 }); 2117 return (0, import_element6.cloneElement)(renderedElement, { 2118 onClick: (event) => { 2119 event.stopPropagation(); 2120 if (renderedElement.props.onClick) { 2121 renderedElement.props.onClick(event); 2122 } 2123 }, 2124 onKeyDown: (event) => { 2125 if (event.key === "Enter" || event.key === "" || event.key === " ") { 2126 event.stopPropagation(); 2127 if (renderedElement.props.onKeyDown) { 2128 renderedElement.props.onKeyDown(event); 2129 } 2130 } 2131 } 2132 }); 2133 } 2134 const clickProps = getClickableItemProps({ 2135 item, 2136 isItemClickable, 2137 onClickItem, 2138 className 2139 }); 2140 return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { ...clickProps, ...extraProps, children }); 2141 } 2142 2143 // packages/dataviews/build-module/dataviews-layouts/table/column-primary.js 2144 var import_jsx_runtime29 = __toESM(require_jsx_runtime()); 2145 function ColumnPrimary({ 2146 item, 2147 level, 2148 titleField, 2149 mediaField, 2150 descriptionField, 2151 onClickItem, 2152 renderItemLink, 2153 isItemClickable 2154 }) { 2155 return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_components5.__experimentalHStack, { spacing: 3, alignment: "flex-start", justify: "flex-start", children: [ 2156 mediaField && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)( 2157 ItemClickWrapper, 2158 { 2159 item, 2160 isItemClickable, 2161 onClickItem, 2162 renderItemLink, 2163 className: "dataviews-view-table__cell-content-wrapper dataviews-column-primary__media", 2164 "aria-label": isItemClickable(item) && (!!onClickItem || !!renderItemLink) && !!titleField ? titleField.getValue?.({ item }) : void 0, 2165 children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)( 2166 mediaField.render, 2167 { 2168 item, 2169 field: mediaField, 2170 config: { sizes: "32px" } 2171 } 2172 ) 2173 } 2174 ), 2175 /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)( 2176 import_components5.__experimentalVStack, 2177 { 2178 spacing: 0, 2179 alignment: "flex-start", 2180 className: "dataviews-view-table__primary-column-content", 2181 children: [ 2182 titleField && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)( 2183 ItemClickWrapper, 2184 { 2185 item, 2186 isItemClickable, 2187 onClickItem, 2188 renderItemLink, 2189 className: "dataviews-view-table__cell-content-wrapper dataviews-title-field", 2190 children: [ 2191 level !== void 0 && level > 0 && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "dataviews-view-table__level", children: [ 2192 "\u2014".repeat(level), 2193 "\xA0" 2194 ] }), 2195 /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(titleField.render, { item, field: titleField }) 2196 ] 2197 } 2198 ), 2199 descriptionField && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)( 2200 descriptionField.render, 2201 { 2202 item, 2203 field: descriptionField 2204 } 2205 ) 2206 ] 2207 } 2208 ) 2209 ] }); 2210 } 2211 var column_primary_default = ColumnPrimary; 2212 2213 // packages/dataviews/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js 2214 var import_compose3 = __toESM(require_compose()); 2215 var import_element7 = __toESM(require_element()); 2216 var import_i18n6 = __toESM(require_i18n()); 2217 var isScrolledToEnd = (element) => { 2218 if ((0, import_i18n6.isRTL)()) { 2219 const scrollLeft = Math.abs(element.scrollLeft); 2220 return scrollLeft <= 1; 2221 } 2222 return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1; 2223 }; 2224 function useIsHorizontalScrollEnd({ 2225 scrollContainerRef, 2226 enabled = false 2227 }) { 2228 const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = (0, import_element7.useState)(false); 2229 const handleIsHorizontalScrollEnd = (0, import_compose3.useDebounce)( 2230 (0, import_element7.useCallback)(() => { 2231 const scrollContainer = scrollContainerRef.current; 2232 if (scrollContainer) { 2233 setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer)); 2234 } 2235 }, [scrollContainerRef, setIsHorizontalScrollEnd]), 2236 200 2237 ); 2238 (0, import_element7.useEffect)(() => { 2239 if (typeof window === "undefined" || !enabled || !scrollContainerRef.current) { 2240 return () => { 2241 }; 2242 } 2243 handleIsHorizontalScrollEnd(); 2244 scrollContainerRef.current.addEventListener( 2245 "scroll", 2246 handleIsHorizontalScrollEnd 2247 ); 2248 window.addEventListener("resize", handleIsHorizontalScrollEnd); 2249 return () => { 2250 scrollContainerRef.current?.removeEventListener( 2251 "scroll", 2252 handleIsHorizontalScrollEnd 2253 ); 2254 window.removeEventListener("resize", handleIsHorizontalScrollEnd); 2255 }; 2256 }, [scrollContainerRef, enabled]); 2257 return isHorizontalScrollEnd; 2258 } 2259 2260 // packages/dataviews/build-module/dataviews-layouts/utils/get-data-by-group.js 2261 function getDataByGroup(data, groupByField) { 2262 return data.reduce((groups, item) => { 2263 const groupName = groupByField.getValue({ item }); 2264 if (!groups.has(groupName)) { 2265 groups.set(groupName, []); 2266 } 2267 groups.get(groupName)?.push(item); 2268 return groups; 2269 }, /* @__PURE__ */ new Map()); 2270 } 2271 2272 // packages/dataviews/build-module/components/dataviews-view-config/properties-section.js 2273 var import_components6 = __toESM(require_components()); 2274 var import_i18n7 = __toESM(require_i18n()); 2275 var import_element8 = __toESM(require_element()); 2276 var import_jsx_runtime30 = __toESM(require_jsx_runtime()); 2277 function FieldItem({ 2278 field, 2279 isVisible: isVisible2, 2280 onToggleVisibility 2281 }) { 2282 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components6.__experimentalItem, { onClick: field.enableHiding ? onToggleVisibility : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_components6.__experimentalHStack, { expanded: true, justify: "flex-start", alignment: "center", children: [ 2283 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { style: { height: 24, width: 24 }, children: isVisible2 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components6.Icon, { icon: check_default }) }), 2284 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "dataviews-view-config__label", children: field.label }) 2285 ] }) }); 2286 } 2287 function isDefined(item) { 2288 return !!item; 2289 } 2290 function PropertiesSection({ 2291 showLabel = true 2292 }) { 2293 const { view, fields, onChangeView } = (0, import_element8.useContext)(dataviews_context_default); 2294 const regularFields = getHideableFields(view, fields); 2295 if (!regularFields?.length) { 2296 return null; 2297 } 2298 const titleField = fields.find((f2) => f2.id === view.titleField); 2299 const previewField2 = fields.find((f2) => f2.id === view.mediaField); 2300 const descriptionField = fields.find( 2301 (f2) => f2.id === view.descriptionField 2302 ); 2303 const lockedFields = [ 2304 { 2305 field: titleField, 2306 isVisibleFlag: "showTitle" 2307 }, 2308 { 2309 field: previewField2, 2310 isVisibleFlag: "showMedia" 2311 }, 2312 { 2313 field: descriptionField, 2314 isVisibleFlag: "showDescription" 2315 } 2316 ].filter(({ field }) => isDefined(field)); 2317 const visibleFieldIds = view.fields ?? []; 2318 const visibleRegularFieldsCount = regularFields.filter( 2319 (f2) => visibleFieldIds.includes(f2.id) 2320 ).length; 2321 let visibleLockedFields = lockedFields.filter( 2322 ({ field, isVisibleFlag }) => ( 2323 // @ts-expect-error 2324 isDefined(field) && (view[isVisibleFlag] ?? true) 2325 ) 2326 ); 2327 const totalVisibleFields = visibleLockedFields.length + visibleRegularFieldsCount; 2328 if (totalVisibleFields === 1) { 2329 if (visibleLockedFields.length === 1) { 2330 visibleLockedFields = visibleLockedFields.map((locked) => ({ 2331 ...locked, 2332 field: { ...locked.field, enableHiding: false } 2333 })); 2334 } 2335 } 2336 const hiddenLockedFields = lockedFields.filter( 2337 ({ field, isVisibleFlag }) => ( 2338 // @ts-expect-error 2339 isDefined(field) && !(view[isVisibleFlag] ?? true) 2340 ) 2341 ); 2342 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_components6.__experimentalVStack, { className: "dataviews-field-control", spacing: 0, children: [ 2343 showLabel && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components6.BaseControl.VisualLabel, { children: (0, import_i18n7.__)("Properties") }), 2344 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_components6.__experimentalVStack, { className: "dataviews-view-config__properties", spacing: 0, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_components6.__experimentalItemGroup, { isBordered: true, isSeparated: true, size: "medium", children: [ 2345 visibleLockedFields.map(({ field, isVisibleFlag }) => { 2346 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2347 FieldItem, 2348 { 2349 field, 2350 isVisible: true, 2351 onToggleVisibility: () => { 2352 onChangeView({ 2353 ...view, 2354 [isVisibleFlag]: false 2355 }); 2356 } 2357 }, 2358 field.id 2359 ); 2360 }), 2361 hiddenLockedFields.map(({ field, isVisibleFlag }) => { 2362 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2363 FieldItem, 2364 { 2365 field, 2366 isVisible: false, 2367 onToggleVisibility: () => { 2368 onChangeView({ 2369 ...view, 2370 [isVisibleFlag]: true 2371 }); 2372 } 2373 }, 2374 field.id 2375 ); 2376 }), 2377 regularFields.map((field) => { 2378 const isVisible2 = visibleFieldIds.includes(field.id); 2379 const isLastVisible = totalVisibleFields === 1 && isVisible2; 2380 const fieldToRender = isLastVisible ? { ...field, enableHiding: false } : field; 2381 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2382 FieldItem, 2383 { 2384 field: fieldToRender, 2385 isVisible: isVisible2, 2386 onToggleVisibility: () => { 2387 onChangeView({ 2388 ...view, 2389 fields: isVisible2 ? visibleFieldIds.filter( 2390 (fieldId) => fieldId !== field.id 2391 ) : [...visibleFieldIds, field.id] 2392 }); 2393 } 2394 }, 2395 field.id 2396 ); 2397 }) 2398 ] }) }) 2399 ] }); 2400 } 2401 2402 // packages/dataviews/build-module/dataviews-layouts/table/index.js 2403 var import_jsx_runtime31 = __toESM(require_jsx_runtime()); 2404 function TableColumnField({ 2405 item, 2406 fields, 2407 column, 2408 align 2409 }) { 2410 const field = fields.find((f2) => f2.id === column); 2411 if (!field) { 2412 return null; 2413 } 2414 const className = clsx_default("dataviews-view-table__cell-content-wrapper", { 2415 "dataviews-view-table__cell-align-end": align === "end", 2416 "dataviews-view-table__cell-align-center": align === "center" 2417 }); 2418 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(field.render, { item, field }) }); 2419 } 2420 function TableRow({ 2421 hasBulkActions, 2422 item, 2423 level, 2424 actions, 2425 fields, 2426 id, 2427 view, 2428 titleField, 2429 mediaField, 2430 descriptionField, 2431 selection, 2432 getItemId, 2433 isItemClickable, 2434 onClickItem, 2435 renderItemLink, 2436 onChangeSelection, 2437 isActionsColumnSticky, 2438 posinset 2439 }) { 2440 const { paginationInfo } = (0, import_element9.useContext)(dataviews_context_default); 2441 const hasPossibleBulkAction = useHasAPossibleBulkAction(actions, item); 2442 const isSelected2 = hasPossibleBulkAction && selection.includes(id); 2443 const { 2444 showTitle = true, 2445 showMedia = true, 2446 showDescription = true, 2447 infiniteScrollEnabled 2448 } = view; 2449 const isTouchDeviceRef = (0, import_element9.useRef)(false); 2450 const columns = view.fields ?? []; 2451 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription; 2452 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)( 2453 "tr", 2454 { 2455 className: clsx_default("dataviews-view-table__row", { 2456 "is-selected": hasPossibleBulkAction && isSelected2, 2457 "has-bulk-actions": hasPossibleBulkAction 2458 }), 2459 onTouchStart: () => { 2460 isTouchDeviceRef.current = true; 2461 }, 2462 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0, 2463 "aria-posinset": posinset, 2464 role: infiniteScrollEnabled ? "article" : void 0, 2465 onMouseDown: (event) => { 2466 const isMetaClick = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey; 2467 if (event.button === 0 && isMetaClick && window.navigator.userAgent.toLowerCase().includes("firefox")) { 2468 event?.preventDefault(); 2469 } 2470 }, 2471 onClick: (event) => { 2472 if (!hasPossibleBulkAction) { 2473 return; 2474 } 2475 const isModifierKeyPressed = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey; 2476 if (isModifierKeyPressed && !isTouchDeviceRef.current && document.getSelection()?.type !== "Range") { 2477 onChangeSelection( 2478 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id] 2479 ); 2480 } 2481 }, 2482 children: [ 2483 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("td", { className: "dataviews-view-table__checkbox-column", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2484 DataViewsSelectionCheckbox, 2485 { 2486 item, 2487 selection, 2488 onChangeSelection, 2489 getItemId, 2490 titleField, 2491 disabled: !hasPossibleBulkAction 2492 } 2493 ) }) }), 2494 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2495 column_primary_default, 2496 { 2497 item, 2498 level, 2499 titleField: showTitle ? titleField : void 0, 2500 mediaField: showMedia ? mediaField : void 0, 2501 descriptionField: showDescription ? descriptionField : void 0, 2502 isItemClickable, 2503 onClickItem, 2504 renderItemLink 2505 } 2506 ) }), 2507 columns.map((column) => { 2508 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 2509 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2510 "td", 2511 { 2512 style: { 2513 width, 2514 maxWidth, 2515 minWidth 2516 }, 2517 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2518 TableColumnField, 2519 { 2520 fields, 2521 item, 2522 column, 2523 align 2524 } 2525 ) 2526 }, 2527 column 2528 ); 2529 }), 2530 !!actions?.length && // Disable reason: we are not making the element interactive, 2531 // but preventing any click events from bubbling up to the 2532 // table row. This allows us to add a click handler to the row 2533 // itself (to toggle row selection) without erroneously 2534 // intercepting click events from ItemActions. 2535 /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */ 2536 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2537 "td", 2538 { 2539 className: clsx_default("dataviews-view-table__actions-column", { 2540 "dataviews-view-table__actions-column--sticky": true, 2541 "dataviews-view-table__actions-column--stuck": isActionsColumnSticky 2542 }), 2543 onClick: (e2) => e2.stopPropagation(), 2544 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(ItemActions, { item, actions }) 2545 } 2546 ) 2547 ] 2548 } 2549 ); 2550 } 2551 function ViewTable({ 2552 actions, 2553 data, 2554 fields, 2555 getItemId, 2556 getItemLevel, 2557 isLoading = false, 2558 onChangeView, 2559 onChangeSelection, 2560 selection, 2561 setOpenedFilter, 2562 onClickItem, 2563 isItemClickable, 2564 renderItemLink, 2565 view, 2566 className, 2567 empty 2568 }) { 2569 const { containerRef } = (0, import_element9.useContext)(dataviews_context_default); 2570 const headerMenuRefs = (0, import_element9.useRef)(/* @__PURE__ */ new Map()); 2571 const headerMenuToFocusRef = (0, import_element9.useRef)(); 2572 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element9.useState)(); 2573 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data); 2574 const [contextMenuAnchor, setContextMenuAnchor] = (0, import_element9.useState)(null); 2575 (0, import_element9.useEffect)(() => { 2576 if (headerMenuToFocusRef.current) { 2577 headerMenuToFocusRef.current.focus(); 2578 headerMenuToFocusRef.current = void 0; 2579 } 2580 }); 2581 const tableNoticeId = (0, import_element9.useId)(); 2582 const isHorizontalScrollEnd = useIsHorizontalScrollEnd({ 2583 scrollContainerRef: containerRef, 2584 enabled: !!actions?.length 2585 }); 2586 if (nextHeaderMenuToFocus) { 2587 headerMenuToFocusRef.current = nextHeaderMenuToFocus; 2588 setNextHeaderMenuToFocus(void 0); 2589 return; 2590 } 2591 const onHide = (field) => { 2592 const hidden = headerMenuRefs.current.get(field.id); 2593 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0; 2594 setNextHeaderMenuToFocus(fallback?.node); 2595 }; 2596 const handleHeaderContextMenu = (event) => { 2597 event.preventDefault(); 2598 event.stopPropagation(); 2599 const virtualAnchor = { 2600 getBoundingClientRect: () => ({ 2601 x: event.clientX, 2602 y: event.clientY, 2603 top: event.clientY, 2604 left: event.clientX, 2605 right: event.clientX, 2606 bottom: event.clientY, 2607 width: 0, 2608 height: 0, 2609 toJSON: () => ({}) 2610 }) 2611 }; 2612 window.requestAnimationFrame(() => { 2613 setContextMenuAnchor(virtualAnchor); 2614 }); 2615 }; 2616 const hasData = !!data?.length; 2617 const titleField = fields.find((field) => field.id === view.titleField); 2618 const mediaField = fields.find((field) => field.id === view.mediaField); 2619 const descriptionField = fields.find( 2620 (field) => field.id === view.descriptionField 2621 ); 2622 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 2623 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 2624 const { showTitle = true, showMedia = true, showDescription = true } = view; 2625 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription; 2626 const columns = view.fields ?? []; 2627 const headerMenuRef = (column, index) => (node) => { 2628 if (node) { 2629 headerMenuRefs.current.set(column, { 2630 node, 2631 fallback: columns[index > 0 ? index - 1 : 1] 2632 }); 2633 } else { 2634 headerMenuRefs.current.delete(column); 2635 } 2636 }; 2637 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 2638 return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [ 2639 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)( 2640 "table", 2641 { 2642 className: clsx_default("dataviews-view-table", className, { 2643 [`has-$view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes( 2644 view.layout.density 2645 ), 2646 "has-bulk-actions": hasBulkActions 2647 }), 2648 "aria-busy": isLoading, 2649 "aria-describedby": tableNoticeId, 2650 role: isInfiniteScroll ? "feed" : void 0, 2651 children: [ 2652 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("colgroup", { children: [ 2653 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-checkbox" }), 2654 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-first-data" }), 2655 columns.map((column, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2656 "col", 2657 { 2658 className: clsx_default( 2659 `dataviews-view-table__col-$column}`, 2660 { 2661 "dataviews-view-table__col-first-data": !hasPrimaryColumn && index === 0 2662 } 2663 ) 2664 }, 2665 `col-$column}` 2666 )), 2667 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("col", { className: "dataviews-view-table__col-actions" }) 2668 ] }), 2669 contextMenuAnchor && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2670 import_components7.Popover, 2671 { 2672 anchor: contextMenuAnchor, 2673 onClose: () => setContextMenuAnchor(null), 2674 placement: "bottom-start", 2675 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(PropertiesSection, { showLabel: false }) 2676 } 2677 ), 2678 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("thead", { onContextMenu: handleHeaderContextMenu, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("tr", { className: "dataviews-view-table__row", children: [ 2679 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2680 "th", 2681 { 2682 className: "dataviews-view-table__checkbox-column", 2683 scope: "col", 2684 onContextMenu: handleHeaderContextMenu, 2685 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2686 BulkSelectionCheckbox, 2687 { 2688 selection, 2689 onChangeSelection, 2690 data, 2691 actions, 2692 getItemId 2693 } 2694 ) 2695 } 2696 ), 2697 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("th", { scope: "col", children: titleField && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2698 column_header_menu_default, 2699 { 2700 ref: headerMenuRef( 2701 titleField.id, 2702 0 2703 ), 2704 fieldId: titleField.id, 2705 view, 2706 fields, 2707 onChangeView, 2708 onHide, 2709 setOpenedFilter, 2710 canMove: false, 2711 canInsertLeft: false, 2712 canInsertRight: view.layout?.enableMoving ?? true 2713 } 2714 ) }), 2715 columns.map((column, index) => { 2716 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 2717 const canInsertOrMove = view.layout?.enableMoving ?? true; 2718 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2719 "th", 2720 { 2721 style: { 2722 width, 2723 maxWidth, 2724 minWidth, 2725 textAlign: align 2726 }, 2727 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0, 2728 scope: "col", 2729 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2730 column_header_menu_default, 2731 { 2732 ref: headerMenuRef(column, index), 2733 fieldId: column, 2734 view, 2735 fields, 2736 onChangeView, 2737 onHide, 2738 setOpenedFilter, 2739 canMove: canInsertOrMove, 2740 canInsertLeft: canInsertOrMove, 2741 canInsertRight: canInsertOrMove 2742 } 2743 ) 2744 }, 2745 column 2746 ); 2747 }), 2748 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2749 "th", 2750 { 2751 className: clsx_default( 2752 "dataviews-view-table__actions-column", 2753 { 2754 "dataviews-view-table__actions-column--sticky": true, 2755 "dataviews-view-table__actions-column--stuck": !isHorizontalScrollEnd 2756 } 2757 ), 2758 children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "dataviews-view-table-header", children: (0, import_i18n8.__)("Actions") }) 2759 } 2760 ) 2761 ] }) }), 2762 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map( 2763 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("tbody", { children: [ 2764 /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tr", { className: "dataviews-view-table__group-header-row", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2765 "td", 2766 { 2767 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + (hasBulkActions ? 1 : 0) + (actions?.length ? 1 : 0), 2768 className: "dataviews-view-table__group-header-cell", 2769 children: (0, import_i18n8.sprintf)( 2770 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 2771 (0, import_i18n8.__)("%1$s: %2$s"), 2772 groupField.label, 2773 groupName 2774 ) 2775 } 2776 ) }), 2777 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2778 TableRow, 2779 { 2780 item, 2781 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0, 2782 hasBulkActions, 2783 actions, 2784 fields, 2785 id: getItemId(item) || index.toString(), 2786 view, 2787 titleField, 2788 mediaField, 2789 descriptionField, 2790 selection, 2791 getItemId, 2792 onChangeSelection, 2793 onClickItem, 2794 renderItemLink, 2795 isItemClickable, 2796 isActionsColumnSticky: !isHorizontalScrollEnd 2797 }, 2798 getItemId(item) 2799 )) 2800 ] }, `group-$groupName}`) 2801 ) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("tbody", { children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2802 TableRow, 2803 { 2804 item, 2805 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0, 2806 hasBulkActions, 2807 actions, 2808 fields, 2809 id: getItemId(item) || index.toString(), 2810 view, 2811 titleField, 2812 mediaField, 2813 descriptionField, 2814 selection, 2815 getItemId, 2816 onChangeSelection, 2817 onClickItem, 2818 renderItemLink, 2819 isItemClickable, 2820 isActionsColumnSticky: !isHorizontalScrollEnd, 2821 posinset: isInfiniteScroll ? index + 1 : void 0 2822 }, 2823 getItemId(item) 2824 )) }) 2825 ] 2826 } 2827 ), 2828 /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)( 2829 "div", 2830 { 2831 className: clsx_default({ 2832 "dataviews-loading": isLoading, 2833 "dataviews-no-results": !hasData && !isLoading 2834 }), 2835 id: tableNoticeId, 2836 children: [ 2837 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_components7.Spinner, {}) }) : empty), 2838 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_components7.Spinner, {}) }) 2839 ] 2840 } 2841 ) 2842 ] }); 2843 } 2844 var table_default = ViewTable; 2845 2846 // packages/dataviews/build-module/dataviews-layouts/grid/index.js 2847 var import_components10 = __toESM(require_components()); 2848 var import_i18n11 = __toESM(require_i18n()); 2849 2850 // packages/dataviews/build-module/dataviews-layouts/grid/composite-grid.js 2851 var import_components9 = __toESM(require_components()); 2852 var import_i18n10 = __toESM(require_i18n()); 2853 var import_compose4 = __toESM(require_compose()); 2854 var import_keycodes2 = __toESM(require_keycodes()); 2855 var import_element11 = __toESM(require_element()); 2856 2857 // packages/dataviews/build-module/dataviews-layouts/grid/preview-size-picker.js 2858 var import_components8 = __toESM(require_components()); 2859 var import_i18n9 = __toESM(require_i18n()); 2860 var import_element10 = __toESM(require_element()); 2861 var import_jsx_runtime32 = __toESM(require_jsx_runtime()); 2862 var imageSizes = [ 2863 { 2864 value: 120, 2865 breakpoint: 1 2866 }, 2867 { 2868 value: 170, 2869 breakpoint: 1 2870 }, 2871 { 2872 value: 230, 2873 breakpoint: 1 2874 }, 2875 { 2876 value: 290, 2877 breakpoint: 1112 2878 // at minimum image width, 4 images display at this container size 2879 }, 2880 { 2881 value: 350, 2882 breakpoint: 1636 2883 // at minimum image width, 6 images display at this container size 2884 }, 2885 { 2886 value: 430, 2887 breakpoint: 588 2888 // at minimum image width, 2 images display at this container size 2889 } 2890 ]; 2891 var DEFAULT_PREVIEW_SIZE = imageSizes[2].value; 2892 function useGridColumns() { 2893 const context = (0, import_element10.useContext)(dataviews_context_default); 2894 const view = context.view; 2895 return (0, import_element10.useMemo)(() => { 2896 const containerWidth = context.containerWidth; 2897 const gap = 32; 2898 const previewSize = view.layout?.previewSize ?? DEFAULT_PREVIEW_SIZE; 2899 const columns = Math.floor( 2900 (containerWidth + gap) / (previewSize + gap) 2901 ); 2902 return Math.max(1, columns); 2903 }, [context.containerWidth, view.layout?.previewSize]); 2904 } 2905 2906 // packages/dataviews/build-module/dataviews-layouts/grid/composite-grid.js 2907 var import_jsx_runtime33 = __toESM(require_jsx_runtime()); 2908 var { Badge } = unlock(import_components9.privateApis); 2909 function chunk(array, size) { 2910 const chunks = []; 2911 for (let i2 = 0, j2 = array.length; i2 < j2; i2 += size) { 2912 chunks.push(array.slice(i2, i2 + size)); 2913 } 2914 return chunks; 2915 } 2916 var GridItem = (0, import_element11.forwardRef)(function GridItem2({ 2917 view, 2918 selection, 2919 onChangeSelection, 2920 onClickItem, 2921 isItemClickable, 2922 renderItemLink, 2923 getItemId, 2924 item, 2925 actions, 2926 mediaField, 2927 titleField, 2928 descriptionField, 2929 regularFields, 2930 badgeFields, 2931 hasBulkActions, 2932 config, 2933 ...props 2934 }, ref) { 2935 const { showTitle = true, showMedia = true, showDescription = true } = view; 2936 const hasBulkAction = useHasAPossibleBulkAction(actions, item); 2937 const id = getItemId(item); 2938 const instanceId = (0, import_compose4.useInstanceId)(GridItem2); 2939 const isSelected2 = selection.includes(id); 2940 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 2941 mediaField.render, 2942 { 2943 item, 2944 field: mediaField, 2945 config 2946 } 2947 ) : null; 2948 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(titleField.render, { item, field: titleField }) : null; 2949 const shouldRenderMedia = showMedia && renderedMediaField; 2950 let mediaA11yProps; 2951 let titleA11yProps; 2952 if (isItemClickable(item) && onClickItem) { 2953 if (renderedTitleField) { 2954 mediaA11yProps = { 2955 "aria-labelledby": `dataviews-view-grid__title-field-$instanceId}` 2956 }; 2957 titleA11yProps = { 2958 id: `dataviews-view-grid__title-field-$instanceId}` 2959 }; 2960 } else { 2961 mediaA11yProps = { 2962 "aria-label": (0, import_i18n10.__)("Navigate to item") 2963 }; 2964 } 2965 } 2966 return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)( 2967 import_components9.__experimentalVStack, 2968 { 2969 ...props, 2970 ref, 2971 spacing: 0, 2972 className: clsx_default( 2973 props.className, 2974 "dataviews-view-grid__row__gridcell", 2975 "dataviews-view-grid__card", 2976 { 2977 "is-selected": hasBulkAction && isSelected2 2978 } 2979 ), 2980 onClickCapture: (event) => { 2981 props.onClickCapture?.(event); 2982 if ((0, import_keycodes2.isAppleOS)() ? event.metaKey : event.ctrlKey) { 2983 event.stopPropagation(); 2984 event.preventDefault(); 2985 if (!hasBulkAction) { 2986 return; 2987 } 2988 onChangeSelection( 2989 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id] 2990 ); 2991 } 2992 }, 2993 children: [ 2994 shouldRenderMedia && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 2995 ItemClickWrapper, 2996 { 2997 item, 2998 isItemClickable, 2999 onClickItem, 3000 renderItemLink, 3001 className: "dataviews-view-grid__media", 3002 ...mediaA11yProps, 3003 children: renderedMediaField 3004 } 3005 ), 3006 hasBulkActions && shouldRenderMedia && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3007 DataViewsSelectionCheckbox, 3008 { 3009 item, 3010 selection, 3011 onChangeSelection, 3012 getItemId, 3013 titleField, 3014 disabled: !hasBulkAction 3015 } 3016 ), 3017 !showTitle && shouldRenderMedia && !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ItemActions, { item, actions, isCompact: true }) }), 3018 showTitle && /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)( 3019 import_components9.__experimentalHStack, 3020 { 3021 justify: "space-between", 3022 className: "dataviews-view-grid__title-actions", 3023 children: [ 3024 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3025 ItemClickWrapper, 3026 { 3027 item, 3028 isItemClickable, 3029 onClickItem, 3030 renderItemLink, 3031 className: "dataviews-view-grid__title-field dataviews-title-field", 3032 ...titleA11yProps, 3033 children: renderedTitleField 3034 } 3035 ), 3036 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3037 ItemActions, 3038 { 3039 item, 3040 actions, 3041 isCompact: true 3042 } 3043 ) 3044 ] 3045 } 3046 ), 3047 /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_components9.__experimentalVStack, { spacing: 1, children: [ 3048 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3049 descriptionField.render, 3050 { 3051 item, 3052 field: descriptionField 3053 } 3054 ), 3055 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3056 import_components9.__experimentalHStack, 3057 { 3058 className: "dataviews-view-grid__badge-fields", 3059 spacing: 2, 3060 wrap: true, 3061 alignment: "top", 3062 justify: "flex-start", 3063 children: badgeFields.map((field) => { 3064 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3065 Badge, 3066 { 3067 className: "dataviews-view-grid__field-value", 3068 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3069 field.render, 3070 { 3071 item, 3072 field 3073 } 3074 ) 3075 }, 3076 field.id 3077 ); 3078 }) 3079 } 3080 ), 3081 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3082 import_components9.__experimentalVStack, 3083 { 3084 className: "dataviews-view-grid__fields", 3085 spacing: 1, 3086 children: regularFields.map((field) => { 3087 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3088 import_components9.Flex, 3089 { 3090 className: "dataviews-view-grid__field", 3091 gap: 1, 3092 justify: "flex-start", 3093 expanded: true, 3094 style: { height: "auto" }, 3095 direction: "row", 3096 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [ 3097 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_components9.Tooltip, { text: field.label, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_components9.FlexItem, { className: "dataviews-view-grid__field-name", children: field.header }) }), 3098 /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3099 import_components9.FlexItem, 3100 { 3101 className: "dataviews-view-grid__field-value", 3102 style: { maxHeight: "none" }, 3103 children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3104 field.render, 3105 { 3106 item, 3107 field 3108 } 3109 ) 3110 } 3111 ) 3112 ] }) 3113 }, 3114 field.id 3115 ); 3116 }) 3117 } 3118 ) 3119 ] }) 3120 ] 3121 } 3122 ); 3123 }); 3124 function CompositeGrid({ 3125 data, 3126 isInfiniteScroll, 3127 className, 3128 isLoading, 3129 view, 3130 fields, 3131 selection, 3132 onChangeSelection, 3133 onClickItem, 3134 isItemClickable, 3135 renderItemLink, 3136 getItemId, 3137 actions 3138 }) { 3139 const { paginationInfo, resizeObserverRef } = (0, import_element11.useContext)(dataviews_context_default); 3140 const gridColumns = useGridColumns(); 3141 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data); 3142 const titleField = fields.find( 3143 (field) => field.id === view?.titleField 3144 ); 3145 const mediaField = fields.find( 3146 (field) => field.id === view?.mediaField 3147 ); 3148 const descriptionField = fields.find( 3149 (field) => field.id === view?.descriptionField 3150 ); 3151 const otherFields = view.fields ?? []; 3152 const { regularFields, badgeFields } = otherFields.reduce( 3153 (accumulator, fieldId) => { 3154 const field = fields.find((f2) => f2.id === fieldId); 3155 if (!field) { 3156 return accumulator; 3157 } 3158 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields"; 3159 accumulator[key].push(field); 3160 return accumulator; 3161 }, 3162 { regularFields: [], badgeFields: [] } 3163 ); 3164 const size = "900px"; 3165 const totalRows = Math.ceil(data.length / gridColumns); 3166 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3167 import_components9.Composite, 3168 { 3169 role: isInfiniteScroll ? "feed" : "grid", 3170 className: clsx_default("dataviews-view-grid", className), 3171 focusWrap: true, 3172 "aria-busy": isLoading, 3173 "aria-rowcount": isInfiniteScroll ? void 0 : totalRows, 3174 ref: resizeObserverRef, 3175 children: chunk(data, gridColumns).map((row, i2) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3176 import_components9.Composite.Row, 3177 { 3178 render: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3179 "div", 3180 { 3181 role: "row", 3182 "aria-rowindex": i2 + 1, 3183 "aria-label": (0, import_i18n10.sprintf)( 3184 /* translators: %d: The row number in the grid */ 3185 (0, import_i18n10.__)("Row %d"), 3186 i2 + 1 3187 ), 3188 className: "dataviews-view-grid__row", 3189 style: { 3190 gridTemplateColumns: `repeat( $gridColumns}, minmax(0, 1fr) )` 3191 } 3192 } 3193 ), 3194 children: row.map((item, indexInRow) => { 3195 const index = i2 * gridColumns + indexInRow; 3196 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3197 import_components9.Composite.Item, 3198 { 3199 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)( 3200 GridItem, 3201 { 3202 ...props, 3203 role: isInfiniteScroll ? "article" : "gridcell", 3204 "aria-setsize": isInfiniteScroll ? paginationInfo.totalItems : void 0, 3205 "aria-posinset": isInfiniteScroll ? index + 1 : void 0, 3206 view, 3207 selection, 3208 onChangeSelection, 3209 onClickItem, 3210 isItemClickable, 3211 renderItemLink, 3212 getItemId, 3213 item, 3214 actions, 3215 mediaField, 3216 titleField, 3217 descriptionField, 3218 regularFields, 3219 badgeFields, 3220 hasBulkActions, 3221 config: { 3222 sizes: size 3223 } 3224 } 3225 ) 3226 }, 3227 getItemId(item) 3228 ); 3229 }) 3230 }, 3231 i2 3232 )) 3233 } 3234 ); 3235 } 3236 3237 // packages/dataviews/build-module/dataviews-layouts/grid/index.js 3238 var import_jsx_runtime34 = __toESM(require_jsx_runtime()); 3239 function ViewGrid({ 3240 actions, 3241 data, 3242 fields, 3243 getItemId, 3244 isLoading, 3245 onChangeSelection, 3246 onClickItem, 3247 isItemClickable, 3248 renderItemLink, 3249 selection, 3250 view, 3251 className, 3252 empty 3253 }) { 3254 const hasData = !!data?.length; 3255 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 3256 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 3257 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 3258 const gridProps = { 3259 className, 3260 isLoading, 3261 view, 3262 fields, 3263 selection, 3264 onChangeSelection, 3265 onClickItem, 3266 isItemClickable, 3267 renderItemLink, 3268 getItemId, 3269 actions 3270 }; 3271 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { 3272 // Render multiple groups. 3273 children: [ 3274 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_components10.__experimentalVStack, { spacing: 4, children: Array.from(dataByGroup.entries()).map( 3275 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_components10.__experimentalVStack, { spacing: 2, children: [ 3276 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("h3", { className: "dataviews-view-grid__group-header", children: (0, import_i18n11.sprintf)( 3277 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 3278 (0, import_i18n11.__)("%1$s: %2$s"), 3279 groupField.label, 3280 groupName 3281 ) }), 3282 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( 3283 CompositeGrid, 3284 { 3285 ...gridProps, 3286 data: groupItems, 3287 isInfiniteScroll: false 3288 } 3289 ) 3290 ] }, groupName) 3291 ) }), 3292 // Render a single grid with all data. 3293 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( 3294 CompositeGrid, 3295 { 3296 ...gridProps, 3297 data, 3298 isInfiniteScroll: !!isInfiniteScroll 3299 } 3300 ), 3301 // Render empty state. 3302 !hasData && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( 3303 "div", 3304 { 3305 className: clsx_default({ 3306 "dataviews-loading": isLoading, 3307 "dataviews-no-results": !isLoading 3308 }), 3309 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_components10.Spinner, {}) }) : empty 3310 } 3311 ), 3312 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_components10.Spinner, {}) }) 3313 ] 3314 }); 3315 } 3316 var grid_default = ViewGrid; 3317 3318 // packages/dataviews/build-module/dataviews-layouts/list/index.js 3319 var import_compose5 = __toESM(require_compose()); 3320 var import_components11 = __toESM(require_components()); 3321 var import_element12 = __toESM(require_element()); 3322 var import_i18n12 = __toESM(require_i18n()); 3323 var import_data5 = __toESM(require_data()); 3324 var import_jsx_runtime35 = __toESM(require_jsx_runtime()); 3325 var { Menu: Menu3 } = unlock(import_components11.privateApis); 3326 function generateItemWrapperCompositeId(idPrefix) { 3327 return `$idPrefix}-item-wrapper`; 3328 } 3329 function generatePrimaryActionCompositeId(idPrefix, primaryActionId) { 3330 return `$idPrefix}-primary-action-$primaryActionId}`; 3331 } 3332 function generateDropdownTriggerCompositeId(idPrefix) { 3333 return `$idPrefix}-dropdown`; 3334 } 3335 function PrimaryActionGridCell({ 3336 idPrefix, 3337 primaryAction, 3338 item 3339 }) { 3340 const registry = (0, import_data5.useRegistry)(); 3341 const [isModalOpen, setIsModalOpen] = (0, import_element12.useState)(false); 3342 const compositeItemId = generatePrimaryActionCompositeId( 3343 idPrefix, 3344 primaryAction.id 3345 ); 3346 const label = typeof primaryAction.label === "string" ? primaryAction.label : primaryAction.label([item]); 3347 return "RenderModal" in primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3348 import_components11.Composite.Item, 3349 { 3350 id: compositeItemId, 3351 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3352 import_components11.Button, 3353 { 3354 disabled: !!primaryAction.disabled, 3355 accessibleWhenDisabled: true, 3356 text: label, 3357 size: "small", 3358 onClick: () => setIsModalOpen(true) 3359 } 3360 ), 3361 children: isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3362 ActionModal, 3363 { 3364 action: primaryAction, 3365 items: [item], 3366 closeModal: () => setIsModalOpen(false) 3367 } 3368 ) 3369 } 3370 ) }, primaryAction.id) : /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3371 import_components11.Composite.Item, 3372 { 3373 id: compositeItemId, 3374 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3375 import_components11.Button, 3376 { 3377 disabled: !!primaryAction.disabled, 3378 accessibleWhenDisabled: true, 3379 size: "small", 3380 onClick: () => { 3381 primaryAction.callback([item], { registry }); 3382 }, 3383 children: label 3384 } 3385 ) 3386 } 3387 ) }, primaryAction.id); 3388 } 3389 function ListItem({ 3390 view, 3391 actions, 3392 idPrefix, 3393 isSelected: isSelected2, 3394 item, 3395 titleField, 3396 mediaField, 3397 descriptionField, 3398 onSelect, 3399 otherFields, 3400 onDropdownTriggerKeyDown, 3401 posinset 3402 }) { 3403 const { 3404 showTitle = true, 3405 showMedia = true, 3406 showDescription = true, 3407 infiniteScrollEnabled 3408 } = view; 3409 const itemRef = (0, import_element12.useRef)(null); 3410 const labelId = `$idPrefix}-label`; 3411 const descriptionId = `$idPrefix}-description`; 3412 const registry = (0, import_data5.useRegistry)(); 3413 const [isHovered, setIsHovered] = (0, import_element12.useState)(false); 3414 const [activeModalAction, setActiveModalAction] = (0, import_element12.useState)( 3415 null 3416 ); 3417 const handleHover = ({ type }) => { 3418 const isHover = type === "mouseenter"; 3419 setIsHovered(isHover); 3420 }; 3421 const { paginationInfo } = (0, import_element12.useContext)(dataviews_context_default); 3422 (0, import_element12.useEffect)(() => { 3423 if (isSelected2) { 3424 itemRef.current?.scrollIntoView({ 3425 behavior: "auto", 3426 block: "nearest", 3427 inline: "nearest" 3428 }); 3429 } 3430 }, [isSelected2]); 3431 const { primaryAction, eligibleActions } = (0, import_element12.useMemo)(() => { 3432 const _eligibleActions = actions.filter( 3433 (action) => !action.isEligible || action.isEligible(item) 3434 ); 3435 const _primaryActions = _eligibleActions.filter( 3436 (action) => action.isPrimary 3437 ); 3438 return { 3439 primaryAction: _primaryActions[0], 3440 eligibleActions: _eligibleActions 3441 }; 3442 }, [actions, item]); 3443 const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1; 3444 const renderedMediaField = showMedia && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "dataviews-view-list__media-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3445 mediaField.render, 3446 { 3447 item, 3448 field: mediaField, 3449 config: { sizes: "52px" } 3450 } 3451 ) }) : null; 3452 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(titleField.render, { item, field: titleField }) : null; 3453 const usedActions = eligibleActions?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components11.__experimentalHStack, { spacing: 3, className: "dataviews-view-list__item-actions", children: [ 3454 primaryAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3455 PrimaryActionGridCell, 3456 { 3457 idPrefix, 3458 primaryAction, 3459 item 3460 } 3461 ), 3462 !hasOnlyOnePrimaryAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { role: "gridcell", children: [ 3463 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(Menu3, { placement: "bottom-end", children: [ 3464 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3465 Menu3.TriggerButton, 3466 { 3467 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3468 import_components11.Composite.Item, 3469 { 3470 id: generateDropdownTriggerCompositeId( 3471 idPrefix 3472 ), 3473 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3474 import_components11.Button, 3475 { 3476 size: "small", 3477 icon: more_vertical_default, 3478 label: (0, import_i18n12.__)("Actions"), 3479 accessibleWhenDisabled: true, 3480 disabled: !actions.length, 3481 onKeyDown: onDropdownTriggerKeyDown 3482 } 3483 ) 3484 } 3485 ) 3486 } 3487 ), 3488 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Menu3.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3489 ActionsMenuGroup, 3490 { 3491 actions: eligibleActions, 3492 item, 3493 registry, 3494 setActiveModalAction 3495 } 3496 ) }) 3497 ] }), 3498 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3499 ActionModal, 3500 { 3501 action: activeModalAction, 3502 items: [item], 3503 closeModal: () => setActiveModalAction(null) 3504 } 3505 ) 3506 ] }) 3507 ] }); 3508 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3509 import_components11.Composite.Row, 3510 { 3511 ref: itemRef, 3512 render: ( 3513 /* aria-posinset breaks Composite.Row if passed to it directly. */ 3514 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3515 "div", 3516 { 3517 "aria-posinset": posinset, 3518 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0 3519 } 3520 ) 3521 ), 3522 role: infiniteScrollEnabled ? "article" : "row", 3523 className: clsx_default({ 3524 "is-selected": isSelected2, 3525 "is-hovered": isHovered 3526 }), 3527 onMouseEnter: handleHover, 3528 onMouseLeave: handleHover, 3529 children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components11.__experimentalHStack, { className: "dataviews-view-list__item-wrapper", spacing: 0, children: [ 3530 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3531 import_components11.Composite.Item, 3532 { 3533 id: generateItemWrapperCompositeId(idPrefix), 3534 "aria-pressed": isSelected2, 3535 "aria-labelledby": labelId, 3536 "aria-describedby": descriptionId, 3537 className: "dataviews-view-list__item", 3538 onClick: () => onSelect(item) 3539 } 3540 ) }), 3541 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components11.__experimentalHStack, { spacing: 3, justify: "start", alignment: "flex-start", children: [ 3542 renderedMediaField, 3543 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)( 3544 import_components11.__experimentalVStack, 3545 { 3546 spacing: 1, 3547 className: "dataviews-view-list__field-wrapper", 3548 children: [ 3549 /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components11.__experimentalHStack, { spacing: 0, children: [ 3550 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3551 "div", 3552 { 3553 className: "dataviews-title-field", 3554 id: labelId, 3555 children: renderedTitleField 3556 } 3557 ), 3558 usedActions 3559 ] }), 3560 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "dataviews-view-list__field", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3561 descriptionField.render, 3562 { 3563 item, 3564 field: descriptionField 3565 } 3566 ) }), 3567 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3568 "div", 3569 { 3570 className: "dataviews-view-list__fields", 3571 id: descriptionId, 3572 children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)( 3573 "div", 3574 { 3575 className: "dataviews-view-list__field", 3576 children: [ 3577 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3578 import_components11.VisuallyHidden, 3579 { 3580 as: "span", 3581 className: "dataviews-view-list__field-label", 3582 children: field.label 3583 } 3584 ), 3585 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "dataviews-view-list__field-value", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3586 field.render, 3587 { 3588 item, 3589 field 3590 } 3591 ) }) 3592 ] 3593 }, 3594 field.id 3595 )) 3596 } 3597 ) 3598 ] 3599 } 3600 ) 3601 ] }) 3602 ] }) 3603 } 3604 ); 3605 } 3606 function isDefined2(item) { 3607 return !!item; 3608 } 3609 function ViewList(props) { 3610 const { 3611 actions, 3612 data, 3613 fields, 3614 getItemId, 3615 isLoading, 3616 onChangeSelection, 3617 selection, 3618 view, 3619 className, 3620 empty 3621 } = props; 3622 const baseId = (0, import_compose5.useInstanceId)(ViewList, "view-list"); 3623 const selectedItem = data?.findLast( 3624 (item) => selection.includes(getItemId(item)) 3625 ); 3626 const titleField = fields.find((field) => field.id === view.titleField); 3627 const mediaField = fields.find((field) => field.id === view.mediaField); 3628 const descriptionField = fields.find( 3629 (field) => field.id === view.descriptionField 3630 ); 3631 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined2); 3632 const onSelect = (item) => onChangeSelection([getItemId(item)]); 3633 const generateCompositeItemIdPrefix = (0, import_element12.useCallback)( 3634 (item) => `$baseId}-$getItemId(item)}`, 3635 [baseId, getItemId] 3636 ); 3637 const isActiveCompositeItem = (0, import_element12.useCallback)( 3638 (item, idToCheck) => { 3639 return idToCheck.startsWith( 3640 generateCompositeItemIdPrefix(item) 3641 ); 3642 }, 3643 [generateCompositeItemIdPrefix] 3644 ); 3645 const [activeCompositeId, setActiveCompositeId] = (0, import_element12.useState)(void 0); 3646 (0, import_element12.useEffect)(() => { 3647 if (selectedItem) { 3648 setActiveCompositeId( 3649 generateItemWrapperCompositeId( 3650 generateCompositeItemIdPrefix(selectedItem) 3651 ) 3652 ); 3653 } 3654 }, [selectedItem, generateCompositeItemIdPrefix]); 3655 const activeItemIndex = data.findIndex( 3656 (item) => isActiveCompositeItem(item, activeCompositeId ?? "") 3657 ); 3658 const previousActiveItemIndex = (0, import_compose5.usePrevious)(activeItemIndex); 3659 const isActiveIdInList = activeItemIndex !== -1; 3660 const selectCompositeItem = (0, import_element12.useCallback)( 3661 (targetIndex, generateCompositeId) => { 3662 const clampedIndex = Math.min( 3663 data.length - 1, 3664 Math.max(0, targetIndex) 3665 ); 3666 if (!data[clampedIndex]) { 3667 return; 3668 } 3669 const itemIdPrefix = generateCompositeItemIdPrefix( 3670 data[clampedIndex] 3671 ); 3672 const targetCompositeItemId = generateCompositeId(itemIdPrefix); 3673 setActiveCompositeId(targetCompositeItemId); 3674 document.getElementById(targetCompositeItemId)?.focus(); 3675 }, 3676 [data, generateCompositeItemIdPrefix] 3677 ); 3678 (0, import_element12.useEffect)(() => { 3679 const wasActiveIdInList = previousActiveItemIndex !== void 0 && previousActiveItemIndex !== -1; 3680 if (!isActiveIdInList && wasActiveIdInList) { 3681 selectCompositeItem( 3682 previousActiveItemIndex, 3683 generateItemWrapperCompositeId 3684 ); 3685 } 3686 }, [isActiveIdInList, selectCompositeItem, previousActiveItemIndex]); 3687 const onDropdownTriggerKeyDown = (0, import_element12.useCallback)( 3688 (event) => { 3689 if (event.key === "ArrowDown") { 3690 event.preventDefault(); 3691 selectCompositeItem( 3692 activeItemIndex + 1, 3693 generateDropdownTriggerCompositeId 3694 ); 3695 } 3696 if (event.key === "ArrowUp") { 3697 event.preventDefault(); 3698 selectCompositeItem( 3699 activeItemIndex - 1, 3700 generateDropdownTriggerCompositeId 3701 ); 3702 } 3703 }, 3704 [selectCompositeItem, activeItemIndex] 3705 ); 3706 const hasData = data?.length; 3707 if (!hasData) { 3708 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3709 "div", 3710 { 3711 className: clsx_default({ 3712 "dataviews-loading": isLoading, 3713 "dataviews-no-results": !hasData && !isLoading 3714 }), 3715 children: !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components11.Spinner, {}) }) : empty) 3716 } 3717 ); 3718 } 3719 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null; 3720 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 3721 if (hasData && groupField && dataByGroup) { 3722 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3723 import_components11.Composite, 3724 { 3725 id: `$baseId}`, 3726 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", {}), 3727 className: "dataviews-view-list__group", 3728 role: "grid", 3729 activeId: activeCompositeId, 3730 setActiveId: setActiveCompositeId, 3731 children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3732 import_components11.__experimentalVStack, 3733 { 3734 spacing: 4, 3735 className: clsx_default("dataviews-view-list", className), 3736 children: Array.from(dataByGroup.entries()).map( 3737 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components11.__experimentalVStack, { spacing: 2, children: [ 3738 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h3", { className: "dataviews-view-list__group-header", children: (0, import_i18n12.sprintf)( 3739 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 3740 (0, import_i18n12.__)("%1$s: %2$s"), 3741 groupField.label, 3742 groupName 3743 ) }), 3744 groupItems.map((item) => { 3745 const id = generateCompositeItemIdPrefix(item); 3746 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3747 ListItem, 3748 { 3749 view, 3750 idPrefix: id, 3751 actions, 3752 item, 3753 isSelected: item === selectedItem, 3754 onSelect, 3755 mediaField, 3756 titleField, 3757 descriptionField, 3758 otherFields, 3759 onDropdownTriggerKeyDown 3760 }, 3761 id 3762 ); 3763 }) 3764 ] }, groupName) 3765 ) 3766 } 3767 ) 3768 } 3769 ); 3770 } 3771 return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [ 3772 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3773 import_components11.Composite, 3774 { 3775 id: baseId, 3776 render: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", {}), 3777 className: clsx_default("dataviews-view-list", className), 3778 role: view.infiniteScrollEnabled ? "feed" : "grid", 3779 activeId: activeCompositeId, 3780 setActiveId: setActiveCompositeId, 3781 children: data.map((item, index) => { 3782 const id = generateCompositeItemIdPrefix(item); 3783 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 3784 ListItem, 3785 { 3786 view, 3787 idPrefix: id, 3788 actions, 3789 item, 3790 isSelected: item === selectedItem, 3791 onSelect, 3792 mediaField, 3793 titleField, 3794 descriptionField, 3795 otherFields, 3796 onDropdownTriggerKeyDown, 3797 posinset: view.infiniteScrollEnabled ? index + 1 : void 0 3798 }, 3799 id 3800 ); 3801 }) 3802 } 3803 ), 3804 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components11.Spinner, {}) }) 3805 ] }); 3806 } 3807 3808 // packages/dataviews/build-module/dataviews-layouts/activity/index.js 3809 var import_components14 = __toESM(require_components()); 3810 3811 // packages/dataviews/build-module/dataviews-layouts/activity/activity-group.js 3812 var import_components12 = __toESM(require_components()); 3813 var import_i18n13 = __toESM(require_i18n()); 3814 var import_element13 = __toESM(require_element()); 3815 var import_jsx_runtime36 = __toESM(require_jsx_runtime()); 3816 function ActivityGroup({ 3817 groupName, 3818 groupData, 3819 groupField, 3820 children 3821 }) { 3822 const groupHeader = (0, import_element13.createInterpolateElement)( 3823 // translators: %s: The label of the field e.g. "Status". 3824 (0, import_i18n13.sprintf)((0, import_i18n13.__)("%s: <groupName />"), groupField.label).trim(), 3825 { 3826 groupName: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3827 groupField.render, 3828 { 3829 item: groupData[0], 3830 field: groupField 3831 } 3832 ) 3833 } 3834 ); 3835 return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)( 3836 import_components12.__experimentalVStack, 3837 { 3838 spacing: 0, 3839 className: "dataviews-view-activity__group", 3840 children: [ 3841 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("h3", { className: "dataviews-view-activity__group-header", children: groupHeader }), 3842 children 3843 ] 3844 }, 3845 groupName 3846 ); 3847 } 3848 3849 // packages/dataviews/build-module/dataviews-layouts/activity/activity-item.js 3850 var import_components13 = __toESM(require_components()); 3851 var import_element14 = __toESM(require_element()); 3852 var import_data6 = __toESM(require_data()); 3853 var import_jsx_runtime37 = __toESM(require_jsx_runtime()); 3854 function ActivityItem(props) { 3855 const { 3856 view, 3857 actions, 3858 item, 3859 titleField, 3860 mediaField, 3861 descriptionField, 3862 otherFields, 3863 posinset, 3864 onClickItem, 3865 renderItemLink, 3866 isItemClickable 3867 } = props; 3868 const { 3869 showTitle = true, 3870 showMedia = true, 3871 showDescription = true, 3872 infiniteScrollEnabled 3873 } = view; 3874 const itemRef = (0, import_element14.useRef)(null); 3875 const registry = (0, import_data6.useRegistry)(); 3876 const { paginationInfo } = (0, import_element14.useContext)(dataviews_context_default); 3877 const { primaryActions, eligibleActions } = (0, import_element14.useMemo)(() => { 3878 const _eligibleActions = actions.filter( 3879 (action) => !action.isEligible || action.isEligible(item) 3880 ); 3881 const _primaryActions = _eligibleActions.filter( 3882 (action) => action.isPrimary 3883 ); 3884 return { 3885 primaryActions: _primaryActions, 3886 eligibleActions: _eligibleActions 3887 }; 3888 }, [actions, item]); 3889 const density = view.layout?.density ?? "balanced"; 3890 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3891 mediaField.render, 3892 { 3893 item, 3894 field: mediaField, 3895 config: { 3896 sizes: density === "comfortable" ? "32px" : "24px" 3897 } 3898 } 3899 ) : null; 3900 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3901 "span", 3902 { 3903 className: "dataviews-view-activity__item-bullet", 3904 "aria-hidden": "true" 3905 } 3906 ) }); 3907 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(titleField.render, { item, field: titleField }) : null; 3908 const verticalSpacing = (0, import_element14.useMemo)(() => { 3909 switch (density) { 3910 case "comfortable": 3911 return "3"; 3912 default: 3913 return "2"; 3914 } 3915 }, [density]); 3916 return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3917 "div", 3918 { 3919 ref: itemRef, 3920 role: infiniteScrollEnabled ? "article" : void 0, 3921 "aria-posinset": posinset, 3922 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0, 3923 className: clsx_default( 3924 "dataviews-view-activity__item", 3925 density === "compact" && "is-compact", 3926 density === "balanced" && "is-balanced", 3927 density === "comfortable" && "is-comfortable" 3928 ), 3929 children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_components13.__experimentalHStack, { spacing: 4, justify: "start", alignment: "flex-start", children: [ 3930 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3931 import_components13.__experimentalVStack, 3932 { 3933 spacing: 1, 3934 alignment: "center", 3935 className: "dataviews-view-activity__item-type", 3936 children: renderedMediaField 3937 } 3938 ), 3939 /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)( 3940 import_components13.__experimentalVStack, 3941 { 3942 spacing: verticalSpacing, 3943 alignment: "flex-start", 3944 className: "dataviews-view-activity__item-content", 3945 children: [ 3946 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3947 ItemClickWrapper, 3948 { 3949 item, 3950 isItemClickable, 3951 onClickItem, 3952 renderItemLink, 3953 className: "dataviews-view-activity__item-title", 3954 children: renderedTitleField 3955 } 3956 ), 3957 showDescription && descriptionField && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-description", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3958 descriptionField.render, 3959 { 3960 item, 3961 field: descriptionField 3962 } 3963 ) }), 3964 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)( 3965 "div", 3966 { 3967 className: "dataviews-view-activity__item-field", 3968 children: [ 3969 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3970 import_components13.VisuallyHidden, 3971 { 3972 as: "span", 3973 className: "dataviews-view-activity__item-field-label", 3974 children: field.label 3975 } 3976 ), 3977 /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "dataviews-view-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3978 field.render, 3979 { 3980 item, 3981 field 3982 } 3983 ) }) 3984 ] 3985 }, 3986 field.id 3987 )) }), 3988 !!primaryActions?.length && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 3989 PrimaryActions, 3990 { 3991 item, 3992 actions: primaryActions, 3993 registry, 3994 buttonVariant: "secondary" 3995 } 3996 ) 3997 ] 3998 } 3999 ), 4000 primaryActions.length < eligibleActions.length && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "dataviews-view-activity__item-actions", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)( 4001 ItemActions, 4002 { 4003 item, 4004 actions: eligibleActions, 4005 isCompact: true 4006 } 4007 ) }) 4008 ] }) 4009 } 4010 ); 4011 } 4012 var activity_item_default = ActivityItem; 4013 4014 // packages/dataviews/build-module/dataviews-layouts/activity/activity-items.js 4015 var import_react = __toESM(require_react()); 4016 function isDefined3(item) { 4017 return !!item; 4018 } 4019 function ActivityItems(props) { 4020 const { data, fields, getItemId, view } = props; 4021 const titleField = fields.find((field) => field.id === view.titleField); 4022 const mediaField = fields.find((field) => field.id === view.mediaField); 4023 const descriptionField = fields.find( 4024 (field) => field.id === view.descriptionField 4025 ); 4026 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined3); 4027 return data.map((item, index) => { 4028 return /* @__PURE__ */ (0, import_react.createElement)( 4029 activity_item_default, 4030 { 4031 ...props, 4032 key: getItemId(item), 4033 item, 4034 mediaField, 4035 titleField, 4036 descriptionField, 4037 otherFields, 4038 posinset: view.infiniteScrollEnabled ? index + 1 : void 0 4039 } 4040 ); 4041 }); 4042 } 4043 4044 // packages/dataviews/build-module/dataviews-layouts/activity/index.js 4045 var import_jsx_runtime38 = __toESM(require_jsx_runtime()); 4046 function ViewActivity(props) { 4047 const { empty, data, fields, isLoading, view, className } = props; 4048 const hasData = data?.length; 4049 if (!hasData) { 4050 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 4051 "div", 4052 { 4053 className: clsx_default({ 4054 "dataviews-loading": isLoading, 4055 "dataviews-no-results": !hasData && !isLoading 4056 }), 4057 children: !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_components14.Spinner, {}) }) : empty) 4058 } 4059 ); 4060 } 4061 const wrapperClassName = clsx_default("dataviews-view-activity", className); 4062 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null; 4063 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 4064 const groupedEntries = dataByGroup ? Array.from(dataByGroup.entries()) : []; 4065 if (hasData && groupField && dataByGroup) { 4066 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_components14.__experimentalVStack, { spacing: 2, className: wrapperClassName, children: groupedEntries.map( 4067 ([groupName, groupData]) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 4068 ActivityGroup, 4069 { 4070 groupName, 4071 groupData, 4072 groupField, 4073 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 4074 ActivityItems, 4075 { 4076 ...props, 4077 data: groupData 4078 } 4079 ) 4080 }, 4081 groupName 4082 ) 4083 ) }); 4084 } 4085 return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [ 4086 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 4087 "div", 4088 { 4089 className: wrapperClassName, 4090 role: view.infiniteScrollEnabled ? "feed" : void 0, 4091 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ActivityItems, { ...props }) 4092 } 4093 ), 4094 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_components14.Spinner, {}) }) 4095 ] }); 4096 } 4097 4098 // packages/dataviews/build-module/dataviews-layouts/picker-grid/index.js 4099 var import_components17 = __toESM(require_components()); 4100 var import_i18n16 = __toESM(require_i18n()); 4101 var import_compose6 = __toESM(require_compose()); 4102 var import_element18 = __toESM(require_element()); 4103 4104 // packages/dataviews/build-module/components/dataviews-picker/footer.js 4105 var import_components16 = __toESM(require_components()); 4106 var import_data7 = __toESM(require_data()); 4107 var import_element16 = __toESM(require_element()); 4108 var import_i18n15 = __toESM(require_i18n()); 4109 4110 // packages/dataviews/build-module/components/dataviews-pagination/index.js 4111 var import_components15 = __toESM(require_components()); 4112 var import_element15 = __toESM(require_element()); 4113 var import_i18n14 = __toESM(require_i18n()); 4114 var import_jsx_runtime39 = __toESM(require_jsx_runtime()); 4115 function DataViewsPagination() { 4116 const { 4117 view, 4118 onChangeView, 4119 paginationInfo: { totalItems = 0, totalPages } 4120 } = (0, import_element15.useContext)(dataviews_context_default); 4121 if (!totalItems || !totalPages || view.infiniteScrollEnabled) { 4122 return null; 4123 } 4124 const currentPage = view.page ?? 1; 4125 const pageSelectOptions = Array.from(Array(totalPages)).map( 4126 (_, i2) => { 4127 const page = i2 + 1; 4128 return { 4129 value: page.toString(), 4130 label: page.toString(), 4131 "aria-label": currentPage === page ? (0, import_i18n14.sprintf)( 4132 // translators: 1: current page number. 2: total number of pages. 4133 (0, import_i18n14.__)("Page %1$d of %2$d"), 4134 currentPage, 4135 totalPages 4136 ) : page.toString() 4137 }; 4138 } 4139 ); 4140 return !!totalItems && totalPages !== 1 && /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)( 4141 import_components15.__experimentalHStack, 4142 { 4143 expanded: false, 4144 className: "dataviews-pagination", 4145 justify: "end", 4146 spacing: 6, 4147 children: [ 4148 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 4149 import_components15.__experimentalHStack, 4150 { 4151 justify: "flex-start", 4152 expanded: false, 4153 spacing: 1, 4154 className: "dataviews-pagination__page-select", 4155 children: (0, import_element15.createInterpolateElement)( 4156 (0, import_i18n14.sprintf)( 4157 // translators: 1: Current page number, 2: Total number of pages. 4158 (0, import_i18n14._x)( 4159 "<div>Page</div>%1$s<div>of %2$d</div>", 4160 "paging" 4161 ), 4162 "<CurrentPage />", 4163 totalPages 4164 ), 4165 { 4166 div: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { "aria-hidden": true }), 4167 CurrentPage: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 4168 import_components15.SelectControl, 4169 { 4170 "aria-label": (0, import_i18n14.__)("Current page"), 4171 value: currentPage.toString(), 4172 options: pageSelectOptions, 4173 onChange: (newValue) => { 4174 onChangeView({ 4175 ...view, 4176 page: +newValue 4177 }); 4178 }, 4179 size: "small", 4180 variant: "minimal" 4181 } 4182 ) 4183 } 4184 ) 4185 } 4186 ), 4187 /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_components15.__experimentalHStack, { expanded: false, spacing: 1, children: [ 4188 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 4189 import_components15.Button, 4190 { 4191 onClick: () => onChangeView({ 4192 ...view, 4193 page: currentPage - 1 4194 }), 4195 disabled: currentPage === 1, 4196 accessibleWhenDisabled: true, 4197 label: (0, import_i18n14.__)("Previous page"), 4198 icon: (0, import_i18n14.isRTL)() ? next_default : previous_default, 4199 showTooltip: true, 4200 size: "compact", 4201 tooltipPosition: "top" 4202 } 4203 ), 4204 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 4205 import_components15.Button, 4206 { 4207 onClick: () => onChangeView({ ...view, page: currentPage + 1 }), 4208 disabled: currentPage >= totalPages, 4209 accessibleWhenDisabled: true, 4210 label: (0, import_i18n14.__)("Next page"), 4211 icon: (0, import_i18n14.isRTL)() ? previous_default : next_default, 4212 showTooltip: true, 4213 size: "compact", 4214 tooltipPosition: "top" 4215 } 4216 ) 4217 ] }) 4218 ] 4219 } 4220 ); 4221 } 4222 var dataviews_pagination_default = (0, import_element15.memo)(DataViewsPagination); 4223 4224 // packages/dataviews/build-module/components/dataviews-picker/footer.js 4225 var import_jsx_runtime40 = __toESM(require_jsx_runtime()); 4226 function useIsMultiselectPicker(actions) { 4227 return (0, import_element16.useMemo)(() => { 4228 return actions?.every((action) => action.supportsBulk); 4229 }, [actions]); 4230 } 4231 4232 // packages/dataviews/build-module/dataviews-layouts/utils/grid-items.js 4233 var import_element17 = __toESM(require_element()); 4234 var import_jsx_runtime41 = __toESM(require_jsx_runtime()); 4235 var GridItems = (0, import_element17.forwardRef)(({ className, previewSize, ...props }, ref) => { 4236 return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)( 4237 "div", 4238 { 4239 ref, 4240 className: clsx_default("dataviews-view-grid-items", className), 4241 style: { 4242 gridTemplateColumns: previewSize && `repeat(auto-fill, minmax($previewSize}px, 1fr))` 4243 }, 4244 ...props 4245 } 4246 ); 4247 }); 4248 4249 // packages/dataviews/build-module/dataviews-layouts/picker-grid/index.js 4250 var import_jsx_runtime42 = __toESM(require_jsx_runtime()); 4251 var { Badge: Badge2 } = unlock(import_components17.privateApis); 4252 function GridItem3({ 4253 view, 4254 multiselect, 4255 selection, 4256 onChangeSelection, 4257 getItemId, 4258 item, 4259 mediaField, 4260 titleField, 4261 descriptionField, 4262 regularFields, 4263 badgeFields, 4264 config, 4265 posinset, 4266 setsize 4267 }) { 4268 const { showTitle = true, showMedia = true, showDescription = true } = view; 4269 const id = getItemId(item); 4270 const isSelected2 = selection.includes(id); 4271 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4272 mediaField.render, 4273 { 4274 item, 4275 field: mediaField, 4276 config 4277 } 4278 ) : null; 4279 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(titleField.render, { item, field: titleField }) : null; 4280 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)( 4281 import_components17.Composite.Item, 4282 { 4283 "aria-label": titleField ? titleField.getValue({ item }) || (0, import_i18n16.__)("(no title)") : void 0, 4284 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components17.__experimentalVStack, { spacing: 0, children, ...props }), 4285 role: "option", 4286 "aria-posinset": posinset, 4287 "aria-setsize": setsize, 4288 className: clsx_default("dataviews-view-picker-grid__card", { 4289 "is-selected": isSelected2 4290 }), 4291 "aria-selected": isSelected2, 4292 onClick: () => { 4293 if (isSelected2) { 4294 onChangeSelection( 4295 selection.filter((itemId) => id !== itemId) 4296 ); 4297 } else { 4298 const newSelection = multiselect ? [...selection, id] : [id]; 4299 onChangeSelection(newSelection); 4300 } 4301 }, 4302 children: [ 4303 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-picker-grid__media", children: renderedMediaField }), 4304 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4305 DataViewsSelectionCheckbox, 4306 { 4307 item, 4308 selection, 4309 onChangeSelection, 4310 getItemId, 4311 titleField, 4312 disabled: false, 4313 "aria-hidden": true, 4314 tabIndex: -1 4315 } 4316 ), 4317 showTitle && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4318 import_components17.__experimentalHStack, 4319 { 4320 justify: "space-between", 4321 className: "dataviews-view-picker-grid__title-actions", 4322 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-picker-grid__title-field dataviews-title-field", children: renderedTitleField }) 4323 } 4324 ), 4325 /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_components17.__experimentalVStack, { spacing: 1, children: [ 4326 showDescription && descriptionField?.render && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4327 descriptionField.render, 4328 { 4329 item, 4330 field: descriptionField 4331 } 4332 ), 4333 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4334 import_components17.__experimentalHStack, 4335 { 4336 className: "dataviews-view-picker-grid__badge-fields", 4337 spacing: 2, 4338 wrap: true, 4339 alignment: "top", 4340 justify: "flex-start", 4341 children: badgeFields.map((field) => { 4342 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4343 Badge2, 4344 { 4345 className: "dataviews-view-picker-grid__field-value", 4346 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4347 field.render, 4348 { 4349 item, 4350 field 4351 } 4352 ) 4353 }, 4354 field.id 4355 ); 4356 }) 4357 } 4358 ), 4359 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4360 import_components17.__experimentalVStack, 4361 { 4362 className: "dataviews-view-picker-grid__fields", 4363 spacing: 1, 4364 children: regularFields.map((field) => { 4365 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4366 import_components17.Flex, 4367 { 4368 className: "dataviews-view-picker-grid__field", 4369 gap: 1, 4370 justify: "flex-start", 4371 expanded: true, 4372 style: { height: "auto" }, 4373 direction: "row", 4374 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [ 4375 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components17.FlexItem, { className: "dataviews-view-picker-grid__field-name", children: field.header }), 4376 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4377 import_components17.FlexItem, 4378 { 4379 className: "dataviews-view-picker-grid__field-value", 4380 style: { maxHeight: "none" }, 4381 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4382 field.render, 4383 { 4384 item, 4385 field 4386 } 4387 ) 4388 } 4389 ) 4390 ] }) 4391 }, 4392 field.id 4393 ); 4394 }) 4395 } 4396 ) 4397 ] }) 4398 ] 4399 }, 4400 id 4401 ); 4402 } 4403 function GridGroup({ 4404 groupName, 4405 groupField, 4406 children 4407 }) { 4408 const headerId = (0, import_compose6.useInstanceId)( 4409 GridGroup, 4410 "dataviews-view-picker-grid-group__header" 4411 ); 4412 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)( 4413 import_components17.__experimentalVStack, 4414 { 4415 spacing: 2, 4416 role: "group", 4417 "aria-labelledby": headerId, 4418 children: [ 4419 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4420 "h3", 4421 { 4422 className: "dataviews-view-picker-grid-group__header", 4423 id: headerId, 4424 children: (0, import_i18n16.sprintf)( 4425 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 4426 (0, import_i18n16.__)("%1$s: %2$s"), 4427 groupField.label, 4428 groupName 4429 ) 4430 } 4431 ), 4432 children 4433 ] 4434 }, 4435 groupName 4436 ); 4437 } 4438 function ViewPickerGrid({ 4439 actions, 4440 data, 4441 fields, 4442 getItemId, 4443 isLoading, 4444 onChangeSelection, 4445 selection, 4446 view, 4447 className, 4448 empty 4449 }) { 4450 const { resizeObserverRef, paginationInfo, itemListLabel } = (0, import_element18.useContext)(dataviews_context_default); 4451 const titleField = fields.find( 4452 (field) => field.id === view?.titleField 4453 ); 4454 const mediaField = fields.find( 4455 (field) => field.id === view?.mediaField 4456 ); 4457 const descriptionField = fields.find( 4458 (field) => field.id === view?.descriptionField 4459 ); 4460 const otherFields = view.fields ?? []; 4461 const { regularFields, badgeFields } = otherFields.reduce( 4462 (accumulator, fieldId) => { 4463 const field = fields.find((f2) => f2.id === fieldId); 4464 if (!field) { 4465 return accumulator; 4466 } 4467 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields"; 4468 accumulator[key].push(field); 4469 return accumulator; 4470 }, 4471 { regularFields: [], badgeFields: [] } 4472 ); 4473 const hasData = !!data?.length; 4474 const usedPreviewSize = view.layout?.previewSize; 4475 const isMultiselect = useIsMultiselectPicker(actions); 4476 const size = "900px"; 4477 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 4478 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 4479 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 4480 const currentPage = view?.page ?? 1; 4481 const perPage = view?.perPage ?? 0; 4482 const setSize = isInfiniteScroll ? paginationInfo?.totalItems : void 0; 4483 return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { 4484 // Render multiple groups. 4485 children: [ 4486 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4487 import_components17.Composite, 4488 { 4489 virtualFocus: true, 4490 orientation: "horizontal", 4491 role: "listbox", 4492 "aria-multiselectable": isMultiselect, 4493 className: clsx_default( 4494 "dataviews-view-picker-grid", 4495 className 4496 ), 4497 "aria-label": itemListLabel, 4498 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4499 import_components17.__experimentalVStack, 4500 { 4501 spacing: 4, 4502 children, 4503 ...props 4504 } 4505 ), 4506 children: Array.from(dataByGroup.entries()).map( 4507 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4508 GridGroup, 4509 { 4510 groupName, 4511 groupField, 4512 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4513 GridItems, 4514 { 4515 previewSize: usedPreviewSize, 4516 style: { 4517 gridTemplateColumns: usedPreviewSize && `repeat(auto-fill, minmax($usedPreviewSize}px, 1fr))` 4518 }, 4519 "aria-busy": isLoading, 4520 ref: resizeObserverRef, 4521 children: groupItems.map((item) => { 4522 const posInSet = (currentPage - 1) * perPage + data.indexOf(item) + 1; 4523 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4524 GridItem3, 4525 { 4526 view, 4527 multiselect: isMultiselect, 4528 selection, 4529 onChangeSelection, 4530 getItemId, 4531 item, 4532 mediaField, 4533 titleField, 4534 descriptionField, 4535 regularFields, 4536 badgeFields, 4537 config: { 4538 sizes: size 4539 }, 4540 posinset: posInSet, 4541 setsize: setSize 4542 }, 4543 getItemId(item) 4544 ); 4545 }) 4546 } 4547 ) 4548 }, 4549 groupName 4550 ) 4551 ) 4552 } 4553 ), 4554 // Render a single grid with all data. 4555 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4556 import_components17.Composite, 4557 { 4558 render: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4559 GridItems, 4560 { 4561 className: clsx_default( 4562 "dataviews-view-picker-grid", 4563 className 4564 ), 4565 previewSize: usedPreviewSize, 4566 "aria-busy": isLoading, 4567 ref: resizeObserverRef 4568 } 4569 ), 4570 virtualFocus: true, 4571 orientation: "horizontal", 4572 role: "listbox", 4573 "aria-multiselectable": isMultiselect, 4574 "aria-label": itemListLabel, 4575 children: data.map((item, index) => { 4576 let posinset = isInfiniteScroll ? index + 1 : void 0; 4577 if (!isInfiniteScroll) { 4578 posinset = (currentPage - 1) * perPage + index + 1; 4579 } 4580 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4581 GridItem3, 4582 { 4583 view, 4584 multiselect: isMultiselect, 4585 selection, 4586 onChangeSelection, 4587 getItemId, 4588 item, 4589 mediaField, 4590 titleField, 4591 descriptionField, 4592 regularFields, 4593 badgeFields, 4594 config: { 4595 sizes: size 4596 }, 4597 posinset, 4598 setsize: setSize 4599 }, 4600 getItemId(item) 4601 ); 4602 }) 4603 } 4604 ), 4605 // Render empty state. 4606 !hasData && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4607 "div", 4608 { 4609 className: clsx_default({ 4610 "dataviews-loading": isLoading, 4611 "dataviews-no-results": !isLoading 4612 }), 4613 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components17.Spinner, {}) }) : empty 4614 } 4615 ), 4616 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_components17.Spinner, {}) }) 4617 ] 4618 }); 4619 } 4620 var picker_grid_default = ViewPickerGrid; 4621 4622 // packages/dataviews/build-module/dataviews-layouts/picker-table/index.js 4623 var import_i18n17 = __toESM(require_i18n()); 4624 var import_components18 = __toESM(require_components()); 4625 var import_element19 = __toESM(require_element()); 4626 var import_jsx_runtime43 = __toESM(require_jsx_runtime()); 4627 function TableColumnField2({ 4628 item, 4629 fields, 4630 column, 4631 align 4632 }) { 4633 const field = fields.find((f2) => f2.id === column); 4634 if (!field) { 4635 return null; 4636 } 4637 const className = clsx_default("dataviews-view-table__cell-content-wrapper", { 4638 "dataviews-view-table__cell-align-end": align === "end", 4639 "dataviews-view-table__cell-align-center": align === "center" 4640 }); 4641 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(field.render, { item, field }) }); 4642 } 4643 function TableRow2({ 4644 item, 4645 fields, 4646 id, 4647 view, 4648 titleField, 4649 mediaField, 4650 descriptionField, 4651 selection, 4652 getItemId, 4653 onChangeSelection, 4654 multiselect, 4655 posinset 4656 }) { 4657 const { paginationInfo } = (0, import_element19.useContext)(dataviews_context_default); 4658 const isSelected2 = selection.includes(id); 4659 const [isHovered, setIsHovered] = (0, import_element19.useState)(false); 4660 const { 4661 showTitle = true, 4662 showMedia = true, 4663 showDescription = true, 4664 infiniteScrollEnabled 4665 } = view; 4666 const handleMouseEnter = () => { 4667 setIsHovered(true); 4668 }; 4669 const handleMouseLeave = () => { 4670 setIsHovered(false); 4671 }; 4672 const columns = view.fields ?? []; 4673 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription; 4674 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)( 4675 import_components18.Composite.Item, 4676 { 4677 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4678 "tr", 4679 { 4680 className: clsx_default("dataviews-view-table__row", { 4681 "is-selected": isSelected2, 4682 "is-hovered": isHovered 4683 }), 4684 onMouseEnter: handleMouseEnter, 4685 onMouseLeave: handleMouseLeave, 4686 children, 4687 ...props 4688 } 4689 ), 4690 "aria-selected": isSelected2, 4691 "aria-setsize": paginationInfo.totalItems || void 0, 4692 "aria-posinset": posinset, 4693 role: infiniteScrollEnabled ? "article" : "option", 4694 onClick: () => { 4695 if (isSelected2) { 4696 onChangeSelection( 4697 selection.filter((itemId) => id !== itemId) 4698 ); 4699 } else { 4700 const newSelection = multiselect ? [...selection, id] : [id]; 4701 onChangeSelection(newSelection); 4702 } 4703 }, 4704 children: [ 4705 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4706 "td", 4707 { 4708 className: "dataviews-view-table__checkbox-column", 4709 role: "presentation", 4710 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4711 DataViewsSelectionCheckbox, 4712 { 4713 item, 4714 selection, 4715 onChangeSelection, 4716 getItemId, 4717 titleField, 4718 disabled: false, 4719 "aria-hidden": true, 4720 tabIndex: -1 4721 } 4722 ) }) 4723 } 4724 ), 4725 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("td", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4726 column_primary_default, 4727 { 4728 item, 4729 titleField: showTitle ? titleField : void 0, 4730 mediaField: showMedia ? mediaField : void 0, 4731 descriptionField: showDescription ? descriptionField : void 0, 4732 isItemClickable: () => false 4733 } 4734 ) }), 4735 columns.map((column) => { 4736 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 4737 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4738 "td", 4739 { 4740 style: { 4741 width, 4742 maxWidth, 4743 minWidth 4744 }, 4745 role: "presentation", 4746 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4747 TableColumnField2, 4748 { 4749 fields, 4750 item, 4751 column, 4752 align 4753 } 4754 ) 4755 }, 4756 column 4757 ); 4758 }) 4759 ] 4760 }, 4761 id 4762 ); 4763 } 4764 function ViewPickerTable({ 4765 actions, 4766 data, 4767 fields, 4768 getItemId, 4769 isLoading = false, 4770 onChangeView, 4771 onChangeSelection, 4772 selection, 4773 setOpenedFilter, 4774 view, 4775 className, 4776 empty 4777 }) { 4778 const headerMenuRefs = (0, import_element19.useRef)(/* @__PURE__ */ new Map()); 4779 const headerMenuToFocusRef = (0, import_element19.useRef)(); 4780 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element19.useState)(); 4781 const isMultiselect = useIsMultiselectPicker(actions) ?? false; 4782 (0, import_element19.useEffect)(() => { 4783 if (headerMenuToFocusRef.current) { 4784 headerMenuToFocusRef.current.focus(); 4785 headerMenuToFocusRef.current = void 0; 4786 } 4787 }); 4788 const tableNoticeId = (0, import_element19.useId)(); 4789 if (nextHeaderMenuToFocus) { 4790 headerMenuToFocusRef.current = nextHeaderMenuToFocus; 4791 setNextHeaderMenuToFocus(void 0); 4792 return; 4793 } 4794 const onHide = (field) => { 4795 const hidden = headerMenuRefs.current.get(field.id); 4796 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0; 4797 setNextHeaderMenuToFocus(fallback?.node); 4798 }; 4799 const hasData = !!data?.length; 4800 const titleField = fields.find((field) => field.id === view.titleField); 4801 const mediaField = fields.find((field) => field.id === view.mediaField); 4802 const descriptionField = fields.find( 4803 (field) => field.id === view.descriptionField 4804 ); 4805 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 4806 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 4807 const { showTitle = true, showMedia = true, showDescription = true } = view; 4808 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField && showDescription; 4809 const columns = view.fields ?? []; 4810 const headerMenuRef = (column, index) => (node) => { 4811 if (node) { 4812 headerMenuRefs.current.set(column, { 4813 node, 4814 fallback: columns[index > 0 ? index - 1 : 1] 4815 }); 4816 } else { 4817 headerMenuRefs.current.delete(column); 4818 } 4819 }; 4820 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 4821 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_jsx_runtime43.Fragment, { children: [ 4822 /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)( 4823 "table", 4824 { 4825 className: clsx_default( 4826 "dataviews-view-table", 4827 "dataviews-view-picker-table", 4828 className, 4829 { 4830 [`has-$view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes( 4831 view.layout.density 4832 ) 4833 } 4834 ), 4835 "aria-busy": isLoading, 4836 "aria-describedby": tableNoticeId, 4837 role: isInfiniteScroll ? "feed" : "listbox", 4838 children: [ 4839 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("thead", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)( 4840 "tr", 4841 { 4842 className: "dataviews-view-table__row", 4843 role: "presentation", 4844 children: [ 4845 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("th", { className: "dataviews-view-table__checkbox-column", children: isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4846 BulkSelectionCheckbox, 4847 { 4848 selection, 4849 onChangeSelection, 4850 data, 4851 actions, 4852 getItemId 4853 } 4854 ) }), 4855 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("th", { children: titleField && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4856 column_header_menu_default, 4857 { 4858 ref: headerMenuRef( 4859 titleField.id, 4860 0 4861 ), 4862 fieldId: titleField.id, 4863 view, 4864 fields, 4865 onChangeView, 4866 onHide, 4867 setOpenedFilter, 4868 canMove: false 4869 } 4870 ) }), 4871 columns.map((column, index) => { 4872 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 4873 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4874 "th", 4875 { 4876 style: { 4877 width, 4878 maxWidth, 4879 minWidth, 4880 textAlign: align 4881 }, 4882 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0, 4883 scope: "col", 4884 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4885 column_header_menu_default, 4886 { 4887 ref: headerMenuRef(column, index), 4888 fieldId: column, 4889 view, 4890 fields, 4891 onChangeView, 4892 onHide, 4893 setOpenedFilter, 4894 canMove: view.layout?.enableMoving ?? true 4895 } 4896 ) 4897 }, 4898 column 4899 ); 4900 }) 4901 ] 4902 } 4903 ) }), 4904 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map( 4905 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)( 4906 import_components18.Composite, 4907 { 4908 virtualFocus: true, 4909 orientation: "vertical", 4910 render: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("tbody", { role: "group" }), 4911 children: [ 4912 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4913 "tr", 4914 { 4915 className: "dataviews-view-table__group-header-row", 4916 role: "presentation", 4917 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4918 "td", 4919 { 4920 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + 1, 4921 className: "dataviews-view-table__group-header-cell", 4922 role: "presentation", 4923 children: (0, import_i18n17.sprintf)( 4924 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 4925 (0, import_i18n17.__)("%1$s: %2$s"), 4926 groupField.label, 4927 groupName 4928 ) 4929 } 4930 ) 4931 } 4932 ), 4933 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4934 TableRow2, 4935 { 4936 item, 4937 fields, 4938 id: getItemId(item) || index.toString(), 4939 view, 4940 titleField, 4941 mediaField, 4942 descriptionField, 4943 selection, 4944 getItemId, 4945 onChangeSelection, 4946 multiselect: isMultiselect 4947 }, 4948 getItemId(item) 4949 )) 4950 ] 4951 }, 4952 `group-$groupName}` 4953 ) 4954 ) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4955 import_components18.Composite, 4956 { 4957 render: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("tbody", { role: "presentation" }), 4958 virtualFocus: true, 4959 orientation: "vertical", 4960 children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4961 TableRow2, 4962 { 4963 item, 4964 fields, 4965 id: getItemId(item) || index.toString(), 4966 view, 4967 titleField, 4968 mediaField, 4969 descriptionField, 4970 selection, 4971 getItemId, 4972 onChangeSelection, 4973 multiselect: isMultiselect, 4974 posinset: index + 1 4975 }, 4976 getItemId(item) 4977 )) 4978 } 4979 ) 4980 ] 4981 } 4982 ), 4983 /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)( 4984 "div", 4985 { 4986 className: clsx_default({ 4987 "dataviews-loading": isLoading, 4988 "dataviews-no-results": !hasData && !isLoading 4989 }), 4990 id: tableNoticeId, 4991 children: [ 4992 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components18.Spinner, {}) }) : empty), 4993 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components18.Spinner, {}) }) 4994 ] 4995 } 4996 ) 4997 ] }); 4998 } 4999 var picker_table_default = ViewPickerTable; 5000 5001 // packages/dataviews/build-module/dataviews-layouts/utils/preview-size-picker.js 5002 var import_components19 = __toESM(require_components()); 5003 var import_i18n18 = __toESM(require_i18n()); 5004 var import_element20 = __toESM(require_element()); 5005 var import_jsx_runtime44 = __toESM(require_jsx_runtime()); 5006 var imageSizes2 = [ 5007 { 5008 value: 120, 5009 breakpoint: 1 5010 }, 5011 { 5012 value: 170, 5013 breakpoint: 1 5014 }, 5015 { 5016 value: 230, 5017 breakpoint: 1 5018 }, 5019 { 5020 value: 290, 5021 breakpoint: 1112 5022 // at minimum image width, 4 images display at this container size 5023 }, 5024 { 5025 value: 350, 5026 breakpoint: 1636 5027 // at minimum image width, 6 images display at this container size 5028 }, 5029 { 5030 value: 430, 5031 breakpoint: 588 5032 // at minimum image width, 2 images display at this container size 5033 } 5034 ]; 5035 function PreviewSizePicker() { 5036 const context = (0, import_element20.useContext)(dataviews_context_default); 5037 const view = context.view; 5038 const breakValues = imageSizes2.filter((size) => { 5039 return context.containerWidth >= size.breakpoint; 5040 }); 5041 const layoutPreviewSize = view.layout?.previewSize ?? 230; 5042 const previewSizeToUse = breakValues.map((size, index) => ({ ...size, index })).filter((size) => size.value <= layoutPreviewSize).sort((a2, b2) => b2.value - a2.value)[0]?.index ?? 0; 5043 const marks = breakValues.map((size, index) => { 5044 return { 5045 value: index 5046 }; 5047 }); 5048 return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( 5049 import_components19.RangeControl, 5050 { 5051 __next40pxDefaultSize: true, 5052 showTooltip: false, 5053 label: (0, import_i18n18.__)("Preview size"), 5054 value: previewSizeToUse, 5055 min: 0, 5056 max: breakValues.length - 1, 5057 withInputField: false, 5058 onChange: (value = 0) => { 5059 context.onChangeView({ 5060 ...view, 5061 layout: { 5062 ...view.layout, 5063 previewSize: breakValues[value].value 5064 } 5065 }); 5066 }, 5067 step: 1, 5068 marks 5069 } 5070 ); 5071 } 5072 5073 // packages/dataviews/build-module/dataviews-layouts/table/density-picker.js 5074 var import_components20 = __toESM(require_components()); 5075 var import_i18n19 = __toESM(require_i18n()); 5076 var import_element21 = __toESM(require_element()); 5077 var import_jsx_runtime45 = __toESM(require_jsx_runtime()); 5078 function DensityPicker() { 5079 const context = (0, import_element21.useContext)(dataviews_context_default); 5080 const view = context.view; 5081 return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)( 5082 import_components20.__experimentalToggleGroupControl, 5083 { 5084 size: "__unstable-large", 5085 label: (0, import_i18n19.__)("Density"), 5086 value: view.layout?.density || "balanced", 5087 onChange: (value) => { 5088 context.onChangeView({ 5089 ...view, 5090 layout: { 5091 ...view.layout, 5092 density: value 5093 } 5094 }); 5095 }, 5096 isBlock: true, 5097 children: [ 5098 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 5099 import_components20.__experimentalToggleGroupControlOption, 5100 { 5101 value: "comfortable", 5102 label: (0, import_i18n19._x)( 5103 "Comfortable", 5104 "Density option for DataView layout" 5105 ) 5106 }, 5107 "comfortable" 5108 ), 5109 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 5110 import_components20.__experimentalToggleGroupControlOption, 5111 { 5112 value: "balanced", 5113 label: (0, import_i18n19._x)("Balanced", "Density option for DataView layout") 5114 }, 5115 "balanced" 5116 ), 5117 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 5118 import_components20.__experimentalToggleGroupControlOption, 5119 { 5120 value: "compact", 5121 label: (0, import_i18n19._x)("Compact", "Density option for DataView layout") 5122 }, 5123 "compact" 5124 ) 5125 ] 5126 } 5127 ); 5128 } 5129 5130 // packages/dataviews/build-module/dataviews-layouts/index.js 5131 var VIEW_LAYOUTS = [ 5132 { 5133 type: LAYOUT_TABLE, 5134 label: (0, import_i18n20.__)("Table"), 5135 component: table_default, 5136 icon: block_table_default, 5137 viewConfigOptions: DensityPicker 5138 }, 5139 { 5140 type: LAYOUT_GRID, 5141 label: (0, import_i18n20.__)("Grid"), 5142 component: grid_default, 5143 icon: category_default, 5144 viewConfigOptions: PreviewSizePicker 5145 }, 5146 { 5147 type: LAYOUT_LIST, 5148 label: (0, import_i18n20.__)("List"), 5149 component: ViewList, 5150 icon: (0, import_i18n20.isRTL)() ? format_list_bullets_rtl_default : format_list_bullets_default 5151 }, 5152 { 5153 type: LAYOUT_ACTIVITY, 5154 label: (0, import_i18n20.__)("Activity"), 5155 component: ViewActivity, 5156 icon: scheduled_default, 5157 viewConfigOptions: DensityPicker 5158 }, 5159 { 5160 type: LAYOUT_PICKER_GRID, 5161 label: (0, import_i18n20.__)("Grid"), 5162 component: picker_grid_default, 5163 icon: category_default, 5164 viewConfigOptions: PreviewSizePicker, 5165 isPicker: true 5166 }, 5167 { 5168 type: LAYOUT_PICKER_TABLE, 5169 label: (0, import_i18n20.__)("Table"), 5170 component: picker_table_default, 5171 icon: block_table_default, 5172 viewConfigOptions: DensityPicker, 5173 isPicker: true 5174 } 5175 ]; 5176 5177 // packages/dataviews/build-module/components/dataviews-filters/filters.js 5178 var import_element29 = __toESM(require_element()); 5179 var import_components26 = __toESM(require_components()); 5180 5181 // packages/dataviews/build-module/components/dataviews-filters/filter.js 5182 var import_components23 = __toESM(require_components()); 5183 var import_i18n23 = __toESM(require_i18n()); 5184 var import_element26 = __toESM(require_element()); 5185 5186 // node_modules/@ariakit/react-core/esm/__chunks/3YLGPPWQ.js 5187 var __defProp2 = Object.defineProperty; 5188 var __defProps = Object.defineProperties; 5189 var __getOwnPropDescs = Object.getOwnPropertyDescriptors; 5190 var __getOwnPropSymbols = Object.getOwnPropertySymbols; 5191 var __hasOwnProp2 = Object.prototype.hasOwnProperty; 5192 var __propIsEnum = Object.prototype.propertyIsEnumerable; 5193 var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 5194 var __spreadValues = (a2, b2) => { 5195 for (var prop in b2 || (b2 = {})) 5196 if (__hasOwnProp2.call(b2, prop)) 5197 __defNormalProp(a2, prop, b2[prop]); 5198 if (__getOwnPropSymbols) 5199 for (var prop of __getOwnPropSymbols(b2)) { 5200 if (__propIsEnum.call(b2, prop)) 5201 __defNormalProp(a2, prop, b2[prop]); 5202 } 5203 return a2; 5204 }; 5205 var __spreadProps = (a2, b2) => __defProps(a2, __getOwnPropDescs(b2)); 5206 var __objRest = (source, exclude) => { 5207 var target = {}; 5208 for (var prop in source) 5209 if (__hasOwnProp2.call(source, prop) && exclude.indexOf(prop) < 0) 5210 target[prop] = source[prop]; 5211 if (source != null && __getOwnPropSymbols) 5212 for (var prop of __getOwnPropSymbols(source)) { 5213 if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) 5214 target[prop] = source[prop]; 5215 } 5216 return target; 5217 }; 5218 5219 // node_modules/@ariakit/core/esm/__chunks/3YLGPPWQ.js 5220 var __defProp3 = Object.defineProperty; 5221 var __defProps2 = Object.defineProperties; 5222 var __getOwnPropDescs2 = Object.getOwnPropertyDescriptors; 5223 var __getOwnPropSymbols2 = Object.getOwnPropertySymbols; 5224 var __hasOwnProp3 = Object.prototype.hasOwnProperty; 5225 var __propIsEnum2 = Object.prototype.propertyIsEnumerable; 5226 var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 5227 var __spreadValues2 = (a2, b2) => { 5228 for (var prop in b2 || (b2 = {})) 5229 if (__hasOwnProp3.call(b2, prop)) 5230 __defNormalProp2(a2, prop, b2[prop]); 5231 if (__getOwnPropSymbols2) 5232 for (var prop of __getOwnPropSymbols2(b2)) { 5233 if (__propIsEnum2.call(b2, prop)) 5234 __defNormalProp2(a2, prop, b2[prop]); 5235 } 5236 return a2; 5237 }; 5238 var __spreadProps2 = (a2, b2) => __defProps2(a2, __getOwnPropDescs2(b2)); 5239 var __objRest2 = (source, exclude) => { 5240 var target = {}; 5241 for (var prop in source) 5242 if (__hasOwnProp3.call(source, prop) && exclude.indexOf(prop) < 0) 5243 target[prop] = source[prop]; 5244 if (source != null && __getOwnPropSymbols2) 5245 for (var prop of __getOwnPropSymbols2(source)) { 5246 if (exclude.indexOf(prop) < 0 && __propIsEnum2.call(source, prop)) 5247 target[prop] = source[prop]; 5248 } 5249 return target; 5250 }; 5251 5252 // node_modules/@ariakit/core/esm/__chunks/PBFD2E7P.js 5253 function noop(..._) { 5254 } 5255 function applyState(argument, currentValue) { 5256 if (isUpdater(argument)) { 5257 const value = isLazyValue(currentValue) ? currentValue() : currentValue; 5258 return argument(value); 5259 } 5260 return argument; 5261 } 5262 function isUpdater(argument) { 5263 return typeof argument === "function"; 5264 } 5265 function isLazyValue(value) { 5266 return typeof value === "function"; 5267 } 5268 function hasOwnProperty(object, prop) { 5269 if (typeof Object.hasOwn === "function") { 5270 return Object.hasOwn(object, prop); 5271 } 5272 return Object.prototype.hasOwnProperty.call(object, prop); 5273 } 5274 function chain(...fns) { 5275 return (...args) => { 5276 for (const fn of fns) { 5277 if (typeof fn === "function") { 5278 fn(...args); 5279 } 5280 } 5281 }; 5282 } 5283 function normalizeString(str) { 5284 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); 5285 } 5286 function omit2(object, keys) { 5287 const result = __spreadValues2({}, object); 5288 for (const key of keys) { 5289 if (hasOwnProperty(result, key)) { 5290 delete result[key]; 5291 } 5292 } 5293 return result; 5294 } 5295 function pick(object, paths) { 5296 const result = {}; 5297 for (const key of paths) { 5298 if (hasOwnProperty(object, key)) { 5299 result[key] = object[key]; 5300 } 5301 } 5302 return result; 5303 } 5304 function identity(value) { 5305 return value; 5306 } 5307 function invariant(condition, message2) { 5308 if (condition) return; 5309 if (typeof message2 !== "string") throw new Error("Invariant failed"); 5310 throw new Error(message2); 5311 } 5312 function getKeys(obj) { 5313 return Object.keys(obj); 5314 } 5315 function isFalsyBooleanCallback(booleanOrCallback, ...args) { 5316 const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback; 5317 if (result == null) return false; 5318 return !result; 5319 } 5320 function disabledFromProps(props) { 5321 return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true"; 5322 } 5323 function removeUndefinedValues(obj) { 5324 const result = {}; 5325 for (const key in obj) { 5326 if (obj[key] !== void 0) { 5327 result[key] = obj[key]; 5328 } 5329 } 5330 return result; 5331 } 5332 function defaultValue(...values) { 5333 for (const value of values) { 5334 if (value !== void 0) return value; 5335 } 5336 return void 0; 5337 } 5338 5339 // node_modules/@ariakit/react-core/esm/__chunks/SK3NAZA3.js 5340 var import_react2 = __toESM(require_react(), 1); 5341 function setRef(ref, value) { 5342 if (typeof ref === "function") { 5343 ref(value); 5344 } else if (ref) { 5345 ref.current = value; 5346 } 5347 } 5348 function isValidElementWithRef(element) { 5349 if (!element) return false; 5350 if (!(0, import_react2.isValidElement)(element)) return false; 5351 if ("ref" in element.props) return true; 5352 if ("ref" in element) return true; 5353 return false; 5354 } 5355 function getRefProperty(element) { 5356 if (!isValidElementWithRef(element)) return null; 5357 const props = __spreadValues({}, element.props); 5358 return props.ref || element.ref; 5359 } 5360 function mergeProps(base, overrides) { 5361 const props = __spreadValues({}, base); 5362 for (const key in overrides) { 5363 if (!hasOwnProperty(overrides, key)) continue; 5364 if (key === "className") { 5365 const prop = "className"; 5366 props[prop] = base[prop] ? `$base[prop]} $overrides[prop]}` : overrides[prop]; 5367 continue; 5368 } 5369 if (key === "style") { 5370 const prop = "style"; 5371 props[prop] = base[prop] ? __spreadValues(__spreadValues({}, base[prop]), overrides[prop]) : overrides[prop]; 5372 continue; 5373 } 5374 const overrideValue = overrides[key]; 5375 if (typeof overrideValue === "function" && key.startsWith("on")) { 5376 const baseValue = base[key]; 5377 if (typeof baseValue === "function") { 5378 props[key] = (...args) => { 5379 overrideValue(...args); 5380 baseValue(...args); 5381 }; 5382 continue; 5383 } 5384 } 5385 props[key] = overrideValue; 5386 } 5387 return props; 5388 } 5389 5390 // node_modules/@ariakit/core/esm/__chunks/DTR5TSDJ.js 5391 var canUseDOM = checkIsBrowser(); 5392 function checkIsBrowser() { 5393 var _a; 5394 return typeof window !== "undefined" && !!((_a = window.document) == null ? void 0 : _a.createElement); 5395 } 5396 function getDocument(node) { 5397 if (!node) return document; 5398 if ("self" in node) return node.document; 5399 return node.ownerDocument || document; 5400 } 5401 function getActiveElement(node, activeDescendant = false) { 5402 const { activeElement } = getDocument(node); 5403 if (!(activeElement == null ? void 0 : activeElement.nodeName)) { 5404 return null; 5405 } 5406 if (isFrame(activeElement) && activeElement.contentDocument) { 5407 return getActiveElement( 5408 activeElement.contentDocument.body, 5409 activeDescendant 5410 ); 5411 } 5412 if (activeDescendant) { 5413 const id = activeElement.getAttribute("aria-activedescendant"); 5414 if (id) { 5415 const element = getDocument(activeElement).getElementById(id); 5416 if (element) { 5417 return element; 5418 } 5419 } 5420 } 5421 return activeElement; 5422 } 5423 function contains(parent, child) { 5424 return parent === child || parent.contains(child); 5425 } 5426 function isFrame(element) { 5427 return element.tagName === "IFRAME"; 5428 } 5429 function isButton(element) { 5430 const tagName = element.tagName.toLowerCase(); 5431 if (tagName === "button") return true; 5432 if (tagName === "input" && element.type) { 5433 return buttonInputTypes.indexOf(element.type) !== -1; 5434 } 5435 return false; 5436 } 5437 var buttonInputTypes = [ 5438 "button", 5439 "color", 5440 "file", 5441 "image", 5442 "reset", 5443 "submit" 5444 ]; 5445 function isVisible(element) { 5446 if (typeof element.checkVisibility === "function") { 5447 return element.checkVisibility(); 5448 } 5449 const htmlElement = element; 5450 return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0; 5451 } 5452 function isTextField(element) { 5453 try { 5454 const isTextInput = element instanceof HTMLInputElement && element.selectionStart !== null; 5455 const isTextArea = element.tagName === "TEXTAREA"; 5456 return isTextInput || isTextArea || false; 5457 } catch (error) { 5458 return false; 5459 } 5460 } 5461 function isTextbox(element) { 5462 return element.isContentEditable || isTextField(element); 5463 } 5464 function getTextboxValue(element) { 5465 if (isTextField(element)) { 5466 return element.value; 5467 } 5468 if (element.isContentEditable) { 5469 const range = getDocument(element).createRange(); 5470 range.selectNodeContents(element); 5471 return range.toString(); 5472 } 5473 return ""; 5474 } 5475 function getTextboxSelection(element) { 5476 let start = 0; 5477 let end = 0; 5478 if (isTextField(element)) { 5479 start = element.selectionStart || 0; 5480 end = element.selectionEnd || 0; 5481 } else if (element.isContentEditable) { 5482 const selection = getDocument(element).getSelection(); 5483 if ((selection == null ? void 0 : selection.rangeCount) && selection.anchorNode && contains(element, selection.anchorNode) && selection.focusNode && contains(element, selection.focusNode)) { 5484 const range = selection.getRangeAt(0); 5485 const nextRange = range.cloneRange(); 5486 nextRange.selectNodeContents(element); 5487 nextRange.setEnd(range.startContainer, range.startOffset); 5488 start = nextRange.toString().length; 5489 nextRange.setEnd(range.endContainer, range.endOffset); 5490 end = nextRange.toString().length; 5491 } 5492 } 5493 return { start, end }; 5494 } 5495 function getPopupRole(element, fallback) { 5496 const allowedPopupRoles = ["dialog", "menu", "listbox", "tree", "grid"]; 5497 const role = element == null ? void 0 : element.getAttribute("role"); 5498 if (role && allowedPopupRoles.indexOf(role) !== -1) { 5499 return role; 5500 } 5501 return fallback; 5502 } 5503 function getScrollingElement(element) { 5504 if (!element) return null; 5505 const isScrollableOverflow = (overflow) => { 5506 if (overflow === "auto") return true; 5507 if (overflow === "scroll") return true; 5508 return false; 5509 }; 5510 if (element.clientHeight && element.scrollHeight > element.clientHeight) { 5511 const { overflowY } = getComputedStyle(element); 5512 if (isScrollableOverflow(overflowY)) return element; 5513 } else if (element.clientWidth && element.scrollWidth > element.clientWidth) { 5514 const { overflowX } = getComputedStyle(element); 5515 if (isScrollableOverflow(overflowX)) return element; 5516 } 5517 return getScrollingElement(element.parentElement) || document.scrollingElement || document.body; 5518 } 5519 function setSelectionRange(element, ...args) { 5520 if (/text|search|password|tel|url/i.test(element.type)) { 5521 element.setSelectionRange(...args); 5522 } 5523 } 5524 function sortBasedOnDOMPosition(items, getElement) { 5525 const pairs = items.map((item, index) => [index, item]); 5526 let isOrderDifferent = false; 5527 pairs.sort(([indexA, a2], [indexB, b2]) => { 5528 const elementA = getElement(a2); 5529 const elementB = getElement(b2); 5530 if (elementA === elementB) return 0; 5531 if (!elementA || !elementB) return 0; 5532 if (isElementPreceding(elementA, elementB)) { 5533 if (indexA > indexB) { 5534 isOrderDifferent = true; 5535 } 5536 return -1; 5537 } 5538 if (indexA < indexB) { 5539 isOrderDifferent = true; 5540 } 5541 return 1; 5542 }); 5543 if (isOrderDifferent) { 5544 return pairs.map(([_, item]) => item); 5545 } 5546 return items; 5547 } 5548 function isElementPreceding(a2, b2) { 5549 return Boolean( 5550 b2.compareDocumentPosition(a2) & Node.DOCUMENT_POSITION_PRECEDING 5551 ); 5552 } 5553 5554 // node_modules/@ariakit/core/esm/__chunks/QAGXQEUG.js 5555 function isTouchDevice() { 5556 return canUseDOM && !!navigator.maxTouchPoints; 5557 } 5558 function isApple() { 5559 if (!canUseDOM) return false; 5560 return /mac|iphone|ipad|ipod/i.test(navigator.platform); 5561 } 5562 function isSafari() { 5563 return canUseDOM && isApple() && /apple/i.test(navigator.vendor); 5564 } 5565 function isFirefox() { 5566 return canUseDOM && /firefox\//i.test(navigator.userAgent); 5567 } 5568 5569 // node_modules/@ariakit/core/esm/utils/events.js 5570 function isPortalEvent(event) { 5571 return Boolean( 5572 event.currentTarget && !contains(event.currentTarget, event.target) 5573 ); 5574 } 5575 function isSelfTarget(event) { 5576 return event.target === event.currentTarget; 5577 } 5578 function isOpeningInNewTab(event) { 5579 const element = event.currentTarget; 5580 if (!element) return false; 5581 const isAppleDevice = isApple(); 5582 if (isAppleDevice && !event.metaKey) return false; 5583 if (!isAppleDevice && !event.ctrlKey) return false; 5584 const tagName = element.tagName.toLowerCase(); 5585 if (tagName === "a") return true; 5586 if (tagName === "button" && element.type === "submit") return true; 5587 if (tagName === "input" && element.type === "submit") return true; 5588 return false; 5589 } 5590 function isDownloading(event) { 5591 const element = event.currentTarget; 5592 if (!element) return false; 5593 const tagName = element.tagName.toLowerCase(); 5594 if (!event.altKey) return false; 5595 if (tagName === "a") return true; 5596 if (tagName === "button" && element.type === "submit") return true; 5597 if (tagName === "input" && element.type === "submit") return true; 5598 return false; 5599 } 5600 function fireBlurEvent(element, eventInit) { 5601 const event = new FocusEvent("blur", eventInit); 5602 const defaultAllowed = element.dispatchEvent(event); 5603 const bubbleInit = __spreadProps2(__spreadValues2({}, eventInit), { bubbles: true }); 5604 element.dispatchEvent(new FocusEvent("focusout", bubbleInit)); 5605 return defaultAllowed; 5606 } 5607 function fireKeyboardEvent(element, type, eventInit) { 5608 const event = new KeyboardEvent(type, eventInit); 5609 return element.dispatchEvent(event); 5610 } 5611 function fireClickEvent(element, eventInit) { 5612 const event = new MouseEvent("click", eventInit); 5613 return element.dispatchEvent(event); 5614 } 5615 function isFocusEventOutside(event, container) { 5616 const containerElement = container || event.currentTarget; 5617 const relatedTarget = event.relatedTarget; 5618 return !relatedTarget || !contains(containerElement, relatedTarget); 5619 } 5620 function queueBeforeEvent(element, type, callback, timeout) { 5621 const createTimer = (callback2) => { 5622 if (timeout) { 5623 const timerId2 = setTimeout(callback2, timeout); 5624 return () => clearTimeout(timerId2); 5625 } 5626 const timerId = requestAnimationFrame(callback2); 5627 return () => cancelAnimationFrame(timerId); 5628 }; 5629 const cancelTimer = createTimer(() => { 5630 element.removeEventListener(type, callSync, true); 5631 callback(); 5632 }); 5633 const callSync = () => { 5634 cancelTimer(); 5635 callback(); 5636 }; 5637 element.addEventListener(type, callSync, { once: true, capture: true }); 5638 return cancelTimer; 5639 } 5640 function addGlobalEventListener(type, listener, options, scope = window) { 5641 const children = []; 5642 try { 5643 scope.document.addEventListener(type, listener, options); 5644 for (const frame of Array.from(scope.frames)) { 5645 children.push(addGlobalEventListener(type, listener, options, frame)); 5646 } 5647 } catch (e2) { 5648 } 5649 const removeEventListener = () => { 5650 try { 5651 scope.document.removeEventListener(type, listener, options); 5652 } catch (e2) { 5653 } 5654 for (const remove of children) { 5655 remove(); 5656 } 5657 }; 5658 return removeEventListener; 5659 } 5660 5661 // node_modules/@ariakit/react-core/esm/__chunks/ABQUS43J.js 5662 var import_react3 = __toESM(require_react(), 1); 5663 var React2 = __toESM(require_react(), 1); 5664 var _React = __spreadValues({}, React2); 5665 var useReactId = _React.useId; 5666 var useReactDeferredValue = _React.useDeferredValue; 5667 var useReactInsertionEffect = _React.useInsertionEffect; 5668 var useSafeLayoutEffect = canUseDOM ? import_react3.useLayoutEffect : import_react3.useEffect; 5669 function useInitialValue(value) { 5670 const [initialValue] = (0, import_react3.useState)(value); 5671 return initialValue; 5672 } 5673 function useLiveRef(value) { 5674 const ref = (0, import_react3.useRef)(value); 5675 useSafeLayoutEffect(() => { 5676 ref.current = value; 5677 }); 5678 return ref; 5679 } 5680 function useEvent(callback) { 5681 const ref = (0, import_react3.useRef)(() => { 5682 throw new Error("Cannot call an event handler while rendering."); 5683 }); 5684 if (useReactInsertionEffect) { 5685 useReactInsertionEffect(() => { 5686 ref.current = callback; 5687 }); 5688 } else { 5689 ref.current = callback; 5690 } 5691 return (0, import_react3.useCallback)((...args) => { 5692 var _a; 5693 return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args); 5694 }, []); 5695 } 5696 function useTransactionState(callback) { 5697 const [state, setState] = (0, import_react3.useState)(null); 5698 useSafeLayoutEffect(() => { 5699 if (state == null) return; 5700 if (!callback) return; 5701 let prevState = null; 5702 callback((prev) => { 5703 prevState = prev; 5704 return state; 5705 }); 5706 return () => { 5707 callback(prevState); 5708 }; 5709 }, [state, callback]); 5710 return [state, setState]; 5711 } 5712 function useMergeRefs(...refs) { 5713 return (0, import_react3.useMemo)(() => { 5714 if (!refs.some(Boolean)) return; 5715 return (value) => { 5716 for (const ref of refs) { 5717 setRef(ref, value); 5718 } 5719 }; 5720 }, refs); 5721 } 5722 function useId3(defaultId) { 5723 if (useReactId) { 5724 const reactId = useReactId(); 5725 if (defaultId) return defaultId; 5726 return reactId; 5727 } 5728 const [id, setId] = (0, import_react3.useState)(defaultId); 5729 useSafeLayoutEffect(() => { 5730 if (defaultId || id) return; 5731 const random = Math.random().toString(36).slice(2, 8); 5732 setId(`id-$random}`); 5733 }, [defaultId, id]); 5734 return defaultId || id; 5735 } 5736 function useTagName(refOrElement, type) { 5737 const stringOrUndefined = (type2) => { 5738 if (typeof type2 !== "string") return; 5739 return type2; 5740 }; 5741 const [tagName, setTagName] = (0, import_react3.useState)(() => stringOrUndefined(type)); 5742 useSafeLayoutEffect(() => { 5743 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement; 5744 setTagName((element == null ? void 0 : element.tagName.toLowerCase()) || stringOrUndefined(type)); 5745 }, [refOrElement, type]); 5746 return tagName; 5747 } 5748 function useAttribute(refOrElement, attributeName, defaultValue2) { 5749 const initialValue = useInitialValue(defaultValue2); 5750 const [attribute, setAttribute] = (0, import_react3.useState)(initialValue); 5751 (0, import_react3.useEffect)(() => { 5752 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement; 5753 if (!element) return; 5754 const callback = () => { 5755 const value = element.getAttribute(attributeName); 5756 setAttribute(value == null ? initialValue : value); 5757 }; 5758 const observer = new MutationObserver(callback); 5759 observer.observe(element, { attributeFilter: [attributeName] }); 5760 callback(); 5761 return () => observer.disconnect(); 5762 }, [refOrElement, attributeName, initialValue]); 5763 return attribute; 5764 } 5765 function useUpdateEffect(effect, deps) { 5766 const mounted = (0, import_react3.useRef)(false); 5767 (0, import_react3.useEffect)(() => { 5768 if (mounted.current) { 5769 return effect(); 5770 } 5771 mounted.current = true; 5772 }, deps); 5773 (0, import_react3.useEffect)( 5774 () => () => { 5775 mounted.current = false; 5776 }, 5777 [] 5778 ); 5779 } 5780 function useUpdateLayoutEffect(effect, deps) { 5781 const mounted = (0, import_react3.useRef)(false); 5782 useSafeLayoutEffect(() => { 5783 if (mounted.current) { 5784 return effect(); 5785 } 5786 mounted.current = true; 5787 }, deps); 5788 useSafeLayoutEffect( 5789 () => () => { 5790 mounted.current = false; 5791 }, 5792 [] 5793 ); 5794 } 5795 function useForceUpdate() { 5796 return (0, import_react3.useReducer)(() => [], []); 5797 } 5798 function useBooleanEvent(booleanOrCallback) { 5799 return useEvent( 5800 typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback 5801 ); 5802 } 5803 function useWrapElement(props, callback, deps = []) { 5804 const wrapElement = (0, import_react3.useCallback)( 5805 (element) => { 5806 if (props.wrapElement) { 5807 element = props.wrapElement(element); 5808 } 5809 return callback(element); 5810 }, 5811 [...deps, props.wrapElement] 5812 ); 5813 return __spreadProps(__spreadValues({}, props), { wrapElement }); 5814 } 5815 function useMetadataProps(props, key, value) { 5816 const parent = props.onLoadedMetadataCapture; 5817 const onLoadedMetadataCapture = (0, import_react3.useMemo)(() => { 5818 return Object.assign(() => { 5819 }, __spreadProps(__spreadValues({}, parent), { [key]: value })); 5820 }, [parent, key, value]); 5821 return [parent == null ? void 0 : parent[key], { onLoadedMetadataCapture }]; 5822 } 5823 function useIsMouseMoving() { 5824 (0, import_react3.useEffect)(() => { 5825 addGlobalEventListener("mousemove", setMouseMoving, true); 5826 addGlobalEventListener("mousedown", resetMouseMoving, true); 5827 addGlobalEventListener("mouseup", resetMouseMoving, true); 5828 addGlobalEventListener("keydown", resetMouseMoving, true); 5829 addGlobalEventListener("scroll", resetMouseMoving, true); 5830 }, []); 5831 const isMouseMoving = useEvent(() => mouseMoving); 5832 return isMouseMoving; 5833 } 5834 var mouseMoving = false; 5835 var previousScreenX = 0; 5836 var previousScreenY = 0; 5837 function hasMouseMovement(event) { 5838 const movementX = event.movementX || event.screenX - previousScreenX; 5839 const movementY = event.movementY || event.screenY - previousScreenY; 5840 previousScreenX = event.screenX; 5841 previousScreenY = event.screenY; 5842 return movementX || movementY || false; 5843 } 5844 function setMouseMoving(event) { 5845 if (!hasMouseMovement(event)) return; 5846 mouseMoving = true; 5847 } 5848 function resetMouseMoving() { 5849 mouseMoving = false; 5850 } 5851 5852 // node_modules/@ariakit/react-core/esm/__chunks/LMDWO4NN.js 5853 var React3 = __toESM(require_react(), 1); 5854 var import_jsx_runtime46 = __toESM(require_jsx_runtime(), 1); 5855 function forwardRef22(render4) { 5856 const Role = React3.forwardRef((props, ref) => render4(__spreadProps(__spreadValues({}, props), { ref }))); 5857 Role.displayName = render4.displayName || render4.name; 5858 return Role; 5859 } 5860 function memo22(Component, propsAreEqual) { 5861 return React3.memo(Component, propsAreEqual); 5862 } 5863 function createElement2(Type, props) { 5864 const _a = props, { wrapElement, render: render4 } = _a, rest = __objRest(_a, ["wrapElement", "render"]); 5865 const mergedRef = useMergeRefs(props.ref, getRefProperty(render4)); 5866 let element; 5867 if (React3.isValidElement(render4)) { 5868 const renderProps = __spreadProps(__spreadValues({}, render4.props), { ref: mergedRef }); 5869 element = React3.cloneElement(render4, mergeProps(rest, renderProps)); 5870 } else if (render4) { 5871 element = render4(rest); 5872 } else { 5873 element = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Type, __spreadValues({}, rest)); 5874 } 5875 if (wrapElement) { 5876 return wrapElement(element); 5877 } 5878 return element; 5879 } 5880 function createHook(useProps) { 5881 const useRole = (props = {}) => { 5882 return useProps(props); 5883 }; 5884 useRole.displayName = useProps.name; 5885 return useRole; 5886 } 5887 function createStoreContext(providers = [], scopedProviders = []) { 5888 const context = React3.createContext(void 0); 5889 const scopedContext = React3.createContext(void 0); 5890 const useContext28 = () => React3.useContext(context); 5891 const useScopedContext = (onlyScoped = false) => { 5892 const scoped = React3.useContext(scopedContext); 5893 const store = useContext28(); 5894 if (onlyScoped) return scoped; 5895 return scoped || store; 5896 }; 5897 const useProviderContext = () => { 5898 const scoped = React3.useContext(scopedContext); 5899 const store = useContext28(); 5900 if (scoped && scoped === store) return; 5901 return store; 5902 }; 5903 const ContextProvider = (props) => { 5904 return providers.reduceRight( 5905 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Provider, __spreadProps(__spreadValues({}, props), { children })), 5906 /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(context.Provider, __spreadValues({}, props)) 5907 ); 5908 }; 5909 const ScopedContextProvider = (props) => { 5910 return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ContextProvider, __spreadProps(__spreadValues({}, props), { children: scopedProviders.reduceRight( 5911 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Provider, __spreadProps(__spreadValues({}, props), { children })), 5912 /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(scopedContext.Provider, __spreadValues({}, props)) 5913 ) })); 5914 }; 5915 return { 5916 context, 5917 scopedContext, 5918 useContext: useContext28, 5919 useScopedContext, 5920 useProviderContext, 5921 ContextProvider, 5922 ScopedContextProvider 5923 }; 5924 } 5925 5926 // node_modules/@ariakit/react-core/esm/__chunks/VDHZ5F7K.js 5927 var ctx = createStoreContext(); 5928 var useCollectionContext = ctx.useContext; 5929 var useCollectionScopedContext = ctx.useScopedContext; 5930 var useCollectionProviderContext = ctx.useProviderContext; 5931 var CollectionContextProvider = ctx.ContextProvider; 5932 var CollectionScopedContextProvider = ctx.ScopedContextProvider; 5933 5934 // node_modules/@ariakit/react-core/esm/__chunks/P7GR5CS5.js 5935 var import_react4 = __toESM(require_react(), 1); 5936 var ctx2 = createStoreContext( 5937 [CollectionContextProvider], 5938 [CollectionScopedContextProvider] 5939 ); 5940 var useCompositeContext = ctx2.useContext; 5941 var useCompositeScopedContext = ctx2.useScopedContext; 5942 var useCompositeProviderContext = ctx2.useProviderContext; 5943 var CompositeContextProvider = ctx2.ContextProvider; 5944 var CompositeScopedContextProvider = ctx2.ScopedContextProvider; 5945 var CompositeItemContext = (0, import_react4.createContext)( 5946 void 0 5947 ); 5948 var CompositeRowContext = (0, import_react4.createContext)( 5949 void 0 5950 ); 5951 5952 // node_modules/@ariakit/react-core/esm/__chunks/3XAVFTCA.js 5953 var import_react5 = __toESM(require_react(), 1); 5954 var TagValueContext = (0, import_react5.createContext)(null); 5955 var TagRemoveIdContext = (0, import_react5.createContext)( 5956 null 5957 ); 5958 var ctx3 = createStoreContext( 5959 [CompositeContextProvider], 5960 [CompositeScopedContextProvider] 5961 ); 5962 var useTagContext = ctx3.useContext; 5963 var useTagScopedContext = ctx3.useScopedContext; 5964 var useTagProviderContext = ctx3.useProviderContext; 5965 var TagContextProvider = ctx3.ContextProvider; 5966 var TagScopedContextProvider = ctx3.ScopedContextProvider; 5967 5968 // node_modules/@ariakit/core/esm/__chunks/BCALMBPZ.js 5969 function getInternal(store, key) { 5970 const internals = store.__unstableInternals; 5971 invariant(internals, "Invalid store"); 5972 return internals[key]; 5973 } 5974 function createStore(initialState, ...stores) { 5975 let state = initialState; 5976 let prevStateBatch = state; 5977 let lastUpdate = Symbol(); 5978 let destroy = noop; 5979 const instances = /* @__PURE__ */ new Set(); 5980 const updatedKeys = /* @__PURE__ */ new Set(); 5981 const setups = /* @__PURE__ */ new Set(); 5982 const listeners = /* @__PURE__ */ new Set(); 5983 const batchListeners = /* @__PURE__ */ new Set(); 5984 const disposables = /* @__PURE__ */ new WeakMap(); 5985 const listenerKeys = /* @__PURE__ */ new WeakMap(); 5986 const storeSetup = (callback) => { 5987 setups.add(callback); 5988 return () => setups.delete(callback); 5989 }; 5990 const storeInit = () => { 5991 const initialized = instances.size; 5992 const instance = Symbol(); 5993 instances.add(instance); 5994 const maybeDestroy = () => { 5995 instances.delete(instance); 5996 if (instances.size) return; 5997 destroy(); 5998 }; 5999 if (initialized) return maybeDestroy; 6000 const desyncs = getKeys(state).map( 6001 (key) => chain( 6002 ...stores.map((store) => { 6003 var _a; 6004 const storeState = (_a = store == null ? void 0 : store.getState) == null ? void 0 : _a.call(store); 6005 if (!storeState) return; 6006 if (!hasOwnProperty(storeState, key)) return; 6007 return sync(store, [key], (state2) => { 6008 setState( 6009 key, 6010 state2[key], 6011 // @ts-expect-error - Not public API. This is just to prevent 6012 // infinite loops. 6013 true 6014 ); 6015 }); 6016 }) 6017 ) 6018 ); 6019 const teardowns = []; 6020 for (const setup2 of setups) { 6021 teardowns.push(setup2()); 6022 } 6023 const cleanups = stores.map(init); 6024 destroy = chain(...desyncs, ...teardowns, ...cleanups); 6025 return maybeDestroy; 6026 }; 6027 const sub = (keys, listener, set = listeners) => { 6028 set.add(listener); 6029 listenerKeys.set(listener, keys); 6030 return () => { 6031 var _a; 6032 (_a = disposables.get(listener)) == null ? void 0 : _a(); 6033 disposables.delete(listener); 6034 listenerKeys.delete(listener); 6035 set.delete(listener); 6036 }; 6037 }; 6038 const storeSubscribe = (keys, listener) => sub(keys, listener); 6039 const storeSync = (keys, listener) => { 6040 disposables.set(listener, listener(state, state)); 6041 return sub(keys, listener); 6042 }; 6043 const storeBatch = (keys, listener) => { 6044 disposables.set(listener, listener(state, prevStateBatch)); 6045 return sub(keys, listener, batchListeners); 6046 }; 6047 const storePick = (keys) => createStore(pick(state, keys), finalStore); 6048 const storeOmit = (keys) => createStore(omit2(state, keys), finalStore); 6049 const getState = () => state; 6050 const setState = (key, value, fromStores = false) => { 6051 var _a; 6052 if (!hasOwnProperty(state, key)) return; 6053 const nextValue = applyState(value, state[key]); 6054 if (nextValue === state[key]) return; 6055 if (!fromStores) { 6056 for (const store of stores) { 6057 (_a = store == null ? void 0 : store.setState) == null ? void 0 : _a.call(store, key, nextValue); 6058 } 6059 } 6060 const prevState = state; 6061 state = __spreadProps2(__spreadValues2({}, state), { [key]: nextValue }); 6062 const thisUpdate = Symbol(); 6063 lastUpdate = thisUpdate; 6064 updatedKeys.add(key); 6065 const run = (listener, prev, uKeys) => { 6066 var _a2; 6067 const keys = listenerKeys.get(listener); 6068 const updated = (k) => uKeys ? uKeys.has(k) : k === key; 6069 if (!keys || keys.some(updated)) { 6070 (_a2 = disposables.get(listener)) == null ? void 0 : _a2(); 6071 disposables.set(listener, listener(state, prev)); 6072 } 6073 }; 6074 for (const listener of listeners) { 6075 run(listener, prevState); 6076 } 6077 queueMicrotask(() => { 6078 if (lastUpdate !== thisUpdate) return; 6079 const snapshot = state; 6080 for (const listener of batchListeners) { 6081 run(listener, prevStateBatch, updatedKeys); 6082 } 6083 prevStateBatch = snapshot; 6084 updatedKeys.clear(); 6085 }); 6086 }; 6087 const finalStore = { 6088 getState, 6089 setState, 6090 __unstableInternals: { 6091 setup: storeSetup, 6092 init: storeInit, 6093 subscribe: storeSubscribe, 6094 sync: storeSync, 6095 batch: storeBatch, 6096 pick: storePick, 6097 omit: storeOmit 6098 } 6099 }; 6100 return finalStore; 6101 } 6102 function setup(store, ...args) { 6103 if (!store) return; 6104 return getInternal(store, "setup")(...args); 6105 } 6106 function init(store, ...args) { 6107 if (!store) return; 6108 return getInternal(store, "init")(...args); 6109 } 6110 function subscribe(store, ...args) { 6111 if (!store) return; 6112 return getInternal(store, "subscribe")(...args); 6113 } 6114 function sync(store, ...args) { 6115 if (!store) return; 6116 return getInternal(store, "sync")(...args); 6117 } 6118 function batch(store, ...args) { 6119 if (!store) return; 6120 return getInternal(store, "batch")(...args); 6121 } 6122 function omit22(store, ...args) { 6123 if (!store) return; 6124 return getInternal(store, "omit")(...args); 6125 } 6126 function pick2(store, ...args) { 6127 if (!store) return; 6128 return getInternal(store, "pick")(...args); 6129 } 6130 function mergeStore(...stores) { 6131 const initialState = stores.reduce((state, store2) => { 6132 var _a; 6133 const nextState = (_a = store2 == null ? void 0 : store2.getState) == null ? void 0 : _a.call(store2); 6134 if (!nextState) return state; 6135 return Object.assign(state, nextState); 6136 }, {}); 6137 const store = createStore(initialState, ...stores); 6138 return Object.assign({}, ...stores, store); 6139 } 6140 function throwOnConflictingProps(props, store) { 6141 if (false) return; 6142 if (!store) return; 6143 const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => { 6144 var _a; 6145 const stateKey = key.replace("default", ""); 6146 return `${((_a = stateKey[0]) == null ? void 0 : _a.toLowerCase()) || ""}$stateKey.slice(1)}`; 6147 }); 6148 if (!defaultKeys.length) return; 6149 const storeState = store.getState(); 6150 const conflictingProps = defaultKeys.filter( 6151 (key) => hasOwnProperty(storeState, key) 6152 ); 6153 if (!conflictingProps.length) return; 6154 throw new Error( 6155 `Passing a store prop in conjunction with a default state is not supported. 6156 6157 const store = useSelectStore(); 6158 <SelectProvider store={store} defaultValue="Apple" /> 6159 ^ ^ 6160 6161 Instead, pass the default state to the topmost store: 6162 6163 const store = useSelectStore({ defaultValue: "Apple" }); 6164 <SelectProvider store={store} /> 6165 6166 See https://github.com/ariakit/ariakit/pull/2745 for more details. 6167 6168 If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit 6169 ` 6170 ); 6171 } 6172 6173 // node_modules/@ariakit/react-core/esm/__chunks/YV4JVR4I.js 6174 var React4 = __toESM(require_react(), 1); 6175 var import_shim = __toESM(require_shim(), 1); 6176 var { useSyncExternalStore } = import_shim.default; 6177 var noopSubscribe = () => () => { 6178 }; 6179 function useStoreState(store, keyOrSelector = identity) { 6180 const storeSubscribe = React4.useCallback( 6181 (callback) => { 6182 if (!store) return noopSubscribe(); 6183 return subscribe(store, null, callback); 6184 }, 6185 [store] 6186 ); 6187 const getSnapshot = () => { 6188 const key = typeof keyOrSelector === "string" ? keyOrSelector : null; 6189 const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null; 6190 const state = store == null ? void 0 : store.getState(); 6191 if (selector2) return selector2(state); 6192 if (!state) return; 6193 if (!key) return; 6194 if (!hasOwnProperty(state, key)) return; 6195 return state[key]; 6196 }; 6197 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot); 6198 } 6199 function useStoreStateObject(store, object) { 6200 const objRef = React4.useRef( 6201 {} 6202 ); 6203 const storeSubscribe = React4.useCallback( 6204 (callback) => { 6205 if (!store) return noopSubscribe(); 6206 return subscribe(store, null, callback); 6207 }, 6208 [store] 6209 ); 6210 const getSnapshot = () => { 6211 const state = store == null ? void 0 : store.getState(); 6212 let updated = false; 6213 const obj = objRef.current; 6214 for (const prop in object) { 6215 const keyOrSelector = object[prop]; 6216 if (typeof keyOrSelector === "function") { 6217 const value = keyOrSelector(state); 6218 if (value !== obj[prop]) { 6219 obj[prop] = value; 6220 updated = true; 6221 } 6222 } 6223 if (typeof keyOrSelector === "string") { 6224 if (!state) continue; 6225 if (!hasOwnProperty(state, keyOrSelector)) continue; 6226 const value = state[keyOrSelector]; 6227 if (value !== obj[prop]) { 6228 obj[prop] = value; 6229 updated = true; 6230 } 6231 } 6232 } 6233 if (updated) { 6234 objRef.current = __spreadValues({}, obj); 6235 } 6236 return objRef.current; 6237 }; 6238 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot); 6239 } 6240 function useStoreProps(store, props, key, setKey) { 6241 const value = hasOwnProperty(props, key) ? props[key] : void 0; 6242 const setValue = setKey ? props[setKey] : void 0; 6243 const propsRef = useLiveRef({ value, setValue }); 6244 useSafeLayoutEffect(() => { 6245 return sync(store, [key], (state, prev) => { 6246 const { value: value2, setValue: setValue2 } = propsRef.current; 6247 if (!setValue2) return; 6248 if (state[key] === prev[key]) return; 6249 if (state[key] === value2) return; 6250 setValue2(state[key]); 6251 }); 6252 }, [store, key]); 6253 useSafeLayoutEffect(() => { 6254 if (value === void 0) return; 6255 store.setState(key, value); 6256 return batch(store, [key], () => { 6257 if (value === void 0) return; 6258 store.setState(key, value); 6259 }); 6260 }); 6261 } 6262 function useStore(createStore2, props) { 6263 const [store, setStore] = React4.useState(() => createStore2(props)); 6264 useSafeLayoutEffect(() => init(store), [store]); 6265 const useState23 = React4.useCallback( 6266 (keyOrSelector) => useStoreState(store, keyOrSelector), 6267 [store] 6268 ); 6269 const memoizedStore = React4.useMemo( 6270 () => __spreadProps(__spreadValues({}, store), { useState: useState23 }), 6271 [store, useState23] 6272 ); 6273 const updateStore = useEvent(() => { 6274 setStore((store2) => createStore2(__spreadValues(__spreadValues({}, props), store2.getState()))); 6275 }); 6276 return [memoizedStore, updateStore]; 6277 } 6278 6279 // node_modules/@ariakit/core/esm/__chunks/CYQWQL4J.js 6280 function getCommonParent(items) { 6281 var _a; 6282 const firstItem = items.find((item) => !!item.element); 6283 const lastItem = [...items].reverse().find((item) => !!item.element); 6284 let parentElement = (_a = firstItem == null ? void 0 : firstItem.element) == null ? void 0 : _a.parentElement; 6285 while (parentElement && (lastItem == null ? void 0 : lastItem.element)) { 6286 const parent = parentElement; 6287 if (lastItem && parent.contains(lastItem.element)) { 6288 return parentElement; 6289 } 6290 parentElement = parentElement.parentElement; 6291 } 6292 return getDocument(parentElement).body; 6293 } 6294 function getPrivateStore(store) { 6295 return store == null ? void 0 : store.__unstablePrivateStore; 6296 } 6297 function createCollectionStore(props = {}) { 6298 var _a; 6299 throwOnConflictingProps(props, props.store); 6300 const syncState = (_a = props.store) == null ? void 0 : _a.getState(); 6301 const items = defaultValue( 6302 props.items, 6303 syncState == null ? void 0 : syncState.items, 6304 props.defaultItems, 6305 [] 6306 ); 6307 const itemsMap = new Map(items.map((item) => [item.id, item])); 6308 const initialState = { 6309 items, 6310 renderedItems: defaultValue(syncState == null ? void 0 : syncState.renderedItems, []) 6311 }; 6312 const syncPrivateStore = getPrivateStore(props.store); 6313 const privateStore = createStore( 6314 { items, renderedItems: initialState.renderedItems }, 6315 syncPrivateStore 6316 ); 6317 const collection = createStore(initialState, props.store); 6318 const sortItems = (renderedItems) => { 6319 const sortedItems = sortBasedOnDOMPosition(renderedItems, (i2) => i2.element); 6320 privateStore.setState("renderedItems", sortedItems); 6321 collection.setState("renderedItems", sortedItems); 6322 }; 6323 setup(collection, () => init(privateStore)); 6324 setup(privateStore, () => { 6325 return batch(privateStore, ["items"], (state) => { 6326 collection.setState("items", state.items); 6327 }); 6328 }); 6329 setup(privateStore, () => { 6330 return batch(privateStore, ["renderedItems"], (state) => { 6331 let firstRun = true; 6332 let raf = requestAnimationFrame(() => { 6333 const { renderedItems } = collection.getState(); 6334 if (state.renderedItems === renderedItems) return; 6335 sortItems(state.renderedItems); 6336 }); 6337 if (typeof IntersectionObserver !== "function") { 6338 return () => cancelAnimationFrame(raf); 6339 } 6340 const ioCallback = () => { 6341 if (firstRun) { 6342 firstRun = false; 6343 return; 6344 } 6345 cancelAnimationFrame(raf); 6346 raf = requestAnimationFrame(() => sortItems(state.renderedItems)); 6347 }; 6348 const root = getCommonParent(state.renderedItems); 6349 const observer = new IntersectionObserver(ioCallback, { root }); 6350 for (const item of state.renderedItems) { 6351 if (!item.element) continue; 6352 observer.observe(item.element); 6353 } 6354 return () => { 6355 cancelAnimationFrame(raf); 6356 observer.disconnect(); 6357 }; 6358 }); 6359 }); 6360 const mergeItem = (item, setItems, canDeleteFromMap = false) => { 6361 let prevItem; 6362 setItems((items2) => { 6363 const index = items2.findIndex(({ id }) => id === item.id); 6364 const nextItems = items2.slice(); 6365 if (index !== -1) { 6366 prevItem = items2[index]; 6367 const nextItem = __spreadValues2(__spreadValues2({}, prevItem), item); 6368 nextItems[index] = nextItem; 6369 itemsMap.set(item.id, nextItem); 6370 } else { 6371 nextItems.push(item); 6372 itemsMap.set(item.id, item); 6373 } 6374 return nextItems; 6375 }); 6376 const unmergeItem = () => { 6377 setItems((items2) => { 6378 if (!prevItem) { 6379 if (canDeleteFromMap) { 6380 itemsMap.delete(item.id); 6381 } 6382 return items2.filter(({ id }) => id !== item.id); 6383 } 6384 const index = items2.findIndex(({ id }) => id === item.id); 6385 if (index === -1) return items2; 6386 const nextItems = items2.slice(); 6387 nextItems[index] = prevItem; 6388 itemsMap.set(item.id, prevItem); 6389 return nextItems; 6390 }); 6391 }; 6392 return unmergeItem; 6393 }; 6394 const registerItem = (item) => mergeItem( 6395 item, 6396 (getItems) => privateStore.setState("items", getItems), 6397 true 6398 ); 6399 return __spreadProps2(__spreadValues2({}, collection), { 6400 registerItem, 6401 renderItem: (item) => chain( 6402 registerItem(item), 6403 mergeItem( 6404 item, 6405 (getItems) => privateStore.setState("renderedItems", getItems) 6406 ) 6407 ), 6408 item: (id) => { 6409 if (!id) return null; 6410 let item = itemsMap.get(id); 6411 if (!item) { 6412 const { items: items2 } = privateStore.getState(); 6413 item = items2.find((item2) => item2.id === id); 6414 if (item) { 6415 itemsMap.set(id, item); 6416 } 6417 } 6418 return item || null; 6419 }, 6420 // @ts-expect-error Internal 6421 __unstablePrivateStore: privateStore 6422 }); 6423 } 6424 6425 // node_modules/@ariakit/react-core/esm/__chunks/C3IKGW5T.js 6426 function useCollectionStoreProps(store, update, props) { 6427 useUpdateEffect(update, [props.store]); 6428 useStoreProps(store, props, "items", "setItems"); 6429 return store; 6430 } 6431 6432 // node_modules/@ariakit/core/esm/__chunks/7PRQYBBV.js 6433 function toArray(arg) { 6434 if (Array.isArray(arg)) { 6435 return arg; 6436 } 6437 return typeof arg !== "undefined" ? [arg] : []; 6438 } 6439 function flatten2DArray(array) { 6440 const flattened = []; 6441 for (const row of array) { 6442 flattened.push(...row); 6443 } 6444 return flattened; 6445 } 6446 function reverseArray(array) { 6447 return array.slice().reverse(); 6448 } 6449 6450 // node_modules/@ariakit/core/esm/__chunks/AJZ4BYF3.js 6451 var NULL_ITEM = { id: null }; 6452 function findFirstEnabledItem(items, excludeId) { 6453 return items.find((item) => { 6454 if (excludeId) { 6455 return !item.disabled && item.id !== excludeId; 6456 } 6457 return !item.disabled; 6458 }); 6459 } 6460 function getEnabledItems(items, excludeId) { 6461 return items.filter((item) => { 6462 if (excludeId) { 6463 return !item.disabled && item.id !== excludeId; 6464 } 6465 return !item.disabled; 6466 }); 6467 } 6468 function getItemsInRow(items, rowId) { 6469 return items.filter((item) => item.rowId === rowId); 6470 } 6471 function flipItems(items, activeId, shouldInsertNullItem = false) { 6472 const index = items.findIndex((item) => item.id === activeId); 6473 return [ 6474 ...items.slice(index + 1), 6475 ...shouldInsertNullItem ? [NULL_ITEM] : [], 6476 ...items.slice(0, index) 6477 ]; 6478 } 6479 function groupItemsByRows(items) { 6480 const rows = []; 6481 for (const item of items) { 6482 const row = rows.find((currentRow) => { 6483 var _a; 6484 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId; 6485 }); 6486 if (row) { 6487 row.push(item); 6488 } else { 6489 rows.push([item]); 6490 } 6491 } 6492 return rows; 6493 } 6494 function getMaxRowLength(array) { 6495 let maxLength = 0; 6496 for (const { length } of array) { 6497 if (length > maxLength) { 6498 maxLength = length; 6499 } 6500 } 6501 return maxLength; 6502 } 6503 function createEmptyItem(rowId) { 6504 return { 6505 id: "__EMPTY_ITEM__", 6506 disabled: true, 6507 rowId 6508 }; 6509 } 6510 function normalizeRows(rows, activeId, focusShift) { 6511 const maxLength = getMaxRowLength(rows); 6512 for (const row of rows) { 6513 for (let i2 = 0; i2 < maxLength; i2 += 1) { 6514 const item = row[i2]; 6515 if (!item || focusShift && item.disabled) { 6516 const isFirst = i2 === 0; 6517 const previousItem = isFirst && focusShift ? findFirstEnabledItem(row) : row[i2 - 1]; 6518 row[i2] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem == null ? void 0 : previousItem.rowId); 6519 } 6520 } 6521 } 6522 return rows; 6523 } 6524 function verticalizeItems(items) { 6525 const rows = groupItemsByRows(items); 6526 const maxLength = getMaxRowLength(rows); 6527 const verticalized = []; 6528 for (let i2 = 0; i2 < maxLength; i2 += 1) { 6529 for (const row of rows) { 6530 const item = row[i2]; 6531 if (item) { 6532 verticalized.push(__spreadProps2(__spreadValues2({}, item), { 6533 // If there's no rowId, it means that it's not a grid composite, but 6534 // a single row instead. So, instead of verticalizing it, that is, 6535 // assigning a different rowId based on the column index, we keep it 6536 // undefined so they will be part of the same row. This is useful 6537 // when using up/down on one-dimensional composites. 6538 rowId: item.rowId ? `$i2}` : void 0 6539 })); 6540 } 6541 } 6542 } 6543 return verticalized; 6544 } 6545 function createCompositeStore(props = {}) { 6546 var _a; 6547 const syncState = (_a = props.store) == null ? void 0 : _a.getState(); 6548 const collection = createCollectionStore(props); 6549 const activeId = defaultValue( 6550 props.activeId, 6551 syncState == null ? void 0 : syncState.activeId, 6552 props.defaultActiveId 6553 ); 6554 const initialState = __spreadProps2(__spreadValues2({}, collection.getState()), { 6555 id: defaultValue( 6556 props.id, 6557 syncState == null ? void 0 : syncState.id, 6558 `id-$Math.random().toString(36).slice(2, 8)}` 6559 ), 6560 activeId, 6561 baseElement: defaultValue(syncState == null ? void 0 : syncState.baseElement, null), 6562 includesBaseElement: defaultValue( 6563 props.includesBaseElement, 6564 syncState == null ? void 0 : syncState.includesBaseElement, 6565 activeId === null 6566 ), 6567 moves: defaultValue(syncState == null ? void 0 : syncState.moves, 0), 6568 orientation: defaultValue( 6569 props.orientation, 6570 syncState == null ? void 0 : syncState.orientation, 6571 "both" 6572 ), 6573 rtl: defaultValue(props.rtl, syncState == null ? void 0 : syncState.rtl, false), 6574 virtualFocus: defaultValue( 6575 props.virtualFocus, 6576 syncState == null ? void 0 : syncState.virtualFocus, 6577 false 6578 ), 6579 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, false), 6580 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, false), 6581 focusShift: defaultValue(props.focusShift, syncState == null ? void 0 : syncState.focusShift, false) 6582 }); 6583 const composite = createStore(initialState, collection, props.store); 6584 setup( 6585 composite, 6586 () => sync(composite, ["renderedItems", "activeId"], (state) => { 6587 composite.setState("activeId", (activeId2) => { 6588 var _a2; 6589 if (activeId2 !== void 0) return activeId2; 6590 return (_a2 = findFirstEnabledItem(state.renderedItems)) == null ? void 0 : _a2.id; 6591 }); 6592 }) 6593 ); 6594 const getNextId = (direction = "next", options = {}) => { 6595 var _a2, _b; 6596 const defaultState = composite.getState(); 6597 const { 6598 skip = 0, 6599 activeId: activeId2 = defaultState.activeId, 6600 focusShift = defaultState.focusShift, 6601 focusLoop = defaultState.focusLoop, 6602 focusWrap = defaultState.focusWrap, 6603 includesBaseElement = defaultState.includesBaseElement, 6604 renderedItems = defaultState.renderedItems, 6605 rtl = defaultState.rtl 6606 } = options; 6607 const isVerticalDirection = direction === "up" || direction === "down"; 6608 const isNextDirection = direction === "next" || direction === "down"; 6609 const canReverse = isNextDirection ? rtl && !isVerticalDirection : !rtl || isVerticalDirection; 6610 const canShift = focusShift && !skip; 6611 let items = !isVerticalDirection ? renderedItems : flatten2DArray( 6612 normalizeRows(groupItemsByRows(renderedItems), activeId2, canShift) 6613 ); 6614 items = canReverse ? reverseArray(items) : items; 6615 items = isVerticalDirection ? verticalizeItems(items) : items; 6616 if (activeId2 == null) { 6617 return (_a2 = findFirstEnabledItem(items)) == null ? void 0 : _a2.id; 6618 } 6619 const activeItem = items.find((item) => item.id === activeId2); 6620 if (!activeItem) { 6621 return (_b = findFirstEnabledItem(items)) == null ? void 0 : _b.id; 6622 } 6623 const isGrid2 = items.some((item) => item.rowId); 6624 const activeIndex = items.indexOf(activeItem); 6625 const nextItems = items.slice(activeIndex + 1); 6626 const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId); 6627 if (skip) { 6628 const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2); 6629 const nextItem2 = nextEnabledItemsInRow.slice(skip)[0] || // If we can't find an item, just return the last one. 6630 nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1]; 6631 return nextItem2 == null ? void 0 : nextItem2.id; 6632 } 6633 const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical"); 6634 const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical"); 6635 const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false; 6636 if (canLoop) { 6637 const loopItems = canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId); 6638 const sortedItems = flipItems(loopItems, activeId2, hasNullItem); 6639 const nextItem2 = findFirstEnabledItem(sortedItems, activeId2); 6640 return nextItem2 == null ? void 0 : nextItem2.id; 6641 } 6642 if (canWrap) { 6643 const nextItem2 = findFirstEnabledItem( 6644 // We can use nextItems, which contains all the next items, including 6645 // items from other rows, to wrap between rows. However, if there is a 6646 // null item (the composite container), we'll only use the next items in 6647 // the row. So moving next from the last item will focus on the 6648 // composite container. On grid composites, horizontal navigation never 6649 // focuses on the composite container, only vertical. 6650 hasNullItem ? nextItemsInRow : nextItems, 6651 activeId2 6652 ); 6653 const nextId = hasNullItem ? (nextItem2 == null ? void 0 : nextItem2.id) || null : nextItem2 == null ? void 0 : nextItem2.id; 6654 return nextId; 6655 } 6656 const nextItem = findFirstEnabledItem(nextItemsInRow, activeId2); 6657 if (!nextItem && hasNullItem) { 6658 return null; 6659 } 6660 return nextItem == null ? void 0 : nextItem.id; 6661 }; 6662 return __spreadProps2(__spreadValues2(__spreadValues2({}, collection), composite), { 6663 setBaseElement: (element) => composite.setState("baseElement", element), 6664 setActiveId: (id) => composite.setState("activeId", id), 6665 move: (id) => { 6666 if (id === void 0) return; 6667 composite.setState("activeId", id); 6668 composite.setState("moves", (moves) => moves + 1); 6669 }, 6670 first: () => { 6671 var _a2; 6672 return (_a2 = findFirstEnabledItem(composite.getState().renderedItems)) == null ? void 0 : _a2.id; 6673 }, 6674 last: () => { 6675 var _a2; 6676 return (_a2 = findFirstEnabledItem(reverseArray(composite.getState().renderedItems))) == null ? void 0 : _a2.id; 6677 }, 6678 next: (options) => { 6679 if (options !== void 0 && typeof options === "number") { 6680 options = { skip: options }; 6681 } 6682 return getNextId("next", options); 6683 }, 6684 previous: (options) => { 6685 if (options !== void 0 && typeof options === "number") { 6686 options = { skip: options }; 6687 } 6688 return getNextId("previous", options); 6689 }, 6690 down: (options) => { 6691 if (options !== void 0 && typeof options === "number") { 6692 options = { skip: options }; 6693 } 6694 return getNextId("down", options); 6695 }, 6696 up: (options) => { 6697 if (options !== void 0 && typeof options === "number") { 6698 options = { skip: options }; 6699 } 6700 return getNextId("up", options); 6701 } 6702 }); 6703 } 6704 6705 // node_modules/@ariakit/react-core/esm/__chunks/4CMBR7SL.js 6706 function useCompositeStoreOptions(props) { 6707 const id = useId3(props.id); 6708 return __spreadValues({ id }, props); 6709 } 6710 function useCompositeStoreProps(store, update, props) { 6711 store = useCollectionStoreProps(store, update, props); 6712 useStoreProps(store, props, "activeId", "setActiveId"); 6713 useStoreProps(store, props, "includesBaseElement"); 6714 useStoreProps(store, props, "virtualFocus"); 6715 useStoreProps(store, props, "orientation"); 6716 useStoreProps(store, props, "rtl"); 6717 useStoreProps(store, props, "focusLoop"); 6718 useStoreProps(store, props, "focusWrap"); 6719 useStoreProps(store, props, "focusShift"); 6720 return store; 6721 } 6722 6723 // node_modules/@ariakit/core/esm/__chunks/RCQ5P4YE.js 6724 function createDisclosureStore(props = {}) { 6725 const store = mergeStore( 6726 props.store, 6727 omit22(props.disclosure, ["contentElement", "disclosureElement"]) 6728 ); 6729 throwOnConflictingProps(props, store); 6730 const syncState = store == null ? void 0 : store.getState(); 6731 const open = defaultValue( 6732 props.open, 6733 syncState == null ? void 0 : syncState.open, 6734 props.defaultOpen, 6735 false 6736 ); 6737 const animated = defaultValue(props.animated, syncState == null ? void 0 : syncState.animated, false); 6738 const initialState = { 6739 open, 6740 animated, 6741 animating: !!animated && open, 6742 mounted: open, 6743 contentElement: defaultValue(syncState == null ? void 0 : syncState.contentElement, null), 6744 disclosureElement: defaultValue(syncState == null ? void 0 : syncState.disclosureElement, null) 6745 }; 6746 const disclosure = createStore(initialState, store); 6747 setup( 6748 disclosure, 6749 () => sync(disclosure, ["animated", "animating"], (state) => { 6750 if (state.animated) return; 6751 disclosure.setState("animating", false); 6752 }) 6753 ); 6754 setup( 6755 disclosure, 6756 () => subscribe(disclosure, ["open"], () => { 6757 if (!disclosure.getState().animated) return; 6758 disclosure.setState("animating", true); 6759 }) 6760 ); 6761 setup( 6762 disclosure, 6763 () => sync(disclosure, ["open", "animating"], (state) => { 6764 disclosure.setState("mounted", state.open || state.animating); 6765 }) 6766 ); 6767 return __spreadProps2(__spreadValues2({}, disclosure), { 6768 disclosure: props.disclosure, 6769 setOpen: (value) => disclosure.setState("open", value), 6770 show: () => disclosure.setState("open", true), 6771 hide: () => disclosure.setState("open", false), 6772 toggle: () => disclosure.setState("open", (open2) => !open2), 6773 stopAnimation: () => disclosure.setState("animating", false), 6774 setContentElement: (value) => disclosure.setState("contentElement", value), 6775 setDisclosureElement: (value) => disclosure.setState("disclosureElement", value) 6776 }); 6777 } 6778 6779 // node_modules/@ariakit/react-core/esm/__chunks/WYCIER3C.js 6780 function useDisclosureStoreProps(store, update, props) { 6781 useUpdateEffect(update, [props.store, props.disclosure]); 6782 useStoreProps(store, props, "open", "setOpen"); 6783 useStoreProps(store, props, "mounted", "setMounted"); 6784 useStoreProps(store, props, "animated"); 6785 return Object.assign(store, { disclosure: props.disclosure }); 6786 } 6787 6788 // node_modules/@ariakit/core/esm/__chunks/FZZ2AVHF.js 6789 function createDialogStore(props = {}) { 6790 return createDisclosureStore(props); 6791 } 6792 6793 // node_modules/@ariakit/react-core/esm/__chunks/BM6PGYQY.js 6794 function useDialogStoreProps(store, update, props) { 6795 return useDisclosureStoreProps(store, update, props); 6796 } 6797 6798 // node_modules/@ariakit/core/esm/__chunks/ME2CUF3F.js 6799 function createPopoverStore(_a = {}) { 6800 var _b = _a, { 6801 popover: otherPopover 6802 } = _b, props = __objRest2(_b, [ 6803 "popover" 6804 ]); 6805 const store = mergeStore( 6806 props.store, 6807 omit22(otherPopover, [ 6808 "arrowElement", 6809 "anchorElement", 6810 "contentElement", 6811 "popoverElement", 6812 "disclosureElement" 6813 ]) 6814 ); 6815 throwOnConflictingProps(props, store); 6816 const syncState = store == null ? void 0 : store.getState(); 6817 const dialog = createDialogStore(__spreadProps2(__spreadValues2({}, props), { store })); 6818 const placement = defaultValue( 6819 props.placement, 6820 syncState == null ? void 0 : syncState.placement, 6821 "bottom" 6822 ); 6823 const initialState = __spreadProps2(__spreadValues2({}, dialog.getState()), { 6824 placement, 6825 currentPlacement: placement, 6826 anchorElement: defaultValue(syncState == null ? void 0 : syncState.anchorElement, null), 6827 popoverElement: defaultValue(syncState == null ? void 0 : syncState.popoverElement, null), 6828 arrowElement: defaultValue(syncState == null ? void 0 : syncState.arrowElement, null), 6829 rendered: Symbol("rendered") 6830 }); 6831 const popover = createStore(initialState, dialog, store); 6832 return __spreadProps2(__spreadValues2(__spreadValues2({}, dialog), popover), { 6833 setAnchorElement: (element) => popover.setState("anchorElement", element), 6834 setPopoverElement: (element) => popover.setState("popoverElement", element), 6835 setArrowElement: (element) => popover.setState("arrowElement", element), 6836 render: () => popover.setState("rendered", Symbol("rendered")) 6837 }); 6838 } 6839 6840 // node_modules/@ariakit/react-core/esm/__chunks/O2PQ2652.js 6841 function usePopoverStoreProps(store, update, props) { 6842 useUpdateEffect(update, [props.popover]); 6843 useStoreProps(store, props, "placement"); 6844 return useDialogStoreProps(store, update, props); 6845 } 6846 6847 // node_modules/@ariakit/core/esm/combobox/combobox-store.js 6848 var isTouchSafari = isSafari() && isTouchDevice(); 6849 function createComboboxStore(_a = {}) { 6850 var _b = _a, { 6851 tag 6852 } = _b, props = __objRest2(_b, [ 6853 "tag" 6854 ]); 6855 const store = mergeStore(props.store, pick2(tag, ["value", "rtl"])); 6856 throwOnConflictingProps(props, store); 6857 const tagState = tag == null ? void 0 : tag.getState(); 6858 const syncState = store == null ? void 0 : store.getState(); 6859 const activeId = defaultValue( 6860 props.activeId, 6861 syncState == null ? void 0 : syncState.activeId, 6862 props.defaultActiveId, 6863 null 6864 ); 6865 const composite = createCompositeStore(__spreadProps2(__spreadValues2({}, props), { 6866 activeId, 6867 includesBaseElement: defaultValue( 6868 props.includesBaseElement, 6869 syncState == null ? void 0 : syncState.includesBaseElement, 6870 true 6871 ), 6872 orientation: defaultValue( 6873 props.orientation, 6874 syncState == null ? void 0 : syncState.orientation, 6875 "vertical" 6876 ), 6877 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true), 6878 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, true), 6879 virtualFocus: defaultValue( 6880 props.virtualFocus, 6881 syncState == null ? void 0 : syncState.virtualFocus, 6882 true 6883 ) 6884 })); 6885 const popover = createPopoverStore(__spreadProps2(__spreadValues2({}, props), { 6886 placement: defaultValue( 6887 props.placement, 6888 syncState == null ? void 0 : syncState.placement, 6889 "bottom-start" 6890 ) 6891 })); 6892 const value = defaultValue( 6893 props.value, 6894 syncState == null ? void 0 : syncState.value, 6895 props.defaultValue, 6896 "" 6897 ); 6898 const selectedValue = defaultValue( 6899 props.selectedValue, 6900 syncState == null ? void 0 : syncState.selectedValue, 6901 tagState == null ? void 0 : tagState.values, 6902 props.defaultSelectedValue, 6903 "" 6904 ); 6905 const multiSelectable = Array.isArray(selectedValue); 6906 const initialState = __spreadProps2(__spreadValues2(__spreadValues2({}, composite.getState()), popover.getState()), { 6907 value, 6908 selectedValue, 6909 resetValueOnSelect: defaultValue( 6910 props.resetValueOnSelect, 6911 syncState == null ? void 0 : syncState.resetValueOnSelect, 6912 multiSelectable 6913 ), 6914 resetValueOnHide: defaultValue( 6915 props.resetValueOnHide, 6916 syncState == null ? void 0 : syncState.resetValueOnHide, 6917 multiSelectable && !tag 6918 ), 6919 activeValue: syncState == null ? void 0 : syncState.activeValue 6920 }); 6921 const combobox = createStore(initialState, composite, popover, store); 6922 if (isTouchSafari) { 6923 setup( 6924 combobox, 6925 () => sync(combobox, ["virtualFocus"], () => { 6926 combobox.setState("virtualFocus", false); 6927 }) 6928 ); 6929 } 6930 setup(combobox, () => { 6931 if (!tag) return; 6932 return chain( 6933 sync(combobox, ["selectedValue"], (state) => { 6934 if (!Array.isArray(state.selectedValue)) return; 6935 tag.setValues(state.selectedValue); 6936 }), 6937 sync(tag, ["values"], (state) => { 6938 combobox.setState("selectedValue", state.values); 6939 }) 6940 ); 6941 }); 6942 setup( 6943 combobox, 6944 () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => { 6945 if (!state.resetValueOnHide) return; 6946 if (state.mounted) return; 6947 combobox.setState("value", value); 6948 }) 6949 ); 6950 setup( 6951 combobox, 6952 () => sync(combobox, ["open"], (state) => { 6953 if (state.open) return; 6954 combobox.setState("activeId", activeId); 6955 combobox.setState("moves", 0); 6956 }) 6957 ); 6958 setup( 6959 combobox, 6960 () => sync(combobox, ["moves", "activeId"], (state, prevState) => { 6961 if (state.moves === prevState.moves) { 6962 combobox.setState("activeValue", void 0); 6963 } 6964 }) 6965 ); 6966 setup( 6967 combobox, 6968 () => batch(combobox, ["moves", "renderedItems"], (state, prev) => { 6969 if (state.moves === prev.moves) return; 6970 const { activeId: activeId2 } = combobox.getState(); 6971 const activeItem = composite.item(activeId2); 6972 combobox.setState("activeValue", activeItem == null ? void 0 : activeItem.value); 6973 }) 6974 ); 6975 return __spreadProps2(__spreadValues2(__spreadValues2(__spreadValues2({}, popover), composite), combobox), { 6976 tag, 6977 setValue: (value2) => combobox.setState("value", value2), 6978 resetValue: () => combobox.setState("value", initialState.value), 6979 setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2) 6980 }); 6981 } 6982 6983 // node_modules/@ariakit/react-core/esm/__chunks/FEOFMWBY.js 6984 function useComboboxStoreOptions(props) { 6985 const tag = useTagContext(); 6986 props = __spreadProps(__spreadValues({}, props), { 6987 tag: props.tag !== void 0 ? props.tag : tag 6988 }); 6989 return useCompositeStoreOptions(props); 6990 } 6991 function useComboboxStoreProps(store, update, props) { 6992 useUpdateEffect(update, [props.tag]); 6993 useStoreProps(store, props, "value", "setValue"); 6994 useStoreProps(store, props, "selectedValue", "setSelectedValue"); 6995 useStoreProps(store, props, "resetValueOnHide"); 6996 useStoreProps(store, props, "resetValueOnSelect"); 6997 return Object.assign( 6998 useCompositeStoreProps( 6999 usePopoverStoreProps(store, update, props), 7000 update, 7001 props 7002 ), 7003 { tag: props.tag } 7004 ); 7005 } 7006 function useComboboxStore(props = {}) { 7007 props = useComboboxStoreOptions(props); 7008 const [store, update] = useStore(createComboboxStore, props); 7009 return useComboboxStoreProps(store, update, props); 7010 } 7011 7012 // node_modules/@ariakit/react-core/esm/__chunks/S6EF7IVO.js 7013 var ctx4 = createStoreContext(); 7014 var useDisclosureContext = ctx4.useContext; 7015 var useDisclosureScopedContext = ctx4.useScopedContext; 7016 var useDisclosureProviderContext = ctx4.useProviderContext; 7017 var DisclosureContextProvider = ctx4.ContextProvider; 7018 var DisclosureScopedContextProvider = ctx4.ScopedContextProvider; 7019 7020 // node_modules/@ariakit/react-core/esm/__chunks/RS7LB2H4.js 7021 var import_react6 = __toESM(require_react(), 1); 7022 var ctx5 = createStoreContext( 7023 [DisclosureContextProvider], 7024 [DisclosureScopedContextProvider] 7025 ); 7026 var useDialogContext = ctx5.useContext; 7027 var useDialogScopedContext = ctx5.useScopedContext; 7028 var useDialogProviderContext = ctx5.useProviderContext; 7029 var DialogContextProvider = ctx5.ContextProvider; 7030 var DialogScopedContextProvider = ctx5.ScopedContextProvider; 7031 var DialogHeadingContext = (0, import_react6.createContext)(void 0); 7032 var DialogDescriptionContext = (0, import_react6.createContext)(void 0); 7033 7034 // node_modules/@ariakit/react-core/esm/__chunks/MTZPJQMC.js 7035 var ctx6 = createStoreContext( 7036 [DialogContextProvider], 7037 [DialogScopedContextProvider] 7038 ); 7039 var usePopoverContext = ctx6.useContext; 7040 var usePopoverScopedContext = ctx6.useScopedContext; 7041 var usePopoverProviderContext = ctx6.useProviderContext; 7042 var PopoverContextProvider = ctx6.ContextProvider; 7043 var PopoverScopedContextProvider = ctx6.ScopedContextProvider; 7044 7045 // node_modules/@ariakit/react-core/esm/__chunks/VEVQD5MH.js 7046 var import_react7 = __toESM(require_react(), 1); 7047 var ComboboxListRoleContext = (0, import_react7.createContext)( 7048 void 0 7049 ); 7050 var ctx7 = createStoreContext( 7051 [PopoverContextProvider, CompositeContextProvider], 7052 [PopoverScopedContextProvider, CompositeScopedContextProvider] 7053 ); 7054 var useComboboxContext = ctx7.useContext; 7055 var useComboboxScopedContext = ctx7.useScopedContext; 7056 var useComboboxProviderContext = ctx7.useProviderContext; 7057 var ComboboxContextProvider = ctx7.ContextProvider; 7058 var ComboboxScopedContextProvider = ctx7.ScopedContextProvider; 7059 var ComboboxItemValueContext = (0, import_react7.createContext)( 7060 void 0 7061 ); 7062 var ComboboxItemCheckedContext = (0, import_react7.createContext)(false); 7063 7064 // node_modules/@ariakit/react-core/esm/__chunks/OMU7RWRV.js 7065 var TagName = "div"; 7066 var usePopoverAnchor = createHook( 7067 function usePopoverAnchor2(_a) { 7068 var _b = _a, { store } = _b, props = __objRest(_b, ["store"]); 7069 const context = usePopoverProviderContext(); 7070 store = store || context; 7071 props = __spreadProps(__spreadValues({}, props), { 7072 ref: useMergeRefs(store == null ? void 0 : store.setAnchorElement, props.ref) 7073 }); 7074 return props; 7075 } 7076 ); 7077 var PopoverAnchor = forwardRef22(function PopoverAnchor2(props) { 7078 const htmlProps = usePopoverAnchor(props); 7079 return createElement2(TagName, htmlProps); 7080 }); 7081 7082 // node_modules/@ariakit/react-core/esm/__chunks/5VQZOHHZ.js 7083 function findFirstEnabledItem2(items, excludeId) { 7084 return items.find((item) => { 7085 if (excludeId) { 7086 return !item.disabled && item.id !== excludeId; 7087 } 7088 return !item.disabled; 7089 }); 7090 } 7091 function getEnabledItem(store, id) { 7092 if (!id) return null; 7093 return store.item(id) || null; 7094 } 7095 function groupItemsByRows2(items) { 7096 const rows = []; 7097 for (const item of items) { 7098 const row = rows.find((currentRow) => { 7099 var _a; 7100 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId; 7101 }); 7102 if (row) { 7103 row.push(item); 7104 } else { 7105 rows.push([item]); 7106 } 7107 } 7108 return rows; 7109 } 7110 function selectTextField(element, collapseToEnd = false) { 7111 if (isTextField(element)) { 7112 element.setSelectionRange( 7113 collapseToEnd ? element.value.length : 0, 7114 element.value.length 7115 ); 7116 } else if (element.isContentEditable) { 7117 const selection = getDocument(element).getSelection(); 7118 selection == null ? void 0 : selection.selectAllChildren(element); 7119 if (collapseToEnd) { 7120 selection == null ? void 0 : selection.collapseToEnd(); 7121 } 7122 } 7123 } 7124 var FOCUS_SILENTLY = Symbol("FOCUS_SILENTLY"); 7125 function focusSilently(element) { 7126 element[FOCUS_SILENTLY] = true; 7127 element.focus({ preventScroll: true }); 7128 } 7129 function silentlyFocused(element) { 7130 const isSilentlyFocused = element[FOCUS_SILENTLY]; 7131 delete element[FOCUS_SILENTLY]; 7132 return isSilentlyFocused; 7133 } 7134 function isItem(store, element, exclude) { 7135 if (!element) return false; 7136 if (element === exclude) return false; 7137 const item = store.item(element.id); 7138 if (!item) return false; 7139 if (exclude && item.element === exclude) return false; 7140 return true; 7141 } 7142 7143 // node_modules/@ariakit/react-core/esm/__chunks/SWN3JYXT.js 7144 var import_react8 = __toESM(require_react(), 1); 7145 var FocusableContext = (0, import_react8.createContext)(true); 7146 7147 // node_modules/@ariakit/core/esm/utils/focus.js 7148 var selector = "input:not([type='hidden']):not([disabled]), select:not([disabled]), textarea:not([disabled]), a[href], button:not([disabled]), [tabindex], summary, iframe, object, embed, area[href], audio[controls], video[controls], [contenteditable]:not([contenteditable='false'])"; 7149 function isFocusable(element) { 7150 if (!element.matches(selector)) return false; 7151 if (!isVisible(element)) return false; 7152 if (element.closest("[inert]")) return false; 7153 return true; 7154 } 7155 function getClosestFocusable(element) { 7156 while (element && !isFocusable(element)) { 7157 element = element.closest(selector); 7158 } 7159 return element || null; 7160 } 7161 function hasFocus(element) { 7162 const activeElement = getActiveElement(element); 7163 if (!activeElement) return false; 7164 if (activeElement === element) return true; 7165 const activeDescendant = activeElement.getAttribute("aria-activedescendant"); 7166 if (!activeDescendant) return false; 7167 return activeDescendant === element.id; 7168 } 7169 function hasFocusWithin(element) { 7170 const activeElement = getActiveElement(element); 7171 if (!activeElement) return false; 7172 if (contains(element, activeElement)) return true; 7173 const activeDescendant = activeElement.getAttribute("aria-activedescendant"); 7174 if (!activeDescendant) return false; 7175 if (!("id" in element)) return false; 7176 if (activeDescendant === element.id) return true; 7177 return !!element.querySelector(`#$CSS.escape(activeDescendant)}`); 7178 } 7179 function focusIfNeeded(element) { 7180 if (!hasFocusWithin(element) && isFocusable(element)) { 7181 element.focus(); 7182 } 7183 } 7184 function focusIntoView(element, options) { 7185 if (!("scrollIntoView" in element)) { 7186 element.focus(); 7187 } else { 7188 element.focus({ preventScroll: true }); 7189 element.scrollIntoView(__spreadValues2({ block: "nearest", inline: "nearest" }, options)); 7190 } 7191 } 7192 7193 // node_modules/@ariakit/react-core/esm/__chunks/LVA2YJMS.js 7194 var import_react9 = __toESM(require_react(), 1); 7195 var TagName2 = "div"; 7196 var isSafariBrowser = isSafari(); 7197 var alwaysFocusVisibleInputTypes = [ 7198 "text", 7199 "search", 7200 "url", 7201 "tel", 7202 "email", 7203 "password", 7204 "number", 7205 "date", 7206 "month", 7207 "week", 7208 "time", 7209 "datetime", 7210 "datetime-local" 7211 ]; 7212 var safariFocusAncestorSymbol = Symbol("safariFocusAncestor"); 7213 function markSafariFocusAncestor(element, value) { 7214 if (!element) return; 7215 element[safariFocusAncestorSymbol] = value; 7216 } 7217 function isAlwaysFocusVisible(element) { 7218 const { tagName, readOnly, type } = element; 7219 if (tagName === "TEXTAREA" && !readOnly) return true; 7220 if (tagName === "SELECT" && !readOnly) return true; 7221 if (tagName === "INPUT" && !readOnly) { 7222 return alwaysFocusVisibleInputTypes.includes(type); 7223 } 7224 if (element.isContentEditable) return true; 7225 const role = element.getAttribute("role"); 7226 if (role === "combobox" && element.dataset.name) { 7227 return true; 7228 } 7229 return false; 7230 } 7231 function getLabels(element) { 7232 if ("labels" in element) { 7233 return element.labels; 7234 } 7235 return null; 7236 } 7237 function isNativeCheckboxOrRadio(element) { 7238 const tagName = element.tagName.toLowerCase(); 7239 if (tagName === "input" && element.type) { 7240 return element.type === "radio" || element.type === "checkbox"; 7241 } 7242 return false; 7243 } 7244 function isNativeTabbable(tagName) { 7245 if (!tagName) return true; 7246 return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a"; 7247 } 7248 function supportsDisabledAttribute(tagName) { 7249 if (!tagName) return true; 7250 return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea"; 7251 } 7252 function getTabIndex(focusable, trulyDisabled, nativeTabbable, supportsDisabled, tabIndexProp) { 7253 if (!focusable) { 7254 return tabIndexProp; 7255 } 7256 if (trulyDisabled) { 7257 if (nativeTabbable && !supportsDisabled) { 7258 return -1; 7259 } 7260 return; 7261 } 7262 if (nativeTabbable) { 7263 return tabIndexProp; 7264 } 7265 return tabIndexProp || 0; 7266 } 7267 function useDisableEvent(onEvent, disabled) { 7268 return useEvent((event) => { 7269 onEvent == null ? void 0 : onEvent(event); 7270 if (event.defaultPrevented) return; 7271 if (disabled) { 7272 event.stopPropagation(); 7273 event.preventDefault(); 7274 } 7275 }); 7276 } 7277 var isKeyboardModality = true; 7278 function onGlobalMouseDown(event) { 7279 const target = event.target; 7280 if (target && "hasAttribute" in target) { 7281 if (!target.hasAttribute("data-focus-visible")) { 7282 isKeyboardModality = false; 7283 } 7284 } 7285 } 7286 function onGlobalKeyDown(event) { 7287 if (event.metaKey) return; 7288 if (event.ctrlKey) return; 7289 if (event.altKey) return; 7290 isKeyboardModality = true; 7291 } 7292 var useFocusable = createHook( 7293 function useFocusable2(_a) { 7294 var _b = _a, { 7295 focusable = true, 7296 accessibleWhenDisabled, 7297 autoFocus, 7298 onFocusVisible 7299 } = _b, props = __objRest(_b, [ 7300 "focusable", 7301 "accessibleWhenDisabled", 7302 "autoFocus", 7303 "onFocusVisible" 7304 ]); 7305 const ref = (0, import_react9.useRef)(null); 7306 (0, import_react9.useEffect)(() => { 7307 if (!focusable) return; 7308 addGlobalEventListener("mousedown", onGlobalMouseDown, true); 7309 addGlobalEventListener("keydown", onGlobalKeyDown, true); 7310 }, [focusable]); 7311 if (isSafariBrowser) { 7312 (0, import_react9.useEffect)(() => { 7313 if (!focusable) return; 7314 const element = ref.current; 7315 if (!element) return; 7316 if (!isNativeCheckboxOrRadio(element)) return; 7317 const labels = getLabels(element); 7318 if (!labels) return; 7319 const onMouseUp = () => queueMicrotask(() => element.focus()); 7320 for (const label of labels) { 7321 label.addEventListener("mouseup", onMouseUp); 7322 } 7323 return () => { 7324 for (const label of labels) { 7325 label.removeEventListener("mouseup", onMouseUp); 7326 } 7327 }; 7328 }, [focusable]); 7329 } 7330 const disabled = focusable && disabledFromProps(props); 7331 const trulyDisabled = !!disabled && !accessibleWhenDisabled; 7332 const [focusVisible, setFocusVisible] = (0, import_react9.useState)(false); 7333 (0, import_react9.useEffect)(() => { 7334 if (!focusable) return; 7335 if (trulyDisabled && focusVisible) { 7336 setFocusVisible(false); 7337 } 7338 }, [focusable, trulyDisabled, focusVisible]); 7339 (0, import_react9.useEffect)(() => { 7340 if (!focusable) return; 7341 if (!focusVisible) return; 7342 const element = ref.current; 7343 if (!element) return; 7344 if (typeof IntersectionObserver === "undefined") return; 7345 const observer = new IntersectionObserver(() => { 7346 if (!isFocusable(element)) { 7347 setFocusVisible(false); 7348 } 7349 }); 7350 observer.observe(element); 7351 return () => observer.disconnect(); 7352 }, [focusable, focusVisible]); 7353 const onKeyPressCapture = useDisableEvent( 7354 props.onKeyPressCapture, 7355 disabled 7356 ); 7357 const onMouseDownCapture = useDisableEvent( 7358 props.onMouseDownCapture, 7359 disabled 7360 ); 7361 const onClickCapture = useDisableEvent(props.onClickCapture, disabled); 7362 const onMouseDownProp = props.onMouseDown; 7363 const onMouseDown = useEvent((event) => { 7364 onMouseDownProp == null ? void 0 : onMouseDownProp(event); 7365 if (event.defaultPrevented) return; 7366 if (!focusable) return; 7367 const element = event.currentTarget; 7368 if (!isSafariBrowser) return; 7369 if (isPortalEvent(event)) return; 7370 if (!isButton(element) && !isNativeCheckboxOrRadio(element)) return; 7371 let receivedFocus = false; 7372 const onFocus = () => { 7373 receivedFocus = true; 7374 }; 7375 const options = { capture: true, once: true }; 7376 element.addEventListener("focusin", onFocus, options); 7377 const focusableContainer = getClosestFocusable(element.parentElement); 7378 markSafariFocusAncestor(focusableContainer, true); 7379 queueBeforeEvent(element, "mouseup", () => { 7380 element.removeEventListener("focusin", onFocus, true); 7381 markSafariFocusAncestor(focusableContainer, false); 7382 if (receivedFocus) return; 7383 focusIfNeeded(element); 7384 }); 7385 }); 7386 const handleFocusVisible = (event, currentTarget) => { 7387 if (currentTarget) { 7388 event.currentTarget = currentTarget; 7389 } 7390 if (!focusable) return; 7391 const element = event.currentTarget; 7392 if (!element) return; 7393 if (!hasFocus(element)) return; 7394 onFocusVisible == null ? void 0 : onFocusVisible(event); 7395 if (event.defaultPrevented) return; 7396 element.dataset.focusVisible = "true"; 7397 setFocusVisible(true); 7398 }; 7399 const onKeyDownCaptureProp = props.onKeyDownCapture; 7400 const onKeyDownCapture = useEvent((event) => { 7401 onKeyDownCaptureProp == null ? void 0 : onKeyDownCaptureProp(event); 7402 if (event.defaultPrevented) return; 7403 if (!focusable) return; 7404 if (focusVisible) return; 7405 if (event.metaKey) return; 7406 if (event.altKey) return; 7407 if (event.ctrlKey) return; 7408 if (!isSelfTarget(event)) return; 7409 const element = event.currentTarget; 7410 const applyFocusVisible = () => handleFocusVisible(event, element); 7411 queueBeforeEvent(element, "focusout", applyFocusVisible); 7412 }); 7413 const onFocusCaptureProp = props.onFocusCapture; 7414 const onFocusCapture = useEvent((event) => { 7415 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event); 7416 if (event.defaultPrevented) return; 7417 if (!focusable) return; 7418 if (!isSelfTarget(event)) { 7419 setFocusVisible(false); 7420 return; 7421 } 7422 const element = event.currentTarget; 7423 const applyFocusVisible = () => handleFocusVisible(event, element); 7424 if (isKeyboardModality || isAlwaysFocusVisible(event.target)) { 7425 queueBeforeEvent(event.target, "focusout", applyFocusVisible); 7426 } else { 7427 setFocusVisible(false); 7428 } 7429 }); 7430 const onBlurProp = props.onBlur; 7431 const onBlur = useEvent((event) => { 7432 onBlurProp == null ? void 0 : onBlurProp(event); 7433 if (!focusable) return; 7434 if (!isFocusEventOutside(event)) return; 7435 setFocusVisible(false); 7436 }); 7437 const autoFocusOnShow = (0, import_react9.useContext)(FocusableContext); 7438 const autoFocusRef = useEvent((element) => { 7439 if (!focusable) return; 7440 if (!autoFocus) return; 7441 if (!element) return; 7442 if (!autoFocusOnShow) return; 7443 queueMicrotask(() => { 7444 if (hasFocus(element)) return; 7445 if (!isFocusable(element)) return; 7446 element.focus(); 7447 }); 7448 }); 7449 const tagName = useTagName(ref); 7450 const nativeTabbable = focusable && isNativeTabbable(tagName); 7451 const supportsDisabled = focusable && supportsDisabledAttribute(tagName); 7452 const styleProp = props.style; 7453 const style = (0, import_react9.useMemo)(() => { 7454 if (trulyDisabled) { 7455 return __spreadValues({ pointerEvents: "none" }, styleProp); 7456 } 7457 return styleProp; 7458 }, [trulyDisabled, styleProp]); 7459 props = __spreadProps(__spreadValues({ 7460 "data-focus-visible": focusable && focusVisible || void 0, 7461 "data-autofocus": autoFocus || void 0, 7462 "aria-disabled": disabled || void 0 7463 }, props), { 7464 ref: useMergeRefs(ref, autoFocusRef, props.ref), 7465 style, 7466 tabIndex: getTabIndex( 7467 focusable, 7468 trulyDisabled, 7469 nativeTabbable, 7470 supportsDisabled, 7471 props.tabIndex 7472 ), 7473 disabled: supportsDisabled && trulyDisabled ? true : void 0, 7474 // TODO: Test Focusable contentEditable. 7475 contentEditable: disabled ? void 0 : props.contentEditable, 7476 onKeyPressCapture, 7477 onClickCapture, 7478 onMouseDownCapture, 7479 onMouseDown, 7480 onKeyDownCapture, 7481 onFocusCapture, 7482 onBlur 7483 }); 7484 return removeUndefinedValues(props); 7485 } 7486 ); 7487 var Focusable = forwardRef22(function Focusable2(props) { 7488 const htmlProps = useFocusable(props); 7489 return createElement2(TagName2, htmlProps); 7490 }); 7491 7492 // node_modules/@ariakit/react-core/esm/__chunks/ITI7HKP4.js 7493 var import_react10 = __toESM(require_react(), 1); 7494 var import_jsx_runtime47 = __toESM(require_jsx_runtime(), 1); 7495 var TagName3 = "div"; 7496 function isGrid(items) { 7497 return items.some((item) => !!item.rowId); 7498 } 7499 function isPrintableKey(event) { 7500 const target = event.target; 7501 if (target && !isTextField(target)) return false; 7502 return event.key.length === 1 && !event.ctrlKey && !event.metaKey; 7503 } 7504 function isModifierKey(event) { 7505 return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta"; 7506 } 7507 function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) { 7508 return useEvent((event) => { 7509 var _a; 7510 onKeyboardEvent == null ? void 0 : onKeyboardEvent(event); 7511 if (event.defaultPrevented) return; 7512 if (event.isPropagationStopped()) return; 7513 if (!isSelfTarget(event)) return; 7514 if (isModifierKey(event)) return; 7515 if (isPrintableKey(event)) return; 7516 const state = store.getState(); 7517 const activeElement = (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.element; 7518 if (!activeElement) return; 7519 const _b = event, { view } = _b, eventInit = __objRest(_b, ["view"]); 7520 const previousElement = previousElementRef == null ? void 0 : previousElementRef.current; 7521 if (activeElement !== previousElement) { 7522 activeElement.focus(); 7523 } 7524 if (!fireKeyboardEvent(activeElement, event.type, eventInit)) { 7525 event.preventDefault(); 7526 } 7527 if (event.currentTarget.contains(activeElement)) { 7528 event.stopPropagation(); 7529 } 7530 }); 7531 } 7532 function findFirstEnabledItemInTheLastRow(items) { 7533 return findFirstEnabledItem2( 7534 flatten2DArray(reverseArray(groupItemsByRows2(items))) 7535 ); 7536 } 7537 function useScheduleFocus(store) { 7538 const [scheduled, setScheduled] = (0, import_react10.useState)(false); 7539 const schedule = (0, import_react10.useCallback)(() => setScheduled(true), []); 7540 const activeItem = store.useState( 7541 (state) => getEnabledItem(store, state.activeId) 7542 ); 7543 (0, import_react10.useEffect)(() => { 7544 const activeElement = activeItem == null ? void 0 : activeItem.element; 7545 if (!scheduled) return; 7546 if (!activeElement) return; 7547 setScheduled(false); 7548 activeElement.focus({ preventScroll: true }); 7549 }, [activeItem, scheduled]); 7550 return schedule; 7551 } 7552 var useComposite = createHook( 7553 function useComposite2(_a) { 7554 var _b = _a, { 7555 store, 7556 composite = true, 7557 focusOnMove = composite, 7558 moveOnKeyPress = true 7559 } = _b, props = __objRest(_b, [ 7560 "store", 7561 "composite", 7562 "focusOnMove", 7563 "moveOnKeyPress" 7564 ]); 7565 const context = useCompositeProviderContext(); 7566 store = store || context; 7567 invariant( 7568 store, 7569 "Composite must receive a `store` prop or be wrapped in a CompositeProvider component." 7570 ); 7571 const ref = (0, import_react10.useRef)(null); 7572 const previousElementRef = (0, import_react10.useRef)(null); 7573 const scheduleFocus = useScheduleFocus(store); 7574 const moves = store.useState("moves"); 7575 const [, setBaseElement] = useTransactionState( 7576 composite ? store.setBaseElement : null 7577 ); 7578 (0, import_react10.useEffect)(() => { 7579 var _a2; 7580 if (!store) return; 7581 if (!moves) return; 7582 if (!composite) return; 7583 if (!focusOnMove) return; 7584 const { activeId: activeId2 } = store.getState(); 7585 const itemElement = (_a2 = getEnabledItem(store, activeId2)) == null ? void 0 : _a2.element; 7586 if (!itemElement) return; 7587 focusIntoView(itemElement); 7588 }, [store, moves, composite, focusOnMove]); 7589 useSafeLayoutEffect(() => { 7590 if (!store) return; 7591 if (!moves) return; 7592 if (!composite) return; 7593 const { baseElement, activeId: activeId2 } = store.getState(); 7594 const isSelfAcive = activeId2 === null; 7595 if (!isSelfAcive) return; 7596 if (!baseElement) return; 7597 const previousElement = previousElementRef.current; 7598 previousElementRef.current = null; 7599 if (previousElement) { 7600 fireBlurEvent(previousElement, { relatedTarget: baseElement }); 7601 } 7602 if (!hasFocus(baseElement)) { 7603 baseElement.focus(); 7604 } 7605 }, [store, moves, composite]); 7606 const activeId = store.useState("activeId"); 7607 const virtualFocus = store.useState("virtualFocus"); 7608 useSafeLayoutEffect(() => { 7609 var _a2; 7610 if (!store) return; 7611 if (!composite) return; 7612 if (!virtualFocus) return; 7613 const previousElement = previousElementRef.current; 7614 previousElementRef.current = null; 7615 if (!previousElement) return; 7616 const activeElement = (_a2 = getEnabledItem(store, activeId)) == null ? void 0 : _a2.element; 7617 const relatedTarget = activeElement || getActiveElement(previousElement); 7618 if (relatedTarget === previousElement) return; 7619 fireBlurEvent(previousElement, { relatedTarget }); 7620 }, [store, activeId, virtualFocus, composite]); 7621 const onKeyDownCapture = useKeyboardEventProxy( 7622 store, 7623 props.onKeyDownCapture, 7624 previousElementRef 7625 ); 7626 const onKeyUpCapture = useKeyboardEventProxy( 7627 store, 7628 props.onKeyUpCapture, 7629 previousElementRef 7630 ); 7631 const onFocusCaptureProp = props.onFocusCapture; 7632 const onFocusCapture = useEvent((event) => { 7633 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event); 7634 if (event.defaultPrevented) return; 7635 if (!store) return; 7636 const { virtualFocus: virtualFocus2 } = store.getState(); 7637 if (!virtualFocus2) return; 7638 const previousActiveElement = event.relatedTarget; 7639 const isSilentlyFocused = silentlyFocused(event.currentTarget); 7640 if (isSelfTarget(event) && isSilentlyFocused) { 7641 event.stopPropagation(); 7642 previousElementRef.current = previousActiveElement; 7643 } 7644 }); 7645 const onFocusProp = props.onFocus; 7646 const onFocus = useEvent((event) => { 7647 onFocusProp == null ? void 0 : onFocusProp(event); 7648 if (event.defaultPrevented) return; 7649 if (!composite) return; 7650 if (!store) return; 7651 const { relatedTarget } = event; 7652 const { virtualFocus: virtualFocus2 } = store.getState(); 7653 if (virtualFocus2) { 7654 if (isSelfTarget(event) && !isItem(store, relatedTarget)) { 7655 queueMicrotask(scheduleFocus); 7656 } 7657 } else if (isSelfTarget(event)) { 7658 store.setActiveId(null); 7659 } 7660 }); 7661 const onBlurCaptureProp = props.onBlurCapture; 7662 const onBlurCapture = useEvent((event) => { 7663 var _a2; 7664 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event); 7665 if (event.defaultPrevented) return; 7666 if (!store) return; 7667 const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState(); 7668 if (!virtualFocus2) return; 7669 const activeElement = (_a2 = getEnabledItem(store, activeId2)) == null ? void 0 : _a2.element; 7670 const nextActiveElement = event.relatedTarget; 7671 const nextActiveElementIsItem = isItem(store, nextActiveElement); 7672 const previousElement = previousElementRef.current; 7673 previousElementRef.current = null; 7674 if (isSelfTarget(event) && nextActiveElementIsItem) { 7675 if (nextActiveElement === activeElement) { 7676 if (previousElement && previousElement !== nextActiveElement) { 7677 fireBlurEvent(previousElement, event); 7678 } 7679 } else if (activeElement) { 7680 fireBlurEvent(activeElement, event); 7681 } else if (previousElement) { 7682 fireBlurEvent(previousElement, event); 7683 } 7684 event.stopPropagation(); 7685 } else { 7686 const targetIsItem = isItem(store, event.target); 7687 if (!targetIsItem && activeElement) { 7688 fireBlurEvent(activeElement, event); 7689 } 7690 } 7691 }); 7692 const onKeyDownProp = props.onKeyDown; 7693 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); 7694 const onKeyDown = useEvent((event) => { 7695 var _a2; 7696 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 7697 if (event.defaultPrevented) return; 7698 if (!store) return; 7699 if (!isSelfTarget(event)) return; 7700 const { orientation, renderedItems, activeId: activeId2 } = store.getState(); 7701 const activeItem = getEnabledItem(store, activeId2); 7702 if ((_a2 = activeItem == null ? void 0 : activeItem.element) == null ? void 0 : _a2.isConnected) return; 7703 const isVertical = orientation !== "horizontal"; 7704 const isHorizontal = orientation !== "vertical"; 7705 const grid = isGrid(renderedItems); 7706 const isHorizontalKey = event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End"; 7707 if (isHorizontalKey && isTextField(event.currentTarget)) return; 7708 const up = () => { 7709 if (grid) { 7710 const item = findFirstEnabledItemInTheLastRow(renderedItems); 7711 return item == null ? void 0 : item.id; 7712 } 7713 return store == null ? void 0 : store.last(); 7714 }; 7715 const keyMap = { 7716 ArrowUp: (grid || isVertical) && up, 7717 ArrowRight: (grid || isHorizontal) && store.first, 7718 ArrowDown: (grid || isVertical) && store.first, 7719 ArrowLeft: (grid || isHorizontal) && store.last, 7720 Home: store.first, 7721 End: store.last, 7722 PageUp: store.first, 7723 PageDown: store.last 7724 }; 7725 const action = keyMap[event.key]; 7726 if (action) { 7727 const id = action(); 7728 if (id !== void 0) { 7729 if (!moveOnKeyPressProp(event)) return; 7730 event.preventDefault(); 7731 store.move(id); 7732 } 7733 } 7734 }); 7735 props = useWrapElement( 7736 props, 7737 (element) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(CompositeContextProvider, { value: store, children: element }), 7738 [store] 7739 ); 7740 const activeDescendant = store.useState((state) => { 7741 var _a2; 7742 if (!store) return; 7743 if (!composite) return; 7744 if (!state.virtualFocus) return; 7745 return (_a2 = getEnabledItem(store, state.activeId)) == null ? void 0 : _a2.id; 7746 }); 7747 props = __spreadProps(__spreadValues({ 7748 "aria-activedescendant": activeDescendant 7749 }, props), { 7750 ref: useMergeRefs(ref, setBaseElement, props.ref), 7751 onKeyDownCapture, 7752 onKeyUpCapture, 7753 onFocusCapture, 7754 onFocus, 7755 onBlurCapture, 7756 onKeyDown 7757 }); 7758 const focusable = store.useState( 7759 (state) => composite && (state.virtualFocus || state.activeId === null) 7760 ); 7761 props = useFocusable(__spreadValues({ focusable }, props)); 7762 return props; 7763 } 7764 ); 7765 var Composite5 = forwardRef22(function Composite22(props) { 7766 const htmlProps = useComposite(props); 7767 return createElement2(TagName3, htmlProps); 7768 }); 7769 7770 // node_modules/@ariakit/react-core/esm/combobox/combobox.js 7771 var import_react11 = __toESM(require_react(), 1); 7772 var TagName4 = "input"; 7773 function isFirstItemAutoSelected(items, activeValue, autoSelect) { 7774 if (!autoSelect) return false; 7775 const firstItem = items.find((item) => !item.disabled && item.value); 7776 return (firstItem == null ? void 0 : firstItem.value) === activeValue; 7777 } 7778 function hasCompletionString(value, activeValue) { 7779 if (!activeValue) return false; 7780 if (value == null) return false; 7781 value = normalizeString(value); 7782 return activeValue.length > value.length && activeValue.toLowerCase().indexOf(value.toLowerCase()) === 0; 7783 } 7784 function isInputEvent(event) { 7785 return event.type === "input"; 7786 } 7787 function isAriaAutoCompleteValue(value) { 7788 return value === "inline" || value === "list" || value === "both" || value === "none"; 7789 } 7790 function getDefaultAutoSelectId(items) { 7791 const item = items.find((item2) => { 7792 var _a; 7793 if (item2.disabled) return false; 7794 return ((_a = item2.element) == null ? void 0 : _a.getAttribute("role")) !== "tab"; 7795 }); 7796 return item == null ? void 0 : item.id; 7797 } 7798 var useCombobox = createHook( 7799 function useCombobox2(_a) { 7800 var _b = _a, { 7801 store, 7802 focusable = true, 7803 autoSelect: autoSelectProp = false, 7804 getAutoSelectId, 7805 setValueOnChange, 7806 showMinLength = 0, 7807 showOnChange, 7808 showOnMouseDown, 7809 showOnClick = showOnMouseDown, 7810 showOnKeyDown, 7811 showOnKeyPress = showOnKeyDown, 7812 blurActiveItemOnClick, 7813 setValueOnClick = true, 7814 moveOnKeyPress = true, 7815 autoComplete = "list" 7816 } = _b, props = __objRest(_b, [ 7817 "store", 7818 "focusable", 7819 "autoSelect", 7820 "getAutoSelectId", 7821 "setValueOnChange", 7822 "showMinLength", 7823 "showOnChange", 7824 "showOnMouseDown", 7825 "showOnClick", 7826 "showOnKeyDown", 7827 "showOnKeyPress", 7828 "blurActiveItemOnClick", 7829 "setValueOnClick", 7830 "moveOnKeyPress", 7831 "autoComplete" 7832 ]); 7833 const context = useComboboxProviderContext(); 7834 store = store || context; 7835 invariant( 7836 store, 7837 "Combobox must receive a `store` prop or be wrapped in a ComboboxProvider component." 7838 ); 7839 const ref = (0, import_react11.useRef)(null); 7840 const [valueUpdated, forceValueUpdate] = useForceUpdate(); 7841 const canAutoSelectRef = (0, import_react11.useRef)(false); 7842 const composingRef = (0, import_react11.useRef)(false); 7843 const autoSelect = store.useState( 7844 (state) => state.virtualFocus && autoSelectProp 7845 ); 7846 const inline = autoComplete === "inline" || autoComplete === "both"; 7847 const [canInline, setCanInline] = (0, import_react11.useState)(inline); 7848 useUpdateLayoutEffect(() => { 7849 if (!inline) return; 7850 setCanInline(true); 7851 }, [inline]); 7852 const storeValue = store.useState("value"); 7853 const prevSelectedValueRef = (0, import_react11.useRef)(); 7854 (0, import_react11.useEffect)(() => { 7855 return sync(store, ["selectedValue", "activeId"], (_, prev) => { 7856 prevSelectedValueRef.current = prev.selectedValue; 7857 }); 7858 }, []); 7859 const inlineActiveValue = store.useState((state) => { 7860 var _a2; 7861 if (!inline) return; 7862 if (!canInline) return; 7863 if (state.activeValue && Array.isArray(state.selectedValue)) { 7864 if (state.selectedValue.includes(state.activeValue)) return; 7865 if ((_a2 = prevSelectedValueRef.current) == null ? void 0 : _a2.includes(state.activeValue)) return; 7866 } 7867 return state.activeValue; 7868 }); 7869 const items = store.useState("renderedItems"); 7870 const open = store.useState("open"); 7871 const contentElement = store.useState("contentElement"); 7872 const value = (0, import_react11.useMemo)(() => { 7873 if (!inline) return storeValue; 7874 if (!canInline) return storeValue; 7875 const firstItemAutoSelected = isFirstItemAutoSelected( 7876 items, 7877 inlineActiveValue, 7878 autoSelect 7879 ); 7880 if (firstItemAutoSelected) { 7881 if (hasCompletionString(storeValue, inlineActiveValue)) { 7882 const slice = (inlineActiveValue == null ? void 0 : inlineActiveValue.slice(storeValue.length)) || ""; 7883 return storeValue + slice; 7884 } 7885 return storeValue; 7886 } 7887 return inlineActiveValue || storeValue; 7888 }, [inline, canInline, items, inlineActiveValue, autoSelect, storeValue]); 7889 (0, import_react11.useEffect)(() => { 7890 const element = ref.current; 7891 if (!element) return; 7892 const onCompositeItemMove = () => setCanInline(true); 7893 element.addEventListener("combobox-item-move", onCompositeItemMove); 7894 return () => { 7895 element.removeEventListener("combobox-item-move", onCompositeItemMove); 7896 }; 7897 }, []); 7898 (0, import_react11.useEffect)(() => { 7899 if (!inline) return; 7900 if (!canInline) return; 7901 if (!inlineActiveValue) return; 7902 const firstItemAutoSelected = isFirstItemAutoSelected( 7903 items, 7904 inlineActiveValue, 7905 autoSelect 7906 ); 7907 if (!firstItemAutoSelected) return; 7908 if (!hasCompletionString(storeValue, inlineActiveValue)) return; 7909 let cleanup = noop; 7910 queueMicrotask(() => { 7911 const element = ref.current; 7912 if (!element) return; 7913 const { start: prevStart, end: prevEnd } = getTextboxSelection(element); 7914 const nextStart = storeValue.length; 7915 const nextEnd = inlineActiveValue.length; 7916 setSelectionRange(element, nextStart, nextEnd); 7917 cleanup = () => { 7918 if (!hasFocus(element)) return; 7919 const { start, end } = getTextboxSelection(element); 7920 if (start !== nextStart) return; 7921 if (end !== nextEnd) return; 7922 setSelectionRange(element, prevStart, prevEnd); 7923 }; 7924 }); 7925 return () => cleanup(); 7926 }, [ 7927 valueUpdated, 7928 inline, 7929 canInline, 7930 inlineActiveValue, 7931 items, 7932 autoSelect, 7933 storeValue 7934 ]); 7935 const scrollingElementRef = (0, import_react11.useRef)(null); 7936 const getAutoSelectIdProp = useEvent(getAutoSelectId); 7937 const autoSelectIdRef = (0, import_react11.useRef)(null); 7938 (0, import_react11.useEffect)(() => { 7939 if (!open) return; 7940 if (!contentElement) return; 7941 const scrollingElement = getScrollingElement(contentElement); 7942 if (!scrollingElement) return; 7943 scrollingElementRef.current = scrollingElement; 7944 const onUserScroll = () => { 7945 canAutoSelectRef.current = false; 7946 }; 7947 const onScroll = () => { 7948 if (!store) return; 7949 if (!canAutoSelectRef.current) return; 7950 const { activeId } = store.getState(); 7951 if (activeId === null) return; 7952 if (activeId === autoSelectIdRef.current) return; 7953 canAutoSelectRef.current = false; 7954 }; 7955 const options = { passive: true, capture: true }; 7956 scrollingElement.addEventListener("wheel", onUserScroll, options); 7957 scrollingElement.addEventListener("touchmove", onUserScroll, options); 7958 scrollingElement.addEventListener("scroll", onScroll, options); 7959 return () => { 7960 scrollingElement.removeEventListener("wheel", onUserScroll, true); 7961 scrollingElement.removeEventListener("touchmove", onUserScroll, true); 7962 scrollingElement.removeEventListener("scroll", onScroll, true); 7963 }; 7964 }, [open, contentElement, store]); 7965 useSafeLayoutEffect(() => { 7966 if (!storeValue) return; 7967 if (composingRef.current) return; 7968 canAutoSelectRef.current = true; 7969 }, [storeValue]); 7970 useSafeLayoutEffect(() => { 7971 if (autoSelect !== "always" && open) return; 7972 canAutoSelectRef.current = open; 7973 }, [autoSelect, open]); 7974 const resetValueOnSelect = store.useState("resetValueOnSelect"); 7975 useUpdateEffect(() => { 7976 var _a2, _b2; 7977 const canAutoSelect = canAutoSelectRef.current; 7978 if (!store) return; 7979 if (!open) return; 7980 if (!canAutoSelect && !resetValueOnSelect) return; 7981 const { baseElement, contentElement: contentElement2, activeId } = store.getState(); 7982 if (baseElement && !hasFocus(baseElement)) return; 7983 if (contentElement2 == null ? void 0 : contentElement2.hasAttribute("data-placing")) { 7984 const observer = new MutationObserver(forceValueUpdate); 7985 observer.observe(contentElement2, { attributeFilter: ["data-placing"] }); 7986 return () => observer.disconnect(); 7987 } 7988 if (autoSelect && canAutoSelect) { 7989 const userAutoSelectId = getAutoSelectIdProp(items); 7990 const autoSelectId = userAutoSelectId !== void 0 ? userAutoSelectId : (_a2 = getDefaultAutoSelectId(items)) != null ? _a2 : store.first(); 7991 autoSelectIdRef.current = autoSelectId; 7992 store.move(autoSelectId != null ? autoSelectId : null); 7993 } else { 7994 const element = (_b2 = store.item(activeId || store.first())) == null ? void 0 : _b2.element; 7995 if (element && "scrollIntoView" in element) { 7996 element.scrollIntoView({ block: "nearest", inline: "nearest" }); 7997 } 7998 } 7999 return; 8000 }, [ 8001 store, 8002 open, 8003 valueUpdated, 8004 storeValue, 8005 autoSelect, 8006 resetValueOnSelect, 8007 getAutoSelectIdProp, 8008 items 8009 ]); 8010 (0, import_react11.useEffect)(() => { 8011 if (!inline) return; 8012 const combobox = ref.current; 8013 if (!combobox) return; 8014 const elements = [combobox, contentElement].filter( 8015 (value2) => !!value2 8016 ); 8017 const onBlur2 = (event) => { 8018 if (elements.every((el) => isFocusEventOutside(event, el))) { 8019 store == null ? void 0 : store.setValue(value); 8020 } 8021 }; 8022 for (const element of elements) { 8023 element.addEventListener("focusout", onBlur2); 8024 } 8025 return () => { 8026 for (const element of elements) { 8027 element.removeEventListener("focusout", onBlur2); 8028 } 8029 }; 8030 }, [inline, contentElement, store, value]); 8031 const canShow = (event) => { 8032 const currentTarget = event.currentTarget; 8033 return currentTarget.value.length >= showMinLength; 8034 }; 8035 const onChangeProp = props.onChange; 8036 const showOnChangeProp = useBooleanEvent(showOnChange != null ? showOnChange : canShow); 8037 const setValueOnChangeProp = useBooleanEvent( 8038 // If the combobox is combined with tags, the value will be set by the tag 8039 // input component. 8040 setValueOnChange != null ? setValueOnChange : !store.tag 8041 ); 8042 const onChange = useEvent((event) => { 8043 onChangeProp == null ? void 0 : onChangeProp(event); 8044 if (event.defaultPrevented) return; 8045 if (!store) return; 8046 const currentTarget = event.currentTarget; 8047 const { value: value2, selectionStart, selectionEnd } = currentTarget; 8048 const nativeEvent = event.nativeEvent; 8049 canAutoSelectRef.current = true; 8050 if (isInputEvent(nativeEvent)) { 8051 if (nativeEvent.isComposing) { 8052 canAutoSelectRef.current = false; 8053 composingRef.current = true; 8054 } 8055 if (inline) { 8056 const textInserted = nativeEvent.inputType === "insertText" || nativeEvent.inputType === "insertCompositionText"; 8057 const caretAtEnd = selectionStart === value2.length; 8058 setCanInline(textInserted && caretAtEnd); 8059 } 8060 } 8061 if (setValueOnChangeProp(event)) { 8062 const isSameValue = value2 === store.getState().value; 8063 store.setValue(value2); 8064 queueMicrotask(() => { 8065 setSelectionRange(currentTarget, selectionStart, selectionEnd); 8066 }); 8067 if (inline && autoSelect && isSameValue) { 8068 forceValueUpdate(); 8069 } 8070 } 8071 if (showOnChangeProp(event)) { 8072 store.show(); 8073 } 8074 if (!autoSelect || !canAutoSelectRef.current) { 8075 store.setActiveId(null); 8076 } 8077 }); 8078 const onCompositionEndProp = props.onCompositionEnd; 8079 const onCompositionEnd = useEvent((event) => { 8080 canAutoSelectRef.current = true; 8081 composingRef.current = false; 8082 onCompositionEndProp == null ? void 0 : onCompositionEndProp(event); 8083 if (event.defaultPrevented) return; 8084 if (!autoSelect) return; 8085 forceValueUpdate(); 8086 }); 8087 const onMouseDownProp = props.onMouseDown; 8088 const blurActiveItemOnClickProp = useBooleanEvent( 8089 blurActiveItemOnClick != null ? blurActiveItemOnClick : () => !!(store == null ? void 0 : store.getState().includesBaseElement) 8090 ); 8091 const setValueOnClickProp = useBooleanEvent(setValueOnClick); 8092 const showOnClickProp = useBooleanEvent(showOnClick != null ? showOnClick : canShow); 8093 const onMouseDown = useEvent((event) => { 8094 onMouseDownProp == null ? void 0 : onMouseDownProp(event); 8095 if (event.defaultPrevented) return; 8096 if (event.button) return; 8097 if (event.ctrlKey) return; 8098 if (!store) return; 8099 if (blurActiveItemOnClickProp(event)) { 8100 store.setActiveId(null); 8101 } 8102 if (setValueOnClickProp(event)) { 8103 store.setValue(value); 8104 } 8105 if (showOnClickProp(event)) { 8106 queueBeforeEvent(event.currentTarget, "mouseup", store.show); 8107 } 8108 }); 8109 const onKeyDownProp = props.onKeyDown; 8110 const showOnKeyPressProp = useBooleanEvent(showOnKeyPress != null ? showOnKeyPress : canShow); 8111 const onKeyDown = useEvent((event) => { 8112 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8113 if (!event.repeat) { 8114 canAutoSelectRef.current = false; 8115 } 8116 if (event.defaultPrevented) return; 8117 if (event.ctrlKey) return; 8118 if (event.altKey) return; 8119 if (event.shiftKey) return; 8120 if (event.metaKey) return; 8121 if (!store) return; 8122 const { open: open2 } = store.getState(); 8123 if (open2) return; 8124 if (event.key === "ArrowUp" || event.key === "ArrowDown") { 8125 if (showOnKeyPressProp(event)) { 8126 event.preventDefault(); 8127 store.show(); 8128 } 8129 } 8130 }); 8131 const onBlurProp = props.onBlur; 8132 const onBlur = useEvent((event) => { 8133 canAutoSelectRef.current = false; 8134 onBlurProp == null ? void 0 : onBlurProp(event); 8135 if (event.defaultPrevented) return; 8136 }); 8137 const id = useId3(props.id); 8138 const ariaAutoComplete = isAriaAutoCompleteValue(autoComplete) ? autoComplete : void 0; 8139 const isActiveItem = store.useState((state) => state.activeId === null); 8140 props = __spreadProps(__spreadValues({ 8141 id, 8142 role: "combobox", 8143 "aria-autocomplete": ariaAutoComplete, 8144 "aria-haspopup": getPopupRole(contentElement, "listbox"), 8145 "aria-expanded": open, 8146 "aria-controls": contentElement == null ? void 0 : contentElement.id, 8147 "data-active-item": isActiveItem || void 0, 8148 value 8149 }, props), { 8150 ref: useMergeRefs(ref, props.ref), 8151 onChange, 8152 onCompositionEnd, 8153 onMouseDown, 8154 onKeyDown, 8155 onBlur 8156 }); 8157 props = useComposite(__spreadProps(__spreadValues({ 8158 store, 8159 focusable 8160 }, props), { 8161 // Enable inline autocomplete when the user moves from the combobox input 8162 // to an item. 8163 moveOnKeyPress: (event) => { 8164 if (isFalsyBooleanCallback(moveOnKeyPress, event)) return false; 8165 if (inline) setCanInline(true); 8166 return true; 8167 } 8168 })); 8169 props = usePopoverAnchor(__spreadValues({ store }, props)); 8170 return __spreadValues({ autoComplete: "off" }, props); 8171 } 8172 ); 8173 var Combobox = forwardRef22(function Combobox2(props) { 8174 const htmlProps = useCombobox(props); 8175 return createElement2(TagName4, htmlProps); 8176 }); 8177 8178 // node_modules/@ariakit/react-core/esm/combobox/combobox-provider.js 8179 var import_jsx_runtime48 = __toESM(require_jsx_runtime(), 1); 8180 function ComboboxProvider(props = {}) { 8181 const store = useComboboxStore(props); 8182 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(ComboboxContextProvider, { value: store, children: props.children }); 8183 } 8184 8185 // node_modules/@ariakit/react-core/esm/__chunks/KUU7WJ55.js 8186 var import_react12 = __toESM(require_react(), 1); 8187 var TagName5 = "button"; 8188 function isNativeClick(event) { 8189 if (!event.isTrusted) return false; 8190 const element = event.currentTarget; 8191 if (event.key === "Enter") { 8192 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A"; 8193 } 8194 if (event.key === " ") { 8195 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT"; 8196 } 8197 return false; 8198 } 8199 var symbol = Symbol("command"); 8200 var useCommand = createHook( 8201 function useCommand2(_a) { 8202 var _b = _a, { clickOnEnter = true, clickOnSpace = true } = _b, props = __objRest(_b, ["clickOnEnter", "clickOnSpace"]); 8203 const ref = (0, import_react12.useRef)(null); 8204 const [isNativeButton, setIsNativeButton] = (0, import_react12.useState)(false); 8205 (0, import_react12.useEffect)(() => { 8206 if (!ref.current) return; 8207 setIsNativeButton(isButton(ref.current)); 8208 }, []); 8209 const [active, setActive] = (0, import_react12.useState)(false); 8210 const activeRef = (0, import_react12.useRef)(false); 8211 const disabled = disabledFromProps(props); 8212 const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true); 8213 const onKeyDownProp = props.onKeyDown; 8214 const onKeyDown = useEvent((event) => { 8215 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8216 const element = event.currentTarget; 8217 if (event.defaultPrevented) return; 8218 if (isDuplicate) return; 8219 if (disabled) return; 8220 if (!isSelfTarget(event)) return; 8221 if (isTextField(element)) return; 8222 if (element.isContentEditable) return; 8223 const isEnter = clickOnEnter && event.key === "Enter"; 8224 const isSpace = clickOnSpace && event.key === " "; 8225 const shouldPreventEnter = event.key === "Enter" && !clickOnEnter; 8226 const shouldPreventSpace = event.key === " " && !clickOnSpace; 8227 if (shouldPreventEnter || shouldPreventSpace) { 8228 event.preventDefault(); 8229 return; 8230 } 8231 if (isEnter || isSpace) { 8232 const nativeClick = isNativeClick(event); 8233 if (isEnter) { 8234 if (!nativeClick) { 8235 event.preventDefault(); 8236 const _a2 = event, { view } = _a2, eventInit = __objRest(_a2, ["view"]); 8237 const click = () => fireClickEvent(element, eventInit); 8238 if (isFirefox()) { 8239 queueBeforeEvent(element, "keyup", click); 8240 } else { 8241 queueMicrotask(click); 8242 } 8243 } 8244 } else if (isSpace) { 8245 activeRef.current = true; 8246 if (!nativeClick) { 8247 event.preventDefault(); 8248 setActive(true); 8249 } 8250 } 8251 } 8252 }); 8253 const onKeyUpProp = props.onKeyUp; 8254 const onKeyUp = useEvent((event) => { 8255 onKeyUpProp == null ? void 0 : onKeyUpProp(event); 8256 if (event.defaultPrevented) return; 8257 if (isDuplicate) return; 8258 if (disabled) return; 8259 if (event.metaKey) return; 8260 const isSpace = clickOnSpace && event.key === " "; 8261 if (activeRef.current && isSpace) { 8262 activeRef.current = false; 8263 if (!isNativeClick(event)) { 8264 event.preventDefault(); 8265 setActive(false); 8266 const element = event.currentTarget; 8267 const _a2 = event, { view } = _a2, eventInit = __objRest(_a2, ["view"]); 8268 queueMicrotask(() => fireClickEvent(element, eventInit)); 8269 } 8270 } 8271 }); 8272 props = __spreadProps(__spreadValues(__spreadValues({ 8273 "data-active": active || void 0, 8274 type: isNativeButton ? "button" : void 0 8275 }, metadataProps), props), { 8276 ref: useMergeRefs(ref, props.ref), 8277 onKeyDown, 8278 onKeyUp 8279 }); 8280 props = useFocusable(props); 8281 return props; 8282 } 8283 ); 8284 var Command = forwardRef22(function Command2(props) { 8285 const htmlProps = useCommand(props); 8286 return createElement2(TagName5, htmlProps); 8287 }); 8288 8289 // node_modules/@ariakit/react-core/esm/combobox/combobox-item-value.js 8290 var import_react13 = __toESM(require_react(), 1); 8291 var import_jsx_runtime49 = __toESM(require_jsx_runtime(), 1); 8292 var TagName6 = "span"; 8293 function normalizeValue(value) { 8294 return normalizeString(value).toLowerCase(); 8295 } 8296 function getOffsets(string, values) { 8297 const offsets = []; 8298 for (const value of values) { 8299 let pos = 0; 8300 const length = value.length; 8301 while (string.indexOf(value, pos) !== -1) { 8302 const index = string.indexOf(value, pos); 8303 if (index !== -1) { 8304 offsets.push([index, length]); 8305 } 8306 pos = index + 1; 8307 } 8308 } 8309 return offsets; 8310 } 8311 function filterOverlappingOffsets(offsets) { 8312 return offsets.filter(([offset, length], i2, arr) => { 8313 return !arr.some( 8314 ([o2, l2], j2) => j2 !== i2 && o2 <= offset && o2 + l2 >= offset + length 8315 ); 8316 }); 8317 } 8318 function sortOffsets(offsets) { 8319 return offsets.sort(([a2], [b2]) => a2 - b2); 8320 } 8321 function splitValue(itemValue, userValue) { 8322 if (!itemValue) return itemValue; 8323 if (!userValue) return itemValue; 8324 const userValues = toArray(userValue).filter(Boolean).map(normalizeValue); 8325 const parts = []; 8326 const span = (value, autocomplete = false) => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)( 8327 "span", 8328 { 8329 "data-autocomplete-value": autocomplete ? "" : void 0, 8330 "data-user-value": autocomplete ? void 0 : "", 8331 children: value 8332 }, 8333 parts.length 8334 ); 8335 const offsets = sortOffsets( 8336 filterOverlappingOffsets( 8337 // Convert userValues into a set to avoid duplicates 8338 getOffsets(normalizeValue(itemValue), new Set(userValues)) 8339 ) 8340 ); 8341 if (!offsets.length) { 8342 parts.push(span(itemValue, true)); 8343 return parts; 8344 } 8345 const [firstOffset] = offsets[0]; 8346 const values = [ 8347 itemValue.slice(0, firstOffset), 8348 ...offsets.flatMap(([offset, length], i2) => { 8349 var _a; 8350 const value = itemValue.slice(offset, offset + length); 8351 const nextOffset = (_a = offsets[i2 + 1]) == null ? void 0 : _a[0]; 8352 const nextValue = itemValue.slice(offset + length, nextOffset); 8353 return [value, nextValue]; 8354 }) 8355 ]; 8356 values.forEach((value, i2) => { 8357 if (!value) return; 8358 parts.push(span(value, i2 % 2 === 0)); 8359 }); 8360 return parts; 8361 } 8362 var useComboboxItemValue = createHook(function useComboboxItemValue2(_a) { 8363 var _b = _a, { store, value, userValue } = _b, props = __objRest(_b, ["store", "value", "userValue"]); 8364 const context = useComboboxScopedContext(); 8365 store = store || context; 8366 const itemContext = (0, import_react13.useContext)(ComboboxItemValueContext); 8367 const itemValue = value != null ? value : itemContext; 8368 const inputValue = useStoreState(store, (state) => userValue != null ? userValue : state == null ? void 0 : state.value); 8369 const children = (0, import_react13.useMemo)(() => { 8370 if (!itemValue) return; 8371 if (!inputValue) return itemValue; 8372 return splitValue(itemValue, inputValue); 8373 }, [itemValue, inputValue]); 8374 props = __spreadValues({ 8375 children 8376 }, props); 8377 return removeUndefinedValues(props); 8378 }); 8379 var ComboboxItemValue = forwardRef22(function ComboboxItemValue2(props) { 8380 const htmlProps = useComboboxItemValue(props); 8381 return createElement2(TagName6, htmlProps); 8382 }); 8383 8384 // node_modules/@ariakit/react-core/esm/__chunks/UQQRIHDV.js 8385 var import_react14 = __toESM(require_react(), 1); 8386 var TagName7 = "div"; 8387 function getMouseDestination(event) { 8388 const relatedTarget = event.relatedTarget; 8389 if ((relatedTarget == null ? void 0 : relatedTarget.nodeType) === Node.ELEMENT_NODE) { 8390 return relatedTarget; 8391 } 8392 return null; 8393 } 8394 function hoveringInside(event) { 8395 const nextElement = getMouseDestination(event); 8396 if (!nextElement) return false; 8397 return contains(event.currentTarget, nextElement); 8398 } 8399 var symbol2 = Symbol("composite-hover"); 8400 function movingToAnotherItem(event) { 8401 let dest = getMouseDestination(event); 8402 if (!dest) return false; 8403 do { 8404 if (hasOwnProperty(dest, symbol2) && dest[symbol2]) return true; 8405 dest = dest.parentElement; 8406 } while (dest); 8407 return false; 8408 } 8409 var useCompositeHover = createHook( 8410 function useCompositeHover2(_a) { 8411 var _b = _a, { 8412 store, 8413 focusOnHover = true, 8414 blurOnHoverEnd = !!focusOnHover 8415 } = _b, props = __objRest(_b, [ 8416 "store", 8417 "focusOnHover", 8418 "blurOnHoverEnd" 8419 ]); 8420 const context = useCompositeContext(); 8421 store = store || context; 8422 invariant( 8423 store, 8424 "CompositeHover must be wrapped in a Composite component." 8425 ); 8426 const isMouseMoving = useIsMouseMoving(); 8427 const onMouseMoveProp = props.onMouseMove; 8428 const focusOnHoverProp = useBooleanEvent(focusOnHover); 8429 const onMouseMove = useEvent((event) => { 8430 onMouseMoveProp == null ? void 0 : onMouseMoveProp(event); 8431 if (event.defaultPrevented) return; 8432 if (!isMouseMoving()) return; 8433 if (!focusOnHoverProp(event)) return; 8434 if (!hasFocusWithin(event.currentTarget)) { 8435 const baseElement = store == null ? void 0 : store.getState().baseElement; 8436 if (baseElement && !hasFocus(baseElement)) { 8437 baseElement.focus(); 8438 } 8439 } 8440 store == null ? void 0 : store.setActiveId(event.currentTarget.id); 8441 }); 8442 const onMouseLeaveProp = props.onMouseLeave; 8443 const blurOnHoverEndProp = useBooleanEvent(blurOnHoverEnd); 8444 const onMouseLeave = useEvent((event) => { 8445 var _a2; 8446 onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event); 8447 if (event.defaultPrevented) return; 8448 if (!isMouseMoving()) return; 8449 if (hoveringInside(event)) return; 8450 if (movingToAnotherItem(event)) return; 8451 if (!focusOnHoverProp(event)) return; 8452 if (!blurOnHoverEndProp(event)) return; 8453 store == null ? void 0 : store.setActiveId(null); 8454 (_a2 = store == null ? void 0 : store.getState().baseElement) == null ? void 0 : _a2.focus(); 8455 }); 8456 const ref = (0, import_react14.useCallback)((element) => { 8457 if (!element) return; 8458 element[symbol2] = true; 8459 }, []); 8460 props = __spreadProps(__spreadValues({}, props), { 8461 ref: useMergeRefs(ref, props.ref), 8462 onMouseMove, 8463 onMouseLeave 8464 }); 8465 return removeUndefinedValues(props); 8466 } 8467 ); 8468 var CompositeHover = memo22( 8469 forwardRef22(function CompositeHover2(props) { 8470 const htmlProps = useCompositeHover(props); 8471 return createElement2(TagName7, htmlProps); 8472 }) 8473 ); 8474 8475 // node_modules/@ariakit/react-core/esm/__chunks/RZ4GPYOB.js 8476 var import_react15 = __toESM(require_react(), 1); 8477 var TagName8 = "div"; 8478 var useCollectionItem = createHook( 8479 function useCollectionItem2(_a) { 8480 var _b = _a, { 8481 store, 8482 shouldRegisterItem = true, 8483 getItem = identity, 8484 element 8485 } = _b, props = __objRest(_b, [ 8486 "store", 8487 "shouldRegisterItem", 8488 "getItem", 8489 // @ts-expect-error This prop may come from a collection renderer. 8490 "element" 8491 ]); 8492 const context = useCollectionContext(); 8493 store = store || context; 8494 const id = useId3(props.id); 8495 const ref = (0, import_react15.useRef)(element); 8496 (0, import_react15.useEffect)(() => { 8497 const element2 = ref.current; 8498 if (!id) return; 8499 if (!element2) return; 8500 if (!shouldRegisterItem) return; 8501 const item = getItem({ id, element: element2 }); 8502 return store == null ? void 0 : store.renderItem(item); 8503 }, [id, shouldRegisterItem, getItem, store]); 8504 props = __spreadProps(__spreadValues({}, props), { 8505 ref: useMergeRefs(ref, props.ref) 8506 }); 8507 return removeUndefinedValues(props); 8508 } 8509 ); 8510 var CollectionItem = forwardRef22(function CollectionItem2(props) { 8511 const htmlProps = useCollectionItem(props); 8512 return createElement2(TagName8, htmlProps); 8513 }); 8514 8515 // node_modules/@ariakit/react-core/esm/__chunks/P2CTZE2T.js 8516 var import_react16 = __toESM(require_react(), 1); 8517 var import_jsx_runtime50 = __toESM(require_jsx_runtime(), 1); 8518 var TagName9 = "button"; 8519 function isEditableElement(element) { 8520 if (isTextbox(element)) return true; 8521 return element.tagName === "INPUT" && !isButton(element); 8522 } 8523 function getNextPageOffset(scrollingElement, pageUp = false) { 8524 const height = scrollingElement.clientHeight; 8525 const { top } = scrollingElement.getBoundingClientRect(); 8526 const pageSize = Math.max(height * 0.875, height - 40) * 1.5; 8527 const pageOffset = pageUp ? height - pageSize + top : pageSize + top; 8528 if (scrollingElement.tagName === "HTML") { 8529 return pageOffset + scrollingElement.scrollTop; 8530 } 8531 return pageOffset; 8532 } 8533 function getItemOffset(itemElement, pageUp = false) { 8534 const { top } = itemElement.getBoundingClientRect(); 8535 if (pageUp) { 8536 return top + itemElement.clientHeight; 8537 } 8538 return top; 8539 } 8540 function findNextPageItemId(element, store, next, pageUp = false) { 8541 var _a; 8542 if (!store) return; 8543 if (!next) return; 8544 const { renderedItems } = store.getState(); 8545 const scrollingElement = getScrollingElement(element); 8546 if (!scrollingElement) return; 8547 const nextPageOffset = getNextPageOffset(scrollingElement, pageUp); 8548 let id; 8549 let prevDifference; 8550 for (let i2 = 0; i2 < renderedItems.length; i2 += 1) { 8551 const previousId = id; 8552 id = next(i2); 8553 if (!id) break; 8554 if (id === previousId) continue; 8555 const itemElement = (_a = getEnabledItem(store, id)) == null ? void 0 : _a.element; 8556 if (!itemElement) continue; 8557 const itemOffset = getItemOffset(itemElement, pageUp); 8558 const difference = itemOffset - nextPageOffset; 8559 const absDifference = Math.abs(difference); 8560 if (pageUp && difference <= 0 || !pageUp && difference >= 0) { 8561 if (prevDifference !== void 0 && prevDifference < absDifference) { 8562 id = previousId; 8563 } 8564 break; 8565 } 8566 prevDifference = absDifference; 8567 } 8568 return id; 8569 } 8570 function targetIsAnotherItem(event, store) { 8571 if (isSelfTarget(event)) return false; 8572 return isItem(store, event.target); 8573 } 8574 var useCompositeItem = createHook( 8575 function useCompositeItem2(_a) { 8576 var _b = _a, { 8577 store, 8578 rowId: rowIdProp, 8579 preventScrollOnKeyDown = false, 8580 moveOnKeyPress = true, 8581 tabbable = false, 8582 getItem: getItemProp, 8583 "aria-setsize": ariaSetSizeProp, 8584 "aria-posinset": ariaPosInSetProp 8585 } = _b, props = __objRest(_b, [ 8586 "store", 8587 "rowId", 8588 "preventScrollOnKeyDown", 8589 "moveOnKeyPress", 8590 "tabbable", 8591 "getItem", 8592 "aria-setsize", 8593 "aria-posinset" 8594 ]); 8595 const context = useCompositeContext(); 8596 store = store || context; 8597 const id = useId3(props.id); 8598 const ref = (0, import_react16.useRef)(null); 8599 const row = (0, import_react16.useContext)(CompositeRowContext); 8600 const disabled = disabledFromProps(props); 8601 const trulyDisabled = disabled && !props.accessibleWhenDisabled; 8602 const { 8603 rowId, 8604 baseElement, 8605 isActiveItem, 8606 ariaSetSize, 8607 ariaPosInSet, 8608 isTabbable 8609 } = useStoreStateObject(store, { 8610 rowId(state) { 8611 if (rowIdProp) return rowIdProp; 8612 if (!state) return; 8613 if (!(row == null ? void 0 : row.baseElement)) return; 8614 if (row.baseElement !== state.baseElement) return; 8615 return row.id; 8616 }, 8617 baseElement(state) { 8618 return (state == null ? void 0 : state.baseElement) || void 0; 8619 }, 8620 isActiveItem(state) { 8621 return !!state && state.activeId === id; 8622 }, 8623 ariaSetSize(state) { 8624 if (ariaSetSizeProp != null) return ariaSetSizeProp; 8625 if (!state) return; 8626 if (!(row == null ? void 0 : row.ariaSetSize)) return; 8627 if (row.baseElement !== state.baseElement) return; 8628 return row.ariaSetSize; 8629 }, 8630 ariaPosInSet(state) { 8631 if (ariaPosInSetProp != null) return ariaPosInSetProp; 8632 if (!state) return; 8633 if (!(row == null ? void 0 : row.ariaPosInSet)) return; 8634 if (row.baseElement !== state.baseElement) return; 8635 const itemsInRow = state.renderedItems.filter( 8636 (item) => item.rowId === rowId 8637 ); 8638 return row.ariaPosInSet + itemsInRow.findIndex((item) => item.id === id); 8639 }, 8640 isTabbable(state) { 8641 if (!(state == null ? void 0 : state.renderedItems.length)) return true; 8642 if (state.virtualFocus) return false; 8643 if (tabbable) return true; 8644 if (state.activeId === null) return false; 8645 const item = store == null ? void 0 : store.item(state.activeId); 8646 if (item == null ? void 0 : item.disabled) return true; 8647 if (!(item == null ? void 0 : item.element)) return true; 8648 return state.activeId === id; 8649 } 8650 }); 8651 const getItem = (0, import_react16.useCallback)( 8652 (item) => { 8653 var _a2; 8654 const nextItem = __spreadProps(__spreadValues({}, item), { 8655 id: id || item.id, 8656 rowId, 8657 disabled: !!trulyDisabled, 8658 children: (_a2 = item.element) == null ? void 0 : _a2.textContent 8659 }); 8660 if (getItemProp) { 8661 return getItemProp(nextItem); 8662 } 8663 return nextItem; 8664 }, 8665 [id, rowId, trulyDisabled, getItemProp] 8666 ); 8667 const onFocusProp = props.onFocus; 8668 const hasFocusedComposite = (0, import_react16.useRef)(false); 8669 const onFocus = useEvent((event) => { 8670 onFocusProp == null ? void 0 : onFocusProp(event); 8671 if (event.defaultPrevented) return; 8672 if (isPortalEvent(event)) return; 8673 if (!id) return; 8674 if (!store) return; 8675 if (targetIsAnotherItem(event, store)) return; 8676 const { virtualFocus, baseElement: baseElement2 } = store.getState(); 8677 store.setActiveId(id); 8678 if (isTextbox(event.currentTarget)) { 8679 selectTextField(event.currentTarget); 8680 } 8681 if (!virtualFocus) return; 8682 if (!isSelfTarget(event)) return; 8683 if (isEditableElement(event.currentTarget)) return; 8684 if (!(baseElement2 == null ? void 0 : baseElement2.isConnected)) return; 8685 if (isSafari() && event.currentTarget.hasAttribute("data-autofocus")) { 8686 event.currentTarget.scrollIntoView({ 8687 block: "nearest", 8688 inline: "nearest" 8689 }); 8690 } 8691 hasFocusedComposite.current = true; 8692 const fromComposite = event.relatedTarget === baseElement2 || isItem(store, event.relatedTarget); 8693 if (fromComposite) { 8694 focusSilently(baseElement2); 8695 } else { 8696 baseElement2.focus(); 8697 } 8698 }); 8699 const onBlurCaptureProp = props.onBlurCapture; 8700 const onBlurCapture = useEvent((event) => { 8701 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event); 8702 if (event.defaultPrevented) return; 8703 const state = store == null ? void 0 : store.getState(); 8704 if ((state == null ? void 0 : state.virtualFocus) && hasFocusedComposite.current) { 8705 hasFocusedComposite.current = false; 8706 event.preventDefault(); 8707 event.stopPropagation(); 8708 } 8709 }); 8710 const onKeyDownProp = props.onKeyDown; 8711 const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown); 8712 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); 8713 const onKeyDown = useEvent((event) => { 8714 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8715 if (event.defaultPrevented) return; 8716 if (!isSelfTarget(event)) return; 8717 if (!store) return; 8718 const { currentTarget } = event; 8719 const state = store.getState(); 8720 const item = store.item(id); 8721 const isGrid2 = !!(item == null ? void 0 : item.rowId); 8722 const isVertical = state.orientation !== "horizontal"; 8723 const isHorizontal = state.orientation !== "vertical"; 8724 const canHomeEnd = () => { 8725 if (isGrid2) return true; 8726 if (isHorizontal) return true; 8727 if (!state.baseElement) return true; 8728 if (!isTextField(state.baseElement)) return true; 8729 return false; 8730 }; 8731 const keyMap = { 8732 ArrowUp: (isGrid2 || isVertical) && store.up, 8733 ArrowRight: (isGrid2 || isHorizontal) && store.next, 8734 ArrowDown: (isGrid2 || isVertical) && store.down, 8735 ArrowLeft: (isGrid2 || isHorizontal) && store.previous, 8736 Home: () => { 8737 if (!canHomeEnd()) return; 8738 if (!isGrid2 || event.ctrlKey) { 8739 return store == null ? void 0 : store.first(); 8740 } 8741 return store == null ? void 0 : store.previous(-1); 8742 }, 8743 End: () => { 8744 if (!canHomeEnd()) return; 8745 if (!isGrid2 || event.ctrlKey) { 8746 return store == null ? void 0 : store.last(); 8747 } 8748 return store == null ? void 0 : store.next(-1); 8749 }, 8750 PageUp: () => { 8751 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.up, true); 8752 }, 8753 PageDown: () => { 8754 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.down); 8755 } 8756 }; 8757 const action = keyMap[event.key]; 8758 if (action) { 8759 if (isTextbox(currentTarget)) { 8760 const selection = getTextboxSelection(currentTarget); 8761 const isLeft = isHorizontal && event.key === "ArrowLeft"; 8762 const isRight = isHorizontal && event.key === "ArrowRight"; 8763 const isUp = isVertical && event.key === "ArrowUp"; 8764 const isDown = isVertical && event.key === "ArrowDown"; 8765 if (isRight || isDown) { 8766 const { length: valueLength } = getTextboxValue(currentTarget); 8767 if (selection.end !== valueLength) return; 8768 } else if ((isLeft || isUp) && selection.start !== 0) return; 8769 } 8770 const nextId = action(); 8771 if (preventScrollOnKeyDownProp(event) || nextId !== void 0) { 8772 if (!moveOnKeyPressProp(event)) return; 8773 event.preventDefault(); 8774 store.move(nextId); 8775 } 8776 } 8777 }); 8778 const providerValue = (0, import_react16.useMemo)( 8779 () => ({ id, baseElement }), 8780 [id, baseElement] 8781 ); 8782 props = useWrapElement( 8783 props, 8784 (element) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(CompositeItemContext.Provider, { value: providerValue, children: element }), 8785 [providerValue] 8786 ); 8787 props = __spreadProps(__spreadValues({ 8788 id, 8789 "data-active-item": isActiveItem || void 0 8790 }, props), { 8791 ref: useMergeRefs(ref, props.ref), 8792 tabIndex: isTabbable ? props.tabIndex : -1, 8793 onFocus, 8794 onBlurCapture, 8795 onKeyDown 8796 }); 8797 props = useCommand(props); 8798 props = useCollectionItem(__spreadProps(__spreadValues({ 8799 store 8800 }, props), { 8801 getItem, 8802 shouldRegisterItem: id ? props.shouldRegisterItem : false 8803 })); 8804 return removeUndefinedValues(__spreadProps(__spreadValues({}, props), { 8805 "aria-setsize": ariaSetSize, 8806 "aria-posinset": ariaPosInSet 8807 })); 8808 } 8809 ); 8810 var CompositeItem = memo22( 8811 forwardRef22(function CompositeItem2(props) { 8812 const htmlProps = useCompositeItem(props); 8813 return createElement2(TagName9, htmlProps); 8814 }) 8815 ); 8816 8817 // node_modules/@ariakit/react-core/esm/__chunks/ZTDSJLD6.js 8818 var import_react17 = __toESM(require_react(), 1); 8819 var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1); 8820 var TagName10 = "div"; 8821 function isSelected(storeValue, itemValue) { 8822 if (itemValue == null) return; 8823 if (storeValue == null) return false; 8824 if (Array.isArray(storeValue)) { 8825 return storeValue.includes(itemValue); 8826 } 8827 return storeValue === itemValue; 8828 } 8829 function getItemRole(popupRole) { 8830 var _a; 8831 const itemRoleByPopupRole = { 8832 menu: "menuitem", 8833 listbox: "option", 8834 tree: "treeitem" 8835 }; 8836 const key = popupRole; 8837 return (_a = itemRoleByPopupRole[key]) != null ? _a : "option"; 8838 } 8839 var useComboboxItem = createHook( 8840 function useComboboxItem2(_a) { 8841 var _b = _a, { 8842 store, 8843 value, 8844 hideOnClick, 8845 setValueOnClick, 8846 selectValueOnClick = true, 8847 resetValueOnSelect, 8848 focusOnHover = false, 8849 moveOnKeyPress = true, 8850 getItem: getItemProp 8851 } = _b, props = __objRest(_b, [ 8852 "store", 8853 "value", 8854 "hideOnClick", 8855 "setValueOnClick", 8856 "selectValueOnClick", 8857 "resetValueOnSelect", 8858 "focusOnHover", 8859 "moveOnKeyPress", 8860 "getItem" 8861 ]); 8862 var _a2; 8863 const context = useComboboxScopedContext(); 8864 store = store || context; 8865 invariant( 8866 store, 8867 "ComboboxItem must be wrapped in a ComboboxList or ComboboxPopover component." 8868 ); 8869 const { resetValueOnSelectState, multiSelectable, selected } = useStoreStateObject(store, { 8870 resetValueOnSelectState: "resetValueOnSelect", 8871 multiSelectable(state) { 8872 return Array.isArray(state.selectedValue); 8873 }, 8874 selected(state) { 8875 return isSelected(state.selectedValue, value); 8876 } 8877 }); 8878 const getItem = (0, import_react17.useCallback)( 8879 (item) => { 8880 const nextItem = __spreadProps(__spreadValues({}, item), { value }); 8881 if (getItemProp) { 8882 return getItemProp(nextItem); 8883 } 8884 return nextItem; 8885 }, 8886 [value, getItemProp] 8887 ); 8888 setValueOnClick = setValueOnClick != null ? setValueOnClick : !multiSelectable; 8889 hideOnClick = hideOnClick != null ? hideOnClick : value != null && !multiSelectable; 8890 const onClickProp = props.onClick; 8891 const setValueOnClickProp = useBooleanEvent(setValueOnClick); 8892 const selectValueOnClickProp = useBooleanEvent(selectValueOnClick); 8893 const resetValueOnSelectProp = useBooleanEvent( 8894 (_a2 = resetValueOnSelect != null ? resetValueOnSelect : resetValueOnSelectState) != null ? _a2 : multiSelectable 8895 ); 8896 const hideOnClickProp = useBooleanEvent(hideOnClick); 8897 const onClick = useEvent((event) => { 8898 onClickProp == null ? void 0 : onClickProp(event); 8899 if (event.defaultPrevented) return; 8900 if (isDownloading(event)) return; 8901 if (isOpeningInNewTab(event)) return; 8902 if (value != null) { 8903 if (selectValueOnClickProp(event)) { 8904 if (resetValueOnSelectProp(event)) { 8905 store == null ? void 0 : store.resetValue(); 8906 } 8907 store == null ? void 0 : store.setSelectedValue((prevValue) => { 8908 if (!Array.isArray(prevValue)) return value; 8909 if (prevValue.includes(value)) { 8910 return prevValue.filter((v2) => v2 !== value); 8911 } 8912 return [...prevValue, value]; 8913 }); 8914 } 8915 if (setValueOnClickProp(event)) { 8916 store == null ? void 0 : store.setValue(value); 8917 } 8918 } 8919 if (hideOnClickProp(event)) { 8920 store == null ? void 0 : store.hide(); 8921 } 8922 }); 8923 const onKeyDownProp = props.onKeyDown; 8924 const onKeyDown = useEvent((event) => { 8925 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8926 if (event.defaultPrevented) return; 8927 const baseElement = store == null ? void 0 : store.getState().baseElement; 8928 if (!baseElement) return; 8929 if (hasFocus(baseElement)) return; 8930 const printable = event.key.length === 1; 8931 if (printable || event.key === "Backspace" || event.key === "Delete") { 8932 queueMicrotask(() => baseElement.focus()); 8933 if (isTextField(baseElement)) { 8934 store == null ? void 0 : store.setValue(baseElement.value); 8935 } 8936 } 8937 }); 8938 if (multiSelectable && selected != null) { 8939 props = __spreadValues({ 8940 "aria-selected": selected 8941 }, props); 8942 } 8943 props = useWrapElement( 8944 props, 8945 (element) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ComboboxItemValueContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ComboboxItemCheckedContext.Provider, { value: selected != null ? selected : false, children: element }) }), 8946 [value, selected] 8947 ); 8948 const popupRole = (0, import_react17.useContext)(ComboboxListRoleContext); 8949 props = __spreadProps(__spreadValues({ 8950 role: getItemRole(popupRole), 8951 children: value 8952 }, props), { 8953 onClick, 8954 onKeyDown 8955 }); 8956 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); 8957 props = useCompositeItem(__spreadProps(__spreadValues({ 8958 store 8959 }, props), { 8960 getItem, 8961 // Dispatch a custom event on the combobox input when moving to an item 8962 // with the keyboard so the Combobox component can enable inline 8963 // autocompletion. 8964 moveOnKeyPress: (event) => { 8965 if (!moveOnKeyPressProp(event)) return false; 8966 const moveEvent = new Event("combobox-item-move"); 8967 const baseElement = store == null ? void 0 : store.getState().baseElement; 8968 baseElement == null ? void 0 : baseElement.dispatchEvent(moveEvent); 8969 return true; 8970 } 8971 })); 8972 props = useCompositeHover(__spreadValues({ store, focusOnHover }, props)); 8973 return props; 8974 } 8975 ); 8976 var ComboboxItem = memo22( 8977 forwardRef22(function ComboboxItem2(props) { 8978 const htmlProps = useComboboxItem(props); 8979 return createElement2(TagName10, htmlProps); 8980 }) 8981 ); 8982 8983 // node_modules/@ariakit/react-core/esm/combobox/combobox-label.js 8984 var TagName11 = "label"; 8985 var useComboboxLabel = createHook( 8986 function useComboboxLabel2(_a) { 8987 var _b = _a, { store } = _b, props = __objRest(_b, ["store"]); 8988 const context = useComboboxProviderContext(); 8989 store = store || context; 8990 invariant( 8991 store, 8992 "ComboboxLabel must receive a `store` prop or be wrapped in a ComboboxProvider component." 8993 ); 8994 const comboboxId = store.useState((state) => { 8995 var _a2; 8996 return (_a2 = state.baseElement) == null ? void 0 : _a2.id; 8997 }); 8998 props = __spreadValues({ 8999 htmlFor: comboboxId 9000 }, props); 9001 return removeUndefinedValues(props); 9002 } 9003 ); 9004 var ComboboxLabel = memo22( 9005 forwardRef22(function ComboboxLabel2(props) { 9006 const htmlProps = useComboboxLabel(props); 9007 return createElement2(TagName11, htmlProps); 9008 }) 9009 ); 9010 9011 // node_modules/@ariakit/react-core/esm/__chunks/VGCJ63VH.js 9012 var import_react18 = __toESM(require_react(), 1); 9013 var import_react_dom = __toESM(require_react_dom(), 1); 9014 var import_jsx_runtime52 = __toESM(require_jsx_runtime(), 1); 9015 var TagName12 = "div"; 9016 function afterTimeout(timeoutMs, cb) { 9017 const timeoutId = setTimeout(cb, timeoutMs); 9018 return () => clearTimeout(timeoutId); 9019 } 9020 function afterPaint2(cb) { 9021 let raf = requestAnimationFrame(() => { 9022 raf = requestAnimationFrame(cb); 9023 }); 9024 return () => cancelAnimationFrame(raf); 9025 } 9026 function parseCSSTime(...times) { 9027 return times.join(", ").split(", ").reduce((longestTime, currentTimeString) => { 9028 const multiplier = currentTimeString.endsWith("ms") ? 1 : 1e3; 9029 const currentTime = Number.parseFloat(currentTimeString || "0s") * multiplier; 9030 if (currentTime > longestTime) return currentTime; 9031 return longestTime; 9032 }, 0); 9033 } 9034 function isHidden(mounted, hidden, alwaysVisible) { 9035 return !alwaysVisible && hidden !== false && (!mounted || !!hidden); 9036 } 9037 var useDisclosureContent = createHook(function useDisclosureContent2(_a) { 9038 var _b = _a, { store, alwaysVisible } = _b, props = __objRest(_b, ["store", "alwaysVisible"]); 9039 const context = useDisclosureProviderContext(); 9040 store = store || context; 9041 invariant( 9042 store, 9043 "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component." 9044 ); 9045 const ref = (0, import_react18.useRef)(null); 9046 const id = useId3(props.id); 9047 const [transition, setTransition] = (0, import_react18.useState)(null); 9048 const open = store.useState("open"); 9049 const mounted = store.useState("mounted"); 9050 const animated = store.useState("animated"); 9051 const contentElement = store.useState("contentElement"); 9052 const otherElement = useStoreState(store.disclosure, "contentElement"); 9053 useSafeLayoutEffect(() => { 9054 if (!ref.current) return; 9055 store == null ? void 0 : store.setContentElement(ref.current); 9056 }, [store]); 9057 useSafeLayoutEffect(() => { 9058 let previousAnimated; 9059 store == null ? void 0 : store.setState("animated", (animated2) => { 9060 previousAnimated = animated2; 9061 return true; 9062 }); 9063 return () => { 9064 if (previousAnimated === void 0) return; 9065 store == null ? void 0 : store.setState("animated", previousAnimated); 9066 }; 9067 }, [store]); 9068 useSafeLayoutEffect(() => { 9069 if (!animated) return; 9070 if (!(contentElement == null ? void 0 : contentElement.isConnected)) { 9071 setTransition(null); 9072 return; 9073 } 9074 return afterPaint2(() => { 9075 setTransition(open ? "enter" : mounted ? "leave" : null); 9076 }); 9077 }, [animated, contentElement, open, mounted]); 9078 useSafeLayoutEffect(() => { 9079 if (!store) return; 9080 if (!animated) return; 9081 if (!transition) return; 9082 if (!contentElement) return; 9083 const stopAnimation = () => store == null ? void 0 : store.setState("animating", false); 9084 const stopAnimationSync = () => (0, import_react_dom.flushSync)(stopAnimation); 9085 if (transition === "leave" && open) return; 9086 if (transition === "enter" && !open) return; 9087 if (typeof animated === "number") { 9088 const timeout2 = animated; 9089 return afterTimeout(timeout2, stopAnimationSync); 9090 } 9091 const { 9092 transitionDuration, 9093 animationDuration, 9094 transitionDelay, 9095 animationDelay 9096 } = getComputedStyle(contentElement); 9097 const { 9098 transitionDuration: transitionDuration2 = "0", 9099 animationDuration: animationDuration2 = "0", 9100 transitionDelay: transitionDelay2 = "0", 9101 animationDelay: animationDelay2 = "0" 9102 } = otherElement ? getComputedStyle(otherElement) : {}; 9103 const delay = parseCSSTime( 9104 transitionDelay, 9105 animationDelay, 9106 transitionDelay2, 9107 animationDelay2 9108 ); 9109 const duration = parseCSSTime( 9110 transitionDuration, 9111 animationDuration, 9112 transitionDuration2, 9113 animationDuration2 9114 ); 9115 const timeout = delay + duration; 9116 if (!timeout) { 9117 if (transition === "enter") { 9118 store.setState("animated", false); 9119 } 9120 stopAnimation(); 9121 return; 9122 } 9123 const frameRate = 1e3 / 60; 9124 const maxTimeout = Math.max(timeout - frameRate, 0); 9125 return afterTimeout(maxTimeout, stopAnimationSync); 9126 }, [store, animated, contentElement, otherElement, open, transition]); 9127 props = useWrapElement( 9128 props, 9129 (element) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(DialogScopedContextProvider, { value: store, children: element }), 9130 [store] 9131 ); 9132 const hidden = isHidden(mounted, props.hidden, alwaysVisible); 9133 const styleProp = props.style; 9134 const style = (0, import_react18.useMemo)(() => { 9135 if (hidden) { 9136 return __spreadProps(__spreadValues({}, styleProp), { display: "none" }); 9137 } 9138 return styleProp; 9139 }, [hidden, styleProp]); 9140 props = __spreadProps(__spreadValues({ 9141 id, 9142 "data-open": open || void 0, 9143 "data-enter": transition === "enter" || void 0, 9144 "data-leave": transition === "leave" || void 0, 9145 hidden 9146 }, props), { 9147 ref: useMergeRefs(id ? store.setContentElement : null, ref, props.ref), 9148 style 9149 }); 9150 return removeUndefinedValues(props); 9151 }); 9152 var DisclosureContentImpl = forwardRef22(function DisclosureContentImpl2(props) { 9153 const htmlProps = useDisclosureContent(props); 9154 return createElement2(TagName12, htmlProps); 9155 }); 9156 var DisclosureContent = forwardRef22(function DisclosureContent2(_a) { 9157 var _b = _a, { 9158 unmountOnHide 9159 } = _b, props = __objRest(_b, [ 9160 "unmountOnHide" 9161 ]); 9162 const context = useDisclosureProviderContext(); 9163 const store = props.store || context; 9164 const mounted = useStoreState( 9165 store, 9166 (state) => !unmountOnHide || (state == null ? void 0 : state.mounted) 9167 ); 9168 if (mounted === false) return null; 9169 return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(DisclosureContentImpl, __spreadValues({}, props)); 9170 }); 9171 9172 // node_modules/@ariakit/react-core/esm/__chunks/HUWAI7RB.js 9173 var import_react19 = __toESM(require_react(), 1); 9174 var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1); 9175 var TagName13 = "div"; 9176 var useComboboxList = createHook( 9177 function useComboboxList2(_a) { 9178 var _b = _a, { store, alwaysVisible } = _b, props = __objRest(_b, ["store", "alwaysVisible"]); 9179 const scopedContext = useComboboxScopedContext(true); 9180 const context = useComboboxContext(); 9181 store = store || context; 9182 const scopedContextSameStore = !!store && store === scopedContext; 9183 invariant( 9184 store, 9185 "ComboboxList must receive a `store` prop or be wrapped in a ComboboxProvider component." 9186 ); 9187 const ref = (0, import_react19.useRef)(null); 9188 const id = useId3(props.id); 9189 const mounted = store.useState("mounted"); 9190 const hidden = isHidden(mounted, props.hidden, alwaysVisible); 9191 const style = hidden ? __spreadProps(__spreadValues({}, props.style), { display: "none" }) : props.style; 9192 const multiSelectable = store.useState( 9193 (state) => Array.isArray(state.selectedValue) 9194 ); 9195 const role = useAttribute(ref, "role", props.role); 9196 const isCompositeRole = role === "listbox" || role === "tree" || role === "grid"; 9197 const ariaMultiSelectable = isCompositeRole ? multiSelectable || void 0 : void 0; 9198 const [hasListboxInside, setHasListboxInside] = (0, import_react19.useState)(false); 9199 const contentElement = store.useState("contentElement"); 9200 useSafeLayoutEffect(() => { 9201 if (!mounted) return; 9202 const element = ref.current; 9203 if (!element) return; 9204 if (contentElement !== element) return; 9205 const callback = () => { 9206 setHasListboxInside(!!element.querySelector("[role='listbox']")); 9207 }; 9208 const observer = new MutationObserver(callback); 9209 observer.observe(element, { 9210 subtree: true, 9211 childList: true, 9212 attributeFilter: ["role"] 9213 }); 9214 callback(); 9215 return () => observer.disconnect(); 9216 }, [mounted, contentElement]); 9217 if (!hasListboxInside) { 9218 props = __spreadValues({ 9219 role: "listbox", 9220 "aria-multiselectable": ariaMultiSelectable 9221 }, props); 9222 } 9223 props = useWrapElement( 9224 props, 9225 (element) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ComboboxScopedContextProvider, { value: store, children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ComboboxListRoleContext.Provider, { value: role, children: element }) }), 9226 [store, role] 9227 ); 9228 const setContentElement = id && (!scopedContext || !scopedContextSameStore) ? store.setContentElement : null; 9229 props = __spreadProps(__spreadValues({ 9230 id, 9231 hidden 9232 }, props), { 9233 ref: useMergeRefs(setContentElement, ref, props.ref), 9234 style 9235 }); 9236 return removeUndefinedValues(props); 9237 } 9238 ); 9239 var ComboboxList = forwardRef22(function ComboboxList2(props) { 9240 const htmlProps = useComboboxList(props); 9241 return createElement2(TagName13, htmlProps); 9242 }); 9243 9244 // packages/dataviews/build-module/components/dataviews-filters/search-widget.js 9245 var import_remove_accents = __toESM(require_remove_accents()); 9246 var import_compose7 = __toESM(require_compose()); 9247 var import_i18n21 = __toESM(require_i18n()); 9248 var import_element23 = __toESM(require_element()); 9249 var import_components21 = __toESM(require_components()); 9250 9251 // packages/dataviews/build-module/components/dataviews-filters/utils.js 9252 var EMPTY_ARRAY2 = []; 9253 var getCurrentValue = (filterDefinition, currentFilter) => { 9254 if (filterDefinition.singleSelection) { 9255 return currentFilter?.value; 9256 } 9257 if (Array.isArray(currentFilter?.value)) { 9258 return currentFilter.value; 9259 } 9260 if (!Array.isArray(currentFilter?.value) && !!currentFilter?.value) { 9261 return [currentFilter.value]; 9262 } 9263 return EMPTY_ARRAY2; 9264 }; 9265 9266 // packages/dataviews/build-module/hooks/use-elements.js 9267 var import_element22 = __toESM(require_element()); 9268 var EMPTY_ARRAY3 = []; 9269 function useElements({ 9270 elements, 9271 getElements 9272 }) { 9273 const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY3; 9274 const [records, setRecords] = (0, import_element22.useState)(staticElements); 9275 const [isLoading, setIsLoading] = (0, import_element22.useState)(false); 9276 (0, import_element22.useEffect)(() => { 9277 if (!getElements) { 9278 setRecords(staticElements); 9279 return; 9280 } 9281 let cancelled = false; 9282 setIsLoading(true); 9283 getElements().then((fetchedElements) => { 9284 if (!cancelled) { 9285 const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements; 9286 setRecords(dynamicElements); 9287 } 9288 }).catch(() => { 9289 if (!cancelled) { 9290 setRecords(staticElements); 9291 } 9292 }).finally(() => { 9293 if (!cancelled) { 9294 setIsLoading(false); 9295 } 9296 }); 9297 return () => { 9298 cancelled = true; 9299 }; 9300 }, [getElements, staticElements]); 9301 return { 9302 elements: records, 9303 isLoading 9304 }; 9305 } 9306 9307 // packages/dataviews/build-module/components/dataviews-filters/search-widget.js 9308 var import_jsx_runtime54 = __toESM(require_jsx_runtime()); 9309 function normalizeSearchInput(input = "") { 9310 return (0, import_remove_accents.default)(input.trim().toLowerCase()); 9311 } 9312 var getNewValue = (filterDefinition, currentFilter, value) => { 9313 if (filterDefinition.singleSelection) { 9314 return value; 9315 } 9316 if (Array.isArray(currentFilter?.value)) { 9317 return currentFilter.value.includes(value) ? currentFilter.value.filter((v2) => v2 !== value) : [...currentFilter.value, value]; 9318 } 9319 return [value]; 9320 }; 9321 function generateFilterElementCompositeItemId(prefix, filterElementValue) { 9322 return `$prefix}-$filterElementValue}`; 9323 } 9324 var MultiSelectionOption = ({ selected }) => { 9325 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9326 "span", 9327 { 9328 className: clsx_default( 9329 "dataviews-filters__search-widget-listitem-multi-selection", 9330 { "is-selected": selected } 9331 ), 9332 children: selected && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components21.Icon, { icon: check_default }) 9333 } 9334 ); 9335 }; 9336 var SingleSelectionOption = ({ selected }) => { 9337 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9338 "span", 9339 { 9340 className: clsx_default( 9341 "dataviews-filters__search-widget-listitem-single-selection", 9342 { "is-selected": selected } 9343 ) 9344 } 9345 ); 9346 }; 9347 function ListBox({ view, filter, onChangeView }) { 9348 const baseId = (0, import_compose7.useInstanceId)(ListBox, "dataviews-filter-list-box"); 9349 const [activeCompositeId, setActiveCompositeId] = (0, import_element23.useState)( 9350 // When there are one or less operators, the first item is set as active 9351 // (by setting the initial `activeId` to `undefined`). 9352 // With 2 or more operators, the focus is moved on the operators control 9353 // (by setting the initial `activeId` to `null`), meaning that there won't 9354 // be an active item initially. Focus is then managed via the 9355 // `onFocusVisible` callback. 9356 filter.operators?.length === 1 ? void 0 : null 9357 ); 9358 const currentFilter = view.filters?.find( 9359 (f2) => f2.field === filter.field 9360 ); 9361 const currentValue = getCurrentValue(filter, currentFilter); 9362 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9363 import_components21.Composite, 9364 { 9365 virtualFocus: true, 9366 focusLoop: true, 9367 activeId: activeCompositeId, 9368 setActiveId: setActiveCompositeId, 9369 role: "listbox", 9370 className: "dataviews-filters__search-widget-listbox", 9371 "aria-label": (0, import_i18n21.sprintf)( 9372 /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */ 9373 (0, import_i18n21.__)("List of: %1$s"), 9374 filter.name 9375 ), 9376 onFocusVisible: () => { 9377 if (!activeCompositeId && filter.elements.length) { 9378 setActiveCompositeId( 9379 generateFilterElementCompositeItemId( 9380 baseId, 9381 filter.elements[0].value 9382 ) 9383 ); 9384 } 9385 }, 9386 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components21.Composite.Typeahead, {}), 9387 children: filter.elements.map((element) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)( 9388 import_components21.Composite.Hover, 9389 { 9390 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9391 import_components21.Composite.Item, 9392 { 9393 id: generateFilterElementCompositeItemId( 9394 baseId, 9395 element.value 9396 ), 9397 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9398 "div", 9399 { 9400 "aria-label": element.label, 9401 role: "option", 9402 className: "dataviews-filters__search-widget-listitem" 9403 } 9404 ), 9405 onClick: () => { 9406 const newFilters = currentFilter ? [ 9407 ...(view.filters ?? []).map( 9408 (_filter) => { 9409 if (_filter.field === filter.field) { 9410 return { 9411 ..._filter, 9412 operator: currentFilter.operator || filter.operators[0], 9413 value: getNewValue( 9414 filter, 9415 currentFilter, 9416 element.value 9417 ) 9418 }; 9419 } 9420 return _filter; 9421 } 9422 ) 9423 ] : [ 9424 ...view.filters ?? [], 9425 { 9426 field: filter.field, 9427 operator: filter.operators[0], 9428 value: getNewValue( 9429 filter, 9430 currentFilter, 9431 element.value 9432 ) 9433 } 9434 ]; 9435 onChangeView({ 9436 ...view, 9437 page: 1, 9438 filters: newFilters 9439 }); 9440 } 9441 } 9442 ), 9443 children: [ 9444 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9445 SingleSelectionOption, 9446 { 9447 selected: currentValue === element.value 9448 } 9449 ), 9450 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9451 MultiSelectionOption, 9452 { 9453 selected: currentValue.includes(element.value) 9454 } 9455 ), 9456 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { children: element.label }) 9457 ] 9458 }, 9459 element.value 9460 )) 9461 } 9462 ); 9463 } 9464 function ComboboxList22({ view, filter, onChangeView }) { 9465 const [searchValue, setSearchValue] = (0, import_element23.useState)(""); 9466 const deferredSearchValue = (0, import_element23.useDeferredValue)(searchValue); 9467 const currentFilter = view.filters?.find( 9468 (_filter) => _filter.field === filter.field 9469 ); 9470 const currentValue = getCurrentValue(filter, currentFilter); 9471 const matches = (0, import_element23.useMemo)(() => { 9472 const normalizedSearch = normalizeSearchInput(deferredSearchValue); 9473 return filter.elements.filter( 9474 (item) => normalizeSearchInput(item.label).includes(normalizedSearch) 9475 ); 9476 }, [filter.elements, deferredSearchValue]); 9477 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)( 9478 ComboboxProvider, 9479 { 9480 selectedValue: currentValue, 9481 setSelectedValue: (value) => { 9482 const newFilters = currentFilter ? [ 9483 ...(view.filters ?? []).map((_filter) => { 9484 if (_filter.field === filter.field) { 9485 return { 9486 ..._filter, 9487 operator: currentFilter.operator || filter.operators[0], 9488 value 9489 }; 9490 } 9491 return _filter; 9492 }) 9493 ] : [ 9494 ...view.filters ?? [], 9495 { 9496 field: filter.field, 9497 operator: filter.operators[0], 9498 value 9499 } 9500 ]; 9501 onChangeView({ 9502 ...view, 9503 page: 1, 9504 filters: newFilters 9505 }); 9506 }, 9507 setValue: setSearchValue, 9508 children: [ 9509 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "dataviews-filters__search-widget-filter-combobox__wrapper", children: [ 9510 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9511 ComboboxLabel, 9512 { 9513 render: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components21.VisuallyHidden, { children: (0, import_i18n21.__)("Search items") }), 9514 children: (0, import_i18n21.__)("Search items") 9515 } 9516 ), 9517 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9518 Combobox, 9519 { 9520 autoSelect: "always", 9521 placeholder: (0, import_i18n21.__)("Search"), 9522 className: "dataviews-filters__search-widget-filter-combobox__input" 9523 } 9524 ), 9525 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-filters__search-widget-filter-combobox__icon", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components21.Icon, { icon: search_default }) }) 9526 ] }), 9527 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)( 9528 ComboboxList, 9529 { 9530 className: "dataviews-filters__search-widget-filter-combobox-list", 9531 alwaysVisible: true, 9532 children: [ 9533 matches.map((element) => { 9534 return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)( 9535 ComboboxItem, 9536 { 9537 resetValueOnSelect: false, 9538 value: element.value, 9539 className: "dataviews-filters__search-widget-listitem", 9540 hideOnClick: false, 9541 setValueOnClick: false, 9542 focusOnHover: true, 9543 children: [ 9544 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9545 SingleSelectionOption, 9546 { 9547 selected: currentValue === element.value 9548 } 9549 ), 9550 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9551 MultiSelectionOption, 9552 { 9553 selected: currentValue.includes( 9554 element.value 9555 ) 9556 } 9557 ), 9558 /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("span", { children: [ 9559 /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 9560 ComboboxItemValue, 9561 { 9562 className: "dataviews-filters__search-widget-filter-combobox-item-value", 9563 value: element.label 9564 } 9565 ), 9566 !!element.description && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "dataviews-filters__search-widget-listitem-description", children: element.description }) 9567 ] }) 9568 ] 9569 }, 9570 element.value 9571 ); 9572 }), 9573 !matches.length && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { children: (0, import_i18n21.__)("No results found") }) 9574 ] 9575 } 9576 ) 9577 ] 9578 } 9579 ); 9580 } 9581 function SearchWidget(props) { 9582 const { elements, isLoading } = useElements({ 9583 elements: props.filter.elements, 9584 getElements: props.filter.getElements 9585 }); 9586 if (isLoading) { 9587 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_components21.Spinner, {}) }); 9588 } 9589 if (elements.length === 0) { 9590 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: (0, import_i18n21.__)("No elements found") }); 9591 } 9592 const Widget = elements.length > 10 ? ComboboxList22 : ListBox; 9593 return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Widget, { ...props, filter: { ...props.filter, elements } }); 9594 } 9595 9596 // packages/dataviews/build-module/components/dataviews-filters/input-widget.js 9597 var import_es6 = __toESM(require_es6()); 9598 var import_compose8 = __toESM(require_compose()); 9599 var import_element24 = __toESM(require_element()); 9600 var import_components22 = __toESM(require_components()); 9601 var import_jsx_runtime55 = __toESM(require_jsx_runtime()); 9602 function InputWidget({ 9603 filter, 9604 view, 9605 onChangeView, 9606 fields 9607 }) { 9608 const currentFilter = view.filters?.find( 9609 (f2) => f2.field === filter.field 9610 ); 9611 const currentValue = getCurrentValue(filter, currentFilter); 9612 const field = (0, import_element24.useMemo)(() => { 9613 const currentField = fields.find((f2) => f2.id === filter.field); 9614 if (currentField) { 9615 return { 9616 ...currentField, 9617 // Deactivate validation for filters. 9618 isValid: {}, 9619 // Configure getValue/setValue as if Item was a plain object. 9620 getValue: ({ item }) => item[currentField.id], 9621 setValue: ({ value }) => ({ 9622 [currentField.id]: value 9623 }) 9624 }; 9625 } 9626 return currentField; 9627 }, [fields, filter.field]); 9628 const data = (0, import_element24.useMemo)(() => { 9629 return (view.filters ?? []).reduce( 9630 (acc, activeFilter) => { 9631 acc[activeFilter.field] = activeFilter.value; 9632 return acc; 9633 }, 9634 {} 9635 ); 9636 }, [view.filters]); 9637 const handleChange = (0, import_compose8.useEvent)((updatedData) => { 9638 if (!field || !currentFilter) { 9639 return; 9640 } 9641 const nextValue = field.getValue({ item: updatedData }); 9642 if ((0, import_es6.default)(nextValue, currentValue)) { 9643 return; 9644 } 9645 onChangeView({ 9646 ...view, 9647 filters: (view.filters ?? []).map( 9648 (_filter) => _filter.field === filter.field ? { 9649 ..._filter, 9650 operator: currentFilter.operator || filter.operators[0], 9651 // Consider empty strings as undefined: 9652 // 9653 // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records 9654 // - empty string as value means "search empty string": returns only the records that have an empty string as value 9655 // 9656 // In practice, this means the filter will not be able to find an empty string as the value. 9657 value: nextValue === "" ? void 0 : nextValue 9658 } : _filter 9659 ) 9660 }); 9661 }); 9662 if (!field || !field.Edit || !currentFilter) { 9663 return null; 9664 } 9665 return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)( 9666 import_components22.Flex, 9667 { 9668 className: "dataviews-filters__user-input-widget", 9669 gap: 2.5, 9670 direction: "column", 9671 children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)( 9672 field.Edit, 9673 { 9674 hideLabelFromVision: true, 9675 data, 9676 field, 9677 operator: currentFilter.operator, 9678 onChange: handleChange 9679 } 9680 ) 9681 } 9682 ); 9683 } 9684 9685 // packages/dataviews/build-module/utils/operators.js 9686 var import_i18n22 = __toESM(require_i18n()); 9687 var import_element25 = __toESM(require_element()); 9688 var import_jsx_runtime56 = __toESM(require_jsx_runtime()); 9689 var filterTextWrappers = { 9690 Name: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "dataviews-filters__summary-filter-text-name" }), 9691 Value: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "dataviews-filters__summary-filter-text-value" }) 9692 }; 9693 var OPERATORS = [ 9694 { 9695 name: OPERATOR_IS_ANY, 9696 /* translators: DataViews operator name */ 9697 label: (0, import_i18n22.__)("Includes"), 9698 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9699 (0, import_i18n22.sprintf)( 9700 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is any: Admin, Editor". */ 9701 (0, import_i18n22.__)("<Name>%1$s includes: </Name><Value>%2$s</Value>"), 9702 filter.name, 9703 activeElements.map((element) => element.label).join(", ") 9704 ), 9705 filterTextWrappers 9706 ), 9707 selection: "multi" 9708 }, 9709 { 9710 name: OPERATOR_IS_NONE, 9711 /* translators: DataViews operator name */ 9712 label: (0, import_i18n22.__)("Is none of"), 9713 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9714 (0, import_i18n22.sprintf)( 9715 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */ 9716 (0, import_i18n22.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"), 9717 filter.name, 9718 activeElements.map((element) => element.label).join(", ") 9719 ), 9720 filterTextWrappers 9721 ), 9722 selection: "multi" 9723 }, 9724 { 9725 name: OPERATOR_IS_ALL, 9726 /* translators: DataViews operator name */ 9727 label: (0, import_i18n22.__)("Includes all"), 9728 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9729 (0, import_i18n22.sprintf)( 9730 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author includes all: Admin, Editor". */ 9731 (0, import_i18n22.__)("<Name>%1$s includes all: </Name><Value>%2$s</Value>"), 9732 filter.name, 9733 activeElements.map((element) => element.label).join(", ") 9734 ), 9735 filterTextWrappers 9736 ), 9737 selection: "multi" 9738 }, 9739 { 9740 name: OPERATOR_IS_NOT_ALL, 9741 /* translators: DataViews operator name */ 9742 label: (0, import_i18n22.__)("Is none of"), 9743 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9744 (0, import_i18n22.sprintf)( 9745 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */ 9746 (0, import_i18n22.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"), 9747 filter.name, 9748 activeElements.map((element) => element.label).join(", ") 9749 ), 9750 filterTextWrappers 9751 ), 9752 selection: "multi" 9753 }, 9754 { 9755 name: OPERATOR_BETWEEN, 9756 /* translators: DataViews operator name */ 9757 label: (0, import_i18n22.__)("Between (inc)"), 9758 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9759 (0, import_i18n22.sprintf)( 9760 /* translators: 1: Filter name (e.g. "Item count"). 2: Filter value min. 3: Filter value max. e.g.: "Item count between (inc): 10 and 180". */ 9761 (0, import_i18n22.__)( 9762 "<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>" 9763 ), 9764 filter.name, 9765 activeElements[0].label[0], 9766 activeElements[0].label[1] 9767 ), 9768 filterTextWrappers 9769 ), 9770 selection: "custom" 9771 }, 9772 { 9773 name: OPERATOR_IN_THE_PAST, 9774 /* translators: DataViews operator name */ 9775 label: (0, import_i18n22.__)("In the past"), 9776 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9777 (0, import_i18n22.sprintf)( 9778 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is in the past: 7 days". */ 9779 (0, import_i18n22.__)( 9780 "<Name>%1$s is in the past: </Name><Value>%2$s</Value>" 9781 ), 9782 filter.name, 9783 `$activeElements[0].value.value} $activeElements[0].value.unit}` 9784 ), 9785 filterTextWrappers 9786 ), 9787 selection: "custom" 9788 }, 9789 { 9790 name: OPERATOR_OVER, 9791 /* translators: DataViews operator name */ 9792 label: (0, import_i18n22.__)("Over"), 9793 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9794 (0, import_i18n22.sprintf)( 9795 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is over: 7 days". */ 9796 (0, import_i18n22.__)("<Name>%1$s is over: </Name><Value>%2$s</Value>"), 9797 filter.name, 9798 `$activeElements[0].value.value} $activeElements[0].value.unit}` 9799 ), 9800 filterTextWrappers 9801 ), 9802 selection: "custom" 9803 }, 9804 { 9805 name: OPERATOR_IS, 9806 /* translators: DataViews operator name */ 9807 label: (0, import_i18n22.__)("Is"), 9808 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9809 (0, import_i18n22.sprintf)( 9810 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is: Admin". */ 9811 (0, import_i18n22.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"), 9812 filter.name, 9813 activeElements[0].label 9814 ), 9815 filterTextWrappers 9816 ), 9817 selection: "single" 9818 }, 9819 { 9820 name: OPERATOR_IS_NOT, 9821 /* translators: DataViews operator name */ 9822 label: (0, import_i18n22.__)("Is not"), 9823 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9824 (0, import_i18n22.sprintf)( 9825 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is not: Admin". */ 9826 (0, import_i18n22.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"), 9827 filter.name, 9828 activeElements[0].label 9829 ), 9830 filterTextWrappers 9831 ), 9832 selection: "single" 9833 }, 9834 { 9835 name: OPERATOR_LESS_THAN, 9836 /* translators: DataViews operator name */ 9837 label: (0, import_i18n22.__)("Less than"), 9838 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9839 (0, import_i18n22.sprintf)( 9840 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than: 10". */ 9841 (0, import_i18n22.__)("<Name>%1$s is less than: </Name><Value>%2$s</Value>"), 9842 filter.name, 9843 activeElements[0].label 9844 ), 9845 filterTextWrappers 9846 ), 9847 selection: "single" 9848 }, 9849 { 9850 name: OPERATOR_GREATER_THAN, 9851 /* translators: DataViews operator name */ 9852 label: (0, import_i18n22.__)("Greater than"), 9853 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9854 (0, import_i18n22.sprintf)( 9855 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than: 10". */ 9856 (0, import_i18n22.__)( 9857 "<Name>%1$s is greater than: </Name><Value>%2$s</Value>" 9858 ), 9859 filter.name, 9860 activeElements[0].label 9861 ), 9862 filterTextWrappers 9863 ), 9864 selection: "single" 9865 }, 9866 { 9867 name: OPERATOR_LESS_THAN_OR_EQUAL, 9868 /* translators: DataViews operator name */ 9869 label: (0, import_i18n22.__)("Less than or equal"), 9870 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9871 (0, import_i18n22.sprintf)( 9872 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than or equal to: 10". */ 9873 (0, import_i18n22.__)( 9874 "<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>" 9875 ), 9876 filter.name, 9877 activeElements[0].label 9878 ), 9879 filterTextWrappers 9880 ), 9881 selection: "single" 9882 }, 9883 { 9884 name: OPERATOR_GREATER_THAN_OR_EQUAL, 9885 /* translators: DataViews operator name */ 9886 label: (0, import_i18n22.__)("Greater than or equal"), 9887 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9888 (0, import_i18n22.sprintf)( 9889 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than or equal to: 10". */ 9890 (0, import_i18n22.__)( 9891 "<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>" 9892 ), 9893 filter.name, 9894 activeElements[0].label 9895 ), 9896 filterTextWrappers 9897 ), 9898 selection: "single" 9899 }, 9900 { 9901 name: OPERATOR_BEFORE, 9902 /* translators: DataViews operator name */ 9903 label: (0, import_i18n22.__)("Before"), 9904 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9905 (0, import_i18n22.sprintf)( 9906 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is before: 2024-01-01". */ 9907 (0, import_i18n22.__)("<Name>%1$s is before: </Name><Value>%2$s</Value>"), 9908 filter.name, 9909 activeElements[0].label 9910 ), 9911 filterTextWrappers 9912 ), 9913 selection: "single" 9914 }, 9915 { 9916 name: OPERATOR_AFTER, 9917 /* translators: DataViews operator name */ 9918 label: (0, import_i18n22.__)("After"), 9919 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9920 (0, import_i18n22.sprintf)( 9921 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is after: 2024-01-01". */ 9922 (0, import_i18n22.__)("<Name>%1$s is after: </Name><Value>%2$s</Value>"), 9923 filter.name, 9924 activeElements[0].label 9925 ), 9926 filterTextWrappers 9927 ), 9928 selection: "single" 9929 }, 9930 { 9931 name: OPERATOR_BEFORE_INC, 9932 /* translators: DataViews operator name */ 9933 label: (0, import_i18n22.__)("Before (inc)"), 9934 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9935 (0, import_i18n22.sprintf)( 9936 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or before: 2024-01-01". */ 9937 (0, import_i18n22.__)( 9938 "<Name>%1$s is on or before: </Name><Value>%2$s</Value>" 9939 ), 9940 filter.name, 9941 activeElements[0].label 9942 ), 9943 filterTextWrappers 9944 ), 9945 selection: "single" 9946 }, 9947 { 9948 name: OPERATOR_AFTER_INC, 9949 /* translators: DataViews operator name */ 9950 label: (0, import_i18n22.__)("After (inc)"), 9951 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9952 (0, import_i18n22.sprintf)( 9953 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or after: 2024-01-01". */ 9954 (0, import_i18n22.__)( 9955 "<Name>%1$s is on or after: </Name><Value>%2$s</Value>" 9956 ), 9957 filter.name, 9958 activeElements[0].label 9959 ), 9960 filterTextWrappers 9961 ), 9962 selection: "single" 9963 }, 9964 { 9965 name: OPERATOR_CONTAINS, 9966 /* translators: DataViews operator name */ 9967 label: (0, import_i18n22.__)("Contains"), 9968 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9969 (0, import_i18n22.sprintf)( 9970 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title contains: Hello". */ 9971 (0, import_i18n22.__)("<Name>%1$s contains: </Name><Value>%2$s</Value>"), 9972 filter.name, 9973 activeElements[0].label 9974 ), 9975 filterTextWrappers 9976 ), 9977 selection: "single" 9978 }, 9979 { 9980 name: OPERATOR_NOT_CONTAINS, 9981 /* translators: DataViews operator name */ 9982 label: (0, import_i18n22.__)("Doesn't contain"), 9983 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 9984 (0, import_i18n22.sprintf)( 9985 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title doesn't contain: Hello". */ 9986 (0, import_i18n22.__)( 9987 "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>" 9988 ), 9989 filter.name, 9990 activeElements[0].label 9991 ), 9992 filterTextWrappers 9993 ), 9994 selection: "single" 9995 }, 9996 { 9997 name: OPERATOR_STARTS_WITH, 9998 /* translators: DataViews operator name */ 9999 label: (0, import_i18n22.__)("Starts with"), 10000 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10001 (0, import_i18n22.sprintf)( 10002 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title starts with: Hello". */ 10003 (0, import_i18n22.__)("<Name>%1$s starts with: </Name><Value>%2$s</Value>"), 10004 filter.name, 10005 activeElements[0].label 10006 ), 10007 filterTextWrappers 10008 ), 10009 selection: "single" 10010 }, 10011 { 10012 name: OPERATOR_ON, 10013 /* translators: DataViews operator name */ 10014 label: (0, import_i18n22.__)("On"), 10015 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10016 (0, import_i18n22.sprintf)( 10017 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is: 2024-01-01". */ 10018 (0, import_i18n22.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"), 10019 filter.name, 10020 activeElements[0].label 10021 ), 10022 filterTextWrappers 10023 ), 10024 selection: "single" 10025 }, 10026 { 10027 name: OPERATOR_NOT_ON, 10028 /* translators: DataViews operator name */ 10029 label: (0, import_i18n22.__)("Not on"), 10030 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10031 (0, import_i18n22.sprintf)( 10032 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is not: 2024-01-01". */ 10033 (0, import_i18n22.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"), 10034 filter.name, 10035 activeElements[0].label 10036 ), 10037 filterTextWrappers 10038 ), 10039 selection: "single" 10040 } 10041 ]; 10042 var getOperatorByName = (name) => OPERATORS.find((op) => op.name === name); 10043 var getAllOperatorNames = () => OPERATORS.map((op) => op.name); 10044 var isSingleSelectionOperator = (name) => OPERATORS.filter((op) => op.selection === "single").some( 10045 (op) => op.name === name 10046 ); 10047 var isRegisteredOperator = (name) => OPERATORS.some((op) => op.name === name); 10048 10049 // packages/dataviews/build-module/components/dataviews-filters/filter.js 10050 var import_jsx_runtime57 = __toESM(require_jsx_runtime()); 10051 var ENTER = "Enter"; 10052 var SPACE = " "; 10053 var FilterText = ({ 10054 activeElements, 10055 filterInView, 10056 filter 10057 }) => { 10058 if (activeElements === void 0 || activeElements.length === 0) { 10059 return filter.name; 10060 } 10061 const operator = getOperatorByName(filterInView?.operator); 10062 if (operator !== void 0) { 10063 return operator.filterText(filter, activeElements); 10064 } 10065 return (0, import_i18n23.sprintf)( 10066 /* translators: 1: Filter name e.g.: "Unknown status for Author". */ 10067 (0, import_i18n23.__)("Unknown status for %1$s"), 10068 filter.name 10069 ); 10070 }; 10071 function OperatorSelector({ 10072 filter, 10073 view, 10074 onChangeView 10075 }) { 10076 const operatorOptions = filter.operators?.map((operator) => ({ 10077 value: operator, 10078 label: getOperatorByName(operator)?.label || operator 10079 })); 10080 const currentFilter = view.filters?.find( 10081 (_filter) => _filter.field === filter.field 10082 ); 10083 const value = currentFilter?.operator || filter.operators[0]; 10084 return operatorOptions.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)( 10085 import_components23.__experimentalHStack, 10086 { 10087 spacing: 2, 10088 justify: "flex-start", 10089 className: "dataviews-filters__summary-operators-container", 10090 children: [ 10091 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_components23.FlexItem, { className: "dataviews-filters__summary-operators-filter-name", children: filter.name }), 10092 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10093 import_components23.SelectControl, 10094 { 10095 className: "dataviews-filters__summary-operators-filter-select", 10096 label: (0, import_i18n23.__)("Conditions"), 10097 value, 10098 options: operatorOptions, 10099 onChange: (newValue) => { 10100 const newOperator = newValue; 10101 const currentOperator = currentFilter?.operator; 10102 const newFilters = currentFilter ? [ 10103 ...(view.filters ?? []).map( 10104 (_filter) => { 10105 if (_filter.field === filter.field) { 10106 const currentOpSelectionModel = getOperatorByName( 10107 currentOperator 10108 )?.selection; 10109 const newOpSelectionModel = getOperatorByName( 10110 newOperator 10111 )?.selection; 10112 const shouldResetValue = currentOpSelectionModel !== newOpSelectionModel || [ 10113 currentOpSelectionModel, 10114 newOpSelectionModel 10115 ].includes("custom"); 10116 return { 10117 ..._filter, 10118 value: shouldResetValue ? void 0 : _filter.value, 10119 operator: newOperator 10120 }; 10121 } 10122 return _filter; 10123 } 10124 ) 10125 ] : [ 10126 ...view.filters ?? [], 10127 { 10128 field: filter.field, 10129 operator: newOperator, 10130 value: void 0 10131 } 10132 ]; 10133 onChangeView({ 10134 ...view, 10135 page: 1, 10136 filters: newFilters 10137 }); 10138 }, 10139 size: "small", 10140 variant: "minimal", 10141 hideLabelFromVision: true 10142 } 10143 ) 10144 ] 10145 } 10146 ); 10147 } 10148 function Filter({ 10149 addFilterRef, 10150 openedFilter, 10151 fields, 10152 ...commonProps 10153 }) { 10154 const toggleRef = (0, import_element26.useRef)(null); 10155 const { filter, view, onChangeView } = commonProps; 10156 const filterInView = view.filters?.find( 10157 (f2) => f2.field === filter.field 10158 ); 10159 let activeElements = []; 10160 const field = (0, import_element26.useMemo)(() => { 10161 const currentField = fields.find((f2) => f2.id === filter.field); 10162 if (currentField) { 10163 return { 10164 ...currentField, 10165 // Configure getValue as if Item was a plain object. 10166 // See related input-widget.tsx 10167 getValue: ({ item }) => item[currentField.id] 10168 }; 10169 } 10170 return currentField; 10171 }, [fields, filter.field]); 10172 const { elements } = useElements({ 10173 elements: filter.elements, 10174 getElements: filter.getElements 10175 }); 10176 if (elements.length > 0) { 10177 activeElements = elements.filter((element) => { 10178 if (filter.singleSelection) { 10179 return element.value === filterInView?.value; 10180 } 10181 return filterInView?.value?.includes(element.value); 10182 }); 10183 } else if (Array.isArray(filterInView?.value)) { 10184 const label = filterInView.value.map((v2) => { 10185 const formattedValue = field?.getValueFormatted({ 10186 item: { [field.id]: v2 }, 10187 field 10188 }); 10189 return formattedValue || String(v2); 10190 }); 10191 activeElements = [ 10192 { 10193 value: filterInView.value, 10194 // @ts-ignore 10195 label 10196 } 10197 ]; 10198 } else if (typeof filterInView?.value === "object") { 10199 activeElements = [ 10200 { value: filterInView.value, label: filterInView.value } 10201 ]; 10202 } else if (filterInView?.value !== void 0) { 10203 const label = field !== void 0 ? field.getValueFormatted({ 10204 item: { [field.id]: filterInView.value }, 10205 field 10206 }) : String(filterInView.value); 10207 activeElements = [ 10208 { 10209 value: filterInView.value, 10210 label 10211 } 10212 ]; 10213 } 10214 const isPrimary = filter.isPrimary; 10215 const isLocked = filterInView?.isLocked; 10216 const hasValues = !isLocked && filterInView?.value !== void 0; 10217 const canResetOrRemove = !isLocked && (!isPrimary || hasValues); 10218 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10219 import_components23.Dropdown, 10220 { 10221 defaultOpen: openedFilter === filter.field, 10222 contentClassName: "dataviews-filters__summary-popover", 10223 popoverProps: { placement: "bottom-start", role: "dialog" }, 10224 onClose: () => { 10225 toggleRef.current?.focus(); 10226 }, 10227 renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "dataviews-filters__summary-chip-container", children: [ 10228 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10229 import_components23.Tooltip, 10230 { 10231 text: (0, import_i18n23.sprintf)( 10232 /* translators: 1: Filter name. */ 10233 (0, import_i18n23.__)("Filter by: %1$s"), 10234 filter.name.toLowerCase() 10235 ), 10236 placement: "top", 10237 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10238 "div", 10239 { 10240 className: clsx_default( 10241 "dataviews-filters__summary-chip", 10242 { 10243 "has-reset": canResetOrRemove, 10244 "has-values": hasValues, 10245 "is-not-clickable": isLocked 10246 } 10247 ), 10248 role: "button", 10249 tabIndex: isLocked ? -1 : 0, 10250 onClick: () => { 10251 if (!isLocked) { 10252 onToggle(); 10253 } 10254 }, 10255 onKeyDown: (event) => { 10256 if (!isLocked && [ENTER, SPACE].includes(event.key)) { 10257 onToggle(); 10258 event.preventDefault(); 10259 } 10260 }, 10261 "aria-disabled": isLocked, 10262 "aria-pressed": isOpen, 10263 "aria-expanded": isOpen, 10264 ref: toggleRef, 10265 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10266 FilterText, 10267 { 10268 activeElements, 10269 filterInView, 10270 filter 10271 } 10272 ) 10273 } 10274 ) 10275 } 10276 ), 10277 canResetOrRemove && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10278 import_components23.Tooltip, 10279 { 10280 text: isPrimary ? (0, import_i18n23.__)("Reset") : (0, import_i18n23.__)("Remove"), 10281 placement: "top", 10282 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10283 "button", 10284 { 10285 className: clsx_default( 10286 "dataviews-filters__summary-chip-remove", 10287 { "has-values": hasValues } 10288 ), 10289 onClick: () => { 10290 onChangeView({ 10291 ...view, 10292 page: 1, 10293 filters: view.filters?.filter( 10294 (_filter) => _filter.field !== filter.field 10295 ) 10296 }); 10297 if (!isPrimary) { 10298 addFilterRef.current?.focus(); 10299 } else { 10300 toggleRef.current?.focus(); 10301 } 10302 }, 10303 children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_components23.Icon, { icon: close_small_default }) 10304 } 10305 ) 10306 } 10307 ) 10308 ] }), 10309 renderContent: () => { 10310 return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_components23.__experimentalVStack, { spacing: 0, justify: "flex-start", children: [ 10311 /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(OperatorSelector, { ...commonProps }), 10312 commonProps.filter.hasElements ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)( 10313 SearchWidget, 10314 { 10315 ...commonProps, 10316 filter: { 10317 ...commonProps.filter, 10318 elements 10319 } 10320 } 10321 ) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(InputWidget, { ...commonProps, fields }) 10322 ] }); 10323 } 10324 } 10325 ); 10326 } 10327 10328 // packages/dataviews/build-module/components/dataviews-filters/add-filter.js 10329 var import_components24 = __toESM(require_components()); 10330 var import_i18n24 = __toESM(require_i18n()); 10331 var import_element27 = __toESM(require_element()); 10332 var import_jsx_runtime58 = __toESM(require_jsx_runtime()); 10333 var { Menu: Menu4 } = unlock(import_components24.privateApis); 10334 function AddFilterMenu({ 10335 filters, 10336 view, 10337 onChangeView, 10338 setOpenedFilter, 10339 triggerProps 10340 }) { 10341 const inactiveFilters = filters.filter((filter) => !filter.isVisible); 10342 return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Menu4, { children: [ 10343 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Menu4.TriggerButton, { ...triggerProps }), 10344 /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Menu4.Popover, { children: inactiveFilters.map((filter) => { 10345 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)( 10346 Menu4.Item, 10347 { 10348 onClick: () => { 10349 setOpenedFilter(filter.field); 10350 onChangeView({ 10351 ...view, 10352 page: 1, 10353 filters: [ 10354 ...view.filters || [], 10355 { 10356 field: filter.field, 10357 value: void 0, 10358 operator: filter.operators[0] 10359 } 10360 ] 10361 }); 10362 }, 10363 children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Menu4.ItemLabel, { children: filter.name }) 10364 }, 10365 filter.field 10366 ); 10367 }) }) 10368 ] }); 10369 } 10370 function AddFilter({ filters, view, onChangeView, setOpenedFilter }, ref) { 10371 if (!filters.length || filters.every(({ isPrimary }) => isPrimary)) { 10372 return null; 10373 } 10374 const inactiveFilters = filters.filter((filter) => !filter.isVisible); 10375 return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)( 10376 AddFilterMenu, 10377 { 10378 triggerProps: { 10379 render: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)( 10380 import_components24.Button, 10381 { 10382 accessibleWhenDisabled: true, 10383 size: "compact", 10384 className: "dataviews-filters-button", 10385 variant: "tertiary", 10386 disabled: !inactiveFilters.length, 10387 ref 10388 } 10389 ), 10390 children: (0, import_i18n24.__)("Add filter") 10391 }, 10392 ...{ filters, view, onChangeView, setOpenedFilter } 10393 } 10394 ); 10395 } 10396 var add_filter_default = (0, import_element27.forwardRef)(AddFilter); 10397 10398 // packages/dataviews/build-module/components/dataviews-filters/reset-filters.js 10399 var import_components25 = __toESM(require_components()); 10400 var import_i18n25 = __toESM(require_i18n()); 10401 var import_jsx_runtime59 = __toESM(require_jsx_runtime()); 10402 function ResetFilter({ 10403 filters, 10404 view, 10405 onChangeView 10406 }) { 10407 const isPrimary = (field) => filters.some( 10408 (_filter) => _filter.field === field && _filter.isPrimary 10409 ); 10410 const isDisabled = !view.search && !view.filters?.some( 10411 (_filter) => !_filter.isLocked && (_filter.value !== void 0 || !isPrimary(_filter.field)) 10412 ); 10413 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 10414 import_components25.Button, 10415 { 10416 disabled: isDisabled, 10417 accessibleWhenDisabled: true, 10418 size: "compact", 10419 variant: "tertiary", 10420 className: "dataviews-filters__reset-button", 10421 onClick: () => { 10422 onChangeView({ 10423 ...view, 10424 page: 1, 10425 search: "", 10426 filters: view.filters?.filter((f2) => !!f2.isLocked) || [] 10427 }); 10428 }, 10429 children: (0, import_i18n25.__)("Reset") 10430 } 10431 ); 10432 } 10433 10434 // packages/dataviews/build-module/components/dataviews-filters/use-filters.js 10435 var import_element28 = __toESM(require_element()); 10436 function useFilters(fields, view) { 10437 return (0, import_element28.useMemo)(() => { 10438 const filters = []; 10439 fields.forEach((field) => { 10440 if (field.filterBy === false || !field.hasElements && !field.Edit) { 10441 return; 10442 } 10443 const operators = field.filterBy.operators; 10444 const isPrimary = !!field.filterBy?.isPrimary; 10445 const isLocked = view.filters?.some( 10446 (f2) => f2.field === field.id && !!f2.isLocked 10447 ) ?? false; 10448 filters.push({ 10449 field: field.id, 10450 name: field.label, 10451 elements: field.elements, 10452 getElements: field.getElements, 10453 hasElements: field.hasElements, 10454 singleSelection: operators.some( 10455 (op) => isSingleSelectionOperator(op) 10456 ), 10457 operators, 10458 isVisible: isLocked || isPrimary || !!view.filters?.some( 10459 (f2) => f2.field === field.id && isRegisteredOperator(f2.operator) 10460 ), 10461 isPrimary, 10462 isLocked 10463 }); 10464 }); 10465 filters.sort((a2, b2) => { 10466 if (a2.isLocked && !b2.isLocked) { 10467 return -1; 10468 } 10469 if (!a2.isLocked && b2.isLocked) { 10470 return 1; 10471 } 10472 if (a2.isPrimary && !b2.isPrimary) { 10473 return -1; 10474 } 10475 if (!a2.isPrimary && b2.isPrimary) { 10476 return 1; 10477 } 10478 return a2.name.localeCompare(b2.name); 10479 }); 10480 return filters; 10481 }, [fields, view]); 10482 } 10483 var use_filters_default = useFilters; 10484 10485 // packages/dataviews/build-module/components/dataviews-filters/filters.js 10486 var import_jsx_runtime60 = __toESM(require_jsx_runtime()); 10487 function Filters({ className }) { 10488 const { fields, view, onChangeView, openedFilter, setOpenedFilter } = (0, import_element29.useContext)(dataviews_context_default); 10489 const addFilterRef = (0, import_element29.useRef)(null); 10490 const filters = use_filters_default(fields, view); 10491 const addFilter = /* @__PURE__ */ (0, import_jsx_runtime60.jsx)( 10492 add_filter_default, 10493 { 10494 filters, 10495 view, 10496 onChangeView, 10497 ref: addFilterRef, 10498 setOpenedFilter 10499 }, 10500 "add-filter" 10501 ); 10502 const visibleFilters = filters.filter((filter) => filter.isVisible); 10503 if (visibleFilters.length === 0) { 10504 return null; 10505 } 10506 const filterComponents = [ 10507 ...visibleFilters.map((filter) => { 10508 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)( 10509 Filter, 10510 { 10511 filter, 10512 view, 10513 fields, 10514 onChangeView, 10515 addFilterRef, 10516 openedFilter 10517 }, 10518 filter.field 10519 ); 10520 }), 10521 addFilter 10522 ]; 10523 filterComponents.push( 10524 /* @__PURE__ */ (0, import_jsx_runtime60.jsx)( 10525 ResetFilter, 10526 { 10527 filters, 10528 view, 10529 onChangeView 10530 }, 10531 "reset-filters" 10532 ) 10533 ); 10534 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)( 10535 import_components26.__experimentalHStack, 10536 { 10537 justify: "flex-start", 10538 style: { width: "fit-content" }, 10539 wrap: true, 10540 className, 10541 children: filterComponents 10542 } 10543 ); 10544 } 10545 var filters_default = (0, import_element29.memo)(Filters); 10546 10547 // packages/dataviews/build-module/components/dataviews-filters/toggle.js 10548 var import_element30 = __toESM(require_element()); 10549 var import_components27 = __toESM(require_components()); 10550 var import_i18n26 = __toESM(require_i18n()); 10551 var import_jsx_runtime61 = __toESM(require_jsx_runtime()); 10552 function FiltersToggle() { 10553 const { 10554 filters, 10555 view, 10556 onChangeView, 10557 setOpenedFilter, 10558 isShowingFilter, 10559 setIsShowingFilter 10560 } = (0, import_element30.useContext)(dataviews_context_default); 10561 const buttonRef = (0, import_element30.useRef)(null); 10562 const onChangeViewWithFilterVisibility = (0, import_element30.useCallback)( 10563 (_view) => { 10564 onChangeView(_view); 10565 setIsShowingFilter(true); 10566 }, 10567 [onChangeView, setIsShowingFilter] 10568 ); 10569 const visibleFilters = filters.filter((filter) => filter.isVisible); 10570 const hasVisibleFilters = !!visibleFilters.length; 10571 if (filters.length === 0) { 10572 return null; 10573 } 10574 const addFilterButtonProps = { 10575 label: (0, import_i18n26.__)("Add filter"), 10576 "aria-expanded": false, 10577 isPressed: false 10578 }; 10579 const toggleFiltersButtonProps = { 10580 label: (0, import_i18n26._x)("Filter", "verb"), 10581 "aria-expanded": isShowingFilter, 10582 isPressed: isShowingFilter, 10583 onClick: () => { 10584 if (!isShowingFilter) { 10585 setOpenedFilter(null); 10586 } 10587 setIsShowingFilter(!isShowingFilter); 10588 } 10589 }; 10590 const buttonComponent = /* @__PURE__ */ (0, import_jsx_runtime61.jsx)( 10591 import_components27.Button, 10592 { 10593 ref: buttonRef, 10594 className: "dataviews-filters__visibility-toggle", 10595 size: "compact", 10596 icon: funnel_default, 10597 ...hasVisibleFilters ? toggleFiltersButtonProps : addFilterButtonProps 10598 } 10599 ); 10600 return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("div", { className: "dataviews-filters__container-visibility-toggle", children: !hasVisibleFilters ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)( 10601 AddFilterMenu, 10602 { 10603 filters, 10604 view, 10605 onChangeView: onChangeViewWithFilterVisibility, 10606 setOpenedFilter, 10607 triggerProps: { render: buttonComponent } 10608 } 10609 ) : /* @__PURE__ */ (0, import_jsx_runtime61.jsx)( 10610 FilterVisibilityToggle, 10611 { 10612 buttonRef, 10613 filtersCount: view.filters?.length, 10614 children: buttonComponent 10615 } 10616 ) }); 10617 } 10618 function FilterVisibilityToggle({ 10619 buttonRef, 10620 filtersCount, 10621 children 10622 }) { 10623 (0, import_element30.useEffect)( 10624 () => () => { 10625 buttonRef.current?.focus(); 10626 }, 10627 [buttonRef] 10628 ); 10629 return /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_jsx_runtime61.Fragment, { children: [ 10630 children, 10631 !!filtersCount && /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "dataviews-filters-toggle__count", children: filtersCount }) 10632 ] }); 10633 } 10634 var toggle_default = FiltersToggle; 10635 10636 // packages/dataviews/build-module/components/dataviews-filters/filters-toggled.js 10637 var import_element31 = __toESM(require_element()); 10638 var import_jsx_runtime62 = __toESM(require_jsx_runtime()); 10639 function FiltersToggled(props) { 10640 const { isShowingFilter } = (0, import_element31.useContext)(dataviews_context_default); 10641 if (!isShowingFilter) { 10642 return null; 10643 } 10644 return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(filters_default, { ...props }); 10645 } 10646 var filters_toggled_default = FiltersToggled; 10647 10648 // packages/dataviews/build-module/components/dataviews-layout/index.js 10649 var import_element32 = __toESM(require_element()); 10650 var import_i18n27 = __toESM(require_i18n()); 10651 var import_jsx_runtime63 = __toESM(require_jsx_runtime()); 10652 function DataViewsLayout({ className }) { 10653 const { 10654 actions = [], 10655 data, 10656 fields, 10657 getItemId, 10658 getItemLevel, 10659 isLoading, 10660 view, 10661 onChangeView, 10662 selection, 10663 onChangeSelection, 10664 setOpenedFilter, 10665 onClickItem, 10666 isItemClickable, 10667 renderItemLink, 10668 defaultLayouts, 10669 empty = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("p", { children: (0, import_i18n27.__)("No results") }) 10670 } = (0, import_element32.useContext)(dataviews_context_default); 10671 const ViewComponent = VIEW_LAYOUTS.find( 10672 (v2) => v2.type === view.type && defaultLayouts[v2.type] 10673 )?.component; 10674 return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)( 10675 ViewComponent, 10676 { 10677 className, 10678 actions, 10679 data, 10680 fields, 10681 getItemId, 10682 getItemLevel, 10683 isLoading, 10684 onChangeView, 10685 onChangeSelection, 10686 selection, 10687 setOpenedFilter, 10688 onClickItem, 10689 renderItemLink, 10690 isItemClickable, 10691 view, 10692 empty 10693 } 10694 ); 10695 } 10696 10697 // packages/dataviews/build-module/components/dataviews-footer/index.js 10698 var import_components28 = __toESM(require_components()); 10699 var import_element33 = __toESM(require_element()); 10700 var import_jsx_runtime64 = __toESM(require_jsx_runtime()); 10701 var EMPTY_ARRAY4 = []; 10702 function DataViewsFooter() { 10703 const { 10704 view, 10705 paginationInfo: { totalItems = 0, totalPages }, 10706 data, 10707 actions = EMPTY_ARRAY4 10708 } = (0, import_element33.useContext)(dataviews_context_default); 10709 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data) && [LAYOUT_TABLE, LAYOUT_GRID].includes(view.type); 10710 if (!totalItems || !totalPages || totalPages <= 1 && !hasBulkActions) { 10711 return null; 10712 } 10713 return !!totalItems && /* @__PURE__ */ (0, import_jsx_runtime64.jsxs)( 10714 import_components28.__experimentalHStack, 10715 { 10716 expanded: false, 10717 justify: "end", 10718 className: "dataviews-footer", 10719 children: [ 10720 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(BulkActionsFooter, {}), 10721 /* @__PURE__ */ (0, import_jsx_runtime64.jsx)(dataviews_pagination_default, {}) 10722 ] 10723 } 10724 ); 10725 } 10726 10727 // packages/dataviews/build-module/components/dataviews-search/index.js 10728 var import_i18n28 = __toESM(require_i18n()); 10729 var import_element34 = __toESM(require_element()); 10730 var import_components29 = __toESM(require_components()); 10731 var import_compose9 = __toESM(require_compose()); 10732 var import_jsx_runtime65 = __toESM(require_jsx_runtime()); 10733 var DataViewsSearch = (0, import_element34.memo)(function Search({ label }) { 10734 const { view, onChangeView } = (0, import_element34.useContext)(dataviews_context_default); 10735 const [search, setSearch, debouncedSearch] = (0, import_compose9.useDebouncedInput)( 10736 view.search 10737 ); 10738 (0, import_element34.useEffect)(() => { 10739 setSearch(view.search ?? ""); 10740 }, [view.search, setSearch]); 10741 const onChangeViewRef = (0, import_element34.useRef)(onChangeView); 10742 const viewRef = (0, import_element34.useRef)(view); 10743 (0, import_element34.useEffect)(() => { 10744 onChangeViewRef.current = onChangeView; 10745 viewRef.current = view; 10746 }, [onChangeView, view]); 10747 (0, import_element34.useEffect)(() => { 10748 if (debouncedSearch !== viewRef.current?.search) { 10749 onChangeViewRef.current({ 10750 ...viewRef.current, 10751 page: 1, 10752 search: debouncedSearch 10753 }); 10754 } 10755 }, [debouncedSearch]); 10756 const searchLabel = label || (0, import_i18n28.__)("Search"); 10757 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( 10758 import_components29.SearchControl, 10759 { 10760 className: "dataviews-search", 10761 onChange: setSearch, 10762 value: search, 10763 label: searchLabel, 10764 placeholder: searchLabel, 10765 size: "compact" 10766 } 10767 ); 10768 }); 10769 var dataviews_search_default = DataViewsSearch; 10770 10771 // packages/dataviews/build-module/components/dataviews-view-config/index.js 10772 var import_components31 = __toESM(require_components()); 10773 var import_i18n30 = __toESM(require_i18n()); 10774 var import_element36 = __toESM(require_element()); 10775 var import_warning = __toESM(require_warning()); 10776 var import_compose10 = __toESM(require_compose()); 10777 10778 // packages/dataviews/build-module/components/dataviews-view-config/infinite-scroll-toggle.js 10779 var import_components30 = __toESM(require_components()); 10780 var import_i18n29 = __toESM(require_i18n()); 10781 var import_element35 = __toESM(require_element()); 10782 var import_jsx_runtime66 = __toESM(require_jsx_runtime()); 10783 function InfiniteScrollToggle() { 10784 const context = (0, import_element35.useContext)(dataviews_context_default); 10785 const { view, onChangeView } = context; 10786 const infiniteScrollEnabled = view.infiniteScrollEnabled ?? false; 10787 if (!context.hasInfiniteScrollHandler) { 10788 return null; 10789 } 10790 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)( 10791 import_components30.ToggleControl, 10792 { 10793 label: (0, import_i18n29.__)("Enable infinite scroll"), 10794 help: (0, import_i18n29.__)( 10795 "Automatically load more content as you scroll, instead of showing pagination links." 10796 ), 10797 checked: infiniteScrollEnabled, 10798 onChange: (newValue) => { 10799 onChangeView({ 10800 ...view, 10801 infiniteScrollEnabled: newValue 10802 }); 10803 } 10804 } 10805 ); 10806 } 10807 10808 // packages/dataviews/build-module/components/dataviews-view-config/index.js 10809 var import_jsx_runtime67 = __toESM(require_jsx_runtime()); 10810 var { Menu: Menu5 } = unlock(import_components31.privateApis); 10811 var DATAVIEWS_CONFIG_POPOVER_PROPS = { 10812 className: "dataviews-config__popover", 10813 placement: "bottom-end", 10814 offset: 9 10815 }; 10816 function ViewTypeMenu() { 10817 const { view, onChangeView, defaultLayouts } = (0, import_element36.useContext)(dataviews_context_default); 10818 const availableLayouts = Object.keys(defaultLayouts); 10819 if (availableLayouts.length <= 1) { 10820 return null; 10821 } 10822 const activeView = VIEW_LAYOUTS.find((v2) => view.type === v2.type); 10823 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Menu5, { children: [ 10824 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10825 Menu5.TriggerButton, 10826 { 10827 render: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10828 import_components31.Button, 10829 { 10830 size: "compact", 10831 icon: activeView?.icon, 10832 label: (0, import_i18n30.__)("Layout") 10833 } 10834 ) 10835 } 10836 ), 10837 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Menu5.Popover, { children: availableLayouts.map((layout) => { 10838 const config = VIEW_LAYOUTS.find( 10839 (v2) => v2.type === layout 10840 ); 10841 if (!config) { 10842 return null; 10843 } 10844 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10845 Menu5.RadioItem, 10846 { 10847 value: layout, 10848 name: "view-actions-available-view", 10849 checked: layout === view.type, 10850 hideOnClick: true, 10851 onChange: (e2) => { 10852 switch (e2.target.value) { 10853 case "list": 10854 case "grid": 10855 case "table": 10856 case "pickerGrid": 10857 case "pickerTable": 10858 case "activity": 10859 const viewWithoutLayout = { ...view }; 10860 if ("layout" in viewWithoutLayout) { 10861 delete viewWithoutLayout.layout; 10862 } 10863 return onChangeView({ 10864 ...viewWithoutLayout, 10865 type: e2.target.value, 10866 ...defaultLayouts[e2.target.value] 10867 }); 10868 } 10869 (0, import_warning.default)("Invalid dataview"); 10870 }, 10871 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Menu5.ItemLabel, { children: config.label }) 10872 }, 10873 layout 10874 ); 10875 }) }) 10876 ] }); 10877 } 10878 function SortFieldControl() { 10879 const { view, fields, onChangeView } = (0, import_element36.useContext)(dataviews_context_default); 10880 const orderOptions = (0, import_element36.useMemo)(() => { 10881 const sortableFields = fields.filter( 10882 (field) => field.enableSorting !== false 10883 ); 10884 return sortableFields.map((field) => { 10885 return { 10886 label: field.label, 10887 value: field.id 10888 }; 10889 }); 10890 }, [fields]); 10891 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10892 import_components31.SelectControl, 10893 { 10894 __next40pxDefaultSize: true, 10895 label: (0, import_i18n30.__)("Sort by"), 10896 value: view.sort?.field, 10897 options: orderOptions, 10898 onChange: (value) => { 10899 onChangeView({ 10900 ...view, 10901 sort: { 10902 direction: view?.sort?.direction || "desc", 10903 field: value 10904 }, 10905 showLevels: false 10906 }); 10907 } 10908 } 10909 ); 10910 } 10911 function SortDirectionControl() { 10912 const { view, fields, onChangeView } = (0, import_element36.useContext)(dataviews_context_default); 10913 const sortableFields = fields.filter( 10914 (field) => field.enableSorting !== false 10915 ); 10916 if (sortableFields.length === 0) { 10917 return null; 10918 } 10919 let value = view.sort?.direction; 10920 if (!value && view.sort?.field) { 10921 value = "desc"; 10922 } 10923 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10924 import_components31.__experimentalToggleGroupControl, 10925 { 10926 className: "dataviews-view-config__sort-direction", 10927 __next40pxDefaultSize: true, 10928 isBlock: true, 10929 label: (0, import_i18n30.__)("Order"), 10930 value, 10931 onChange: (newDirection) => { 10932 if (newDirection === "asc" || newDirection === "desc") { 10933 onChangeView({ 10934 ...view, 10935 sort: { 10936 direction: newDirection, 10937 field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field. 10938 fields.find( 10939 (field) => field.enableSorting !== false 10940 )?.id || "" 10941 }, 10942 showLevels: false 10943 }); 10944 return; 10945 } 10946 (0, import_warning.default)("Invalid direction"); 10947 }, 10948 children: SORTING_DIRECTIONS.map((direction) => { 10949 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10950 import_components31.__experimentalToggleGroupControlOptionIcon, 10951 { 10952 value: direction, 10953 icon: sortIcons[direction], 10954 label: sortLabels[direction] 10955 }, 10956 direction 10957 ); 10958 }) 10959 } 10960 ); 10961 } 10962 function ItemsPerPageControl() { 10963 const { view, config, onChangeView } = (0, import_element36.useContext)(dataviews_context_default); 10964 const { infiniteScrollEnabled } = view; 10965 if (!config || !config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled) { 10966 return null; 10967 } 10968 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10969 import_components31.__experimentalToggleGroupControl, 10970 { 10971 __next40pxDefaultSize: true, 10972 isBlock: true, 10973 label: (0, import_i18n30.__)("Items per page"), 10974 value: view.perPage || 10, 10975 disabled: !view?.sort?.field, 10976 onChange: (newItemsPerPage) => { 10977 const newItemsPerPageNumber = typeof newItemsPerPage === "number" || newItemsPerPage === void 0 ? newItemsPerPage : parseInt(newItemsPerPage, 10); 10978 onChangeView({ 10979 ...view, 10980 perPage: newItemsPerPageNumber, 10981 page: 1 10982 }); 10983 }, 10984 children: config.perPageSizes.map((value) => { 10985 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 10986 import_components31.__experimentalToggleGroupControlOption, 10987 { 10988 value, 10989 label: value.toString() 10990 }, 10991 value 10992 ); 10993 }) 10994 } 10995 ); 10996 } 10997 function SettingsSection({ 10998 title, 10999 description, 11000 children 11001 }) { 11002 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_components31.__experimentalGrid, { columns: 12, className: "dataviews-settings-section", gap: 4, children: [ 11003 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "dataviews-settings-section__sidebar", children: [ 11004 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 11005 import_components31.__experimentalHeading, 11006 { 11007 level: 2, 11008 className: "dataviews-settings-section__title", 11009 children: title 11010 } 11011 ), 11012 description && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 11013 import_components31.__experimentalText, 11014 { 11015 variant: "muted", 11016 className: "dataviews-settings-section__description", 11017 children: description 11018 } 11019 ) 11020 ] }), 11021 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 11022 import_components31.__experimentalGrid, 11023 { 11024 columns: 8, 11025 gap: 4, 11026 className: "dataviews-settings-section__content", 11027 children 11028 } 11029 ) 11030 ] }); 11031 } 11032 function DataviewsViewConfigDropdown() { 11033 const { view } = (0, import_element36.useContext)(dataviews_context_default); 11034 const popoverId = (0, import_compose10.useInstanceId)( 11035 _DataViewsViewConfig, 11036 "dataviews-view-config-dropdown" 11037 ); 11038 const activeLayout = VIEW_LAYOUTS.find( 11039 (layout) => layout.type === view.type 11040 ); 11041 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 11042 import_components31.Dropdown, 11043 { 11044 expandOnMobile: true, 11045 popoverProps: { 11046 ...DATAVIEWS_CONFIG_POPOVER_PROPS, 11047 id: popoverId 11048 }, 11049 renderToggle: ({ onToggle, isOpen }) => { 11050 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 11051 import_components31.Button, 11052 { 11053 size: "compact", 11054 icon: cog_default, 11055 label: (0, import_i18n30._x)("View options", "View is used as a noun"), 11056 onClick: onToggle, 11057 "aria-expanded": isOpen ? "true" : "false", 11058 "aria-controls": popoverId 11059 } 11060 ); 11061 }, 11062 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime67.jsx)( 11063 import_components31.__experimentalDropdownContentWrapper, 11064 { 11065 paddingSize: "medium", 11066 className: "dataviews-config__popover-content-wrapper", 11067 children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_components31.__experimentalVStack, { className: "dataviews-view-config", spacing: 6, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(SettingsSection, { title: (0, import_i18n30.__)("Appearance"), children: [ 11068 /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_components31.__experimentalHStack, { expanded: true, className: "is-divided-in-two", children: [ 11069 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(SortFieldControl, {}), 11070 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(SortDirectionControl, {}) 11071 ] }), 11072 !!activeLayout?.viewConfigOptions && /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(activeLayout.viewConfigOptions, {}), 11073 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(InfiniteScrollToggle, {}), 11074 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ItemsPerPageControl, {}), 11075 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PropertiesSection, {}) 11076 ] }) }) 11077 } 11078 ) 11079 } 11080 ); 11081 } 11082 function _DataViewsViewConfig() { 11083 return /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(import_jsx_runtime67.Fragment, { children: [ 11084 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(ViewTypeMenu, {}), 11085 /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(DataviewsViewConfigDropdown, {}) 11086 ] }); 11087 } 11088 var DataViewsViewConfig = (0, import_element36.memo)(_DataViewsViewConfig); 11089 var dataviews_view_config_default = DataViewsViewConfig; 11090 11091 // packages/dataviews/build-module/dataform-controls/checkbox.js 11092 var import_components32 = __toESM(require_components()); 11093 var import_element37 = __toESM(require_element()); 11094 11095 // packages/dataviews/build-module/dataform-controls/utils/get-custom-validity.js 11096 function getCustomValidity(isValid2, validity) { 11097 let customValidity; 11098 if (isValid2?.required && validity?.required) { 11099 customValidity = validity?.required?.message ? validity.required : void 0; 11100 } else if (isValid2?.pattern && validity?.pattern) { 11101 customValidity = validity.pattern; 11102 } else if (isValid2?.min && validity?.min) { 11103 customValidity = validity.min; 11104 } else if (isValid2?.max && validity?.max) { 11105 customValidity = validity.max; 11106 } else if (isValid2?.minLength && validity?.minLength) { 11107 customValidity = validity.minLength; 11108 } else if (isValid2?.maxLength && validity?.maxLength) { 11109 customValidity = validity.maxLength; 11110 } else if (isValid2?.elements && validity?.elements) { 11111 customValidity = validity.elements; 11112 } else if (validity?.custom) { 11113 customValidity = validity.custom; 11114 } 11115 return customValidity; 11116 } 11117 11118 // packages/dataviews/build-module/dataform-controls/checkbox.js 11119 var import_jsx_runtime68 = __toESM(require_jsx_runtime()); 11120 var { ValidatedCheckboxControl } = unlock(import_components32.privateApis); 11121 function Checkbox({ 11122 field, 11123 onChange, 11124 data, 11125 hideLabelFromVision, 11126 validity 11127 }) { 11128 const { getValue, setValue, label, description, isValid: isValid2 } = field; 11129 const onChangeControl = (0, import_element37.useCallback)(() => { 11130 onChange( 11131 setValue({ item: data, value: !getValue({ item: data }) }) 11132 ); 11133 }, [data, getValue, onChange, setValue]); 11134 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)( 11135 ValidatedCheckboxControl, 11136 { 11137 required: !!field.isValid?.required, 11138 customValidity: getCustomValidity(isValid2, validity), 11139 hidden: hideLabelFromVision, 11140 label, 11141 help: description, 11142 checked: getValue({ item: data }), 11143 onChange: onChangeControl 11144 } 11145 ); 11146 } 11147 11148 // packages/dataviews/node_modules/date-fns/constants.js 11149 var daysInYear = 365.2425; 11150 var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3; 11151 var minTime = -maxTime; 11152 var millisecondsInWeek = 6048e5; 11153 var millisecondsInDay = 864e5; 11154 var secondsInHour = 3600; 11155 var secondsInDay = secondsInHour * 24; 11156 var secondsInWeek = secondsInDay * 7; 11157 var secondsInYear = secondsInDay * daysInYear; 11158 var secondsInMonth = secondsInYear / 12; 11159 var secondsInQuarter = secondsInMonth * 3; 11160 var constructFromSymbol = Symbol.for("constructDateFrom"); 11161 11162 // packages/dataviews/node_modules/date-fns/constructFrom.js 11163 function constructFrom(date, value) { 11164 if (typeof date === "function") return date(value); 11165 if (date && typeof date === "object" && constructFromSymbol in date) 11166 return date[constructFromSymbol](value); 11167 if (date instanceof Date) return new date.constructor(value); 11168 return new Date(value); 11169 } 11170 11171 // packages/dataviews/node_modules/date-fns/toDate.js 11172 function toDate(argument, context) { 11173 return constructFrom(context || argument, argument); 11174 } 11175 11176 // packages/dataviews/node_modules/date-fns/addDays.js 11177 function addDays(date, amount, options) { 11178 const _date = toDate(date, options?.in); 11179 if (isNaN(amount)) return constructFrom(options?.in || date, NaN); 11180 if (!amount) return _date; 11181 _date.setDate(_date.getDate() + amount); 11182 return _date; 11183 } 11184 11185 // packages/dataviews/node_modules/date-fns/addMonths.js 11186 function addMonths(date, amount, options) { 11187 const _date = toDate(date, options?.in); 11188 if (isNaN(amount)) return constructFrom(options?.in || date, NaN); 11189 if (!amount) { 11190 return _date; 11191 } 11192 const dayOfMonth = _date.getDate(); 11193 const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime()); 11194 endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0); 11195 const daysInMonth = endOfDesiredMonth.getDate(); 11196 if (dayOfMonth >= daysInMonth) { 11197 return endOfDesiredMonth; 11198 } else { 11199 _date.setFullYear( 11200 endOfDesiredMonth.getFullYear(), 11201 endOfDesiredMonth.getMonth(), 11202 dayOfMonth 11203 ); 11204 return _date; 11205 } 11206 } 11207 11208 // packages/dataviews/node_modules/date-fns/_lib/defaultOptions.js 11209 var defaultOptions = {}; 11210 function getDefaultOptions() { 11211 return defaultOptions; 11212 } 11213 11214 // packages/dataviews/node_modules/date-fns/startOfWeek.js 11215 function startOfWeek(date, options) { 11216 const defaultOptions2 = getDefaultOptions(); 11217 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0; 11218 const _date = toDate(date, options?.in); 11219 const day = _date.getDay(); 11220 const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; 11221 _date.setDate(_date.getDate() - diff); 11222 _date.setHours(0, 0, 0, 0); 11223 return _date; 11224 } 11225 11226 // packages/dataviews/node_modules/date-fns/startOfISOWeek.js 11227 function startOfISOWeek(date, options) { 11228 return startOfWeek(date, { ...options, weekStartsOn: 1 }); 11229 } 11230 11231 // packages/dataviews/node_modules/date-fns/getISOWeekYear.js 11232 function getISOWeekYear(date, options) { 11233 const _date = toDate(date, options?.in); 11234 const year = _date.getFullYear(); 11235 const fourthOfJanuaryOfNextYear = constructFrom(_date, 0); 11236 fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4); 11237 fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0); 11238 const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear); 11239 const fourthOfJanuaryOfThisYear = constructFrom(_date, 0); 11240 fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4); 11241 fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0); 11242 const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear); 11243 if (_date.getTime() >= startOfNextYear.getTime()) { 11244 return year + 1; 11245 } else if (_date.getTime() >= startOfThisYear.getTime()) { 11246 return year; 11247 } else { 11248 return year - 1; 11249 } 11250 } 11251 11252 // packages/dataviews/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js 11253 function getTimezoneOffsetInMilliseconds(date) { 11254 const _date = toDate(date); 11255 const utcDate = new Date( 11256 Date.UTC( 11257 _date.getFullYear(), 11258 _date.getMonth(), 11259 _date.getDate(), 11260 _date.getHours(), 11261 _date.getMinutes(), 11262 _date.getSeconds(), 11263 _date.getMilliseconds() 11264 ) 11265 ); 11266 utcDate.setUTCFullYear(_date.getFullYear()); 11267 return +date - +utcDate; 11268 } 11269 11270 // packages/dataviews/node_modules/date-fns/_lib/normalizeDates.js 11271 function normalizeDates(context, ...dates) { 11272 const normalize = constructFrom.bind( 11273 null, 11274 context || dates.find((date) => typeof date === "object") 11275 ); 11276 return dates.map(normalize); 11277 } 11278 11279 // packages/dataviews/node_modules/date-fns/startOfDay.js 11280 function startOfDay(date, options) { 11281 const _date = toDate(date, options?.in); 11282 _date.setHours(0, 0, 0, 0); 11283 return _date; 11284 } 11285 11286 // packages/dataviews/node_modules/date-fns/differenceInCalendarDays.js 11287 function differenceInCalendarDays(laterDate, earlierDate, options) { 11288 const [laterDate_, earlierDate_] = normalizeDates( 11289 options?.in, 11290 laterDate, 11291 earlierDate 11292 ); 11293 const laterStartOfDay = startOfDay(laterDate_); 11294 const earlierStartOfDay = startOfDay(earlierDate_); 11295 const laterTimestamp = +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay); 11296 const earlierTimestamp = +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay); 11297 return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay); 11298 } 11299 11300 // packages/dataviews/node_modules/date-fns/startOfISOWeekYear.js 11301 function startOfISOWeekYear(date, options) { 11302 const year = getISOWeekYear(date, options); 11303 const fourthOfJanuary = constructFrom(options?.in || date, 0); 11304 fourthOfJanuary.setFullYear(year, 0, 4); 11305 fourthOfJanuary.setHours(0, 0, 0, 0); 11306 return startOfISOWeek(fourthOfJanuary); 11307 } 11308 11309 // packages/dataviews/node_modules/date-fns/addWeeks.js 11310 function addWeeks(date, amount, options) { 11311 return addDays(date, amount * 7, options); 11312 } 11313 11314 // packages/dataviews/node_modules/date-fns/addYears.js 11315 function addYears(date, amount, options) { 11316 return addMonths(date, amount * 12, options); 11317 } 11318 11319 // packages/dataviews/node_modules/date-fns/isDate.js 11320 function isDate(value) { 11321 return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]"; 11322 } 11323 11324 // packages/dataviews/node_modules/date-fns/isValid.js 11325 function isValid(date) { 11326 return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date))); 11327 } 11328 11329 // packages/dataviews/node_modules/date-fns/startOfMonth.js 11330 function startOfMonth(date, options) { 11331 const _date = toDate(date, options?.in); 11332 _date.setDate(1); 11333 _date.setHours(0, 0, 0, 0); 11334 return _date; 11335 } 11336 11337 // packages/dataviews/node_modules/date-fns/startOfYear.js 11338 function startOfYear(date, options) { 11339 const date_ = toDate(date, options?.in); 11340 date_.setFullYear(date_.getFullYear(), 0, 1); 11341 date_.setHours(0, 0, 0, 0); 11342 return date_; 11343 } 11344 11345 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatDistance.js 11346 var formatDistanceLocale = { 11347 lessThanXSeconds: { 11348 one: "less than a second", 11349 other: "less than {{count}} seconds" 11350 }, 11351 xSeconds: { 11352 one: "1 second", 11353 other: "{{count}} seconds" 11354 }, 11355 halfAMinute: "half a minute", 11356 lessThanXMinutes: { 11357 one: "less than a minute", 11358 other: "less than {{count}} minutes" 11359 }, 11360 xMinutes: { 11361 one: "1 minute", 11362 other: "{{count}} minutes" 11363 }, 11364 aboutXHours: { 11365 one: "about 1 hour", 11366 other: "about {{count}} hours" 11367 }, 11368 xHours: { 11369 one: "1 hour", 11370 other: "{{count}} hours" 11371 }, 11372 xDays: { 11373 one: "1 day", 11374 other: "{{count}} days" 11375 }, 11376 aboutXWeeks: { 11377 one: "about 1 week", 11378 other: "about {{count}} weeks" 11379 }, 11380 xWeeks: { 11381 one: "1 week", 11382 other: "{{count}} weeks" 11383 }, 11384 aboutXMonths: { 11385 one: "about 1 month", 11386 other: "about {{count}} months" 11387 }, 11388 xMonths: { 11389 one: "1 month", 11390 other: "{{count}} months" 11391 }, 11392 aboutXYears: { 11393 one: "about 1 year", 11394 other: "about {{count}} years" 11395 }, 11396 xYears: { 11397 one: "1 year", 11398 other: "{{count}} years" 11399 }, 11400 overXYears: { 11401 one: "over 1 year", 11402 other: "over {{count}} years" 11403 }, 11404 almostXYears: { 11405 one: "almost 1 year", 11406 other: "almost {{count}} years" 11407 } 11408 }; 11409 var formatDistance = (token, count, options) => { 11410 let result; 11411 const tokenValue = formatDistanceLocale[token]; 11412 if (typeof tokenValue === "string") { 11413 result = tokenValue; 11414 } else if (count === 1) { 11415 result = tokenValue.one; 11416 } else { 11417 result = tokenValue.other.replace("{{count}}", count.toString()); 11418 } 11419 if (options?.addSuffix) { 11420 if (options.comparison && options.comparison > 0) { 11421 return "in " + result; 11422 } else { 11423 return result + " ago"; 11424 } 11425 } 11426 return result; 11427 }; 11428 11429 // packages/dataviews/node_modules/date-fns/locale/_lib/buildFormatLongFn.js 11430 function buildFormatLongFn(args) { 11431 return (options = {}) => { 11432 const width = options.width ? String(options.width) : args.defaultWidth; 11433 const format6 = args.formats[width] || args.formats[args.defaultWidth]; 11434 return format6; 11435 }; 11436 } 11437 11438 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatLong.js 11439 var dateFormats = { 11440 full: "EEEE, MMMM do, y", 11441 long: "MMMM do, y", 11442 medium: "MMM d, y", 11443 short: "MM/dd/yyyy" 11444 }; 11445 var timeFormats = { 11446 full: "h:mm:ss a zzzz", 11447 long: "h:mm:ss a z", 11448 medium: "h:mm:ss a", 11449 short: "h:mm a" 11450 }; 11451 var dateTimeFormats = { 11452 full: "{{date}} 'at' {{time}}", 11453 long: "{{date}} 'at' {{time}}", 11454 medium: "{{date}}, {{time}}", 11455 short: "{{date}}, {{time}}" 11456 }; 11457 var formatLong = { 11458 date: buildFormatLongFn({ 11459 formats: dateFormats, 11460 defaultWidth: "full" 11461 }), 11462 time: buildFormatLongFn({ 11463 formats: timeFormats, 11464 defaultWidth: "full" 11465 }), 11466 dateTime: buildFormatLongFn({ 11467 formats: dateTimeFormats, 11468 defaultWidth: "full" 11469 }) 11470 }; 11471 11472 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatRelative.js 11473 var formatRelativeLocale = { 11474 lastWeek: "'last' eeee 'at' p", 11475 yesterday: "'yesterday at' p", 11476 today: "'today at' p", 11477 tomorrow: "'tomorrow at' p", 11478 nextWeek: "eeee 'at' p", 11479 other: "P" 11480 }; 11481 var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token]; 11482 11483 // packages/dataviews/node_modules/date-fns/locale/_lib/buildLocalizeFn.js 11484 function buildLocalizeFn(args) { 11485 return (value, options) => { 11486 const context = options?.context ? String(options.context) : "standalone"; 11487 let valuesArray; 11488 if (context === "formatting" && args.formattingValues) { 11489 const defaultWidth = args.defaultFormattingWidth || args.defaultWidth; 11490 const width = options?.width ? String(options.width) : defaultWidth; 11491 valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth]; 11492 } else { 11493 const defaultWidth = args.defaultWidth; 11494 const width = options?.width ? String(options.width) : args.defaultWidth; 11495 valuesArray = args.values[width] || args.values[defaultWidth]; 11496 } 11497 const index = args.argumentCallback ? args.argumentCallback(value) : value; 11498 return valuesArray[index]; 11499 }; 11500 } 11501 11502 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/localize.js 11503 var eraValues = { 11504 narrow: ["B", "A"], 11505 abbreviated: ["BC", "AD"], 11506 wide: ["Before Christ", "Anno Domini"] 11507 }; 11508 var quarterValues = { 11509 narrow: ["1", "2", "3", "4"], 11510 abbreviated: ["Q1", "Q2", "Q3", "Q4"], 11511 wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"] 11512 }; 11513 var monthValues = { 11514 narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], 11515 abbreviated: [ 11516 "Jan", 11517 "Feb", 11518 "Mar", 11519 "Apr", 11520 "May", 11521 "Jun", 11522 "Jul", 11523 "Aug", 11524 "Sep", 11525 "Oct", 11526 "Nov", 11527 "Dec" 11528 ], 11529 wide: [ 11530 "January", 11531 "February", 11532 "March", 11533 "April", 11534 "May", 11535 "June", 11536 "July", 11537 "August", 11538 "September", 11539 "October", 11540 "November", 11541 "December" 11542 ] 11543 }; 11544 var dayValues = { 11545 narrow: ["S", "M", "T", "W", "T", "F", "S"], 11546 short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], 11547 abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], 11548 wide: [ 11549 "Sunday", 11550 "Monday", 11551 "Tuesday", 11552 "Wednesday", 11553 "Thursday", 11554 "Friday", 11555 "Saturday" 11556 ] 11557 }; 11558 var dayPeriodValues = { 11559 narrow: { 11560 am: "a", 11561 pm: "p", 11562 midnight: "mi", 11563 noon: "n", 11564 morning: "morning", 11565 afternoon: "afternoon", 11566 evening: "evening", 11567 night: "night" 11568 }, 11569 abbreviated: { 11570 am: "AM", 11571 pm: "PM", 11572 midnight: "midnight", 11573 noon: "noon", 11574 morning: "morning", 11575 afternoon: "afternoon", 11576 evening: "evening", 11577 night: "night" 11578 }, 11579 wide: { 11580 am: "a.m.", 11581 pm: "p.m.", 11582 midnight: "midnight", 11583 noon: "noon", 11584 morning: "morning", 11585 afternoon: "afternoon", 11586 evening: "evening", 11587 night: "night" 11588 } 11589 }; 11590 var formattingDayPeriodValues = { 11591 narrow: { 11592 am: "a", 11593 pm: "p", 11594 midnight: "mi", 11595 noon: "n", 11596 morning: "in the morning", 11597 afternoon: "in the afternoon", 11598 evening: "in the evening", 11599 night: "at night" 11600 }, 11601 abbreviated: { 11602 am: "AM", 11603 pm: "PM", 11604 midnight: "midnight", 11605 noon: "noon", 11606 morning: "in the morning", 11607 afternoon: "in the afternoon", 11608 evening: "in the evening", 11609 night: "at night" 11610 }, 11611 wide: { 11612 am: "a.m.", 11613 pm: "p.m.", 11614 midnight: "midnight", 11615 noon: "noon", 11616 morning: "in the morning", 11617 afternoon: "in the afternoon", 11618 evening: "in the evening", 11619 night: "at night" 11620 } 11621 }; 11622 var ordinalNumber = (dirtyNumber, _options) => { 11623 const number = Number(dirtyNumber); 11624 const rem100 = number % 100; 11625 if (rem100 > 20 || rem100 < 10) { 11626 switch (rem100 % 10) { 11627 case 1: 11628 return number + "st"; 11629 case 2: 11630 return number + "nd"; 11631 case 3: 11632 return number + "rd"; 11633 } 11634 } 11635 return number + "th"; 11636 }; 11637 var localize = { 11638 ordinalNumber, 11639 era: buildLocalizeFn({ 11640 values: eraValues, 11641 defaultWidth: "wide" 11642 }), 11643 quarter: buildLocalizeFn({ 11644 values: quarterValues, 11645 defaultWidth: "wide", 11646 argumentCallback: (quarter) => quarter - 1 11647 }), 11648 month: buildLocalizeFn({ 11649 values: monthValues, 11650 defaultWidth: "wide" 11651 }), 11652 day: buildLocalizeFn({ 11653 values: dayValues, 11654 defaultWidth: "wide" 11655 }), 11656 dayPeriod: buildLocalizeFn({ 11657 values: dayPeriodValues, 11658 defaultWidth: "wide", 11659 formattingValues: formattingDayPeriodValues, 11660 defaultFormattingWidth: "wide" 11661 }) 11662 }; 11663 11664 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchFn.js 11665 function buildMatchFn(args) { 11666 return (string, options = {}) => { 11667 const width = options.width; 11668 const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth]; 11669 const matchResult = string.match(matchPattern); 11670 if (!matchResult) { 11671 return null; 11672 } 11673 const matchedString = matchResult[0]; 11674 const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth]; 11675 const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : ( 11676 // [TODO] -- I challenge you to fix the type 11677 findKey(parsePatterns, (pattern) => pattern.test(matchedString)) 11678 ); 11679 let value; 11680 value = args.valueCallback ? args.valueCallback(key) : key; 11681 value = options.valueCallback ? ( 11682 // [TODO] -- I challenge you to fix the type 11683 options.valueCallback(value) 11684 ) : value; 11685 const rest = string.slice(matchedString.length); 11686 return { value, rest }; 11687 }; 11688 } 11689 function findKey(object, predicate) { 11690 for (const key in object) { 11691 if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) { 11692 return key; 11693 } 11694 } 11695 return void 0; 11696 } 11697 function findIndex(array, predicate) { 11698 for (let key = 0; key < array.length; key++) { 11699 if (predicate(array[key])) { 11700 return key; 11701 } 11702 } 11703 return void 0; 11704 } 11705 11706 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js 11707 function buildMatchPatternFn(args) { 11708 return (string, options = {}) => { 11709 const matchResult = string.match(args.matchPattern); 11710 if (!matchResult) return null; 11711 const matchedString = matchResult[0]; 11712 const parseResult = string.match(args.parsePattern); 11713 if (!parseResult) return null; 11714 let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]; 11715 value = options.valueCallback ? options.valueCallback(value) : value; 11716 const rest = string.slice(matchedString.length); 11717 return { value, rest }; 11718 }; 11719 } 11720 11721 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/match.js 11722 var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i; 11723 var parseOrdinalNumberPattern = /\d+/i; 11724 var matchEraPatterns = { 11725 narrow: /^(b|a)/i, 11726 abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i, 11727 wide: /^(before christ|before common era|anno domini|common era)/i 11728 }; 11729 var parseEraPatterns = { 11730 any: [/^b/i, /^(a|c)/i] 11731 }; 11732 var matchQuarterPatterns = { 11733 narrow: /^[1234]/i, 11734 abbreviated: /^q[1234]/i, 11735 wide: /^[1234](th|st|nd|rd)? quarter/i 11736 }; 11737 var parseQuarterPatterns = { 11738 any: [/1/i, /2/i, /3/i, /4/i] 11739 }; 11740 var matchMonthPatterns = { 11741 narrow: /^[jfmasond]/i, 11742 abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i, 11743 wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i 11744 }; 11745 var parseMonthPatterns = { 11746 narrow: [ 11747 /^j/i, 11748 /^f/i, 11749 /^m/i, 11750 /^a/i, 11751 /^m/i, 11752 /^j/i, 11753 /^j/i, 11754 /^a/i, 11755 /^s/i, 11756 /^o/i, 11757 /^n/i, 11758 /^d/i 11759 ], 11760 any: [ 11761 /^ja/i, 11762 /^f/i, 11763 /^mar/i, 11764 /^ap/i, 11765 /^may/i, 11766 /^jun/i, 11767 /^jul/i, 11768 /^au/i, 11769 /^s/i, 11770 /^o/i, 11771 /^n/i, 11772 /^d/i 11773 ] 11774 }; 11775 var matchDayPatterns = { 11776 narrow: /^[smtwf]/i, 11777 short: /^(su|mo|tu|we|th|fr|sa)/i, 11778 abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i, 11779 wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i 11780 }; 11781 var parseDayPatterns = { 11782 narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i], 11783 any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] 11784 }; 11785 var matchDayPeriodPatterns = { 11786 narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i, 11787 any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i 11788 }; 11789 var parseDayPeriodPatterns = { 11790 any: { 11791 am: /^a/i, 11792 pm: /^p/i, 11793 midnight: /^mi/i, 11794 noon: /^no/i, 11795 morning: /morning/i, 11796 afternoon: /afternoon/i, 11797 evening: /evening/i, 11798 night: /night/i 11799 } 11800 }; 11801 var match = { 11802 ordinalNumber: buildMatchPatternFn({ 11803 matchPattern: matchOrdinalNumberPattern, 11804 parsePattern: parseOrdinalNumberPattern, 11805 valueCallback: (value) => parseInt(value, 10) 11806 }), 11807 era: buildMatchFn({ 11808 matchPatterns: matchEraPatterns, 11809 defaultMatchWidth: "wide", 11810 parsePatterns: parseEraPatterns, 11811 defaultParseWidth: "any" 11812 }), 11813 quarter: buildMatchFn({ 11814 matchPatterns: matchQuarterPatterns, 11815 defaultMatchWidth: "wide", 11816 parsePatterns: parseQuarterPatterns, 11817 defaultParseWidth: "any", 11818 valueCallback: (index) => index + 1 11819 }), 11820 month: buildMatchFn({ 11821 matchPatterns: matchMonthPatterns, 11822 defaultMatchWidth: "wide", 11823 parsePatterns: parseMonthPatterns, 11824 defaultParseWidth: "any" 11825 }), 11826 day: buildMatchFn({ 11827 matchPatterns: matchDayPatterns, 11828 defaultMatchWidth: "wide", 11829 parsePatterns: parseDayPatterns, 11830 defaultParseWidth: "any" 11831 }), 11832 dayPeriod: buildMatchFn({ 11833 matchPatterns: matchDayPeriodPatterns, 11834 defaultMatchWidth: "any", 11835 parsePatterns: parseDayPeriodPatterns, 11836 defaultParseWidth: "any" 11837 }) 11838 }; 11839 11840 // packages/dataviews/node_modules/date-fns/locale/en-US.js 11841 var enUS = { 11842 code: "en-US", 11843 formatDistance, 11844 formatLong, 11845 formatRelative, 11846 localize, 11847 match, 11848 options: { 11849 weekStartsOn: 0, 11850 firstWeekContainsDate: 1 11851 } 11852 }; 11853 11854 // packages/dataviews/node_modules/date-fns/getDayOfYear.js 11855 function getDayOfYear(date, options) { 11856 const _date = toDate(date, options?.in); 11857 const diff = differenceInCalendarDays(_date, startOfYear(_date)); 11858 const dayOfYear = diff + 1; 11859 return dayOfYear; 11860 } 11861 11862 // packages/dataviews/node_modules/date-fns/getISOWeek.js 11863 function getISOWeek(date, options) { 11864 const _date = toDate(date, options?.in); 11865 const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date); 11866 return Math.round(diff / millisecondsInWeek) + 1; 11867 } 11868 11869 // packages/dataviews/node_modules/date-fns/getWeekYear.js 11870 function getWeekYear(date, options) { 11871 const _date = toDate(date, options?.in); 11872 const year = _date.getFullYear(); 11873 const defaultOptions2 = getDefaultOptions(); 11874 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1; 11875 const firstWeekOfNextYear = constructFrom(options?.in || date, 0); 11876 firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate); 11877 firstWeekOfNextYear.setHours(0, 0, 0, 0); 11878 const startOfNextYear = startOfWeek(firstWeekOfNextYear, options); 11879 const firstWeekOfThisYear = constructFrom(options?.in || date, 0); 11880 firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate); 11881 firstWeekOfThisYear.setHours(0, 0, 0, 0); 11882 const startOfThisYear = startOfWeek(firstWeekOfThisYear, options); 11883 if (+_date >= +startOfNextYear) { 11884 return year + 1; 11885 } else if (+_date >= +startOfThisYear) { 11886 return year; 11887 } else { 11888 return year - 1; 11889 } 11890 } 11891 11892 // packages/dataviews/node_modules/date-fns/startOfWeekYear.js 11893 function startOfWeekYear(date, options) { 11894 const defaultOptions2 = getDefaultOptions(); 11895 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1; 11896 const year = getWeekYear(date, options); 11897 const firstWeek = constructFrom(options?.in || date, 0); 11898 firstWeek.setFullYear(year, 0, firstWeekContainsDate); 11899 firstWeek.setHours(0, 0, 0, 0); 11900 const _date = startOfWeek(firstWeek, options); 11901 return _date; 11902 } 11903 11904 // packages/dataviews/node_modules/date-fns/getWeek.js 11905 function getWeek(date, options) { 11906 const _date = toDate(date, options?.in); 11907 const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options); 11908 return Math.round(diff / millisecondsInWeek) + 1; 11909 } 11910 11911 // packages/dataviews/node_modules/date-fns/_lib/addLeadingZeros.js 11912 function addLeadingZeros(number, targetLength) { 11913 const sign = number < 0 ? "-" : ""; 11914 const output = Math.abs(number).toString().padStart(targetLength, "0"); 11915 return sign + output; 11916 } 11917 11918 // packages/dataviews/node_modules/date-fns/_lib/format/lightFormatters.js 11919 var lightFormatters = { 11920 // Year 11921 y(date, token) { 11922 const signedYear = date.getFullYear(); 11923 const year = signedYear > 0 ? signedYear : 1 - signedYear; 11924 return addLeadingZeros(token === "yy" ? year % 100 : year, token.length); 11925 }, 11926 // Month 11927 M(date, token) { 11928 const month = date.getMonth(); 11929 return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2); 11930 }, 11931 // Day of the month 11932 d(date, token) { 11933 return addLeadingZeros(date.getDate(), token.length); 11934 }, 11935 // AM or PM 11936 a(date, token) { 11937 const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am"; 11938 switch (token) { 11939 case "a": 11940 case "aa": 11941 return dayPeriodEnumValue.toUpperCase(); 11942 case "aaa": 11943 return dayPeriodEnumValue; 11944 case "aaaaa": 11945 return dayPeriodEnumValue[0]; 11946 case "aaaa": 11947 default: 11948 return dayPeriodEnumValue === "am" ? "a.m." : "p.m."; 11949 } 11950 }, 11951 // Hour [1-12] 11952 h(date, token) { 11953 return addLeadingZeros(date.getHours() % 12 || 12, token.length); 11954 }, 11955 // Hour [0-23] 11956 H(date, token) { 11957 return addLeadingZeros(date.getHours(), token.length); 11958 }, 11959 // Minute 11960 m(date, token) { 11961 return addLeadingZeros(date.getMinutes(), token.length); 11962 }, 11963 // Second 11964 s(date, token) { 11965 return addLeadingZeros(date.getSeconds(), token.length); 11966 }, 11967 // Fraction of second 11968 S(date, token) { 11969 const numberOfDigits = token.length; 11970 const milliseconds = date.getMilliseconds(); 11971 const fractionalSeconds = Math.trunc( 11972 milliseconds * Math.pow(10, numberOfDigits - 3) 11973 ); 11974 return addLeadingZeros(fractionalSeconds, token.length); 11975 } 11976 }; 11977 11978 // packages/dataviews/node_modules/date-fns/_lib/format/formatters.js 11979 var dayPeriodEnum = { 11980 am: "am", 11981 pm: "pm", 11982 midnight: "midnight", 11983 noon: "noon", 11984 morning: "morning", 11985 afternoon: "afternoon", 11986 evening: "evening", 11987 night: "night" 11988 }; 11989 var formatters = { 11990 // Era 11991 G: function(date, token, localize2) { 11992 const era = date.getFullYear() > 0 ? 1 : 0; 11993 switch (token) { 11994 // AD, BC 11995 case "G": 11996 case "GG": 11997 case "GGG": 11998 return localize2.era(era, { width: "abbreviated" }); 11999 // A, B 12000 case "GGGGG": 12001 return localize2.era(era, { width: "narrow" }); 12002 // Anno Domini, Before Christ 12003 case "GGGG": 12004 default: 12005 return localize2.era(era, { width: "wide" }); 12006 } 12007 }, 12008 // Year 12009 y: function(date, token, localize2) { 12010 if (token === "yo") { 12011 const signedYear = date.getFullYear(); 12012 const year = signedYear > 0 ? signedYear : 1 - signedYear; 12013 return localize2.ordinalNumber(year, { unit: "year" }); 12014 } 12015 return lightFormatters.y(date, token); 12016 }, 12017 // Local week-numbering year 12018 Y: function(date, token, localize2, options) { 12019 const signedWeekYear = getWeekYear(date, options); 12020 const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear; 12021 if (token === "YY") { 12022 const twoDigitYear = weekYear % 100; 12023 return addLeadingZeros(twoDigitYear, 2); 12024 } 12025 if (token === "Yo") { 12026 return localize2.ordinalNumber(weekYear, { unit: "year" }); 12027 } 12028 return addLeadingZeros(weekYear, token.length); 12029 }, 12030 // ISO week-numbering year 12031 R: function(date, token) { 12032 const isoWeekYear = getISOWeekYear(date); 12033 return addLeadingZeros(isoWeekYear, token.length); 12034 }, 12035 // Extended year. This is a single number designating the year of this calendar system. 12036 // The main difference between `y` and `u` localizers are B.C. years: 12037 // | Year | `y` | `u` | 12038 // |------|-----|-----| 12039 // | AC 1 | 1 | 1 | 12040 // | BC 1 | 1 | 0 | 12041 // | BC 2 | 2 | -1 | 12042 // Also `yy` always returns the last two digits of a year, 12043 // while `uu` pads single digit years to 2 characters and returns other years unchanged. 12044 u: function(date, token) { 12045 const year = date.getFullYear(); 12046 return addLeadingZeros(year, token.length); 12047 }, 12048 // Quarter 12049 Q: function(date, token, localize2) { 12050 const quarter = Math.ceil((date.getMonth() + 1) / 3); 12051 switch (token) { 12052 // 1, 2, 3, 4 12053 case "Q": 12054 return String(quarter); 12055 // 01, 02, 03, 04 12056 case "QQ": 12057 return addLeadingZeros(quarter, 2); 12058 // 1st, 2nd, 3rd, 4th 12059 case "Qo": 12060 return localize2.ordinalNumber(quarter, { unit: "quarter" }); 12061 // Q1, Q2, Q3, Q4 12062 case "QQQ": 12063 return localize2.quarter(quarter, { 12064 width: "abbreviated", 12065 context: "formatting" 12066 }); 12067 // 1, 2, 3, 4 (narrow quarter; could be not numerical) 12068 case "QQQQQ": 12069 return localize2.quarter(quarter, { 12070 width: "narrow", 12071 context: "formatting" 12072 }); 12073 // 1st quarter, 2nd quarter, ... 12074 case "QQQQ": 12075 default: 12076 return localize2.quarter(quarter, { 12077 width: "wide", 12078 context: "formatting" 12079 }); 12080 } 12081 }, 12082 // Stand-alone quarter 12083 q: function(date, token, localize2) { 12084 const quarter = Math.ceil((date.getMonth() + 1) / 3); 12085 switch (token) { 12086 // 1, 2, 3, 4 12087 case "q": 12088 return String(quarter); 12089 // 01, 02, 03, 04 12090 case "qq": 12091 return addLeadingZeros(quarter, 2); 12092 // 1st, 2nd, 3rd, 4th 12093 case "qo": 12094 return localize2.ordinalNumber(quarter, { unit: "quarter" }); 12095 // Q1, Q2, Q3, Q4 12096 case "qqq": 12097 return localize2.quarter(quarter, { 12098 width: "abbreviated", 12099 context: "standalone" 12100 }); 12101 // 1, 2, 3, 4 (narrow quarter; could be not numerical) 12102 case "qqqqq": 12103 return localize2.quarter(quarter, { 12104 width: "narrow", 12105 context: "standalone" 12106 }); 12107 // 1st quarter, 2nd quarter, ... 12108 case "qqqq": 12109 default: 12110 return localize2.quarter(quarter, { 12111 width: "wide", 12112 context: "standalone" 12113 }); 12114 } 12115 }, 12116 // Month 12117 M: function(date, token, localize2) { 12118 const month = date.getMonth(); 12119 switch (token) { 12120 case "M": 12121 case "MM": 12122 return lightFormatters.M(date, token); 12123 // 1st, 2nd, ..., 12th 12124 case "Mo": 12125 return localize2.ordinalNumber(month + 1, { unit: "month" }); 12126 // Jan, Feb, ..., Dec 12127 case "MMM": 12128 return localize2.month(month, { 12129 width: "abbreviated", 12130 context: "formatting" 12131 }); 12132 // J, F, ..., D 12133 case "MMMMM": 12134 return localize2.month(month, { 12135 width: "narrow", 12136 context: "formatting" 12137 }); 12138 // January, February, ..., December 12139 case "MMMM": 12140 default: 12141 return localize2.month(month, { width: "wide", context: "formatting" }); 12142 } 12143 }, 12144 // Stand-alone month 12145 L: function(date, token, localize2) { 12146 const month = date.getMonth(); 12147 switch (token) { 12148 // 1, 2, ..., 12 12149 case "L": 12150 return String(month + 1); 12151 // 01, 02, ..., 12 12152 case "LL": 12153 return addLeadingZeros(month + 1, 2); 12154 // 1st, 2nd, ..., 12th 12155 case "Lo": 12156 return localize2.ordinalNumber(month + 1, { unit: "month" }); 12157 // Jan, Feb, ..., Dec 12158 case "LLL": 12159 return localize2.month(month, { 12160 width: "abbreviated", 12161 context: "standalone" 12162 }); 12163 // J, F, ..., D 12164 case "LLLLL": 12165 return localize2.month(month, { 12166 width: "narrow", 12167 context: "standalone" 12168 }); 12169 // January, February, ..., December 12170 case "LLLL": 12171 default: 12172 return localize2.month(month, { width: "wide", context: "standalone" }); 12173 } 12174 }, 12175 // Local week of year 12176 w: function(date, token, localize2, options) { 12177 const week = getWeek(date, options); 12178 if (token === "wo") { 12179 return localize2.ordinalNumber(week, { unit: "week" }); 12180 } 12181 return addLeadingZeros(week, token.length); 12182 }, 12183 // ISO week of year 12184 I: function(date, token, localize2) { 12185 const isoWeek = getISOWeek(date); 12186 if (token === "Io") { 12187 return localize2.ordinalNumber(isoWeek, { unit: "week" }); 12188 } 12189 return addLeadingZeros(isoWeek, token.length); 12190 }, 12191 // Day of the month 12192 d: function(date, token, localize2) { 12193 if (token === "do") { 12194 return localize2.ordinalNumber(date.getDate(), { unit: "date" }); 12195 } 12196 return lightFormatters.d(date, token); 12197 }, 12198 // Day of year 12199 D: function(date, token, localize2) { 12200 const dayOfYear = getDayOfYear(date); 12201 if (token === "Do") { 12202 return localize2.ordinalNumber(dayOfYear, { unit: "dayOfYear" }); 12203 } 12204 return addLeadingZeros(dayOfYear, token.length); 12205 }, 12206 // Day of week 12207 E: function(date, token, localize2) { 12208 const dayOfWeek = date.getDay(); 12209 switch (token) { 12210 // Tue 12211 case "E": 12212 case "EE": 12213 case "EEE": 12214 return localize2.day(dayOfWeek, { 12215 width: "abbreviated", 12216 context: "formatting" 12217 }); 12218 // T 12219 case "EEEEE": 12220 return localize2.day(dayOfWeek, { 12221 width: "narrow", 12222 context: "formatting" 12223 }); 12224 // Tu 12225 case "EEEEEE": 12226 return localize2.day(dayOfWeek, { 12227 width: "short", 12228 context: "formatting" 12229 }); 12230 // Tuesday 12231 case "EEEE": 12232 default: 12233 return localize2.day(dayOfWeek, { 12234 width: "wide", 12235 context: "formatting" 12236 }); 12237 } 12238 }, 12239 // Local day of week 12240 e: function(date, token, localize2, options) { 12241 const dayOfWeek = date.getDay(); 12242 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; 12243 switch (token) { 12244 // Numerical value (Nth day of week with current locale or weekStartsOn) 12245 case "e": 12246 return String(localDayOfWeek); 12247 // Padded numerical value 12248 case "ee": 12249 return addLeadingZeros(localDayOfWeek, 2); 12250 // 1st, 2nd, ..., 7th 12251 case "eo": 12252 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" }); 12253 case "eee": 12254 return localize2.day(dayOfWeek, { 12255 width: "abbreviated", 12256 context: "formatting" 12257 }); 12258 // T 12259 case "eeeee": 12260 return localize2.day(dayOfWeek, { 12261 width: "narrow", 12262 context: "formatting" 12263 }); 12264 // Tu 12265 case "eeeeee": 12266 return localize2.day(dayOfWeek, { 12267 width: "short", 12268 context: "formatting" 12269 }); 12270 // Tuesday 12271 case "eeee": 12272 default: 12273 return localize2.day(dayOfWeek, { 12274 width: "wide", 12275 context: "formatting" 12276 }); 12277 } 12278 }, 12279 // Stand-alone local day of week 12280 c: function(date, token, localize2, options) { 12281 const dayOfWeek = date.getDay(); 12282 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; 12283 switch (token) { 12284 // Numerical value (same as in `e`) 12285 case "c": 12286 return String(localDayOfWeek); 12287 // Padded numerical value 12288 case "cc": 12289 return addLeadingZeros(localDayOfWeek, token.length); 12290 // 1st, 2nd, ..., 7th 12291 case "co": 12292 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" }); 12293 case "ccc": 12294 return localize2.day(dayOfWeek, { 12295 width: "abbreviated", 12296 context: "standalone" 12297 }); 12298 // T 12299 case "ccccc": 12300 return localize2.day(dayOfWeek, { 12301 width: "narrow", 12302 context: "standalone" 12303 }); 12304 // Tu 12305 case "cccccc": 12306 return localize2.day(dayOfWeek, { 12307 width: "short", 12308 context: "standalone" 12309 }); 12310 // Tuesday 12311 case "cccc": 12312 default: 12313 return localize2.day(dayOfWeek, { 12314 width: "wide", 12315 context: "standalone" 12316 }); 12317 } 12318 }, 12319 // ISO day of week 12320 i: function(date, token, localize2) { 12321 const dayOfWeek = date.getDay(); 12322 const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek; 12323 switch (token) { 12324 // 2 12325 case "i": 12326 return String(isoDayOfWeek); 12327 // 02 12328 case "ii": 12329 return addLeadingZeros(isoDayOfWeek, token.length); 12330 // 2nd 12331 case "io": 12332 return localize2.ordinalNumber(isoDayOfWeek, { unit: "day" }); 12333 // Tue 12334 case "iii": 12335 return localize2.day(dayOfWeek, { 12336 width: "abbreviated", 12337 context: "formatting" 12338 }); 12339 // T 12340 case "iiiii": 12341 return localize2.day(dayOfWeek, { 12342 width: "narrow", 12343 context: "formatting" 12344 }); 12345 // Tu 12346 case "iiiiii": 12347 return localize2.day(dayOfWeek, { 12348 width: "short", 12349 context: "formatting" 12350 }); 12351 // Tuesday 12352 case "iiii": 12353 default: 12354 return localize2.day(dayOfWeek, { 12355 width: "wide", 12356 context: "formatting" 12357 }); 12358 } 12359 }, 12360 // AM or PM 12361 a: function(date, token, localize2) { 12362 const hours = date.getHours(); 12363 const dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am"; 12364 switch (token) { 12365 case "a": 12366 case "aa": 12367 return localize2.dayPeriod(dayPeriodEnumValue, { 12368 width: "abbreviated", 12369 context: "formatting" 12370 }); 12371 case "aaa": 12372 return localize2.dayPeriod(dayPeriodEnumValue, { 12373 width: "abbreviated", 12374 context: "formatting" 12375 }).toLowerCase(); 12376 case "aaaaa": 12377 return localize2.dayPeriod(dayPeriodEnumValue, { 12378 width: "narrow", 12379 context: "formatting" 12380 }); 12381 case "aaaa": 12382 default: 12383 return localize2.dayPeriod(dayPeriodEnumValue, { 12384 width: "wide", 12385 context: "formatting" 12386 }); 12387 } 12388 }, 12389 // AM, PM, midnight, noon 12390 b: function(date, token, localize2) { 12391 const hours = date.getHours(); 12392 let dayPeriodEnumValue; 12393 if (hours === 12) { 12394 dayPeriodEnumValue = dayPeriodEnum.noon; 12395 } else if (hours === 0) { 12396 dayPeriodEnumValue = dayPeriodEnum.midnight; 12397 } else { 12398 dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am"; 12399 } 12400 switch (token) { 12401 case "b": 12402 case "bb": 12403 return localize2.dayPeriod(dayPeriodEnumValue, { 12404 width: "abbreviated", 12405 context: "formatting" 12406 }); 12407 case "bbb": 12408 return localize2.dayPeriod(dayPeriodEnumValue, { 12409 width: "abbreviated", 12410 context: "formatting" 12411 }).toLowerCase(); 12412 case "bbbbb": 12413 return localize2.dayPeriod(dayPeriodEnumValue, { 12414 width: "narrow", 12415 context: "formatting" 12416 }); 12417 case "bbbb": 12418 default: 12419 return localize2.dayPeriod(dayPeriodEnumValue, { 12420 width: "wide", 12421 context: "formatting" 12422 }); 12423 } 12424 }, 12425 // in the morning, in the afternoon, in the evening, at night 12426 B: function(date, token, localize2) { 12427 const hours = date.getHours(); 12428 let dayPeriodEnumValue; 12429 if (hours >= 17) { 12430 dayPeriodEnumValue = dayPeriodEnum.evening; 12431 } else if (hours >= 12) { 12432 dayPeriodEnumValue = dayPeriodEnum.afternoon; 12433 } else if (hours >= 4) { 12434 dayPeriodEnumValue = dayPeriodEnum.morning; 12435 } else { 12436 dayPeriodEnumValue = dayPeriodEnum.night; 12437 } 12438 switch (token) { 12439 case "B": 12440 case "BB": 12441 case "BBB": 12442 return localize2.dayPeriod(dayPeriodEnumValue, { 12443 width: "abbreviated", 12444 context: "formatting" 12445 }); 12446 case "BBBBB": 12447 return localize2.dayPeriod(dayPeriodEnumValue, { 12448 width: "narrow", 12449 context: "formatting" 12450 }); 12451 case "BBBB": 12452 default: 12453 return localize2.dayPeriod(dayPeriodEnumValue, { 12454 width: "wide", 12455 context: "formatting" 12456 }); 12457 } 12458 }, 12459 // Hour [1-12] 12460 h: function(date, token, localize2) { 12461 if (token === "ho") { 12462 let hours = date.getHours() % 12; 12463 if (hours === 0) hours = 12; 12464 return localize2.ordinalNumber(hours, { unit: "hour" }); 12465 } 12466 return lightFormatters.h(date, token); 12467 }, 12468 // Hour [0-23] 12469 H: function(date, token, localize2) { 12470 if (token === "Ho") { 12471 return localize2.ordinalNumber(date.getHours(), { unit: "hour" }); 12472 } 12473 return lightFormatters.H(date, token); 12474 }, 12475 // Hour [0-11] 12476 K: function(date, token, localize2) { 12477 const hours = date.getHours() % 12; 12478 if (token === "Ko") { 12479 return localize2.ordinalNumber(hours, { unit: "hour" }); 12480 } 12481 return addLeadingZeros(hours, token.length); 12482 }, 12483 // Hour [1-24] 12484 k: function(date, token, localize2) { 12485 let hours = date.getHours(); 12486 if (hours === 0) hours = 24; 12487 if (token === "ko") { 12488 return localize2.ordinalNumber(hours, { unit: "hour" }); 12489 } 12490 return addLeadingZeros(hours, token.length); 12491 }, 12492 // Minute 12493 m: function(date, token, localize2) { 12494 if (token === "mo") { 12495 return localize2.ordinalNumber(date.getMinutes(), { unit: "minute" }); 12496 } 12497 return lightFormatters.m(date, token); 12498 }, 12499 // Second 12500 s: function(date, token, localize2) { 12501 if (token === "so") { 12502 return localize2.ordinalNumber(date.getSeconds(), { unit: "second" }); 12503 } 12504 return lightFormatters.s(date, token); 12505 }, 12506 // Fraction of second 12507 S: function(date, token) { 12508 return lightFormatters.S(date, token); 12509 }, 12510 // Timezone (ISO-8601. If offset is 0, output is always `'Z'`) 12511 X: function(date, token, _localize) { 12512 const timezoneOffset = date.getTimezoneOffset(); 12513 if (timezoneOffset === 0) { 12514 return "Z"; 12515 } 12516 switch (token) { 12517 // Hours and optional minutes 12518 case "X": 12519 return formatTimezoneWithOptionalMinutes(timezoneOffset); 12520 // Hours, minutes and optional seconds without `:` delimiter 12521 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 12522 // so this token always has the same output as `XX` 12523 case "XXXX": 12524 case "XX": 12525 return formatTimezone(timezoneOffset); 12526 // Hours, minutes and optional seconds with `:` delimiter 12527 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 12528 // so this token always has the same output as `XXX` 12529 case "XXXXX": 12530 case "XXX": 12531 // Hours and minutes with `:` delimiter 12532 default: 12533 return formatTimezone(timezoneOffset, ":"); 12534 } 12535 }, 12536 // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent) 12537 x: function(date, token, _localize) { 12538 const timezoneOffset = date.getTimezoneOffset(); 12539 switch (token) { 12540 // Hours and optional minutes 12541 case "x": 12542 return formatTimezoneWithOptionalMinutes(timezoneOffset); 12543 // Hours, minutes and optional seconds without `:` delimiter 12544 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 12545 // so this token always has the same output as `xx` 12546 case "xxxx": 12547 case "xx": 12548 return formatTimezone(timezoneOffset); 12549 // Hours, minutes and optional seconds with `:` delimiter 12550 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 12551 // so this token always has the same output as `xxx` 12552 case "xxxxx": 12553 case "xxx": 12554 // Hours and minutes with `:` delimiter 12555 default: 12556 return formatTimezone(timezoneOffset, ":"); 12557 } 12558 }, 12559 // Timezone (GMT) 12560 O: function(date, token, _localize) { 12561 const timezoneOffset = date.getTimezoneOffset(); 12562 switch (token) { 12563 // Short 12564 case "O": 12565 case "OO": 12566 case "OOO": 12567 return "GMT" + formatTimezoneShort(timezoneOffset, ":"); 12568 // Long 12569 case "OOOO": 12570 default: 12571 return "GMT" + formatTimezone(timezoneOffset, ":"); 12572 } 12573 }, 12574 // Timezone (specific non-location) 12575 z: function(date, token, _localize) { 12576 const timezoneOffset = date.getTimezoneOffset(); 12577 switch (token) { 12578 // Short 12579 case "z": 12580 case "zz": 12581 case "zzz": 12582 return "GMT" + formatTimezoneShort(timezoneOffset, ":"); 12583 // Long 12584 case "zzzz": 12585 default: 12586 return "GMT" + formatTimezone(timezoneOffset, ":"); 12587 } 12588 }, 12589 // Seconds timestamp 12590 t: function(date, token, _localize) { 12591 const timestamp = Math.trunc(+date / 1e3); 12592 return addLeadingZeros(timestamp, token.length); 12593 }, 12594 // Milliseconds timestamp 12595 T: function(date, token, _localize) { 12596 return addLeadingZeros(+date, token.length); 12597 } 12598 }; 12599 function formatTimezoneShort(offset, delimiter = "") { 12600 const sign = offset > 0 ? "-" : "+"; 12601 const absOffset = Math.abs(offset); 12602 const hours = Math.trunc(absOffset / 60); 12603 const minutes = absOffset % 60; 12604 if (minutes === 0) { 12605 return sign + String(hours); 12606 } 12607 return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2); 12608 } 12609 function formatTimezoneWithOptionalMinutes(offset, delimiter) { 12610 if (offset % 60 === 0) { 12611 const sign = offset > 0 ? "-" : "+"; 12612 return sign + addLeadingZeros(Math.abs(offset) / 60, 2); 12613 } 12614 return formatTimezone(offset, delimiter); 12615 } 12616 function formatTimezone(offset, delimiter = "") { 12617 const sign = offset > 0 ? "-" : "+"; 12618 const absOffset = Math.abs(offset); 12619 const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2); 12620 const minutes = addLeadingZeros(absOffset % 60, 2); 12621 return sign + hours + delimiter + minutes; 12622 } 12623 12624 // packages/dataviews/node_modules/date-fns/_lib/format/longFormatters.js 12625 var dateLongFormatter = (pattern, formatLong2) => { 12626 switch (pattern) { 12627 case "P": 12628 return formatLong2.date({ width: "short" }); 12629 case "PP": 12630 return formatLong2.date({ width: "medium" }); 12631 case "PPP": 12632 return formatLong2.date({ width: "long" }); 12633 case "PPPP": 12634 default: 12635 return formatLong2.date({ width: "full" }); 12636 } 12637 }; 12638 var timeLongFormatter = (pattern, formatLong2) => { 12639 switch (pattern) { 12640 case "p": 12641 return formatLong2.time({ width: "short" }); 12642 case "pp": 12643 return formatLong2.time({ width: "medium" }); 12644 case "ppp": 12645 return formatLong2.time({ width: "long" }); 12646 case "pppp": 12647 default: 12648 return formatLong2.time({ width: "full" }); 12649 } 12650 }; 12651 var dateTimeLongFormatter = (pattern, formatLong2) => { 12652 const matchResult = pattern.match(/(P+)(p+)?/) || []; 12653 const datePattern = matchResult[1]; 12654 const timePattern = matchResult[2]; 12655 if (!timePattern) { 12656 return dateLongFormatter(pattern, formatLong2); 12657 } 12658 let dateTimeFormat; 12659 switch (datePattern) { 12660 case "P": 12661 dateTimeFormat = formatLong2.dateTime({ width: "short" }); 12662 break; 12663 case "PP": 12664 dateTimeFormat = formatLong2.dateTime({ width: "medium" }); 12665 break; 12666 case "PPP": 12667 dateTimeFormat = formatLong2.dateTime({ width: "long" }); 12668 break; 12669 case "PPPP": 12670 default: 12671 dateTimeFormat = formatLong2.dateTime({ width: "full" }); 12672 break; 12673 } 12674 return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2)); 12675 }; 12676 var longFormatters = { 12677 p: timeLongFormatter, 12678 P: dateTimeLongFormatter 12679 }; 12680 12681 // packages/dataviews/node_modules/date-fns/_lib/protectedTokens.js 12682 var dayOfYearTokenRE = /^D+$/; 12683 var weekYearTokenRE = /^Y+$/; 12684 var throwTokens = ["D", "DD", "YY", "YYYY"]; 12685 function isProtectedDayOfYearToken(token) { 12686 return dayOfYearTokenRE.test(token); 12687 } 12688 function isProtectedWeekYearToken(token) { 12689 return weekYearTokenRE.test(token); 12690 } 12691 function warnOrThrowProtectedError(token, format6, input) { 12692 const _message = message(token, format6, input); 12693 console.warn(_message); 12694 if (throwTokens.includes(token)) throw new RangeError(_message); 12695 } 12696 function message(token, format6, input) { 12697 const subject = token[0] === "Y" ? "years" : "days of the month"; 12698 return `Use \`$token.toLowerCase()}\` instead of \`$token}\` (in \`$format6}\`) for formatting $subject} to the input \`$input}\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`; 12699 } 12700 12701 // packages/dataviews/node_modules/date-fns/format.js 12702 var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g; 12703 var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g; 12704 var escapedStringRegExp = /^'([^]*?)'?$/; 12705 var doubleQuoteRegExp = /''/g; 12706 var unescapedLatinCharacterRegExp = /[a-zA-Z]/; 12707 function format(date, formatStr, options) { 12708 const defaultOptions2 = getDefaultOptions(); 12709 const locale = options?.locale ?? defaultOptions2.locale ?? enUS; 12710 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1; 12711 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0; 12712 const originalDate = toDate(date, options?.in); 12713 if (!isValid(originalDate)) { 12714 throw new RangeError("Invalid time value"); 12715 } 12716 let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => { 12717 const firstCharacter = substring[0]; 12718 if (firstCharacter === "p" || firstCharacter === "P") { 12719 const longFormatter = longFormatters[firstCharacter]; 12720 return longFormatter(substring, locale.formatLong); 12721 } 12722 return substring; 12723 }).join("").match(formattingTokensRegExp).map((substring) => { 12724 if (substring === "''") { 12725 return { isToken: false, value: "'" }; 12726 } 12727 const firstCharacter = substring[0]; 12728 if (firstCharacter === "'") { 12729 return { isToken: false, value: cleanEscapedString(substring) }; 12730 } 12731 if (formatters[firstCharacter]) { 12732 return { isToken: true, value: substring }; 12733 } 12734 if (firstCharacter.match(unescapedLatinCharacterRegExp)) { 12735 throw new RangeError( 12736 "Format string contains an unescaped latin alphabet character `" + firstCharacter + "`" 12737 ); 12738 } 12739 return { isToken: false, value: substring }; 12740 }); 12741 if (locale.localize.preprocessor) { 12742 parts = locale.localize.preprocessor(originalDate, parts); 12743 } 12744 const formatterOptions = { 12745 firstWeekContainsDate, 12746 weekStartsOn, 12747 locale 12748 }; 12749 return parts.map((part) => { 12750 if (!part.isToken) return part.value; 12751 const token = part.value; 12752 if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) { 12753 warnOrThrowProtectedError(token, formatStr, String(date)); 12754 } 12755 const formatter = formatters[token[0]]; 12756 return formatter(originalDate, token, locale.localize, formatterOptions); 12757 }).join(""); 12758 } 12759 function cleanEscapedString(input) { 12760 const matched = input.match(escapedStringRegExp); 12761 if (!matched) { 12762 return input; 12763 } 12764 return matched[1].replace(doubleQuoteRegExp, "'"); 12765 } 12766 12767 // packages/dataviews/node_modules/date-fns/subDays.js 12768 function subDays(date, amount, options) { 12769 return addDays(date, -amount, options); 12770 } 12771 12772 // packages/dataviews/node_modules/date-fns/subMonths.js 12773 function subMonths(date, amount, options) { 12774 return addMonths(date, -amount, options); 12775 } 12776 12777 // packages/dataviews/node_modules/date-fns/subWeeks.js 12778 function subWeeks(date, amount, options) { 12779 return addWeeks(date, -amount, options); 12780 } 12781 12782 // packages/dataviews/node_modules/date-fns/subYears.js 12783 function subYears(date, amount, options) { 12784 return addYears(date, -amount, options); 12785 } 12786 12787 // packages/dataviews/build-module/dataform-controls/datetime.js 12788 var import_components34 = __toESM(require_components()); 12789 var import_element39 = __toESM(require_element()); 12790 var import_i18n32 = __toESM(require_i18n()); 12791 var import_date2 = __toESM(require_date()); 12792 12793 // packages/dataviews/build-module/dataform-controls/utils/relative-date-control.js 12794 var import_components33 = __toESM(require_components()); 12795 var import_element38 = __toESM(require_element()); 12796 var import_i18n31 = __toESM(require_i18n()); 12797 var import_jsx_runtime69 = __toESM(require_jsx_runtime()); 12798 var TIME_UNITS_OPTIONS = { 12799 [OPERATOR_IN_THE_PAST]: [ 12800 { value: "days", label: (0, import_i18n31.__)("Days") }, 12801 { value: "weeks", label: (0, import_i18n31.__)("Weeks") }, 12802 { value: "months", label: (0, import_i18n31.__)("Months") }, 12803 { value: "years", label: (0, import_i18n31.__)("Years") } 12804 ], 12805 [OPERATOR_OVER]: [ 12806 { value: "days", label: (0, import_i18n31.__)("Days ago") }, 12807 { value: "weeks", label: (0, import_i18n31.__)("Weeks ago") }, 12808 { value: "months", label: (0, import_i18n31.__)("Months ago") }, 12809 { value: "years", label: (0, import_i18n31.__)("Years ago") } 12810 ] 12811 }; 12812 function RelativeDateControl({ 12813 className, 12814 data, 12815 field, 12816 onChange, 12817 hideLabelFromVision, 12818 operator 12819 }) { 12820 const options = TIME_UNITS_OPTIONS[operator === OPERATOR_IN_THE_PAST ? "inThePast" : "over"]; 12821 const { id, label, getValue, setValue } = field; 12822 const fieldValue = getValue({ item: data }); 12823 const { value: relValue = "", unit = options[0].value } = fieldValue && typeof fieldValue === "object" ? fieldValue : {}; 12824 const onChangeValue = (0, import_element38.useCallback)( 12825 (newValue) => onChange( 12826 setValue({ 12827 item: data, 12828 value: { value: Number(newValue), unit } 12829 }) 12830 ), 12831 [onChange, setValue, data, unit] 12832 ); 12833 const onChangeUnit = (0, import_element38.useCallback)( 12834 (newUnit) => onChange( 12835 setValue({ 12836 item: data, 12837 value: { value: relValue, unit: newUnit } 12838 }) 12839 ), 12840 [onChange, setValue, data, relValue] 12841 ); 12842 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)( 12843 import_components33.BaseControl, 12844 { 12845 id, 12846 className: clsx_default(className, "dataviews-controls__relative-date"), 12847 label, 12848 hideLabelFromVision, 12849 children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_components33.__experimentalHStack, { spacing: 2.5, children: [ 12850 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)( 12851 import_components33.__experimentalNumberControl, 12852 { 12853 __next40pxDefaultSize: true, 12854 className: "dataviews-controls__relative-date-number", 12855 spinControls: "none", 12856 min: 1, 12857 step: 1, 12858 value: relValue, 12859 onChange: onChangeValue 12860 } 12861 ), 12862 /* @__PURE__ */ (0, import_jsx_runtime69.jsx)( 12863 import_components33.SelectControl, 12864 { 12865 className: "dataviews-controls__relative-date-unit", 12866 __next40pxDefaultSize: true, 12867 label: (0, import_i18n31.__)("Unit"), 12868 value: unit, 12869 options, 12870 onChange: onChangeUnit, 12871 hideLabelFromVision: true 12872 } 12873 ) 12874 ] }) 12875 } 12876 ); 12877 } 12878 12879 // packages/dataviews/build-module/field-types/utils/parse-date-time.js 12880 var import_date = __toESM(require_date()); 12881 function parseDateTime(dateTimeString) { 12882 if (!dateTimeString) { 12883 return null; 12884 } 12885 const parsed = (0, import_date.getDate)(dateTimeString); 12886 return parsed && isValid(parsed) ? parsed : null; 12887 } 12888 12889 // packages/dataviews/build-module/dataform-controls/datetime.js 12890 var import_jsx_runtime70 = __toESM(require_jsx_runtime()); 12891 var { DateCalendar, ValidatedInputControl } = unlock(import_components34.privateApis); 12892 var formatDateTime = (date) => { 12893 if (!date) { 12894 return ""; 12895 } 12896 if (typeof date === "string") { 12897 return date; 12898 } 12899 return format(date, "yyyy-MM-dd'T'HH:mm"); 12900 }; 12901 function CalendarDateTimeControl({ 12902 data, 12903 field, 12904 onChange, 12905 hideLabelFromVision, 12906 validity 12907 }) { 12908 const { id, label, description, setValue, getValue, isValid: isValid2 } = field; 12909 const fieldValue = getValue({ item: data }); 12910 const value = typeof fieldValue === "string" ? fieldValue : void 0; 12911 const [calendarMonth, setCalendarMonth] = (0, import_element39.useState)(() => { 12912 const parsedDate = parseDateTime(value); 12913 return parsedDate || /* @__PURE__ */ new Date(); 12914 }); 12915 const inputControlRef = (0, import_element39.useRef)(null); 12916 const validationTimeoutRef = (0, import_element39.useRef)(); 12917 const previousFocusRef = (0, import_element39.useRef)(null); 12918 const onChangeCallback = (0, import_element39.useCallback)( 12919 (newValue) => onChange(setValue({ item: data, value: newValue })), 12920 [data, onChange, setValue] 12921 ); 12922 (0, import_element39.useEffect)(() => { 12923 return () => { 12924 if (validationTimeoutRef.current) { 12925 clearTimeout(validationTimeoutRef.current); 12926 } 12927 }; 12928 }, []); 12929 const onSelectDate = (0, import_element39.useCallback)( 12930 (newDate) => { 12931 let dateTimeValue; 12932 if (newDate) { 12933 let finalDateTime = newDate; 12934 if (value) { 12935 const currentDateTime = parseDateTime(value); 12936 if (currentDateTime) { 12937 finalDateTime = new Date(newDate); 12938 finalDateTime.setHours(currentDateTime.getHours()); 12939 finalDateTime.setMinutes( 12940 currentDateTime.getMinutes() 12941 ); 12942 } 12943 } 12944 dateTimeValue = finalDateTime.toISOString(); 12945 onChangeCallback(dateTimeValue); 12946 if (validationTimeoutRef.current) { 12947 clearTimeout(validationTimeoutRef.current); 12948 } 12949 } else { 12950 onChangeCallback(void 0); 12951 } 12952 previousFocusRef.current = inputControlRef.current && inputControlRef.current.ownerDocument.activeElement; 12953 validationTimeoutRef.current = setTimeout(() => { 12954 if (inputControlRef.current) { 12955 inputControlRef.current.focus(); 12956 inputControlRef.current.blur(); 12957 onChangeCallback(dateTimeValue); 12958 if (previousFocusRef.current && previousFocusRef.current instanceof HTMLElement) { 12959 previousFocusRef.current.focus(); 12960 } 12961 } 12962 }, 0); 12963 }, 12964 [onChangeCallback, value] 12965 ); 12966 const handleManualDateTimeChange = (0, import_element39.useCallback)( 12967 (newValue) => { 12968 if (newValue) { 12969 const dateTime = new Date(newValue); 12970 onChangeCallback(dateTime.toISOString()); 12971 const parsedDate = parseDateTime(dateTime.toISOString()); 12972 if (parsedDate) { 12973 setCalendarMonth(parsedDate); 12974 } 12975 } else { 12976 onChangeCallback(void 0); 12977 } 12978 }, 12979 [onChangeCallback] 12980 ); 12981 const { format: fieldFormat } = field; 12982 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date2.getSettings)().l10n.startOfWeek; 12983 const { 12984 timezone: { string: timezoneString } 12985 } = (0, import_date2.getSettings)(); 12986 const displayLabel = isValid2?.required && !hideLabelFromVision ? `$label} (${(0, import_i18n32.__)("Required")})` : label; 12987 return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)( 12988 import_components34.BaseControl, 12989 { 12990 id, 12991 label: displayLabel, 12992 help: description, 12993 hideLabelFromVision, 12994 children: /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(import_components34.__experimentalVStack, { spacing: 4, children: [ 12995 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)( 12996 DateCalendar, 12997 { 12998 style: { width: "100%" }, 12999 selected: value ? parseDateTime(value) || void 0 : void 0, 13000 onSelect: onSelectDate, 13001 month: calendarMonth, 13002 onMonthChange: setCalendarMonth, 13003 timeZone: timezoneString || void 0, 13004 weekStartsOn 13005 } 13006 ), 13007 /* @__PURE__ */ (0, import_jsx_runtime70.jsx)( 13008 ValidatedInputControl, 13009 { 13010 ref: inputControlRef, 13011 __next40pxDefaultSize: true, 13012 required: !!isValid2?.required, 13013 customValidity: getCustomValidity(isValid2, validity), 13014 type: "datetime-local", 13015 label: (0, import_i18n32.__)("Date time"), 13016 hideLabelFromVision: true, 13017 value: value ? formatDateTime( 13018 parseDateTime(value) || void 0 13019 ) : "", 13020 onChange: handleManualDateTimeChange 13021 } 13022 ) 13023 ] }) 13024 } 13025 ); 13026 } 13027 function DateTime({ 13028 data, 13029 field, 13030 onChange, 13031 hideLabelFromVision, 13032 operator, 13033 validity 13034 }) { 13035 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) { 13036 return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)( 13037 RelativeDateControl, 13038 { 13039 className: "dataviews-controls__datetime", 13040 data, 13041 field, 13042 onChange, 13043 hideLabelFromVision, 13044 operator 13045 } 13046 ); 13047 } 13048 return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)( 13049 CalendarDateTimeControl, 13050 { 13051 data, 13052 field, 13053 onChange, 13054 hideLabelFromVision, 13055 validity 13056 } 13057 ); 13058 } 13059 13060 // packages/dataviews/build-module/dataform-controls/date.js 13061 var import_components35 = __toESM(require_components()); 13062 var import_element40 = __toESM(require_element()); 13063 var import_i18n33 = __toESM(require_i18n()); 13064 var import_date3 = __toESM(require_date()); 13065 var import_jsx_runtime71 = __toESM(require_jsx_runtime()); 13066 var { DateCalendar: DateCalendar2, DateRangeCalendar } = unlock(import_components35.privateApis); 13067 var DATE_PRESETS = [ 13068 { 13069 id: "today", 13070 label: (0, import_i18n33.__)("Today"), 13071 getValue: () => (0, import_date3.getDate)(null) 13072 }, 13073 { 13074 id: "yesterday", 13075 label: (0, import_i18n33.__)("Yesterday"), 13076 getValue: () => { 13077 const today = (0, import_date3.getDate)(null); 13078 return subDays(today, 1); 13079 } 13080 }, 13081 { 13082 id: "past-week", 13083 label: (0, import_i18n33.__)("Past week"), 13084 getValue: () => { 13085 const today = (0, import_date3.getDate)(null); 13086 return subDays(today, 7); 13087 } 13088 }, 13089 { 13090 id: "past-month", 13091 label: (0, import_i18n33.__)("Past month"), 13092 getValue: () => { 13093 const today = (0, import_date3.getDate)(null); 13094 return subMonths(today, 1); 13095 } 13096 } 13097 ]; 13098 var DATE_RANGE_PRESETS = [ 13099 { 13100 id: "last-7-days", 13101 label: (0, import_i18n33.__)("Last 7 days"), 13102 getValue: () => { 13103 const today = (0, import_date3.getDate)(null); 13104 return [subDays(today, 7), today]; 13105 } 13106 }, 13107 { 13108 id: "last-30-days", 13109 label: (0, import_i18n33.__)("Last 30 days"), 13110 getValue: () => { 13111 const today = (0, import_date3.getDate)(null); 13112 return [subDays(today, 30), today]; 13113 } 13114 }, 13115 { 13116 id: "month-to-date", 13117 label: (0, import_i18n33.__)("Month to date"), 13118 getValue: () => { 13119 const today = (0, import_date3.getDate)(null); 13120 return [startOfMonth(today), today]; 13121 } 13122 }, 13123 { 13124 id: "last-year", 13125 label: (0, import_i18n33.__)("Last year"), 13126 getValue: () => { 13127 const today = (0, import_date3.getDate)(null); 13128 return [subYears(today, 1), today]; 13129 } 13130 }, 13131 { 13132 id: "year-to-date", 13133 label: (0, import_i18n33.__)("Year to date"), 13134 getValue: () => { 13135 const today = (0, import_date3.getDate)(null); 13136 return [startOfYear(today), today]; 13137 } 13138 } 13139 ]; 13140 var parseDate = (dateString) => { 13141 if (!dateString) { 13142 return null; 13143 } 13144 const parsed = (0, import_date3.getDate)(dateString); 13145 return parsed && isValid(parsed) ? parsed : null; 13146 }; 13147 var formatDate = (date) => { 13148 if (!date) { 13149 return ""; 13150 } 13151 return typeof date === "string" ? date : format(date, "yyyy-MM-dd"); 13152 }; 13153 function ValidatedDateControl({ 13154 field, 13155 validity, 13156 inputRefs, 13157 isTouched, 13158 setIsTouched, 13159 children 13160 }) { 13161 const { isValid: isValid2 } = field; 13162 const [customValidity, setCustomValidity] = (0, import_element40.useState)(void 0); 13163 const validateRefs = (0, import_element40.useCallback)(() => { 13164 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs]; 13165 for (const ref of refs) { 13166 const input = ref.current; 13167 if (input && !input.validity.valid) { 13168 setCustomValidity({ 13169 type: "invalid", 13170 message: input.validationMessage 13171 }); 13172 return; 13173 } 13174 } 13175 setCustomValidity(void 0); 13176 }, [inputRefs]); 13177 (0, import_element40.useEffect)(() => { 13178 if (isTouched) { 13179 const timeoutId = setTimeout(() => { 13180 if (validity) { 13181 setCustomValidity(getCustomValidity(isValid2, validity)); 13182 } else { 13183 validateRefs(); 13184 } 13185 }, 0); 13186 return () => clearTimeout(timeoutId); 13187 } 13188 return void 0; 13189 }, [isTouched, isValid2, validity, validateRefs]); 13190 const onBlur = (event) => { 13191 if (isTouched) { 13192 return; 13193 } 13194 if (!event.relatedTarget || !event.currentTarget.contains(event.relatedTarget)) { 13195 setIsTouched(true); 13196 } 13197 }; 13198 return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { onBlur, children: [ 13199 children, 13200 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { "aria-live": "polite", children: customValidity && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)( 13201 "p", 13202 { 13203 className: clsx_default( 13204 "components-validated-control__indicator", 13205 customValidity.type === "invalid" ? "is-invalid" : void 0, 13206 customValidity.type === "valid" ? "is-valid" : void 0 13207 ), 13208 children: [ 13209 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13210 import_components35.Icon, 13211 { 13212 className: "components-validated-control__indicator-icon", 13213 icon: error_default, 13214 size: 16, 13215 fill: "currentColor" 13216 } 13217 ), 13218 customValidity.message 13219 ] 13220 } 13221 ) }) 13222 ] }); 13223 } 13224 function CalendarDateControl({ 13225 data, 13226 field, 13227 onChange, 13228 hideLabelFromVision, 13229 validity 13230 }) { 13231 const { 13232 id, 13233 label, 13234 setValue, 13235 getValue, 13236 isValid: isValid2, 13237 format: fieldFormat 13238 } = field; 13239 const [selectedPresetId, setSelectedPresetId] = (0, import_element40.useState)( 13240 null 13241 ); 13242 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek; 13243 const fieldValue = getValue({ item: data }); 13244 const value = typeof fieldValue === "string" ? fieldValue : void 0; 13245 const [calendarMonth, setCalendarMonth] = (0, import_element40.useState)(() => { 13246 const parsedDate = parseDate(value); 13247 return parsedDate || /* @__PURE__ */ new Date(); 13248 }); 13249 const [isTouched, setIsTouched] = (0, import_element40.useState)(false); 13250 const validityTargetRef = (0, import_element40.useRef)(null); 13251 const onChangeCallback = (0, import_element40.useCallback)( 13252 (newValue) => onChange(setValue({ item: data, value: newValue })), 13253 [data, onChange, setValue] 13254 ); 13255 const onSelectDate = (0, import_element40.useCallback)( 13256 (newDate) => { 13257 const dateValue = newDate ? format(newDate, "yyyy-MM-dd") : void 0; 13258 onChangeCallback(dateValue); 13259 setSelectedPresetId(null); 13260 setIsTouched(true); 13261 }, 13262 [onChangeCallback] 13263 ); 13264 const handlePresetClick = (0, import_element40.useCallback)( 13265 (preset) => { 13266 const presetDate = preset.getValue(); 13267 const dateValue = formatDate(presetDate); 13268 setCalendarMonth(presetDate); 13269 onChangeCallback(dateValue); 13270 setSelectedPresetId(preset.id); 13271 setIsTouched(true); 13272 }, 13273 [onChangeCallback] 13274 ); 13275 const handleManualDateChange = (0, import_element40.useCallback)( 13276 (newValue) => { 13277 onChangeCallback(newValue); 13278 if (newValue) { 13279 const parsedDate = parseDate(newValue); 13280 if (parsedDate) { 13281 setCalendarMonth(parsedDate); 13282 } 13283 } 13284 setSelectedPresetId(null); 13285 setIsTouched(true); 13286 }, 13287 [onChangeCallback] 13288 ); 13289 const { 13290 timezone: { string: timezoneString } 13291 } = (0, import_date3.getSettings)(); 13292 const displayLabel = isValid2?.required ? `$label} (${(0, import_i18n33.__)("Required")})` : label; 13293 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13294 ValidatedDateControl, 13295 { 13296 field, 13297 validity, 13298 inputRefs: validityTargetRef, 13299 isTouched, 13300 setIsTouched, 13301 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13302 import_components35.BaseControl, 13303 { 13304 id, 13305 className: "dataviews-controls__date", 13306 label: displayLabel, 13307 hideLabelFromVision, 13308 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components35.__experimentalVStack, { spacing: 4, children: [ 13309 /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components35.__experimentalHStack, { spacing: 2, wrap: true, justify: "flex-start", children: [ 13310 DATE_PRESETS.map((preset) => { 13311 const isSelected2 = selectedPresetId === preset.id; 13312 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13313 import_components35.Button, 13314 { 13315 className: "dataviews-controls__date-preset", 13316 variant: "tertiary", 13317 isPressed: isSelected2, 13318 size: "small", 13319 onClick: () => handlePresetClick(preset), 13320 children: preset.label 13321 }, 13322 preset.id 13323 ); 13324 }), 13325 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13326 import_components35.Button, 13327 { 13328 className: "dataviews-controls__date-preset", 13329 variant: "tertiary", 13330 isPressed: !selectedPresetId, 13331 size: "small", 13332 disabled: !!selectedPresetId, 13333 accessibleWhenDisabled: false, 13334 children: (0, import_i18n33.__)("Custom") 13335 } 13336 ) 13337 ] }), 13338 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13339 import_components35.__experimentalInputControl, 13340 { 13341 __next40pxDefaultSize: true, 13342 ref: validityTargetRef, 13343 type: "date", 13344 label: (0, import_i18n33.__)("Date"), 13345 hideLabelFromVision: true, 13346 value, 13347 onChange: handleManualDateChange, 13348 required: !!field.isValid?.required 13349 } 13350 ), 13351 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13352 DateCalendar2, 13353 { 13354 style: { width: "100%" }, 13355 selected: value ? parseDate(value) || void 0 : void 0, 13356 onSelect: onSelectDate, 13357 month: calendarMonth, 13358 onMonthChange: setCalendarMonth, 13359 timeZone: timezoneString || void 0, 13360 weekStartsOn 13361 } 13362 ) 13363 ] }) 13364 } 13365 ) 13366 } 13367 ); 13368 } 13369 function CalendarDateRangeControl({ 13370 data, 13371 field, 13372 onChange, 13373 hideLabelFromVision, 13374 validity 13375 }) { 13376 const { id, label, getValue, setValue, format: fieldFormat } = field; 13377 let value; 13378 const fieldValue = getValue({ item: data }); 13379 if (Array.isArray(fieldValue) && fieldValue.length === 2 && fieldValue.every((date) => typeof date === "string")) { 13380 value = fieldValue; 13381 } 13382 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek; 13383 const onChangeCallback = (0, import_element40.useCallback)( 13384 (newValue) => { 13385 onChange( 13386 setValue({ 13387 item: data, 13388 value: newValue 13389 }) 13390 ); 13391 }, 13392 [data, onChange, setValue] 13393 ); 13394 const [selectedPresetId, setSelectedPresetId] = (0, import_element40.useState)( 13395 null 13396 ); 13397 const selectedRange = (0, import_element40.useMemo)(() => { 13398 if (!value) { 13399 return { from: void 0, to: void 0 }; 13400 } 13401 const [from, to] = value; 13402 return { 13403 from: parseDate(from) || void 0, 13404 to: parseDate(to) || void 0 13405 }; 13406 }, [value]); 13407 const [calendarMonth, setCalendarMonth] = (0, import_element40.useState)(() => { 13408 return selectedRange.from || /* @__PURE__ */ new Date(); 13409 }); 13410 const [isTouched, setIsTouched] = (0, import_element40.useState)(false); 13411 const fromInputRef = (0, import_element40.useRef)(null); 13412 const toInputRef = (0, import_element40.useRef)(null); 13413 const updateDateRange = (0, import_element40.useCallback)( 13414 (fromDate, toDate2) => { 13415 if (fromDate && toDate2) { 13416 onChangeCallback([ 13417 formatDate(fromDate), 13418 formatDate(toDate2) 13419 ]); 13420 } else if (!fromDate && !toDate2) { 13421 onChangeCallback(void 0); 13422 } 13423 }, 13424 [onChangeCallback] 13425 ); 13426 const onSelectCalendarRange = (0, import_element40.useCallback)( 13427 (newRange) => { 13428 updateDateRange(newRange?.from, newRange?.to); 13429 setSelectedPresetId(null); 13430 setIsTouched(true); 13431 }, 13432 [updateDateRange] 13433 ); 13434 const handlePresetClick = (0, import_element40.useCallback)( 13435 (preset) => { 13436 const [startDate, endDate] = preset.getValue(); 13437 setCalendarMonth(startDate); 13438 updateDateRange(startDate, endDate); 13439 setSelectedPresetId(preset.id); 13440 setIsTouched(true); 13441 }, 13442 [updateDateRange] 13443 ); 13444 const handleManualDateChange = (0, import_element40.useCallback)( 13445 (fromOrTo, newValue) => { 13446 const [currentFrom, currentTo] = value || [ 13447 void 0, 13448 void 0 13449 ]; 13450 const updatedFrom = fromOrTo === "from" ? newValue : currentFrom; 13451 const updatedTo = fromOrTo === "to" ? newValue : currentTo; 13452 updateDateRange(updatedFrom, updatedTo); 13453 if (newValue) { 13454 const parsedDate = parseDate(newValue); 13455 if (parsedDate) { 13456 setCalendarMonth(parsedDate); 13457 } 13458 } 13459 setSelectedPresetId(null); 13460 setIsTouched(true); 13461 }, 13462 [value, updateDateRange] 13463 ); 13464 const { timezone } = (0, import_date3.getSettings)(); 13465 const displayLabel = field.isValid?.required ? `$label} (${(0, import_i18n33.__)("Required")})` : label; 13466 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13467 ValidatedDateControl, 13468 { 13469 field, 13470 validity, 13471 inputRefs: [fromInputRef, toInputRef], 13472 isTouched, 13473 setIsTouched, 13474 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13475 import_components35.BaseControl, 13476 { 13477 id, 13478 className: "dataviews-controls__date", 13479 label: displayLabel, 13480 hideLabelFromVision, 13481 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components35.__experimentalVStack, { spacing: 4, children: [ 13482 /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components35.__experimentalHStack, { spacing: 2, wrap: true, justify: "flex-start", children: [ 13483 DATE_RANGE_PRESETS.map((preset) => { 13484 const isSelected2 = selectedPresetId === preset.id; 13485 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13486 import_components35.Button, 13487 { 13488 className: "dataviews-controls__date-preset", 13489 variant: "tertiary", 13490 isPressed: isSelected2, 13491 size: "small", 13492 onClick: () => handlePresetClick(preset), 13493 children: preset.label 13494 }, 13495 preset.id 13496 ); 13497 }), 13498 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13499 import_components35.Button, 13500 { 13501 className: "dataviews-controls__date-preset", 13502 variant: "tertiary", 13503 isPressed: !selectedPresetId, 13504 size: "small", 13505 accessibleWhenDisabled: false, 13506 disabled: !!selectedPresetId, 13507 children: (0, import_i18n33.__)("Custom") 13508 } 13509 ) 13510 ] }), 13511 /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components35.__experimentalHStack, { spacing: 2, children: [ 13512 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13513 import_components35.__experimentalInputControl, 13514 { 13515 __next40pxDefaultSize: true, 13516 ref: fromInputRef, 13517 type: "date", 13518 label: (0, import_i18n33.__)("From"), 13519 hideLabelFromVision: true, 13520 value: value?.[0], 13521 onChange: (newValue) => handleManualDateChange("from", newValue), 13522 required: !!field.isValid?.required 13523 } 13524 ), 13525 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13526 import_components35.__experimentalInputControl, 13527 { 13528 __next40pxDefaultSize: true, 13529 ref: toInputRef, 13530 type: "date", 13531 label: (0, import_i18n33.__)("To"), 13532 hideLabelFromVision: true, 13533 value: value?.[1], 13534 onChange: (newValue) => handleManualDateChange("to", newValue), 13535 required: !!field.isValid?.required 13536 } 13537 ) 13538 ] }), 13539 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13540 DateRangeCalendar, 13541 { 13542 style: { width: "100%" }, 13543 selected: selectedRange, 13544 onSelect: onSelectCalendarRange, 13545 month: calendarMonth, 13546 onMonthChange: setCalendarMonth, 13547 timeZone: timezone.string || void 0, 13548 weekStartsOn 13549 } 13550 ) 13551 ] }) 13552 } 13553 ) 13554 } 13555 ); 13556 } 13557 function DateControl({ 13558 data, 13559 field, 13560 onChange, 13561 hideLabelFromVision, 13562 operator, 13563 validity 13564 }) { 13565 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) { 13566 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13567 RelativeDateControl, 13568 { 13569 className: "dataviews-controls__date", 13570 data, 13571 field, 13572 onChange, 13573 hideLabelFromVision, 13574 operator 13575 } 13576 ); 13577 } 13578 if (operator === OPERATOR_BETWEEN) { 13579 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13580 CalendarDateRangeControl, 13581 { 13582 data, 13583 field, 13584 onChange, 13585 hideLabelFromVision, 13586 validity 13587 } 13588 ); 13589 } 13590 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 13591 CalendarDateControl, 13592 { 13593 data, 13594 field, 13595 onChange, 13596 hideLabelFromVision, 13597 validity 13598 } 13599 ); 13600 } 13601 13602 // packages/dataviews/build-module/dataform-controls/email.js 13603 var import_components37 = __toESM(require_components()); 13604 13605 // packages/dataviews/build-module/dataform-controls/utils/validated-input.js 13606 var import_components36 = __toESM(require_components()); 13607 var import_element41 = __toESM(require_element()); 13608 var import_jsx_runtime72 = __toESM(require_jsx_runtime()); 13609 var { ValidatedInputControl: ValidatedInputControl2 } = unlock(import_components36.privateApis); 13610 function ValidatedText({ 13611 data, 13612 field, 13613 onChange, 13614 hideLabelFromVision, 13615 type, 13616 prefix, 13617 suffix, 13618 validity 13619 }) { 13620 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field; 13621 const value = getValue({ item: data }); 13622 const onChangeControl = (0, import_element41.useCallback)( 13623 (newValue) => onChange( 13624 setValue({ 13625 item: data, 13626 value: newValue 13627 }) 13628 ), 13629 [data, setValue, onChange] 13630 ); 13631 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)( 13632 ValidatedInputControl2, 13633 { 13634 required: !!isValid2.required, 13635 customValidity: getCustomValidity(isValid2, validity), 13636 label, 13637 placeholder, 13638 value: value ?? "", 13639 help: description, 13640 onChange: onChangeControl, 13641 hideLabelFromVision, 13642 type, 13643 prefix, 13644 suffix, 13645 pattern: isValid2.pattern ? isValid2.pattern.constraint : void 0, 13646 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0, 13647 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0, 13648 __next40pxDefaultSize: true 13649 } 13650 ); 13651 } 13652 13653 // packages/dataviews/build-module/dataform-controls/email.js 13654 var import_jsx_runtime73 = __toESM(require_jsx_runtime()); 13655 function Email({ 13656 data, 13657 field, 13658 onChange, 13659 hideLabelFromVision, 13660 validity 13661 }) { 13662 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)( 13663 ValidatedText, 13664 { 13665 ...{ 13666 data, 13667 field, 13668 onChange, 13669 hideLabelFromVision, 13670 validity, 13671 type: "email", 13672 prefix: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_components37.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_components37.Icon, { icon: envelope_default }) }) 13673 } 13674 } 13675 ); 13676 } 13677 13678 // packages/dataviews/build-module/dataform-controls/telephone.js 13679 var import_components38 = __toESM(require_components()); 13680 var import_jsx_runtime74 = __toESM(require_jsx_runtime()); 13681 function Telephone({ 13682 data, 13683 field, 13684 onChange, 13685 hideLabelFromVision, 13686 validity 13687 }) { 13688 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)( 13689 ValidatedText, 13690 { 13691 ...{ 13692 data, 13693 field, 13694 onChange, 13695 hideLabelFromVision, 13696 validity, 13697 type: "tel", 13698 prefix: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_components38.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_components38.Icon, { icon: mobile_default }) }) 13699 } 13700 } 13701 ); 13702 } 13703 13704 // packages/dataviews/build-module/dataform-controls/url.js 13705 var import_components39 = __toESM(require_components()); 13706 var import_jsx_runtime75 = __toESM(require_jsx_runtime()); 13707 function Url({ 13708 data, 13709 field, 13710 onChange, 13711 hideLabelFromVision, 13712 validity 13713 }) { 13714 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13715 ValidatedText, 13716 { 13717 ...{ 13718 data, 13719 field, 13720 onChange, 13721 hideLabelFromVision, 13722 validity, 13723 type: "url", 13724 prefix: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_components39.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_components39.Icon, { icon: link_default }) }) 13725 } 13726 } 13727 ); 13728 } 13729 13730 // packages/dataviews/build-module/dataform-controls/utils/validated-number.js 13731 var import_components40 = __toESM(require_components()); 13732 var import_element42 = __toESM(require_element()); 13733 var import_i18n34 = __toESM(require_i18n()); 13734 var import_jsx_runtime76 = __toESM(require_jsx_runtime()); 13735 var { ValidatedNumberControl } = unlock(import_components40.privateApis); 13736 function toNumberOrEmpty(value) { 13737 if (value === "" || value === void 0) { 13738 return ""; 13739 } 13740 const number = Number(value); 13741 return Number.isFinite(number) ? number : ""; 13742 } 13743 function BetweenControls({ 13744 value, 13745 onChange, 13746 hideLabelFromVision, 13747 step 13748 }) { 13749 const [min = "", max = ""] = value; 13750 const onChangeMin = (0, import_element42.useCallback)( 13751 (newValue) => onChange([toNumberOrEmpty(newValue), max]), 13752 [onChange, max] 13753 ); 13754 const onChangeMax = (0, import_element42.useCallback)( 13755 (newValue) => onChange([min, toNumberOrEmpty(newValue)]), 13756 [onChange, min] 13757 ); 13758 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)( 13759 import_components40.BaseControl, 13760 { 13761 help: (0, import_i18n34.__)("The max. value must be greater than the min. value."), 13762 children: /* @__PURE__ */ (0, import_jsx_runtime76.jsxs)(import_components40.Flex, { direction: "row", gap: 4, children: [ 13763 /* @__PURE__ */ (0, import_jsx_runtime76.jsx)( 13764 import_components40.__experimentalNumberControl, 13765 { 13766 label: (0, import_i18n34.__)("Min."), 13767 value: min, 13768 max: max ? Number(max) - step : void 0, 13769 onChange: onChangeMin, 13770 __next40pxDefaultSize: true, 13771 hideLabelFromVision, 13772 step 13773 } 13774 ), 13775 /* @__PURE__ */ (0, import_jsx_runtime76.jsx)( 13776 import_components40.__experimentalNumberControl, 13777 { 13778 label: (0, import_i18n34.__)("Max."), 13779 value: max, 13780 min: min ? Number(min) + step : void 0, 13781 onChange: onChangeMax, 13782 __next40pxDefaultSize: true, 13783 hideLabelFromVision, 13784 step 13785 } 13786 ) 13787 ] }) 13788 } 13789 ); 13790 } 13791 function ValidatedNumber({ 13792 data, 13793 field, 13794 onChange, 13795 hideLabelFromVision, 13796 operator, 13797 validity 13798 }) { 13799 const decimals = field.format?.decimals ?? 0; 13800 const step = Math.pow(10, Math.abs(decimals) * -1); 13801 const { label, description, getValue, setValue, isValid: isValid2 } = field; 13802 const value = getValue({ item: data }) ?? ""; 13803 const onChangeControl = (0, import_element42.useCallback)( 13804 (newValue) => { 13805 onChange( 13806 setValue({ 13807 item: data, 13808 // Do not convert an empty string or undefined to a number, 13809 // otherwise there's a mismatch between the UI control (empty) 13810 // and the data relied by onChange (0). 13811 value: ["", void 0].includes(newValue) ? void 0 : Number(newValue) 13812 }) 13813 ); 13814 }, 13815 [data, onChange, setValue] 13816 ); 13817 const onChangeBetweenControls = (0, import_element42.useCallback)( 13818 (newValue) => { 13819 onChange( 13820 setValue({ 13821 item: data, 13822 value: newValue 13823 }) 13824 ); 13825 }, 13826 [data, onChange, setValue] 13827 ); 13828 if (operator === OPERATOR_BETWEEN) { 13829 let valueBetween = ["", ""]; 13830 if (Array.isArray(value) && value.length === 2 && value.every( 13831 (element) => typeof element === "number" || element === "" 13832 )) { 13833 valueBetween = value; 13834 } 13835 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)( 13836 BetweenControls, 13837 { 13838 value: valueBetween, 13839 onChange: onChangeBetweenControls, 13840 hideLabelFromVision, 13841 step 13842 } 13843 ); 13844 } 13845 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)( 13846 ValidatedNumberControl, 13847 { 13848 required: !!isValid2.required, 13849 customValidity: getCustomValidity(isValid2, validity), 13850 label, 13851 help: description, 13852 value, 13853 onChange: onChangeControl, 13854 __next40pxDefaultSize: true, 13855 hideLabelFromVision, 13856 step, 13857 min: isValid2.min ? isValid2.min.constraint : void 0, 13858 max: isValid2.max ? isValid2.max.constraint : void 0 13859 } 13860 ); 13861 } 13862 13863 // packages/dataviews/build-module/dataform-controls/integer.js 13864 var import_jsx_runtime77 = __toESM(require_jsx_runtime()); 13865 function Integer(props) { 13866 return /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(ValidatedNumber, { ...props }); 13867 } 13868 13869 // packages/dataviews/build-module/dataform-controls/number.js 13870 var import_jsx_runtime78 = __toESM(require_jsx_runtime()); 13871 function Number2(props) { 13872 return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(ValidatedNumber, { ...props }); 13873 } 13874 13875 // packages/dataviews/build-module/dataform-controls/radio.js 13876 var import_components41 = __toESM(require_components()); 13877 var import_element43 = __toESM(require_element()); 13878 var import_jsx_runtime79 = __toESM(require_jsx_runtime()); 13879 var { ValidatedRadioControl } = unlock(import_components41.privateApis); 13880 function Radio({ 13881 data, 13882 field, 13883 onChange, 13884 hideLabelFromVision, 13885 validity 13886 }) { 13887 const { label, description, getValue, setValue, isValid: isValid2 } = field; 13888 const { elements, isLoading } = useElements({ 13889 elements: field.elements, 13890 getElements: field.getElements 13891 }); 13892 const value = getValue({ item: data }); 13893 const onChangeControl = (0, import_element43.useCallback)( 13894 (newValue) => onChange(setValue({ item: data, value: newValue })), 13895 [data, onChange, setValue] 13896 ); 13897 if (isLoading) { 13898 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components41.Spinner, {}); 13899 } 13900 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)( 13901 ValidatedRadioControl, 13902 { 13903 required: !!field.isValid?.required, 13904 customValidity: getCustomValidity(isValid2, validity), 13905 label, 13906 help: description, 13907 onChange: onChangeControl, 13908 options: elements, 13909 selected: value, 13910 hideLabelFromVision 13911 } 13912 ); 13913 } 13914 13915 // packages/dataviews/build-module/dataform-controls/select.js 13916 var import_components42 = __toESM(require_components()); 13917 var import_element44 = __toESM(require_element()); 13918 var import_jsx_runtime80 = __toESM(require_jsx_runtime()); 13919 var { ValidatedSelectControl } = unlock(import_components42.privateApis); 13920 function Select({ 13921 data, 13922 field, 13923 onChange, 13924 hideLabelFromVision, 13925 validity 13926 }) { 13927 const { type, label, description, getValue, setValue, isValid: isValid2 } = field; 13928 const isMultiple = type === "array"; 13929 const value = getValue({ item: data }) ?? (isMultiple ? [] : ""); 13930 const onChangeControl = (0, import_element44.useCallback)( 13931 (newValue) => onChange(setValue({ item: data, value: newValue })), 13932 [data, onChange, setValue] 13933 ); 13934 const { elements, isLoading } = useElements({ 13935 elements: field.elements, 13936 getElements: field.getElements 13937 }); 13938 if (isLoading) { 13939 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)(import_components42.Spinner, {}); 13940 } 13941 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)( 13942 ValidatedSelectControl, 13943 { 13944 required: !!field.isValid?.required, 13945 customValidity: getCustomValidity(isValid2, validity), 13946 label, 13947 value, 13948 help: description, 13949 options: elements, 13950 onChange: onChangeControl, 13951 __next40pxDefaultSize: true, 13952 hideLabelFromVision, 13953 multiple: isMultiple 13954 } 13955 ); 13956 } 13957 13958 // packages/dataviews/build-module/dataform-controls/text.js 13959 var import_element45 = __toESM(require_element()); 13960 var import_jsx_runtime81 = __toESM(require_jsx_runtime()); 13961 function Text2({ 13962 data, 13963 field, 13964 onChange, 13965 hideLabelFromVision, 13966 config, 13967 validity 13968 }) { 13969 const { prefix, suffix } = config || {}; 13970 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)( 13971 ValidatedText, 13972 { 13973 ...{ 13974 data, 13975 field, 13976 onChange, 13977 hideLabelFromVision, 13978 validity, 13979 prefix: prefix ? (0, import_element45.createElement)(prefix) : void 0, 13980 suffix: suffix ? (0, import_element45.createElement)(suffix) : void 0 13981 } 13982 } 13983 ); 13984 } 13985 13986 // packages/dataviews/build-module/dataform-controls/toggle.js 13987 var import_components43 = __toESM(require_components()); 13988 var import_element46 = __toESM(require_element()); 13989 var import_jsx_runtime82 = __toESM(require_jsx_runtime()); 13990 var { ValidatedToggleControl } = unlock(import_components43.privateApis); 13991 function Toggle({ 13992 field, 13993 onChange, 13994 data, 13995 hideLabelFromVision, 13996 validity 13997 }) { 13998 const { label, description, getValue, setValue, isValid: isValid2 } = field; 13999 const onChangeControl = (0, import_element46.useCallback)(() => { 14000 onChange( 14001 setValue({ item: data, value: !getValue({ item: data }) }) 14002 ); 14003 }, [onChange, setValue, data, getValue]); 14004 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)( 14005 ValidatedToggleControl, 14006 { 14007 required: !!isValid2.required, 14008 customValidity: getCustomValidity(isValid2, validity), 14009 hidden: hideLabelFromVision, 14010 label, 14011 help: description, 14012 checked: getValue({ item: data }), 14013 onChange: onChangeControl 14014 } 14015 ); 14016 } 14017 14018 // packages/dataviews/build-module/dataform-controls/textarea.js 14019 var import_components44 = __toESM(require_components()); 14020 var import_element47 = __toESM(require_element()); 14021 var import_jsx_runtime83 = __toESM(require_jsx_runtime()); 14022 var { ValidatedTextareaControl } = unlock(import_components44.privateApis); 14023 function Textarea({ 14024 data, 14025 field, 14026 onChange, 14027 hideLabelFromVision, 14028 config, 14029 validity 14030 }) { 14031 const { rows = 4 } = config || {}; 14032 const { label, placeholder, description, setValue, isValid: isValid2 } = field; 14033 const value = field.getValue({ item: data }); 14034 const onChangeControl = (0, import_element47.useCallback)( 14035 (newValue) => onChange(setValue({ item: data, value: newValue })), 14036 [data, onChange, setValue] 14037 ); 14038 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)( 14039 ValidatedTextareaControl, 14040 { 14041 required: !!isValid2.required, 14042 customValidity: getCustomValidity(isValid2, validity), 14043 label, 14044 placeholder, 14045 value: value ?? "", 14046 help: description, 14047 onChange: onChangeControl, 14048 rows, 14049 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0, 14050 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0, 14051 __next40pxDefaultSize: true, 14052 hideLabelFromVision 14053 } 14054 ); 14055 } 14056 14057 // packages/dataviews/build-module/dataform-controls/toggle-group.js 14058 var import_components45 = __toESM(require_components()); 14059 var import_element48 = __toESM(require_element()); 14060 var import_jsx_runtime84 = __toESM(require_jsx_runtime()); 14061 var { ValidatedToggleGroupControl } = unlock(import_components45.privateApis); 14062 function ToggleGroup({ 14063 data, 14064 field, 14065 onChange, 14066 hideLabelFromVision, 14067 validity 14068 }) { 14069 const { getValue, setValue, isValid: isValid2 } = field; 14070 const value = getValue({ item: data }); 14071 const onChangeControl = (0, import_element48.useCallback)( 14072 (newValue) => onChange(setValue({ item: data, value: newValue })), 14073 [data, onChange, setValue] 14074 ); 14075 const { elements, isLoading } = useElements({ 14076 elements: field.elements, 14077 getElements: field.getElements 14078 }); 14079 if (isLoading) { 14080 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(import_components45.Spinner, {}); 14081 } 14082 if (elements.length === 0) { 14083 return null; 14084 } 14085 const selectedOption = elements.find((el) => el.value === value); 14086 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)( 14087 ValidatedToggleGroupControl, 14088 { 14089 required: !!field.isValid?.required, 14090 customValidity: getCustomValidity(isValid2, validity), 14091 __next40pxDefaultSize: true, 14092 isBlock: true, 14093 label: field.label, 14094 help: selectedOption?.description || field.description, 14095 onChange: onChangeControl, 14096 value, 14097 hideLabelFromVision, 14098 children: elements.map((el) => /* @__PURE__ */ (0, import_jsx_runtime84.jsx)( 14099 import_components45.__experimentalToggleGroupControlOption, 14100 { 14101 label: el.label, 14102 value: el.value 14103 }, 14104 el.value 14105 )) 14106 } 14107 ); 14108 } 14109 14110 // packages/dataviews/build-module/dataform-controls/array.js 14111 var import_components46 = __toESM(require_components()); 14112 var import_element49 = __toESM(require_element()); 14113 var import_jsx_runtime85 = __toESM(require_jsx_runtime()); 14114 var { ValidatedFormTokenField } = unlock(import_components46.privateApis); 14115 function ArrayControl({ 14116 data, 14117 field, 14118 onChange, 14119 hideLabelFromVision, 14120 validity 14121 }) { 14122 const { label, placeholder, getValue, setValue, isValid: isValid2 } = field; 14123 const value = getValue({ item: data }); 14124 const { elements, isLoading } = useElements({ 14125 elements: field.elements, 14126 getElements: field.getElements 14127 }); 14128 const arrayValueAsElements = (0, import_element49.useMemo)( 14129 () => Array.isArray(value) ? value.map((token) => { 14130 const element = elements?.find( 14131 (suggestion) => suggestion.value === token 14132 ); 14133 return element || { value: token, label: token }; 14134 }) : [], 14135 [value, elements] 14136 ); 14137 const onChangeControl = (0, import_element49.useCallback)( 14138 (tokens) => { 14139 const valueTokens = tokens.map((token) => { 14140 if (typeof token === "object" && "value" in token) { 14141 return token.value; 14142 } 14143 return token; 14144 }); 14145 onChange(setValue({ item: data, value: valueTokens })); 14146 }, 14147 [onChange, setValue, data] 14148 ); 14149 if (isLoading) { 14150 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)(import_components46.Spinner, {}); 14151 } 14152 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)( 14153 ValidatedFormTokenField, 14154 { 14155 required: !!isValid2?.required, 14156 customValidity: getCustomValidity(isValid2, validity), 14157 label: hideLabelFromVision ? void 0 : label, 14158 value: arrayValueAsElements, 14159 onChange: onChangeControl, 14160 placeholder, 14161 suggestions: elements?.map((element) => element.value), 14162 __experimentalValidateInput: (token) => { 14163 if (field.isValid?.elements && elements) { 14164 return elements.some( 14165 (element) => element.value === token || element.label === token 14166 ); 14167 } 14168 return true; 14169 }, 14170 __experimentalExpandOnFocus: elements && elements.length > 0, 14171 __experimentalShowHowTo: !field.isValid?.elements, 14172 displayTransform: (token) => { 14173 if (typeof token === "object" && "label" in token) { 14174 return token.label; 14175 } 14176 if (typeof token === "string" && elements) { 14177 const element = elements.find( 14178 (el) => el.value === token 14179 ); 14180 return element?.label || token; 14181 } 14182 return token; 14183 }, 14184 __experimentalRenderItem: ({ item }) => { 14185 if (typeof item === "string" && elements) { 14186 const element = elements.find( 14187 (el) => el.value === item 14188 ); 14189 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)("span", { children: element?.label || item }); 14190 } 14191 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)("span", { children: item }); 14192 } 14193 } 14194 ); 14195 } 14196 14197 // node_modules/colord/index.mjs 14198 var r2 = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) }; 14199 var t = function(r3) { 14200 return "string" == typeof r3 ? r3.length > 0 : "number" == typeof r3; 14201 }; 14202 var n = function(r3, t2, n2) { 14203 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r3) / n2 + 0; 14204 }; 14205 var e = function(r3, t2, n2) { 14206 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r3 > n2 ? n2 : r3 > t2 ? r3 : t2; 14207 }; 14208 var u = function(r3) { 14209 return (r3 = isFinite(r3) ? r3 % 360 : 0) > 0 ? r3 : r3 + 360; 14210 }; 14211 var a = function(r3) { 14212 return { r: e(r3.r, 0, 255), g: e(r3.g, 0, 255), b: e(r3.b, 0, 255), a: e(r3.a) }; 14213 }; 14214 var o = function(r3) { 14215 return { r: n(r3.r), g: n(r3.g), b: n(r3.b), a: n(r3.a, 3) }; 14216 }; 14217 var i = /^#([0-9a-f]{3,8})$/i; 14218 var s = function(r3) { 14219 var t2 = r3.toString(16); 14220 return t2.length < 2 ? "0" + t2 : t2; 14221 }; 14222 var h = function(r3) { 14223 var t2 = r3.r, n2 = r3.g, e2 = r3.b, u2 = r3.a, a2 = Math.max(t2, n2, e2), o2 = a2 - Math.min(t2, n2, e2), i2 = o2 ? a2 === t2 ? (n2 - e2) / o2 : a2 === n2 ? 2 + (e2 - t2) / o2 : 4 + (t2 - n2) / o2 : 0; 14224 return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 }; 14225 }; 14226 var b = function(r3) { 14227 var t2 = r3.h, n2 = r3.s, e2 = r3.v, u2 = r3.a; 14228 t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100; 14229 var a2 = Math.floor(t2), o2 = e2 * (1 - n2), i2 = e2 * (1 - (t2 - a2) * n2), s2 = e2 * (1 - (1 - t2 + a2) * n2), h2 = a2 % 6; 14230 return { r: 255 * [e2, i2, o2, o2, s2, e2][h2], g: 255 * [s2, e2, e2, i2, o2, o2][h2], b: 255 * [o2, o2, s2, e2, e2, i2][h2], a: u2 }; 14231 }; 14232 var g = function(r3) { 14233 return { h: u(r3.h), s: e(r3.s, 0, 100), l: e(r3.l, 0, 100), a: e(r3.a) }; 14234 }; 14235 var d = function(r3) { 14236 return { h: n(r3.h), s: n(r3.s), l: n(r3.l), a: n(r3.a, 3) }; 14237 }; 14238 var f = function(r3) { 14239 return b((n2 = (t2 = r3).s, { h: t2.h, s: (n2 *= ((e2 = t2.l) < 50 ? e2 : 100 - e2) / 100) > 0 ? 2 * n2 / (e2 + n2) * 100 : 0, v: e2 + n2, a: t2.a })); 14240 var t2, n2, e2; 14241 }; 14242 var c = function(r3) { 14243 return { h: (t2 = h(r3)).h, s: (u2 = (200 - (n2 = t2.s)) * (e2 = t2.v) / 100) > 0 && u2 < 200 ? n2 * e2 / 100 / (u2 <= 100 ? u2 : 200 - u2) * 100 : 0, l: u2 / 2, a: t2.a }; 14244 var t2, n2, e2, u2; 14245 }; 14246 var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14247 var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14248 var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14249 var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14250 var y = { string: [[function(r3) { 14251 var t2 = i.exec(r3); 14252 return t2 ? (r3 = t2[1]).length <= 4 ? { r: parseInt(r3[0] + r3[0], 16), g: parseInt(r3[1] + r3[1], 16), b: parseInt(r3[2] + r3[2], 16), a: 4 === r3.length ? n(parseInt(r3[3] + r3[3], 16) / 255, 2) : 1 } : 6 === r3.length || 8 === r3.length ? { r: parseInt(r3.substr(0, 2), 16), g: parseInt(r3.substr(2, 2), 16), b: parseInt(r3.substr(4, 2), 16), a: 8 === r3.length ? n(parseInt(r3.substr(6, 2), 16) / 255, 2) : 1 } : null : null; 14253 }, "hex"], [function(r3) { 14254 var t2 = v.exec(r3) || m.exec(r3); 14255 return t2 ? t2[2] !== t2[4] || t2[4] !== t2[6] ? null : a({ r: Number(t2[1]) / (t2[2] ? 100 / 255 : 1), g: Number(t2[3]) / (t2[4] ? 100 / 255 : 1), b: Number(t2[5]) / (t2[6] ? 100 / 255 : 1), a: void 0 === t2[7] ? 1 : Number(t2[7]) / (t2[8] ? 100 : 1) }) : null; 14256 }, "rgb"], [function(t2) { 14257 var n2 = l.exec(t2) || p.exec(t2); 14258 if (!n2) return null; 14259 var e2, u2, a2 = g({ h: (e2 = n2[1], u2 = n2[2], void 0 === u2 && (u2 = "deg"), Number(e2) * (r2[u2] || 1)), s: Number(n2[3]), l: Number(n2[4]), a: void 0 === n2[5] ? 1 : Number(n2[5]) / (n2[6] ? 100 : 1) }); 14260 return f(a2); 14261 }, "hsl"]], object: [[function(r3) { 14262 var n2 = r3.r, e2 = r3.g, u2 = r3.b, o2 = r3.a, i2 = void 0 === o2 ? 1 : o2; 14263 return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null; 14264 }, "rgb"], [function(r3) { 14265 var n2 = r3.h, e2 = r3.s, u2 = r3.l, a2 = r3.a, o2 = void 0 === a2 ? 1 : a2; 14266 if (!t(n2) || !t(e2) || !t(u2)) return null; 14267 var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) }); 14268 return f(i2); 14269 }, "hsl"], [function(r3) { 14270 var n2 = r3.h, a2 = r3.s, o2 = r3.v, i2 = r3.a, s2 = void 0 === i2 ? 1 : i2; 14271 if (!t(n2) || !t(a2) || !t(o2)) return null; 14272 var h2 = (function(r4) { 14273 return { h: u(r4.h), s: e(r4.s, 0, 100), v: e(r4.v, 0, 100), a: e(r4.a) }; 14274 })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) }); 14275 return b(h2); 14276 }, "hsv"]] }; 14277 var N = function(r3, t2) { 14278 for (var n2 = 0; n2 < t2.length; n2++) { 14279 var e2 = t2[n2][0](r3); 14280 if (e2) return [e2, t2[n2][1]]; 14281 } 14282 return [null, void 0]; 14283 }; 14284 var x = function(r3) { 14285 return "string" == typeof r3 ? N(r3.trim(), y.string) : "object" == typeof r3 && null !== r3 ? N(r3, y.object) : [null, void 0]; 14286 }; 14287 var M = function(r3, t2) { 14288 var n2 = c(r3); 14289 return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a }; 14290 }; 14291 var H = function(r3) { 14292 return (299 * r3.r + 587 * r3.g + 114 * r3.b) / 1e3 / 255; 14293 }; 14294 var $ = function(r3, t2) { 14295 var n2 = c(r3); 14296 return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a }; 14297 }; 14298 var j = (function() { 14299 function r3(r4) { 14300 this.parsed = x(r4)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 }; 14301 } 14302 return r3.prototype.isValid = function() { 14303 return null !== this.parsed; 14304 }, r3.prototype.brightness = function() { 14305 return n(H(this.rgba), 2); 14306 }, r3.prototype.isDark = function() { 14307 return H(this.rgba) < 0.5; 14308 }, r3.prototype.isLight = function() { 14309 return H(this.rgba) >= 0.5; 14310 }, r3.prototype.toHex = function() { 14311 return r4 = o(this.rgba), t2 = r4.r, e2 = r4.g, u2 = r4.b, i2 = (a2 = r4.a) < 1 ? s(n(255 * a2)) : "", "#" + s(t2) + s(e2) + s(u2) + i2; 14312 var r4, t2, e2, u2, a2, i2; 14313 }, r3.prototype.toRgb = function() { 14314 return o(this.rgba); 14315 }, r3.prototype.toRgbString = function() { 14316 return r4 = o(this.rgba), t2 = r4.r, n2 = r4.g, e2 = r4.b, (u2 = r4.a) < 1 ? "rgba(" + t2 + ", " + n2 + ", " + e2 + ", " + u2 + ")" : "rgb(" + t2 + ", " + n2 + ", " + e2 + ")"; 14317 var r4, t2, n2, e2, u2; 14318 }, r3.prototype.toHsl = function() { 14319 return d(c(this.rgba)); 14320 }, r3.prototype.toHslString = function() { 14321 return r4 = d(c(this.rgba)), t2 = r4.h, n2 = r4.s, e2 = r4.l, (u2 = r4.a) < 1 ? "hsla(" + t2 + ", " + n2 + "%, " + e2 + "%, " + u2 + ")" : "hsl(" + t2 + ", " + n2 + "%, " + e2 + "%)"; 14322 var r4, t2, n2, e2, u2; 14323 }, r3.prototype.toHsv = function() { 14324 return r4 = h(this.rgba), { h: n(r4.h), s: n(r4.s), v: n(r4.v), a: n(r4.a, 3) }; 14325 var r4; 14326 }, r3.prototype.invert = function() { 14327 return w({ r: 255 - (r4 = this.rgba).r, g: 255 - r4.g, b: 255 - r4.b, a: r4.a }); 14328 var r4; 14329 }, r3.prototype.saturate = function(r4) { 14330 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, r4)); 14331 }, r3.prototype.desaturate = function(r4) { 14332 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, -r4)); 14333 }, r3.prototype.grayscale = function() { 14334 return w(M(this.rgba, -1)); 14335 }, r3.prototype.lighten = function(r4) { 14336 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, r4)); 14337 }, r3.prototype.darken = function(r4) { 14338 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, -r4)); 14339 }, r3.prototype.rotate = function(r4) { 14340 return void 0 === r4 && (r4 = 15), this.hue(this.hue() + r4); 14341 }, r3.prototype.alpha = function(r4) { 14342 return "number" == typeof r4 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r4 }) : n(this.rgba.a, 3); 14343 var t2; 14344 }, r3.prototype.hue = function(r4) { 14345 var t2 = c(this.rgba); 14346 return "number" == typeof r4 ? w({ h: r4, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h); 14347 }, r3.prototype.isEqual = function(r4) { 14348 return this.toHex() === w(r4).toHex(); 14349 }, r3; 14350 })(); 14351 var w = function(r3) { 14352 return r3 instanceof j ? r3 : new j(r3); 14353 }; 14354 14355 // packages/dataviews/build-module/dataform-controls/color.js 14356 var import_components47 = __toESM(require_components()); 14357 var import_element50 = __toESM(require_element()); 14358 var import_jsx_runtime86 = __toESM(require_jsx_runtime()); 14359 var { ValidatedInputControl: ValidatedInputControl3, Picker } = unlock(import_components47.privateApis); 14360 var ColorPicker = ({ 14361 color, 14362 onColorChange 14363 }) => { 14364 const validColor = color && w(color).isValid() ? color : "#ffffff"; 14365 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)( 14366 import_components47.Dropdown, 14367 { 14368 renderToggle: ({ onToggle, isOpen }) => /* @__PURE__ */ (0, import_jsx_runtime86.jsx)(import_components47.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)( 14369 "button", 14370 { 14371 type: "button", 14372 onClick: onToggle, 14373 style: { 14374 width: "24px", 14375 height: "24px", 14376 borderRadius: "50%", 14377 backgroundColor: validColor, 14378 border: "1px solid #ddd", 14379 cursor: "pointer", 14380 outline: isOpen ? "2px solid #007cba" : "none", 14381 outlineOffset: "2px", 14382 display: "flex", 14383 alignItems: "center", 14384 justifyContent: "center", 14385 padding: 0, 14386 margin: 0 14387 }, 14388 "aria-label": "Open color picker" 14389 } 14390 ) }), 14391 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime86.jsx)("div", { style: { padding: "16px" }, children: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)( 14392 Picker, 14393 { 14394 color: w(validColor), 14395 onChange: onColorChange, 14396 enableAlpha: true 14397 } 14398 ) }) 14399 } 14400 ); 14401 }; 14402 function Color({ 14403 data, 14404 field, 14405 onChange, 14406 hideLabelFromVision, 14407 validity 14408 }) { 14409 const { label, placeholder, description, setValue, isValid: isValid2 } = field; 14410 const value = field.getValue({ item: data }) || ""; 14411 const handleColorChange = (0, import_element50.useCallback)( 14412 (colorObject) => { 14413 onChange(setValue({ item: data, value: colorObject.toHex() })); 14414 }, 14415 [data, onChange, setValue] 14416 ); 14417 const handleInputChange = (0, import_element50.useCallback)( 14418 (newValue) => { 14419 onChange(setValue({ item: data, value: newValue || "" })); 14420 }, 14421 [data, onChange, setValue] 14422 ); 14423 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)( 14424 ValidatedInputControl3, 14425 { 14426 required: !!field.isValid?.required, 14427 customValidity: getCustomValidity(isValid2, validity), 14428 label, 14429 placeholder, 14430 value, 14431 help: description, 14432 onChange: handleInputChange, 14433 hideLabelFromVision, 14434 type: "text", 14435 prefix: /* @__PURE__ */ (0, import_jsx_runtime86.jsx)( 14436 ColorPicker, 14437 { 14438 color: value, 14439 onColorChange: handleColorChange 14440 } 14441 ) 14442 } 14443 ); 14444 } 14445 14446 // packages/dataviews/build-module/dataform-controls/password.js 14447 var import_components48 = __toESM(require_components()); 14448 var import_element51 = __toESM(require_element()); 14449 var import_i18n35 = __toESM(require_i18n()); 14450 var import_jsx_runtime87 = __toESM(require_jsx_runtime()); 14451 function Password({ 14452 data, 14453 field, 14454 onChange, 14455 hideLabelFromVision, 14456 validity 14457 }) { 14458 const [isVisible2, setIsVisible] = (0, import_element51.useState)(false); 14459 const toggleVisibility = (0, import_element51.useCallback)(() => { 14460 setIsVisible((prev) => !prev); 14461 }, []); 14462 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)( 14463 ValidatedText, 14464 { 14465 ...{ 14466 data, 14467 field, 14468 onChange, 14469 hideLabelFromVision, 14470 validity, 14471 type: isVisible2 ? "text" : "password", 14472 suffix: /* @__PURE__ */ (0, import_jsx_runtime87.jsx)(import_components48.__experimentalInputControlSuffixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime87.jsx)( 14473 import_components48.Button, 14474 { 14475 icon: isVisible2 ? unseen_default : seen_default, 14476 onClick: toggleVisibility, 14477 size: "small", 14478 label: isVisible2 ? (0, import_i18n35.__)("Hide password") : (0, import_i18n35.__)("Show password") 14479 } 14480 ) }) 14481 } 14482 } 14483 ); 14484 } 14485 14486 // packages/dataviews/build-module/field-types/utils/has-elements.js 14487 function hasElements(field) { 14488 return Array.isArray(field.elements) && field.elements.length > 0 || typeof field.getElements === "function"; 14489 } 14490 14491 // packages/dataviews/build-module/dataform-controls/index.js 14492 var import_jsx_runtime88 = __toESM(require_jsx_runtime()); 14493 var FORM_CONTROLS = { 14494 array: ArrayControl, 14495 checkbox: Checkbox, 14496 color: Color, 14497 datetime: DateTime, 14498 date: DateControl, 14499 email: Email, 14500 telephone: Telephone, 14501 url: Url, 14502 integer: Integer, 14503 number: Number2, 14504 password: Password, 14505 radio: Radio, 14506 select: Select, 14507 text: Text2, 14508 toggle: Toggle, 14509 textarea: Textarea, 14510 toggleGroup: ToggleGroup 14511 }; 14512 function isEditConfig(value) { 14513 return value && typeof value === "object" && typeof value.control === "string"; 14514 } 14515 function createConfiguredControl(config) { 14516 const { control, ...controlConfig } = config; 14517 const BaseControlType = getControlByType(control); 14518 if (BaseControlType === null) { 14519 return null; 14520 } 14521 return function ConfiguredControl(props) { 14522 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(BaseControlType, { ...props, config: controlConfig }); 14523 }; 14524 } 14525 function getControl(field, fallback) { 14526 if (typeof field.Edit === "function") { 14527 return field.Edit; 14528 } 14529 if (typeof field.Edit === "string") { 14530 return getControlByType(field.Edit); 14531 } 14532 if (isEditConfig(field.Edit)) { 14533 return createConfiguredControl(field.Edit); 14534 } 14535 if (hasElements(field) && field.type !== "array") { 14536 return getControlByType("select"); 14537 } 14538 if (fallback === null) { 14539 return null; 14540 } 14541 return getControlByType(fallback); 14542 } 14543 function getControlByType(type) { 14544 if (Object.keys(FORM_CONTROLS).includes(type)) { 14545 return FORM_CONTROLS[type]; 14546 } 14547 return null; 14548 } 14549 14550 // packages/dataviews/build-module/field-types/utils/get-filter-by.js 14551 function getFilterBy(field, defaultOperators, validOperators) { 14552 if (field.filterBy === false) { 14553 return false; 14554 } 14555 const operators = field.filterBy?.operators?.filter( 14556 (op) => validOperators.includes(op) 14557 ) ?? defaultOperators; 14558 if (operators.length === 0) { 14559 return false; 14560 } 14561 return { 14562 isPrimary: !!field.filterBy?.isPrimary, 14563 operators 14564 }; 14565 } 14566 var get_filter_by_default = getFilterBy; 14567 14568 // packages/dataviews/build-module/field-types/utils/get-value-from-id.js 14569 var getValueFromId = (id) => ({ item }) => { 14570 const path = id.split("."); 14571 let value = item; 14572 for (const segment of path) { 14573 if (value.hasOwnProperty(segment)) { 14574 value = value[segment]; 14575 } else { 14576 value = void 0; 14577 } 14578 } 14579 return value; 14580 }; 14581 var get_value_from_id_default = getValueFromId; 14582 14583 // packages/dataviews/build-module/field-types/utils/set-value-from-id.js 14584 var setValueFromId = (id) => ({ value }) => { 14585 const path = id.split("."); 14586 const result = {}; 14587 let current = result; 14588 for (const segment of path.slice(0, -1)) { 14589 current[segment] = {}; 14590 current = current[segment]; 14591 } 14592 current[path.at(-1)] = value; 14593 return result; 14594 }; 14595 var set_value_from_id_default = setValueFromId; 14596 14597 // packages/dataviews/build-module/field-types/email.js 14598 var import_i18n36 = __toESM(require_i18n()); 14599 14600 // packages/dataviews/build-module/field-types/utils/render-from-elements.js 14601 function RenderFromElements({ 14602 item, 14603 field 14604 }) { 14605 const { elements, isLoading } = useElements({ 14606 elements: field.elements, 14607 getElements: field.getElements 14608 }); 14609 const value = field.getValue({ item }); 14610 if (isLoading) { 14611 return value; 14612 } 14613 if (elements.length === 0) { 14614 return value; 14615 } 14616 return elements?.find((element) => element.value === value)?.label || field.getValue({ item }); 14617 } 14618 14619 // packages/dataviews/build-module/field-types/utils/render-default.js 14620 var import_jsx_runtime89 = __toESM(require_jsx_runtime()); 14621 function render({ 14622 item, 14623 field 14624 }) { 14625 if (field.hasElements) { 14626 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(RenderFromElements, { item, field }); 14627 } 14628 return field.getValueFormatted({ item, field }); 14629 } 14630 14631 // packages/dataviews/build-module/field-types/utils/sort-text.js 14632 var sort_text_default = (a2, b2, direction) => { 14633 return direction === "asc" ? a2.localeCompare(b2) : b2.localeCompare(a2); 14634 }; 14635 14636 // packages/dataviews/build-module/field-types/utils/is-valid-required.js 14637 function isValidRequired(item, field) { 14638 const value = field.getValue({ item }); 14639 return ![void 0, "", null].includes(value); 14640 } 14641 14642 // packages/dataviews/build-module/field-types/utils/is-valid-min-length.js 14643 function isValidMinLength(item, field) { 14644 if (typeof field.isValid.minLength?.constraint !== "number") { 14645 return false; 14646 } 14647 const value = field.getValue({ item }); 14648 if ([void 0, "", null].includes(value)) { 14649 return true; 14650 } 14651 return String(value).length >= field.isValid.minLength.constraint; 14652 } 14653 14654 // packages/dataviews/build-module/field-types/utils/is-valid-max-length.js 14655 function isValidMaxLength(item, field) { 14656 if (typeof field.isValid.maxLength?.constraint !== "number") { 14657 return false; 14658 } 14659 const value = field.getValue({ item }); 14660 if ([void 0, "", null].includes(value)) { 14661 return true; 14662 } 14663 return String(value).length <= field.isValid.maxLength.constraint; 14664 } 14665 14666 // packages/dataviews/build-module/field-types/utils/is-valid-pattern.js 14667 function isValidPattern(item, field) { 14668 if (field.isValid.pattern?.constraint === void 0) { 14669 return true; 14670 } 14671 try { 14672 const regexp = new RegExp(field.isValid.pattern.constraint); 14673 const value = field.getValue({ item }); 14674 if ([void 0, "", null].includes(value)) { 14675 return true; 14676 } 14677 return regexp.test(String(value)); 14678 } catch { 14679 return false; 14680 } 14681 } 14682 14683 // packages/dataviews/build-module/field-types/utils/is-valid-elements.js 14684 function isValidElements(item, field) { 14685 const elements = field.elements ?? []; 14686 const validValues = elements.map((el) => el.value); 14687 if (validValues.length === 0) { 14688 return true; 14689 } 14690 const value = field.getValue({ item }); 14691 return [].concat(value).every((v2) => validValues.includes(v2)); 14692 } 14693 14694 // packages/dataviews/build-module/field-types/utils/get-value-formatted-default.js 14695 function getValueFormatted({ 14696 item, 14697 field 14698 }) { 14699 return field.getValue({ item }); 14700 } 14701 var get_value_formatted_default_default = getValueFormatted; 14702 14703 // packages/dataviews/build-module/field-types/email.js 14704 var emailRegex = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/; 14705 function isValidCustom(item, field) { 14706 const value = field.getValue({ item }); 14707 if (![void 0, "", null].includes(value) && !emailRegex.test(value)) { 14708 return (0, import_i18n36.__)("Value must be a valid email address."); 14709 } 14710 return null; 14711 } 14712 var email_default = { 14713 type: "email", 14714 render, 14715 Edit: "email", 14716 sort: sort_text_default, 14717 enableSorting: true, 14718 enableGlobalSearch: false, 14719 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 14720 validOperators: [ 14721 OPERATOR_IS, 14722 OPERATOR_IS_NOT, 14723 OPERATOR_CONTAINS, 14724 OPERATOR_NOT_CONTAINS, 14725 OPERATOR_STARTS_WITH, 14726 // Multiple selection 14727 OPERATOR_IS_ANY, 14728 OPERATOR_IS_NONE, 14729 OPERATOR_IS_ALL, 14730 OPERATOR_IS_NOT_ALL 14731 ], 14732 format: {}, 14733 getValueFormatted: get_value_formatted_default_default, 14734 validate: { 14735 required: isValidRequired, 14736 pattern: isValidPattern, 14737 minLength: isValidMinLength, 14738 maxLength: isValidMaxLength, 14739 elements: isValidElements, 14740 custom: isValidCustom 14741 } 14742 }; 14743 14744 // packages/dataviews/build-module/field-types/integer.js 14745 var import_i18n37 = __toESM(require_i18n()); 14746 14747 // packages/dataviews/build-module/field-types/utils/sort-number.js 14748 var sort_number_default = (a2, b2, direction) => { 14749 return direction === "asc" ? a2 - b2 : b2 - a2; 14750 }; 14751 14752 // packages/dataviews/build-module/field-types/utils/is-valid-min.js 14753 function isValidMin(item, field) { 14754 if (typeof field.isValid.min?.constraint !== "number") { 14755 return false; 14756 } 14757 const value = field.getValue({ item }); 14758 if ([void 0, "", null].includes(value)) { 14759 return true; 14760 } 14761 return Number(value) >= field.isValid.min.constraint; 14762 } 14763 14764 // packages/dataviews/build-module/field-types/utils/is-valid-max.js 14765 function isValidMax(item, field) { 14766 if (typeof field.isValid.max?.constraint !== "number") { 14767 return false; 14768 } 14769 const value = field.getValue({ item }); 14770 if ([void 0, "", null].includes(value)) { 14771 return true; 14772 } 14773 return Number(value) <= field.isValid.max.constraint; 14774 } 14775 14776 // packages/dataviews/build-module/field-types/integer.js 14777 var format2 = { 14778 separatorThousand: "," 14779 }; 14780 function getValueFormatted2({ 14781 item, 14782 field 14783 }) { 14784 let value = field.getValue({ item }); 14785 if (value === null || value === void 0) { 14786 return ""; 14787 } 14788 value = Number(value); 14789 if (!Number.isFinite(value)) { 14790 return String(value); 14791 } 14792 let formatInteger; 14793 if (field.type !== "integer") { 14794 formatInteger = format2; 14795 } else { 14796 formatInteger = field.format; 14797 } 14798 const { separatorThousand } = formatInteger; 14799 const integerValue = Math.trunc(value); 14800 if (!separatorThousand) { 14801 return String(integerValue); 14802 } 14803 return String(integerValue).replace( 14804 /\B(?=(\d{3})+(?!\d))/g, 14805 separatorThousand 14806 ); 14807 } 14808 function isValidCustom2(item, field) { 14809 const value = field.getValue({ item }); 14810 if (![void 0, "", null].includes(value) && !Number.isInteger(value)) { 14811 return (0, import_i18n37.__)("Value must be an integer."); 14812 } 14813 return null; 14814 } 14815 var integer_default = { 14816 type: "integer", 14817 render, 14818 Edit: "integer", 14819 sort: sort_number_default, 14820 enableSorting: true, 14821 enableGlobalSearch: false, 14822 defaultOperators: [ 14823 OPERATOR_IS, 14824 OPERATOR_IS_NOT, 14825 OPERATOR_LESS_THAN, 14826 OPERATOR_GREATER_THAN, 14827 OPERATOR_LESS_THAN_OR_EQUAL, 14828 OPERATOR_GREATER_THAN_OR_EQUAL, 14829 OPERATOR_BETWEEN 14830 ], 14831 validOperators: [ 14832 // Single-selection 14833 OPERATOR_IS, 14834 OPERATOR_IS_NOT, 14835 OPERATOR_LESS_THAN, 14836 OPERATOR_GREATER_THAN, 14837 OPERATOR_LESS_THAN_OR_EQUAL, 14838 OPERATOR_GREATER_THAN_OR_EQUAL, 14839 OPERATOR_BETWEEN, 14840 // Multiple-selection 14841 OPERATOR_IS_ANY, 14842 OPERATOR_IS_NONE, 14843 OPERATOR_IS_ALL, 14844 OPERATOR_IS_NOT_ALL 14845 ], 14846 format: format2, 14847 getValueFormatted: getValueFormatted2, 14848 validate: { 14849 required: isValidRequired, 14850 min: isValidMin, 14851 max: isValidMax, 14852 elements: isValidElements, 14853 custom: isValidCustom2 14854 } 14855 }; 14856 14857 // packages/dataviews/build-module/field-types/number.js 14858 var import_i18n38 = __toESM(require_i18n()); 14859 var format3 = { 14860 separatorThousand: ",", 14861 separatorDecimal: ".", 14862 decimals: 2 14863 }; 14864 function getValueFormatted3({ 14865 item, 14866 field 14867 }) { 14868 let value = field.getValue({ item }); 14869 if (value === null || value === void 0) { 14870 return ""; 14871 } 14872 value = Number(value); 14873 if (!Number.isFinite(value)) { 14874 return String(value); 14875 } 14876 let formatNumber; 14877 if (field.type !== "number") { 14878 formatNumber = format3; 14879 } else { 14880 formatNumber = field.format; 14881 } 14882 const { separatorThousand, separatorDecimal, decimals } = formatNumber; 14883 const fixedValue = value.toFixed(decimals); 14884 const [integerPart, decimalPart] = fixedValue.split("."); 14885 const formattedInteger = separatorThousand ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separatorThousand) : integerPart; 14886 return decimals === 0 ? formattedInteger : formattedInteger + separatorDecimal + decimalPart; 14887 } 14888 function isEmpty2(value) { 14889 return value === "" || value === void 0 || value === null; 14890 } 14891 function isValidCustom3(item, field) { 14892 const value = field.getValue({ item }); 14893 if (!isEmpty2(value) && !Number.isFinite(value)) { 14894 return (0, import_i18n38.__)("Value must be a number."); 14895 } 14896 return null; 14897 } 14898 var number_default = { 14899 type: "number", 14900 render, 14901 Edit: "number", 14902 sort: sort_number_default, 14903 enableSorting: true, 14904 enableGlobalSearch: false, 14905 defaultOperators: [ 14906 OPERATOR_IS, 14907 OPERATOR_IS_NOT, 14908 OPERATOR_LESS_THAN, 14909 OPERATOR_GREATER_THAN, 14910 OPERATOR_LESS_THAN_OR_EQUAL, 14911 OPERATOR_GREATER_THAN_OR_EQUAL, 14912 OPERATOR_BETWEEN 14913 ], 14914 validOperators: [ 14915 // Single-selection 14916 OPERATOR_IS, 14917 OPERATOR_IS_NOT, 14918 OPERATOR_LESS_THAN, 14919 OPERATOR_GREATER_THAN, 14920 OPERATOR_LESS_THAN_OR_EQUAL, 14921 OPERATOR_GREATER_THAN_OR_EQUAL, 14922 OPERATOR_BETWEEN, 14923 // Multiple-selection 14924 OPERATOR_IS_ANY, 14925 OPERATOR_IS_NONE, 14926 OPERATOR_IS_ALL, 14927 OPERATOR_IS_NOT_ALL 14928 ], 14929 format: format3, 14930 getValueFormatted: getValueFormatted3, 14931 validate: { 14932 required: isValidRequired, 14933 min: isValidMin, 14934 max: isValidMax, 14935 elements: isValidElements, 14936 custom: isValidCustom3 14937 } 14938 }; 14939 14940 // packages/dataviews/build-module/field-types/text.js 14941 var text_default = { 14942 type: "text", 14943 render, 14944 Edit: "text", 14945 sort: sort_text_default, 14946 enableSorting: true, 14947 enableGlobalSearch: false, 14948 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 14949 validOperators: [ 14950 // Single selection 14951 OPERATOR_IS, 14952 OPERATOR_IS_NOT, 14953 OPERATOR_CONTAINS, 14954 OPERATOR_NOT_CONTAINS, 14955 OPERATOR_STARTS_WITH, 14956 // Multiple selection 14957 OPERATOR_IS_ANY, 14958 OPERATOR_IS_NONE, 14959 OPERATOR_IS_ALL, 14960 OPERATOR_IS_NOT_ALL 14961 ], 14962 format: {}, 14963 getValueFormatted: get_value_formatted_default_default, 14964 validate: { 14965 required: isValidRequired, 14966 pattern: isValidPattern, 14967 minLength: isValidMinLength, 14968 maxLength: isValidMaxLength, 14969 elements: isValidElements 14970 } 14971 }; 14972 14973 // packages/dataviews/build-module/field-types/datetime.js 14974 var import_date5 = __toESM(require_date()); 14975 var format4 = { 14976 datetime: (0, import_date5.getSettings)().formats.datetime, 14977 weekStartsOn: (0, import_date5.getSettings)().l10n.startOfWeek 14978 }; 14979 function getValueFormatted4({ 14980 item, 14981 field 14982 }) { 14983 const value = field.getValue({ item }); 14984 if (["", void 0, null].includes(value)) { 14985 return ""; 14986 } 14987 let formatDatetime; 14988 if (field.type !== "datetime") { 14989 formatDatetime = format4; 14990 } else { 14991 formatDatetime = field.format; 14992 } 14993 return (0, import_date5.dateI18n)(formatDatetime.datetime, (0, import_date5.getDate)(value)); 14994 } 14995 var sort = (a2, b2, direction) => { 14996 const timeA = new Date(a2).getTime(); 14997 const timeB = new Date(b2).getTime(); 14998 return direction === "asc" ? timeA - timeB : timeB - timeA; 14999 }; 15000 var datetime_default = { 15001 type: "datetime", 15002 render, 15003 Edit: "datetime", 15004 sort, 15005 enableSorting: true, 15006 enableGlobalSearch: false, 15007 defaultOperators: [ 15008 OPERATOR_ON, 15009 OPERATOR_NOT_ON, 15010 OPERATOR_BEFORE, 15011 OPERATOR_AFTER, 15012 OPERATOR_BEFORE_INC, 15013 OPERATOR_AFTER_INC, 15014 OPERATOR_IN_THE_PAST, 15015 OPERATOR_OVER 15016 ], 15017 validOperators: [ 15018 OPERATOR_ON, 15019 OPERATOR_NOT_ON, 15020 OPERATOR_BEFORE, 15021 OPERATOR_AFTER, 15022 OPERATOR_BEFORE_INC, 15023 OPERATOR_AFTER_INC, 15024 OPERATOR_IN_THE_PAST, 15025 OPERATOR_OVER 15026 ], 15027 format: format4, 15028 getValueFormatted: getValueFormatted4, 15029 validate: { 15030 required: isValidRequired, 15031 elements: isValidElements 15032 } 15033 }; 15034 15035 // packages/dataviews/build-module/field-types/date.js 15036 var import_date6 = __toESM(require_date()); 15037 var format5 = { 15038 date: (0, import_date6.getSettings)().formats.date, 15039 weekStartsOn: (0, import_date6.getSettings)().l10n.startOfWeek 15040 }; 15041 function getValueFormatted5({ 15042 item, 15043 field 15044 }) { 15045 const value = field.getValue({ item }); 15046 if (["", void 0, null].includes(value)) { 15047 return ""; 15048 } 15049 let formatDate2; 15050 if (field.type !== "date") { 15051 formatDate2 = format5; 15052 } else { 15053 formatDate2 = field.format; 15054 } 15055 return (0, import_date6.dateI18n)(formatDate2.date, (0, import_date6.getDate)(value)); 15056 } 15057 var sort2 = (a2, b2, direction) => { 15058 const timeA = new Date(a2).getTime(); 15059 const timeB = new Date(b2).getTime(); 15060 return direction === "asc" ? timeA - timeB : timeB - timeA; 15061 }; 15062 var date_default = { 15063 type: "date", 15064 render, 15065 Edit: "date", 15066 sort: sort2, 15067 enableSorting: true, 15068 enableGlobalSearch: false, 15069 defaultOperators: [ 15070 OPERATOR_ON, 15071 OPERATOR_NOT_ON, 15072 OPERATOR_BEFORE, 15073 OPERATOR_AFTER, 15074 OPERATOR_BEFORE_INC, 15075 OPERATOR_AFTER_INC, 15076 OPERATOR_IN_THE_PAST, 15077 OPERATOR_OVER, 15078 OPERATOR_BETWEEN 15079 ], 15080 validOperators: [ 15081 OPERATOR_ON, 15082 OPERATOR_NOT_ON, 15083 OPERATOR_BEFORE, 15084 OPERATOR_AFTER, 15085 OPERATOR_BEFORE_INC, 15086 OPERATOR_AFTER_INC, 15087 OPERATOR_IN_THE_PAST, 15088 OPERATOR_OVER, 15089 OPERATOR_BETWEEN 15090 ], 15091 format: format5, 15092 getValueFormatted: getValueFormatted5, 15093 validate: { 15094 required: isValidRequired, 15095 elements: isValidElements 15096 } 15097 }; 15098 15099 // packages/dataviews/build-module/field-types/boolean.js 15100 var import_i18n39 = __toESM(require_i18n()); 15101 15102 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-bool.js 15103 function isValidRequiredForBool(item, field) { 15104 const value = field.getValue({ item }); 15105 return value === true; 15106 } 15107 15108 // packages/dataviews/build-module/field-types/boolean.js 15109 function getValueFormatted6({ 15110 item, 15111 field 15112 }) { 15113 const value = field.getValue({ item }); 15114 if (value === true) { 15115 return (0, import_i18n39.__)("True"); 15116 } 15117 if (value === false) { 15118 return (0, import_i18n39.__)("False"); 15119 } 15120 return ""; 15121 } 15122 function isValidCustom4(item, field) { 15123 const value = field.getValue({ item }); 15124 if (![void 0, "", null].includes(value) && ![true, false].includes(value)) { 15125 return (0, import_i18n39.__)("Value must be true, false, or undefined"); 15126 } 15127 return null; 15128 } 15129 var sort3 = (a2, b2, direction) => { 15130 const boolA = Boolean(a2); 15131 const boolB = Boolean(b2); 15132 if (boolA === boolB) { 15133 return 0; 15134 } 15135 if (direction === "asc") { 15136 return boolA ? 1 : -1; 15137 } 15138 return boolA ? -1 : 1; 15139 }; 15140 var boolean_default = { 15141 type: "boolean", 15142 render, 15143 Edit: "checkbox", 15144 sort: sort3, 15145 validate: { 15146 required: isValidRequiredForBool, 15147 elements: isValidElements, 15148 custom: isValidCustom4 15149 }, 15150 enableSorting: true, 15151 enableGlobalSearch: false, 15152 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT], 15153 validOperators: [OPERATOR_IS, OPERATOR_IS_NOT], 15154 format: {}, 15155 getValueFormatted: getValueFormatted6 15156 }; 15157 15158 // packages/dataviews/build-module/field-types/media.js 15159 var media_default = { 15160 type: "media", 15161 render: () => null, 15162 Edit: null, 15163 sort: () => 0, 15164 enableSorting: false, 15165 enableGlobalSearch: false, 15166 defaultOperators: [], 15167 validOperators: [], 15168 format: {}, 15169 getValueFormatted: get_value_formatted_default_default, 15170 // cannot validate any constraint, so 15171 // the only available validation for the field author 15172 // would be providing a custom validator. 15173 validate: {} 15174 }; 15175 15176 // packages/dataviews/build-module/field-types/array.js 15177 var import_i18n40 = __toESM(require_i18n()); 15178 15179 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-array.js 15180 function isValidRequiredForArray(item, field) { 15181 const value = field.getValue({ item }); 15182 return Array.isArray(value) && value.length > 0 && value.every( 15183 (element) => ![void 0, "", null].includes(element) 15184 ); 15185 } 15186 15187 // packages/dataviews/build-module/field-types/array.js 15188 function getValueFormatted7({ 15189 item, 15190 field 15191 }) { 15192 const value = field.getValue({ item }); 15193 const arr = Array.isArray(value) ? value : []; 15194 return arr.join(", "); 15195 } 15196 function render2({ item, field }) { 15197 return getValueFormatted7({ item, field }); 15198 } 15199 function isValidCustom5(item, field) { 15200 const value = field.getValue({ item }); 15201 if (![void 0, "", null].includes(value) && !Array.isArray(value)) { 15202 return (0, import_i18n40.__)("Value must be an array."); 15203 } 15204 if (!value.every((v2) => typeof v2 === "string")) { 15205 return (0, import_i18n40.__)("Every value must be a string."); 15206 } 15207 return null; 15208 } 15209 var sort4 = (a2, b2, direction) => { 15210 const arrA = Array.isArray(a2) ? a2 : []; 15211 const arrB = Array.isArray(b2) ? b2 : []; 15212 if (arrA.length !== arrB.length) { 15213 return direction === "asc" ? arrA.length - arrB.length : arrB.length - arrA.length; 15214 } 15215 const joinedA = arrA.join(","); 15216 const joinedB = arrB.join(","); 15217 return direction === "asc" ? joinedA.localeCompare(joinedB) : joinedB.localeCompare(joinedA); 15218 }; 15219 var array_default = { 15220 type: "array", 15221 render: render2, 15222 Edit: "array", 15223 sort: sort4, 15224 enableSorting: true, 15225 enableGlobalSearch: false, 15226 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15227 validOperators: [ 15228 OPERATOR_IS_ANY, 15229 OPERATOR_IS_NONE, 15230 OPERATOR_IS_ALL, 15231 OPERATOR_IS_NOT_ALL 15232 ], 15233 format: {}, 15234 getValueFormatted: getValueFormatted7, 15235 validate: { 15236 required: isValidRequiredForArray, 15237 elements: isValidElements, 15238 custom: isValidCustom5 15239 } 15240 }; 15241 15242 // packages/dataviews/build-module/field-types/password.js 15243 function getValueFormatted8({ 15244 item, 15245 field 15246 }) { 15247 return field.getValue({ item }) ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : ""; 15248 } 15249 var password_default = { 15250 type: "password", 15251 render, 15252 Edit: "password", 15253 sort: () => 0, 15254 // Passwords should not be sortable for security reasons 15255 enableSorting: false, 15256 enableGlobalSearch: false, 15257 defaultOperators: [], 15258 validOperators: [], 15259 format: {}, 15260 getValueFormatted: getValueFormatted8, 15261 validate: { 15262 required: isValidRequired, 15263 pattern: isValidPattern, 15264 minLength: isValidMinLength, 15265 maxLength: isValidMaxLength, 15266 elements: isValidElements 15267 } 15268 }; 15269 15270 // packages/dataviews/build-module/field-types/telephone.js 15271 var telephone_default = { 15272 type: "telephone", 15273 render, 15274 Edit: "telephone", 15275 sort: sort_text_default, 15276 enableSorting: true, 15277 enableGlobalSearch: false, 15278 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15279 validOperators: [ 15280 OPERATOR_IS, 15281 OPERATOR_IS_NOT, 15282 OPERATOR_CONTAINS, 15283 OPERATOR_NOT_CONTAINS, 15284 OPERATOR_STARTS_WITH, 15285 // Multiple selection 15286 OPERATOR_IS_ANY, 15287 OPERATOR_IS_NONE, 15288 OPERATOR_IS_ALL, 15289 OPERATOR_IS_NOT_ALL 15290 ], 15291 format: {}, 15292 getValueFormatted: get_value_formatted_default_default, 15293 validate: { 15294 required: isValidRequired, 15295 pattern: isValidPattern, 15296 minLength: isValidMinLength, 15297 maxLength: isValidMaxLength, 15298 elements: isValidElements 15299 } 15300 }; 15301 15302 // packages/dataviews/build-module/field-types/color.js 15303 var import_i18n41 = __toESM(require_i18n()); 15304 var import_jsx_runtime90 = __toESM(require_jsx_runtime()); 15305 function render3({ item, field }) { 15306 if (field.hasElements) { 15307 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(RenderFromElements, { item, field }); 15308 } 15309 const value = get_value_formatted_default_default({ item, field }); 15310 if (!value || !w(value).isValid()) { 15311 return value; 15312 } 15313 return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [ 15314 /* @__PURE__ */ (0, import_jsx_runtime90.jsx)( 15315 "div", 15316 { 15317 style: { 15318 width: "16px", 15319 height: "16px", 15320 borderRadius: "50%", 15321 backgroundColor: value, 15322 border: "1px solid #ddd", 15323 flexShrink: 0 15324 } 15325 } 15326 ), 15327 /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { children: value }) 15328 ] }); 15329 } 15330 function isValidCustom6(item, field) { 15331 const value = field.getValue({ item }); 15332 if (![void 0, "", null].includes(value) && !w(value).isValid()) { 15333 return (0, import_i18n41.__)("Value must be a valid color."); 15334 } 15335 return null; 15336 } 15337 var sort5 = (a2, b2, direction) => { 15338 const colorA = w(a2); 15339 const colorB = w(b2); 15340 if (!colorA.isValid() && !colorB.isValid()) { 15341 return 0; 15342 } 15343 if (!colorA.isValid()) { 15344 return direction === "asc" ? 1 : -1; 15345 } 15346 if (!colorB.isValid()) { 15347 return direction === "asc" ? -1 : 1; 15348 } 15349 const hslA = colorA.toHsl(); 15350 const hslB = colorB.toHsl(); 15351 if (hslA.h !== hslB.h) { 15352 return direction === "asc" ? hslA.h - hslB.h : hslB.h - hslA.h; 15353 } 15354 if (hslA.s !== hslB.s) { 15355 return direction === "asc" ? hslA.s - hslB.s : hslB.s - hslA.s; 15356 } 15357 return direction === "asc" ? hslA.l - hslB.l : hslB.l - hslA.l; 15358 }; 15359 var color_default = { 15360 type: "color", 15361 render: render3, 15362 Edit: "color", 15363 sort: sort5, 15364 enableSorting: true, 15365 enableGlobalSearch: false, 15366 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15367 validOperators: [ 15368 OPERATOR_IS, 15369 OPERATOR_IS_NOT, 15370 OPERATOR_IS_ANY, 15371 OPERATOR_IS_NONE 15372 ], 15373 format: {}, 15374 getValueFormatted: get_value_formatted_default_default, 15375 validate: { 15376 required: isValidRequired, 15377 elements: isValidElements, 15378 custom: isValidCustom6 15379 } 15380 }; 15381 15382 // packages/dataviews/build-module/field-types/url.js 15383 var url_default = { 15384 type: "url", 15385 render, 15386 Edit: "url", 15387 sort: sort_text_default, 15388 enableSorting: true, 15389 enableGlobalSearch: false, 15390 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15391 validOperators: [ 15392 OPERATOR_IS, 15393 OPERATOR_IS_NOT, 15394 OPERATOR_CONTAINS, 15395 OPERATOR_NOT_CONTAINS, 15396 OPERATOR_STARTS_WITH, 15397 // Multiple selection 15398 OPERATOR_IS_ANY, 15399 OPERATOR_IS_NONE, 15400 OPERATOR_IS_ALL, 15401 OPERATOR_IS_NOT_ALL 15402 ], 15403 format: {}, 15404 getValueFormatted: get_value_formatted_default_default, 15405 validate: { 15406 required: isValidRequired, 15407 pattern: isValidPattern, 15408 minLength: isValidMinLength, 15409 maxLength: isValidMaxLength, 15410 elements: isValidElements 15411 } 15412 }; 15413 15414 // packages/dataviews/build-module/field-types/no-type.js 15415 var sort6 = (a2, b2, direction) => { 15416 if (typeof a2 === "number" && typeof b2 === "number") { 15417 return sort_number_default(a2, b2, direction); 15418 } 15419 return sort_text_default(a2, b2, direction); 15420 }; 15421 var no_type_default = { 15422 // type: no type for this one 15423 render, 15424 Edit: null, 15425 sort: sort6, 15426 enableSorting: true, 15427 enableGlobalSearch: false, 15428 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT], 15429 validOperators: getAllOperatorNames(), 15430 format: {}, 15431 getValueFormatted: get_value_formatted_default_default, 15432 validate: { 15433 required: isValidRequired, 15434 elements: isValidElements 15435 } 15436 }; 15437 15438 // packages/dataviews/build-module/field-types/utils/get-is-valid.js 15439 function getIsValid(field, fieldType) { 15440 let required; 15441 if (field.isValid?.required === true && fieldType.validate.required !== void 0) { 15442 required = { 15443 constraint: true, 15444 validate: fieldType.validate.required 15445 }; 15446 } 15447 let elements; 15448 if ((field.isValid?.elements === true || // elements is enabled unless the field opts-out 15449 field.isValid?.elements === void 0 && (!!field.elements || !!field.getElements)) && fieldType.validate.elements !== void 0) { 15450 elements = { 15451 constraint: true, 15452 validate: fieldType.validate.elements 15453 }; 15454 } 15455 let min; 15456 if (typeof field.isValid?.min === "number" && fieldType.validate.min !== void 0) { 15457 min = { 15458 constraint: field.isValid.min, 15459 validate: fieldType.validate.min 15460 }; 15461 } 15462 let max; 15463 if (typeof field.isValid?.max === "number" && fieldType.validate.max !== void 0) { 15464 max = { 15465 constraint: field.isValid.max, 15466 validate: fieldType.validate.max 15467 }; 15468 } 15469 let minLength; 15470 if (typeof field.isValid?.minLength === "number" && fieldType.validate.minLength !== void 0) { 15471 minLength = { 15472 constraint: field.isValid.minLength, 15473 validate: fieldType.validate.minLength 15474 }; 15475 } 15476 let maxLength; 15477 if (typeof field.isValid?.maxLength === "number" && fieldType.validate.maxLength !== void 0) { 15478 maxLength = { 15479 constraint: field.isValid.maxLength, 15480 validate: fieldType.validate.maxLength 15481 }; 15482 } 15483 let pattern; 15484 if (field.isValid?.pattern !== void 0 && fieldType.validate.pattern !== void 0) { 15485 pattern = { 15486 constraint: field.isValid?.pattern, 15487 validate: fieldType.validate.pattern 15488 }; 15489 } 15490 const custom = field.isValid?.custom ?? fieldType.validate.custom; 15491 return { 15492 required, 15493 elements, 15494 min, 15495 max, 15496 minLength, 15497 maxLength, 15498 pattern, 15499 custom 15500 }; 15501 } 15502 15503 // packages/dataviews/build-module/field-types/utils/get-format.js 15504 function getFormat(field, fieldType) { 15505 return { 15506 ...fieldType.format, 15507 ...field.format 15508 }; 15509 } 15510 var get_format_default = getFormat; 15511 15512 // packages/dataviews/build-module/field-types/index.js 15513 function getFieldTypeByName(type) { 15514 const found = [ 15515 email_default, 15516 integer_default, 15517 number_default, 15518 text_default, 15519 datetime_default, 15520 date_default, 15521 boolean_default, 15522 media_default, 15523 array_default, 15524 password_default, 15525 telephone_default, 15526 color_default, 15527 url_default 15528 ].find((fieldType) => fieldType?.type === type); 15529 if (!!found) { 15530 return found; 15531 } 15532 return no_type_default; 15533 } 15534 function normalizeFields(fields) { 15535 return fields.map((field) => { 15536 const fieldType = getFieldTypeByName(field.type); 15537 const getValue = field.getValue || get_value_from_id_default(field.id); 15538 const sort7 = function(a2, b2, direction) { 15539 const aValue = getValue({ item: a2 }); 15540 const bValue = getValue({ item: b2 }); 15541 return field.sort ? field.sort(aValue, bValue, direction) : fieldType.sort(aValue, bValue, direction); 15542 }; 15543 return { 15544 id: field.id, 15545 label: field.label || field.id, 15546 header: field.header || field.label || field.id, 15547 description: field.description, 15548 placeholder: field.placeholder, 15549 getValue, 15550 setValue: field.setValue || set_value_from_id_default(field.id), 15551 elements: field.elements, 15552 getElements: field.getElements, 15553 hasElements: hasElements(field), 15554 isVisible: field.isVisible, 15555 enableHiding: field.enableHiding ?? true, 15556 readOnly: field.readOnly ?? false, 15557 // The type provides defaults for the following props 15558 type: fieldType.type, 15559 render: field.render ?? fieldType.render, 15560 Edit: getControl(field, fieldType.Edit), 15561 sort: sort7, 15562 enableSorting: field.enableSorting ?? fieldType.enableSorting, 15563 enableGlobalSearch: field.enableGlobalSearch ?? fieldType.enableGlobalSearch, 15564 isValid: getIsValid(field, fieldType), 15565 filterBy: get_filter_by_default( 15566 field, 15567 fieldType.defaultOperators, 15568 fieldType.validOperators 15569 ), 15570 format: get_format_default(field, fieldType), 15571 getValueFormatted: field.getValueFormatted ?? fieldType.getValueFormatted 15572 }; 15573 }); 15574 } 15575 15576 // packages/dataviews/build-module/components/dataviews/index.js 15577 var import_jsx_runtime91 = __toESM(require_jsx_runtime()); 15578 var defaultGetItemId = (item) => item.id; 15579 var defaultIsItemClickable = () => true; 15580 var EMPTY_ARRAY5 = []; 15581 var dataViewsLayouts = VIEW_LAYOUTS.filter( 15582 (viewLayout) => !viewLayout.isPicker 15583 ); 15584 function DefaultUI({ 15585 header, 15586 search = true, 15587 searchLabel = void 0 15588 }) { 15589 return /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)(import_jsx_runtime91.Fragment, { children: [ 15590 /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)( 15591 import_components49.__experimentalHStack, 15592 { 15593 alignment: "top", 15594 justify: "space-between", 15595 className: "dataviews__view-actions", 15596 spacing: 1, 15597 children: [ 15598 /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)( 15599 import_components49.__experimentalHStack, 15600 { 15601 justify: "start", 15602 expanded: false, 15603 className: "dataviews__search", 15604 children: [ 15605 search && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(dataviews_search_default, { label: searchLabel }), 15606 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(toggle_default, {}) 15607 ] 15608 } 15609 ), 15610 /* @__PURE__ */ (0, import_jsx_runtime91.jsxs)( 15611 import_components49.__experimentalHStack, 15612 { 15613 spacing: 1, 15614 expanded: false, 15615 style: { flexShrink: 0 }, 15616 children: [ 15617 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(dataviews_view_config_default, {}), 15618 header 15619 ] 15620 } 15621 ) 15622 ] 15623 } 15624 ), 15625 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(filters_toggled_default, { className: "dataviews-filters__container" }), 15626 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(DataViewsLayout, {}), 15627 /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(DataViewsFooter, {}) 15628 ] }); 15629 } 15630 function DataViews({ 15631 view, 15632 onChangeView, 15633 fields, 15634 search = true, 15635 searchLabel = void 0, 15636 actions = EMPTY_ARRAY5, 15637 data, 15638 getItemId = defaultGetItemId, 15639 getItemLevel, 15640 isLoading = false, 15641 paginationInfo, 15642 defaultLayouts: defaultLayoutsProperty, 15643 selection: selectionProperty, 15644 onChangeSelection, 15645 onClickItem, 15646 renderItemLink, 15647 isItemClickable = defaultIsItemClickable, 15648 header, 15649 children, 15650 config = { perPageSizes: [10, 20, 50, 100] }, 15651 empty 15652 }) { 15653 const { infiniteScrollHandler } = paginationInfo; 15654 const containerRef = (0, import_element52.useRef)(null); 15655 const [containerWidth, setContainerWidth] = (0, import_element52.useState)(0); 15656 const resizeObserverRef = (0, import_compose11.useResizeObserver)( 15657 (resizeObserverEntries) => { 15658 setContainerWidth( 15659 resizeObserverEntries[0].borderBoxSize[0].inlineSize 15660 ); 15661 }, 15662 { box: "border-box" } 15663 ); 15664 const [selectionState, setSelectionState] = (0, import_element52.useState)([]); 15665 const isUncontrolled = selectionProperty === void 0 || onChangeSelection === void 0; 15666 const selection = isUncontrolled ? selectionState : selectionProperty; 15667 const [openedFilter, setOpenedFilter] = (0, import_element52.useState)(null); 15668 function setSelectionWithChange(value) { 15669 const newValue = typeof value === "function" ? value(selection) : value; 15670 if (isUncontrolled) { 15671 setSelectionState(newValue); 15672 } 15673 if (onChangeSelection) { 15674 onChangeSelection(newValue); 15675 } 15676 } 15677 const _fields = (0, import_element52.useMemo)(() => normalizeFields(fields), [fields]); 15678 const _selection = (0, import_element52.useMemo)(() => { 15679 return selection.filter( 15680 (id) => data.some((item) => getItemId(item) === id) 15681 ); 15682 }, [selection, data, getItemId]); 15683 const filters = use_filters_default(_fields, view); 15684 const hasPrimaryOrLockedFilters = (0, import_element52.useMemo)( 15685 () => (filters || []).some( 15686 (filter) => filter.isPrimary || filter.isLocked 15687 ), 15688 [filters] 15689 ); 15690 const [isShowingFilter, setIsShowingFilter] = (0, import_element52.useState)( 15691 hasPrimaryOrLockedFilters 15692 ); 15693 (0, import_element52.useEffect)(() => { 15694 if (hasPrimaryOrLockedFilters && !isShowingFilter) { 15695 setIsShowingFilter(true); 15696 } 15697 }, [hasPrimaryOrLockedFilters, isShowingFilter]); 15698 (0, import_element52.useEffect)(() => { 15699 if (!view.infiniteScrollEnabled || !containerRef.current) { 15700 return; 15701 } 15702 const handleScroll = (0, import_compose11.throttle)((event) => { 15703 const target = event.target; 15704 const scrollTop = target.scrollTop; 15705 const scrollHeight = target.scrollHeight; 15706 const clientHeight = target.clientHeight; 15707 if (scrollTop + clientHeight >= scrollHeight - 100) { 15708 infiniteScrollHandler?.(); 15709 } 15710 }, 100); 15711 const container = containerRef.current; 15712 container.addEventListener("scroll", handleScroll); 15713 return () => { 15714 container.removeEventListener("scroll", handleScroll); 15715 handleScroll.cancel(); 15716 }; 15717 }, [infiniteScrollHandler, view.infiniteScrollEnabled]); 15718 const defaultLayouts = (0, import_element52.useMemo)( 15719 () => Object.fromEntries( 15720 Object.entries(defaultLayoutsProperty).filter( 15721 ([layoutType]) => { 15722 return dataViewsLayouts.some( 15723 (viewLayout) => viewLayout.type === layoutType 15724 ); 15725 } 15726 ) 15727 ), 15728 [defaultLayoutsProperty] 15729 ); 15730 if (!defaultLayouts[view.type]) { 15731 return null; 15732 } 15733 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)( 15734 dataviews_context_default.Provider, 15735 { 15736 value: { 15737 view, 15738 onChangeView, 15739 fields: _fields, 15740 actions, 15741 data, 15742 isLoading, 15743 paginationInfo, 15744 selection: _selection, 15745 onChangeSelection: setSelectionWithChange, 15746 openedFilter, 15747 setOpenedFilter, 15748 getItemId, 15749 getItemLevel, 15750 isItemClickable, 15751 onClickItem, 15752 renderItemLink, 15753 containerWidth, 15754 containerRef, 15755 resizeObserverRef, 15756 defaultLayouts, 15757 filters, 15758 isShowingFilter, 15759 setIsShowingFilter, 15760 config, 15761 empty, 15762 hasInfiniteScrollHandler: !!infiniteScrollHandler 15763 }, 15764 children: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)("div", { className: "dataviews-wrapper", ref: containerRef, children: children ?? /* @__PURE__ */ (0, import_jsx_runtime91.jsx)( 15765 DefaultUI, 15766 { 15767 header, 15768 search, 15769 searchLabel 15770 } 15771 ) }) 15772 } 15773 ); 15774 } 15775 var DataViewsSubComponents = DataViews; 15776 DataViewsSubComponents.BulkActionToolbar = BulkActionsFooter; 15777 DataViewsSubComponents.Filters = filters_default; 15778 DataViewsSubComponents.FiltersToggled = filters_toggled_default; 15779 DataViewsSubComponents.FiltersToggle = toggle_default; 15780 DataViewsSubComponents.Layout = DataViewsLayout; 15781 DataViewsSubComponents.LayoutSwitcher = ViewTypeMenu; 15782 DataViewsSubComponents.Pagination = DataViewsPagination; 15783 DataViewsSubComponents.Search = dataviews_search_default; 15784 DataViewsSubComponents.ViewConfig = DataviewsViewConfigDropdown; 15785 DataViewsSubComponents.Footer = DataViewsFooter; 15786 var dataviews_default = DataViewsSubComponents; 15787 15788 // packages/dataviews/build-module/utils/filter-sort-and-paginate.js 15789 var import_remove_accents2 = __toESM(require_remove_accents()); 15790 var import_deprecated = __toESM(require_deprecated()); 15791 var import_date8 = __toESM(require_date()); 15792 function normalizeSearchInput2(input = "") { 15793 return (0, import_remove_accents2.default)(input.trim().toLowerCase()); 15794 } 15795 var EMPTY_ARRAY6 = []; 15796 function getRelativeDate(value, unit) { 15797 switch (unit) { 15798 case "days": 15799 return subDays(/* @__PURE__ */ new Date(), value); 15800 case "weeks": 15801 return subWeeks(/* @__PURE__ */ new Date(), value); 15802 case "months": 15803 return subMonths(/* @__PURE__ */ new Date(), value); 15804 case "years": 15805 return subYears(/* @__PURE__ */ new Date(), value); 15806 default: 15807 return /* @__PURE__ */ new Date(); 15808 } 15809 } 15810 function filterSortAndPaginate(data, view, fields) { 15811 if (!data) { 15812 return { 15813 data: EMPTY_ARRAY6, 15814 paginationInfo: { totalItems: 0, totalPages: 0 } 15815 }; 15816 } 15817 const _fields = normalizeFields(fields); 15818 let filteredData = [...data]; 15819 if (view.search) { 15820 const normalizedSearch = normalizeSearchInput2(view.search); 15821 filteredData = filteredData.filter((item) => { 15822 return _fields.filter((field) => field.enableGlobalSearch).some((field) => { 15823 const fieldValue = field.getValue({ item }); 15824 const values = Array.isArray(fieldValue) ? fieldValue : [fieldValue]; 15825 return values.some( 15826 (value) => normalizeSearchInput2(String(value)).includes( 15827 normalizedSearch 15828 ) 15829 ); 15830 }); 15831 }); 15832 } 15833 if (view.filters && view.filters?.length > 0) { 15834 view.filters.forEach((filter) => { 15835 const field = _fields.find( 15836 (_field) => _field.id === filter.field 15837 ); 15838 if (field) { 15839 if (filter.operator === OPERATOR_IS_ANY && filter?.value?.length > 0) { 15840 filteredData = filteredData.filter((item) => { 15841 const fieldValue = field.getValue({ item }); 15842 if (Array.isArray(fieldValue)) { 15843 return filter.value.some( 15844 (filterValue) => fieldValue.includes(filterValue) 15845 ); 15846 } else if (typeof fieldValue === "string") { 15847 return filter.value.includes(fieldValue); 15848 } 15849 return false; 15850 }); 15851 } else if (filter.operator === OPERATOR_IS_NONE && filter?.value?.length > 0) { 15852 filteredData = filteredData.filter((item) => { 15853 const fieldValue = field.getValue({ item }); 15854 if (Array.isArray(fieldValue)) { 15855 return !filter.value.some( 15856 (filterValue) => fieldValue.includes(filterValue) 15857 ); 15858 } else if (typeof fieldValue === "string") { 15859 return !filter.value.includes(fieldValue); 15860 } 15861 return false; 15862 }); 15863 } else if (filter.operator === OPERATOR_IS_ALL && filter?.value?.length > 0) { 15864 filteredData = filteredData.filter((item) => { 15865 return filter.value.every((value) => { 15866 return field.getValue({ item })?.includes(value); 15867 }); 15868 }); 15869 } else if (filter.operator === OPERATOR_IS_NOT_ALL && filter?.value?.length > 0) { 15870 (0, import_deprecated.default)("The 'isNotAll' filter operator", { 15871 since: "7.0", 15872 alternative: "'isNone'" 15873 }); 15874 filteredData = filteredData.filter((item) => { 15875 return filter.value.every((value) => { 15876 return !field.getValue({ item })?.includes(value); 15877 }); 15878 }); 15879 } else if (filter.operator === OPERATOR_IS) { 15880 filteredData = filteredData.filter((item) => { 15881 return filter.value === field.getValue({ item }) || filter.value === void 0; 15882 }); 15883 } else if (filter.operator === OPERATOR_IS_NOT) { 15884 filteredData = filteredData.filter((item) => { 15885 return filter.value !== field.getValue({ item }); 15886 }); 15887 } else if (filter.operator === OPERATOR_ON && filter.value !== void 0) { 15888 const filterDate = (0, import_date8.getDate)(filter.value); 15889 filteredData = filteredData.filter((item) => { 15890 const fieldDate = (0, import_date8.getDate)(field.getValue({ item })); 15891 return filterDate.getTime() === fieldDate.getTime(); 15892 }); 15893 } else if (filter.operator === OPERATOR_NOT_ON && filter.value !== void 0) { 15894 const filterDate = (0, import_date8.getDate)(filter.value); 15895 filteredData = filteredData.filter((item) => { 15896 const fieldDate = (0, import_date8.getDate)(field.getValue({ item })); 15897 return filterDate.getTime() !== fieldDate.getTime(); 15898 }); 15899 } else if (filter.operator === OPERATOR_LESS_THAN && filter.value !== void 0) { 15900 filteredData = filteredData.filter((item) => { 15901 const fieldValue = field.getValue({ item }); 15902 return fieldValue < filter.value; 15903 }); 15904 } else if (filter.operator === OPERATOR_GREATER_THAN && filter.value !== void 0) { 15905 filteredData = filteredData.filter((item) => { 15906 const fieldValue = field.getValue({ item }); 15907 return fieldValue > filter.value; 15908 }); 15909 } else if (filter.operator === OPERATOR_LESS_THAN_OR_EQUAL && filter.value !== void 0) { 15910 filteredData = filteredData.filter((item) => { 15911 const fieldValue = field.getValue({ item }); 15912 return fieldValue <= filter.value; 15913 }); 15914 } else if (filter.operator === OPERATOR_GREATER_THAN_OR_EQUAL && filter.value !== void 0) { 15915 filteredData = filteredData.filter((item) => { 15916 const fieldValue = field.getValue({ item }); 15917 return fieldValue >= filter.value; 15918 }); 15919 } else if (filter.operator === OPERATOR_CONTAINS && filter?.value !== void 0) { 15920 filteredData = filteredData.filter((item) => { 15921 const fieldValue = field.getValue({ item }); 15922 return typeof fieldValue === "string" && filter.value && fieldValue.toLowerCase().includes( 15923 String(filter.value).toLowerCase() 15924 ); 15925 }); 15926 } else if (filter.operator === OPERATOR_NOT_CONTAINS && filter?.value !== void 0) { 15927 filteredData = filteredData.filter((item) => { 15928 const fieldValue = field.getValue({ item }); 15929 return typeof fieldValue === "string" && filter.value && !fieldValue.toLowerCase().includes( 15930 String(filter.value).toLowerCase() 15931 ); 15932 }); 15933 } else if (filter.operator === OPERATOR_STARTS_WITH && filter?.value !== void 0) { 15934 filteredData = filteredData.filter((item) => { 15935 const fieldValue = field.getValue({ item }); 15936 return typeof fieldValue === "string" && filter.value && fieldValue.toLowerCase().startsWith( 15937 String(filter.value).toLowerCase() 15938 ); 15939 }); 15940 } else if (filter.operator === OPERATOR_BEFORE && filter.value !== void 0) { 15941 const filterValue = (0, import_date8.getDate)(filter.value); 15942 filteredData = filteredData.filter((item) => { 15943 const fieldValue = (0, import_date8.getDate)( 15944 field.getValue({ item }) 15945 ); 15946 return fieldValue < filterValue; 15947 }); 15948 } else if (filter.operator === OPERATOR_AFTER && filter.value !== void 0) { 15949 const filterValue = (0, import_date8.getDate)(filter.value); 15950 filteredData = filteredData.filter((item) => { 15951 const fieldValue = (0, import_date8.getDate)( 15952 field.getValue({ item }) 15953 ); 15954 return fieldValue > filterValue; 15955 }); 15956 } else if (filter.operator === OPERATOR_BEFORE_INC && filter.value !== void 0) { 15957 const filterValue = (0, import_date8.getDate)(filter.value); 15958 filteredData = filteredData.filter((item) => { 15959 const fieldValue = (0, import_date8.getDate)( 15960 field.getValue({ item }) 15961 ); 15962 return fieldValue <= filterValue; 15963 }); 15964 } else if (filter.operator === OPERATOR_AFTER_INC && filter.value !== void 0) { 15965 const filterValue = (0, import_date8.getDate)(filter.value); 15966 filteredData = filteredData.filter((item) => { 15967 const fieldValue = (0, import_date8.getDate)( 15968 field.getValue({ item }) 15969 ); 15970 return fieldValue >= filterValue; 15971 }); 15972 } else if (filter.operator === OPERATOR_BETWEEN && Array.isArray(filter.value) && filter.value.length === 2 && filter.value[0] !== void 0 && filter.value[1] !== void 0) { 15973 filteredData = filteredData.filter((item) => { 15974 const fieldValue = field.getValue({ item }); 15975 if (typeof fieldValue === "number" || fieldValue instanceof Date || typeof fieldValue === "string") { 15976 return fieldValue >= filter.value[0] && fieldValue <= filter.value[1]; 15977 } 15978 return false; 15979 }); 15980 } else if (filter.operator === OPERATOR_IN_THE_PAST && filter.value?.value !== void 0 && filter.value?.unit !== void 0) { 15981 const targetDate = getRelativeDate( 15982 filter.value.value, 15983 filter.value.unit 15984 ); 15985 filteredData = filteredData.filter((item) => { 15986 const fieldValue = (0, import_date8.getDate)( 15987 field.getValue({ item }) 15988 ); 15989 return fieldValue >= targetDate && fieldValue <= /* @__PURE__ */ new Date(); 15990 }); 15991 } else if (filter.operator === OPERATOR_OVER && filter.value?.value !== void 0 && filter.value?.unit !== void 0) { 15992 const targetDate = getRelativeDate( 15993 filter.value.value, 15994 filter.value.unit 15995 ); 15996 filteredData = filteredData.filter((item) => { 15997 const fieldValue = (0, import_date8.getDate)( 15998 field.getValue({ item }) 15999 ); 16000 return fieldValue < targetDate; 16001 }); 16002 } 16003 } 16004 }); 16005 } 16006 const sortByField = view.sort?.field ? _fields.find((field) => { 16007 return field.enableSorting !== false && field.id === view.sort?.field; 16008 }) : null; 16009 const groupByField = view.groupBy?.field ? _fields.find((field) => { 16010 return field.enableSorting !== false && field.id === view.groupBy?.field; 16011 }) : null; 16012 if (sortByField || groupByField) { 16013 filteredData.sort((a2, b2) => { 16014 if (groupByField) { 16015 const groupCompare = groupByField.sort( 16016 a2, 16017 b2, 16018 view.groupBy?.direction ?? "asc" 16019 ); 16020 if (groupCompare !== 0) { 16021 return groupCompare; 16022 } 16023 } 16024 if (sortByField) { 16025 return sortByField.sort(a2, b2, view.sort?.direction ?? "desc"); 16026 } 16027 return 0; 16028 }); 16029 } 16030 let totalItems = filteredData.length; 16031 let totalPages = 1; 16032 if (view.page !== void 0 && view.perPage !== void 0) { 16033 const start = (view.page - 1) * view.perPage; 16034 totalItems = filteredData?.length || 0; 16035 totalPages = Math.ceil(totalItems / view.perPage); 16036 filteredData = filteredData?.slice(start, start + view.perPage); 16037 } 16038 return { 16039 data: filteredData, 16040 paginationInfo: { 16041 totalItems, 16042 totalPages 16043 } 16044 }; 16045 } 16046 16047 // packages/admin-ui/build-module/navigable-region/index.js 16048 var import_element53 = __toESM(require_element()); 16049 var import_jsx_runtime92 = __toESM(require_jsx_runtime()); 16050 var NavigableRegion = (0, import_element53.forwardRef)( 16051 ({ children, className, ariaLabel, as: Tag = "div", ...props }, ref) => { 16052 return /* @__PURE__ */ (0, import_jsx_runtime92.jsx)( 16053 Tag, 16054 { 16055 ref, 16056 className: clsx_default("admin-ui-navigable-region", className), 16057 "aria-label": ariaLabel, 16058 role: "region", 16059 tabIndex: "-1", 16060 ...props, 16061 children 16062 } 16063 ); 16064 } 16065 ); 16066 NavigableRegion.displayName = "NavigableRegion"; 16067 var navigable_region_default = NavigableRegion; 16068 16069 // packages/admin-ui/build-module/page/header.js 16070 var import_components51 = __toESM(require_components()); 16071 16072 // packages/admin-ui/build-module/page/sidebar-toggle-slot.js 16073 var import_components50 = __toESM(require_components()); 16074 var { Fill: SidebarToggleFill, Slot: SidebarToggleSlot } = (0, import_components50.createSlotFill)("SidebarToggle"); 16075 16076 // packages/admin-ui/build-module/page/header.js 16077 var import_jsx_runtime93 = __toESM(require_jsx_runtime()); 16078 function Header({ 16079 breadcrumbs, 16080 badges, 16081 title, 16082 subTitle, 16083 actions, 16084 showSidebarToggle = true 16085 }) { 16086 return /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_components51.__experimentalVStack, { className: "admin-ui-page__header", as: "header", children: [ 16087 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_components51.__experimentalHStack, { justify: "space-between", spacing: 2, children: [ 16088 /* @__PURE__ */ (0, import_jsx_runtime93.jsxs)(import_components51.__experimentalHStack, { spacing: 2, justify: "left", children: [ 16089 showSidebarToggle && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)( 16090 SidebarToggleSlot, 16091 { 16092 bubblesVirtually: true, 16093 className: "admin-ui-page__sidebar-toggle-slot" 16094 } 16095 ), 16096 title && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(import_components51.__experimentalHeading, { as: "h2", level: 3, weight: 500, truncate: true, children: title }), 16097 breadcrumbs, 16098 badges 16099 ] }), 16100 /* @__PURE__ */ (0, import_jsx_runtime93.jsx)( 16101 import_components51.__experimentalHStack, 16102 { 16103 style: { width: "auto", flexShrink: 0 }, 16104 spacing: 2, 16105 className: "admin-ui-page__header-actions", 16106 children: actions 16107 } 16108 ) 16109 ] }), 16110 subTitle && /* @__PURE__ */ (0, import_jsx_runtime93.jsx)("p", { className: "admin-ui-page__header-subtitle", children: subTitle }) 16111 ] }); 16112 } 16113 16114 // packages/admin-ui/build-module/page/index.js 16115 var import_jsx_runtime94 = __toESM(require_jsx_runtime()); 16116 function Page({ 16117 breadcrumbs, 16118 badges, 16119 title, 16120 subTitle, 16121 children, 16122 className, 16123 actions, 16124 hasPadding = false, 16125 showSidebarToggle = true 16126 }) { 16127 const classes = clsx_default("admin-ui-page", className); 16128 return /* @__PURE__ */ (0, import_jsx_runtime94.jsxs)(navigable_region_default, { className: classes, ariaLabel: title, children: [ 16129 (title || breadcrumbs || badges) && /* @__PURE__ */ (0, import_jsx_runtime94.jsx)( 16130 Header, 16131 { 16132 breadcrumbs, 16133 badges, 16134 title, 16135 subTitle, 16136 actions, 16137 showSidebarToggle 16138 } 16139 ), 16140 hasPadding ? /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("div", { className: "admin-ui-page__content has-padding", children }) : children 16141 ] }); 16142 } 16143 Page.SidebarToggleFill = SidebarToggleFill; 16144 var page_default = Page; 16145 16146 // routes/pattern-list/stage.tsx 16147 var import_core_data3 = __toESM(require_core_data()); 16148 var import_components52 = __toESM(require_components()); 16149 var import_data10 = __toESM(require_data()); 16150 var import_element56 = __toESM(require_element()); 16151 var import_editor = __toESM(require_editor()); 16152 var import_patterns3 = __toESM(require_patterns()); 16153 var import_i18n46 = __toESM(require_i18n()); 16154 16155 // routes/lock-unlock.ts 16156 var import_private_apis2 = __toESM(require_private_apis()); 16157 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 16158 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 16159 "@wordpress/routes" 16160 ); 16161 16162 // routes/pattern-list/view-utils.ts 16163 var import_i18n42 = __toESM(require_i18n()); 16164 var LAYOUT_GRID2 = "grid"; 16165 var LAYOUT_TABLE2 = "table"; 16166 var DEFAULT_VIEW = { 16167 type: LAYOUT_GRID2, 16168 perPage: 20, 16169 sort: { 16170 field: "title", 16171 direction: "asc" 16172 }, 16173 filters: [], 16174 fields: ["sync-status"], 16175 layout: { 16176 badgeFields: ["sync-status"] 16177 }, 16178 titleField: "title", 16179 mediaField: "preview" 16180 }; 16181 var DEFAULT_VIEWS = [ 16182 { 16183 slug: "all", 16184 label: (0, import_i18n42.__)("All patterns") 16185 }, 16186 { 16187 slug: "my-patterns", 16188 label: (0, import_i18n42.__)("My patterns") 16189 }, 16190 { 16191 slug: "registered", 16192 label: (0, import_i18n42.__)("Registered") 16193 } 16194 ]; 16195 var DEFAULT_LAYOUTS = { 16196 [LAYOUT_TABLE2]: {}, 16197 [LAYOUT_GRID2]: { 16198 layout: { 16199 badgeFields: ["sync-status"] 16200 } 16201 } 16202 }; 16203 16204 // routes/pattern-list/fields/preview.tsx 16205 var import_i18n43 = __toESM(require_i18n()); 16206 import { Preview } from "@wordpress/lazy-editor"; 16207 function PreviewField({ item }) { 16208 return /* @__PURE__ */ React.createElement( 16209 Preview, 16210 { 16211 blocks: item.blocks, 16212 content: item.content, 16213 description: item.description 16214 } 16215 ); 16216 } 16217 var previewField = { 16218 label: (0, import_i18n43.__)("Preview"), 16219 id: "preview", 16220 render: PreviewField, 16221 enableSorting: false 16222 }; 16223 16224 // routes/pattern-list/fields/sync-status.tsx 16225 var import_i18n44 = __toESM(require_i18n()); 16226 var import_patterns = __toESM(require_patterns()); 16227 var { PATTERN_SYNC_TYPES } = unlock2(import_patterns.privateApis); 16228 var OPERATOR_IS2 = "is"; 16229 var SYNC_FILTERS = [ 16230 { 16231 value: PATTERN_SYNC_TYPES.full, 16232 label: (0, import_i18n44._x)("Synced", "pattern (singular)"), 16233 description: (0, import_i18n44.__)("Patterns that are kept in sync across the site.") 16234 }, 16235 { 16236 value: PATTERN_SYNC_TYPES.unsynced, 16237 label: (0, import_i18n44._x)("Not synced", "pattern (singular)"), 16238 description: (0, import_i18n44.__)( 16239 "Patterns that can be changed freely without affecting the site." 16240 ) 16241 } 16242 ]; 16243 var patternStatusField = { 16244 label: (0, import_i18n44.__)("Sync status"), 16245 id: "sync-status", 16246 render: ({ item }) => { 16247 const syncStatus = item.syncStatus; 16248 return /* @__PURE__ */ React.createElement( 16249 "span", 16250 { 16251 className: `routes-pattern-list__field-sync-status-$syncStatus}` 16252 }, 16253 SYNC_FILTERS.find(({ value }) => value === syncStatus)?.label 16254 ); 16255 }, 16256 elements: SYNC_FILTERS, 16257 filterBy: { 16258 operators: [OPERATOR_IS2], 16259 isPrimary: true 16260 }, 16261 enableSorting: false 16262 }; 16263 16264 // routes/pattern-list/fields/category.tsx 16265 var import_i18n45 = __toESM(require_i18n()); 16266 var import_data8 = __toESM(require_data()); 16267 var import_core_data = __toESM(require_core_data()); 16268 var import_element54 = __toESM(require_element()); 16269 var OPERATOR_IS3 = "is"; 16270 function CategoryField({ item }) { 16271 const blockPatternCategories = (0, import_data8.useSelect)( 16272 (select2) => select2(import_core_data.store).getBlockPatternCategories(), 16273 [] 16274 ); 16275 const categoryLabels = (0, import_element54.useMemo)(() => { 16276 if (!item.categories || !Array.isArray(item.categories)) { 16277 return []; 16278 } 16279 return item.categories.map((catSlug) => { 16280 const category = blockPatternCategories?.find( 16281 (cat) => cat.name === catSlug 16282 ); 16283 return category ? category.label || category.name : null; 16284 }).filter(Boolean); 16285 }, [item.categories, blockPatternCategories]); 16286 if (categoryLabels.length === 0) { 16287 return /* @__PURE__ */ React.createElement("span", { className: "pattern-category-field__empty" }, "\u2014"); 16288 } 16289 return /* @__PURE__ */ React.createElement("span", { className: "pattern-category-field" }, categoryLabels.join(", ")); 16290 } 16291 function usePatternCategories() { 16292 const userPatternCategories = (0, import_data8.useSelect)( 16293 (select2) => select2(import_core_data.store).getUserPatternCategories(), 16294 [] 16295 ); 16296 const blockPatternCategories = (0, import_data8.useSelect)( 16297 (select2) => select2(import_core_data.store).getBlockPatternCategories(), 16298 [] 16299 ); 16300 return (0, import_element54.useMemo)(() => { 16301 const categoryMap = /* @__PURE__ */ new Map(); 16302 userPatternCategories?.forEach((cat) => { 16303 if (!categoryMap.has(cat.name)) { 16304 categoryMap.set(cat.name, { 16305 value: cat.name, 16306 label: cat.label || cat.name 16307 }); 16308 } 16309 }); 16310 blockPatternCategories?.forEach((cat) => { 16311 if (!categoryMap.has(cat.name)) { 16312 categoryMap.set(cat.name, { 16313 value: cat.name, 16314 label: cat.label || cat.name 16315 }); 16316 } 16317 }); 16318 return Array.from(categoryMap.values()).sort( 16319 (a2, b2) => a2.label.localeCompare(b2.label) 16320 ); 16321 }, [userPatternCategories, blockPatternCategories]); 16322 } 16323 function usePatternCategoryField() { 16324 const categories = usePatternCategories(); 16325 return { 16326 label: (0, import_i18n45.__)("Category"), 16327 id: "category", 16328 render: CategoryField, 16329 elements: categories, 16330 getValue: ({ item }) => { 16331 return item.categories; 16332 }, 16333 filterBy: { 16334 operators: [OPERATOR_IS3], 16335 isPrimary: true 16336 }, 16337 enableSorting: false 16338 }; 16339 } 16340 16341 // routes/pattern-list/use-patterns.ts 16342 var import_data9 = __toESM(require_data()); 16343 var import_core_data2 = __toESM(require_core_data()); 16344 var import_element55 = __toESM(require_element()); 16345 var import_patterns2 = __toESM(require_patterns()); 16346 var import_block_editor = __toESM(require_block_editor()); 16347 16348 // routes/pattern-list/utils.ts 16349 var filterOutDuplicatesByName = (currentItem, index, items) => index === items.findIndex((item) => currentItem.name === item.name); 16350 16351 // routes/pattern-list/use-patterns.ts 16352 var { 16353 PATTERN_TYPES, 16354 PATTERN_SYNC_TYPES: PATTERN_SYNC_TYPES2, 16355 EXCLUDED_PATTERN_SOURCES, 16356 PATTERN_DEFAULT_CATEGORY 16357 } = unlock2(import_patterns2.privateApis); 16358 var { extractWords, getNormalizedSearchTerms, normalizeString: normalizeString2 } = unlock2( 16359 import_block_editor.privateApis 16360 ); 16361 function normalizeThemePattern(pattern) { 16362 return { 16363 id: pattern.name, 16364 title: pattern.title, 16365 content: pattern.content, 16366 keywords: pattern.keywords || [], 16367 type: PATTERN_TYPES.theme, 16368 // Normalize categories to always be an array of slugs 16369 categories: pattern.categories || [], 16370 // Theme patterns are always unsynced 16371 syncStatus: PATTERN_SYNC_TYPES2.unsynced, 16372 description: pattern.description || "" 16373 }; 16374 } 16375 function normalizeUserPattern(pattern, userPatternCategories) { 16376 const categories = []; 16377 if (pattern.wp_pattern_category && Array.isArray(pattern.wp_pattern_category)) { 16378 pattern.wp_pattern_category.forEach((catId) => { 16379 const category = userPatternCategories?.find( 16380 (cat) => cat.id === catId 16381 ); 16382 if (category) { 16383 categories.push(category.name); 16384 } 16385 }); 16386 } 16387 const numericId = pattern.id; 16388 return { 16389 id: pattern.name || pattern.id.toString(), 16390 _recordId: numericId, 16391 // Keep numeric ID for permissions lookup 16392 keywords: [], 16393 type: PATTERN_TYPES.user, 16394 // Normalize categories to always be an array of slugs 16395 categories, 16396 // Normalize sync status 16397 syncStatus: pattern.wp_pattern_sync_status || PATTERN_SYNC_TYPES2.full, 16398 title: typeof pattern.title === "string" ? pattern.title : pattern.title.raw, 16399 content: typeof pattern.content === "string" ? pattern.content : pattern.content.raw, 16400 description: pattern.excerpt?.raw || "", 16401 blocks: pattern.blocks 16402 }; 16403 } 16404 var removeMatchingTerms = (unmatchedTerms, unprocessedTerms) => { 16405 return unmatchedTerms.filter( 16406 (term) => !getNormalizedSearchTerms(unprocessedTerms).some( 16407 (unprocessedTerm) => unprocessedTerm.includes(term) 16408 ) 16409 ); 16410 }; 16411 function getItemSearchRank(item, searchTerm, config) { 16412 const { categoryId, hasCategory, onlyFilterByCategory } = config; 16413 let rank = categoryId === PATTERN_DEFAULT_CATEGORY || categoryId === "my-patterns" && item.type === PATTERN_TYPES.user || hasCategory && hasCategory(item, categoryId || "") ? 1 : 0; 16414 if (!rank || onlyFilterByCategory) { 16415 return rank; 16416 } 16417 const normalizedSearchInput = normalizeString2(searchTerm); 16418 const normalizedTitle = normalizeString2(item.title); 16419 if (normalizedSearchInput === normalizedTitle) { 16420 rank += 30; 16421 } else if (normalizedTitle.startsWith(normalizedSearchInput)) { 16422 rank += 20; 16423 } else { 16424 const terms = [ 16425 item.id, 16426 item.title, 16427 item.description, 16428 ...item.keywords 16429 ].join(" "); 16430 const normalizedSearchTerms = extractWords(normalizedSearchInput); 16431 const unmatchedTerms = removeMatchingTerms( 16432 normalizedSearchTerms, 16433 terms 16434 ); 16435 if (unmatchedTerms.length === 0) { 16436 rank += 10; 16437 } 16438 } 16439 return rank; 16440 } 16441 function searchItems(items = [], searchInput = "", config = {}) { 16442 const normalizedSearchTerms = getNormalizedSearchTerms(searchInput); 16443 const onlyFilterByCategory = config.categoryId !== PATTERN_DEFAULT_CATEGORY && !normalizedSearchTerms.length; 16444 const searchRankConfig = { ...config, onlyFilterByCategory }; 16445 const threshold = onlyFilterByCategory ? 0 : 1; 16446 const rankedItems = items.map((item) => { 16447 return [ 16448 item, 16449 getItemSearchRank(item, searchInput, searchRankConfig) 16450 ]; 16451 }).filter(([, rank]) => rank > threshold); 16452 if (normalizedSearchTerms.length === 0) { 16453 return rankedItems.map(([item]) => item); 16454 } 16455 rankedItems.sort(([, rank1], [, rank2]) => rank2 - rank1); 16456 return rankedItems.map(([item]) => item); 16457 } 16458 var selectThemePatterns = (0, import_data9.createSelector)( 16459 (select2) => { 16460 const { getBlockPatterns } = select2(import_core_data2.store); 16461 const { isResolving: isResolvingSelector } = select2(import_core_data2.store); 16462 const restBlockPatterns = getBlockPatterns(); 16463 const patterns = (restBlockPatterns || []).filter( 16464 (pattern) => !EXCLUDED_PATTERN_SOURCES.includes(pattern.source) 16465 ).filter(filterOutDuplicatesByName).filter((pattern) => pattern.inserter !== false).map(normalizeThemePattern); 16466 return { 16467 patterns, 16468 isResolving: isResolvingSelector("getBlockPatterns") 16469 }; 16470 }, 16471 (select2) => [ 16472 select2(import_core_data2.store).getBlockPatterns(), 16473 select2(import_core_data2.store).isResolving("getBlockPatterns") 16474 ] 16475 ); 16476 var selectUserPatterns = (0, import_data9.createSelector)( 16477 (select2, syncStatus = void 0, search = "") => { 16478 const { 16479 getEntityRecords, 16480 isResolving: isResolvingSelector, 16481 getUserPatternCategories 16482 } = select2(import_core_data2.store); 16483 const query = { per_page: -1 }; 16484 const patternPosts = getEntityRecords( 16485 "postType", 16486 PATTERN_TYPES.user, 16487 query 16488 ); 16489 const userPatternCategories = getUserPatternCategories(); 16490 let patterns = (patternPosts ?? []).map( 16491 (pattern) => normalizeUserPattern(pattern, userPatternCategories) 16492 ); 16493 const isResolving = isResolvingSelector("getEntityRecords", [ 16494 "postType", 16495 PATTERN_TYPES.user, 16496 query 16497 ]); 16498 if (syncStatus) { 16499 patterns = patterns.filter( 16500 (pattern) => pattern.syncStatus === syncStatus 16501 ); 16502 } 16503 patterns = searchItems(patterns, search, { 16504 // We exit user pattern retrieval early if we aren't in the 16505 // catch-all category for user created patterns, so it has 16506 // to be in the category. 16507 categoryId: PATTERN_DEFAULT_CATEGORY, 16508 hasCategory: () => true 16509 }); 16510 return { 16511 patterns, 16512 isResolving, 16513 categories: userPatternCategories 16514 }; 16515 }, 16516 (select2) => [ 16517 select2(import_core_data2.store).getEntityRecords("postType", PATTERN_TYPES.user, { 16518 per_page: -1 16519 }), 16520 select2(import_core_data2.store).isResolving("getEntityRecords", [ 16521 "postType", 16522 PATTERN_TYPES.user, 16523 { per_page: -1 } 16524 ]), 16525 select2(import_core_data2.store).getUserPatternCategories() 16526 ] 16527 ); 16528 var selectPatterns = (0, import_data9.createSelector)( 16529 (select2, categoryId, syncStatus, search = "") => { 16530 const { 16531 patterns: themePatterns, 16532 isResolving: isResolvingThemePatterns 16533 } = selectThemePatterns(select2); 16534 const { patterns: userPatterns, isResolving: isResolvingUserPatterns } = selectUserPatterns(select2); 16535 let patterns = [ 16536 ...themePatterns || [], 16537 ...userPatterns || [] 16538 ]; 16539 if (syncStatus) { 16540 patterns = patterns.filter( 16541 (pattern) => pattern.syncStatus === syncStatus 16542 ); 16543 } 16544 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) { 16545 patterns = searchItems(patterns, search, { 16546 categoryId, 16547 hasCategory: (item, currentCategory) => { 16548 return item.categories?.includes(currentCategory); 16549 } 16550 }); 16551 } else { 16552 patterns = searchItems(patterns, search, { 16553 categoryId: PATTERN_DEFAULT_CATEGORY, 16554 hasCategory: () => true 16555 }); 16556 } 16557 return { 16558 patterns, 16559 isResolving: isResolvingThemePatterns || isResolvingUserPatterns 16560 }; 16561 }, 16562 (select2) => [ 16563 selectThemePatterns(select2), 16564 selectUserPatterns(select2) 16565 ] 16566 ); 16567 function useAugmentPatternsWithPermissions(patterns) { 16568 const idsAndTypes = (0, import_element55.useMemo)( 16569 () => patterns?.filter((record) => record.type !== PATTERN_TYPES.theme).map((record) => [ 16570 record.type, 16571 record._recordId, 16572 record.id 16573 ]) ?? [], 16574 [patterns] 16575 ); 16576 const permissions = (0, import_data9.useSelect)( 16577 (select2) => { 16578 const { getEntityRecordPermissions } = unlock2( 16579 select2(import_core_data2.store) 16580 ); 16581 return idsAndTypes.reduce( 16582 (acc, [type, numericId, stringId]) => { 16583 acc[stringId] = getEntityRecordPermissions( 16584 "postType", 16585 type, 16586 numericId 16587 ); 16588 return acc; 16589 }, 16590 {} 16591 ); 16592 }, 16593 [idsAndTypes] 16594 ); 16595 return (0, import_element55.useMemo)( 16596 () => patterns?.map((record) => ({ 16597 ...record, 16598 permissions: permissions?.[record.id] ?? {} 16599 })) ?? [], 16600 [patterns, permissions] 16601 ); 16602 } 16603 var usePatterns = (postType, categoryId, { search = "", syncStatus } = {}) => { 16604 return (0, import_data9.useSelect)( 16605 (select2) => { 16606 if (postType === PATTERN_TYPES.user) { 16607 const result = selectUserPatterns(select2, syncStatus, search); 16608 let { patterns } = result; 16609 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) { 16610 patterns = patterns.filter( 16611 (pattern) => pattern.categories.includes(categoryId) 16612 ); 16613 } 16614 return { 16615 patterns, 16616 isResolving: result.isResolving 16617 }; 16618 } else if (postType === PATTERN_TYPES.theme) { 16619 const result = selectThemePatterns(select2); 16620 let { patterns } = result; 16621 if (categoryId && categoryId !== PATTERN_DEFAULT_CATEGORY) { 16622 patterns = patterns.filter( 16623 (pattern) => pattern.categories.includes(categoryId) 16624 ); 16625 } 16626 patterns = searchItems(patterns, search, { 16627 categoryId: categoryId || PATTERN_DEFAULT_CATEGORY, 16628 hasCategory: () => true 16629 }); 16630 return { 16631 patterns, 16632 isResolving: result.isResolving 16633 }; 16634 } 16635 return selectPatterns(select2, categoryId, syncStatus, search); 16636 }, 16637 [categoryId, postType, search, syncStatus] 16638 ); 16639 }; 16640 var use_patterns_default = usePatterns; 16641 16642 // routes/pattern-list/style.scss 16643 var css = `/** 16644 * SCSS Variables. 16645 * 16646 * Please use variables from this sheet to ensure consistency across the UI. 16647 * Don't add to this sheet unless you're pretty sure the value will be reused in many places. 16648 * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. 16649 */ 16650 /** 16651 * Colors 16652 */ 16653 /** 16654 * Fonts & basic variables. 16655 */ 16656 /** 16657 * Typography 16658 */ 16659 /** 16660 * Grid System. 16661 * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ 16662 */ 16663 /** 16664 * Radius scale. 16665 */ 16666 /** 16667 * Elevation scale. 16668 */ 16669 /** 16670 * Dimensions. 16671 */ 16672 /** 16673 * Mobile specific styles 16674 */ 16675 /** 16676 * Editor styles. 16677 */ 16678 /** 16679 * Block & Editor UI. 16680 */ 16681 /** 16682 * Block paddings. 16683 */ 16684 /** 16685 * React Native specific. 16686 * These variables do not appear to be used anywhere else. 16687 */ 16688 /** 16689 * Typography 16690 */ 16691 /** 16692 * SCSS Variables. 16693 * 16694 * Please use variables from this sheet to ensure consistency across the UI. 16695 * Don't add to this sheet unless you're pretty sure the value will be reused in many places. 16696 * For example, don't add rules to this sheet that affect block visuals. It's purely for UI. 16697 */ 16698 /** 16699 * Colors 16700 */ 16701 /** 16702 * Fonts & basic variables. 16703 */ 16704 /** 16705 * Typography 16706 */ 16707 /** 16708 * Grid System. 16709 * https://make.wordpress.org/design/2019/10/31/proposal-a-consistent-spacing-system-for-wordpress/ 16710 */ 16711 /** 16712 * Radius scale. 16713 */ 16714 /** 16715 * Elevation scale. 16716 */ 16717 /** 16718 * Dimensions. 16719 */ 16720 /** 16721 * Mobile specific styles 16722 */ 16723 /** 16724 * Editor styles. 16725 */ 16726 /** 16727 * Block & Editor UI. 16728 */ 16729 /** 16730 * Block paddings. 16731 */ 16732 /** 16733 * React Native specific. 16734 * These variables do not appear to be used anywhere else. 16735 */ 16736 /** 16737 * Breakpoints & Media Queries 16738 */ 16739 /** 16740 * Converts a hex value into the rgb equivalent. 16741 * 16742 * @param {string} hex - the hexadecimal value to convert 16743 * @return {string} comma separated rgb values 16744 */ 16745 /** 16746 * Long content fade mixin 16747 * 16748 * Creates a fading overlay to signify that the content is longer 16749 * than the space allows. 16750 */ 16751 /** 16752 * Breakpoint mixins 16753 */ 16754 /** 16755 * Focus styles. 16756 */ 16757 /** 16758 * Applies editor left position to the selector passed as argument 16759 */ 16760 /** 16761 * Styles that are reused verbatim in a few places 16762 */ 16763 /** 16764 * Allows users to opt-out of animations via OS-level preferences. 16765 */ 16766 /** 16767 * Reset default styles for JavaScript UI based pages. 16768 * This is a WP-admin agnostic reset 16769 */ 16770 /** 16771 * Reset the WP Admin page styles for Gutenberg-like pages. 16772 */ 16773 :root { 16774 --wp-block-synced-color: #7a00df; 16775 --wp-block-synced-color--rgb: 122, 0, 223; 16776 --wp-bound-block-color: var(--wp-block-synced-color); 16777 --wp-editor-canvas-background: #ddd; 16778 --wp-admin-theme-color: #007cba; 16779 --wp-admin-theme-color--rgb: 0, 124, 186; 16780 --wp-admin-theme-color-darker-10: rgb(0, 107, 160.5); 16781 --wp-admin-theme-color-darker-10--rgb: 0, 107, 160.5; 16782 --wp-admin-theme-color-darker-20: #005a87; 16783 --wp-admin-theme-color-darker-20--rgb: 0, 90, 135; 16784 --wp-admin-border-width-focus: 2px; 16785 } 16786 16787 @media (min-resolution: 192dpi) { 16788 :root { 16789 --wp-admin-border-width-focus: 1.5px; 16790 } 16791 } 16792 .patterns-menu-items__convert-modal { 16793 z-index: 1000001; 16794 } 16795 16796 .patterns-menu-items__convert-modal [role=dialog] > [role=document] { 16797 width: 350px; 16798 } 16799 16800 .patterns-menu-items__convert-modal .patterns-menu-items__convert-modal-categories { 16801 position: relative; 16802 } 16803 16804 .patterns-menu-items__convert-modal .components-form-token-field__suggestions-list:not(:empty) { 16805 position: absolute; 16806 border: 1px solid var(--wp-admin-theme-color); 16807 border-bottom-left-radius: 2px; 16808 border-bottom-right-radius: 2px; 16809 box-shadow: 0 0 0.5px 0.5px var(--wp-admin-theme-color); 16810 box-sizing: border-box; 16811 z-index: 1; 16812 background-color: #fff; 16813 width: calc(100% + 2px); 16814 left: -1px; 16815 min-width: initial; 16816 max-height: 96px; 16817 } 16818 16819 .patterns-create-modal__name-input input[type=text] { 16820 margin: 0; 16821 } 16822 16823 .patterns-rename-pattern-category-modal__validation-message { 16824 color: #cc1818; 16825 } 16826 16827 @media (min-width: 782px) { 16828 .patterns-rename-pattern-category-modal__validation-message { 16829 width: 320px; 16830 } 16831 } 16832 .pattern-overrides-control__allow-overrides-button { 16833 width: 100%; 16834 justify-content: center; 16835 } 16836 16837 .routes-pattern-list__tabs-wrapper { 16838 border-bottom: 1px solid #f0f0f0; 16839 padding: 0 24px; 16840 } 16841 16842 .dataviews-view-grid__badge-fields .dataviews-view-grid__field-value:has(.routes-pattern-list__field-sync-status-fully) { 16843 background: rgba(var(--wp-block-synced-color--rgb), 0.04); 16844 color: var(--wp-block-synced-color); 16845 }`; 16846 document.head.appendChild(document.createElement("style")).appendChild(document.createTextNode(css)); 16847 16848 // routes/pattern-list/stage.tsx 16849 var { usePostActions, patternTitleField } = unlock2(import_editor.privateApis); 16850 var { Tabs } = unlock2(import_components52.privateApis); 16851 var { PATTERN_TYPES: PATTERN_TYPES2, CreatePatternModal } = unlock2(import_patterns3.privateApis); 16852 function PatternList() { 16853 const invalidate = useInvalidate(); 16854 const { type = "all" } = useParams({ 16855 from: "/patterns/list/$type" 16856 }); 16857 const navigate = useNavigate(); 16858 const searchParams = useSearch({ from: "/patterns/list/$type" }); 16859 const postTypeObject = (0, import_data10.useSelect)( 16860 (select2) => select2(import_core_data3.store).getPostType("wp_block"), 16861 [] 16862 ); 16863 const labels = postTypeObject?.labels; 16864 const canCreateRecord = (0, import_data10.useSelect)( 16865 (select2) => select2(import_core_data3.store).canUser("create", { 16866 kind: "postType", 16867 name: "wp_block" 16868 }), 16869 [] 16870 ); 16871 const [showPatternModal, setShowPatternModal] = (0, import_element56.useState)(false); 16872 const handleQueryParamsChange = (0, import_element56.useCallback)( 16873 (params) => { 16874 navigate({ 16875 search: { 16876 ...searchParams, 16877 ...params 16878 } 16879 }); 16880 }, 16881 [searchParams, navigate] 16882 ); 16883 const { view, isModified, updateView, resetToDefault } = useView({ 16884 kind: "postType", 16885 name: "wp_block", 16886 slug: type, 16887 defaultView: DEFAULT_VIEW, 16888 queryParams: searchParams, 16889 onChangeQueryParams: handleQueryParamsChange 16890 }); 16891 const onReset = () => { 16892 resetToDefault(); 16893 invalidate(); 16894 }; 16895 const onChangeView = (newView) => { 16896 updateView(newView); 16897 if (newView.type !== view.type) { 16898 invalidate(); 16899 } 16900 }; 16901 const categoryFilter = (0, import_element56.useMemo)(() => { 16902 const filter = view.filters?.find((f2) => f2.field === "category"); 16903 return filter?.value || "all-patterns"; 16904 }, [view.filters]); 16905 const syncStatusFilter = (0, import_element56.useMemo)(() => { 16906 const filter = view.filters?.find((f2) => f2.field === "sync-status"); 16907 return filter?.value; 16908 }, [view.filters]); 16909 const patternType = (0, import_element56.useMemo)(() => { 16910 if (type === "my-patterns") { 16911 return PATTERN_TYPES2.user; 16912 } else if (type === "registered") { 16913 return PATTERN_TYPES2.theme; 16914 } 16915 return null; 16916 }, [type]); 16917 const { patterns, isResolving } = use_patterns_default( 16918 patternType, 16919 categoryFilter, 16920 { 16921 search: view.search, 16922 syncStatus: syncStatusFilter 16923 } 16924 ); 16925 const patternsWithPermissions = useAugmentPatternsWithPermissions(patterns); 16926 const patternCategoryField = usePatternCategoryField(); 16927 const fields = (0, import_element56.useMemo)(() => { 16928 const patternFields = [ 16929 previewField, 16930 patternTitleField, 16931 patternCategoryField 16932 ]; 16933 if (type === "my-patterns" || type === "all") { 16934 patternFields.push(patternStatusField); 16935 } 16936 return patternFields; 16937 }, [type, patternCategoryField]); 16938 const { data: posts, paginationInfo } = (0, import_element56.useMemo)(() => { 16939 const viewWithoutFilters = { ...view }; 16940 delete viewWithoutFilters.search; 16941 viewWithoutFilters.filters = []; 16942 return filterSortAndPaginate( 16943 patternsWithPermissions, 16944 viewWithoutFilters, 16945 fields 16946 ); 16947 }, [patternsWithPermissions, view, fields]); 16948 const { totalItems, totalPages } = paginationInfo; 16949 const cleanupDeletedPostIdsFromUrl = (0, import_element56.useCallback)( 16950 (deletedItems) => { 16951 const deletedIds = deletedItems.map((item) => item.id); 16952 const currentPostIds = searchParams.postIds || []; 16953 const remainingPostIds = currentPostIds.filter( 16954 (id) => !deletedIds.includes(id) 16955 ); 16956 if (remainingPostIds.length !== currentPostIds.length) { 16957 navigate({ 16958 search: { 16959 ...searchParams, 16960 postIds: remainingPostIds.length > 0 ? remainingPostIds : void 0 16961 } 16962 }); 16963 } else { 16964 invalidate(); 16965 } 16966 }, 16967 [invalidate, searchParams, navigate] 16968 ); 16969 const postTypeActions = usePostActions({ 16970 postType: "wp_block", 16971 context: "list", 16972 onActionPerformed: (actionId, items) => { 16973 if (actionId === "move-to-trash" || actionId === "permanently-delete") { 16974 cleanupDeletedPostIdsFromUrl(items); 16975 } 16976 } 16977 }); 16978 const actions = (0, import_element56.useMemo)(() => { 16979 return [ 16980 ...postTypeActions?.flatMap((action) => { 16981 if (action.id === "view-post-revisions") { 16982 return []; 16983 } 16984 return [action]; 16985 }) 16986 ]; 16987 }, [postTypeActions]); 16988 const handleTabChange = (0, import_element56.useCallback)( 16989 (typeSlug) => { 16990 navigate({ 16991 to: `/patterns/list/$typeSlug}` 16992 }); 16993 }, 16994 [navigate] 16995 ); 16996 if (!postTypeObject) { 16997 return null; 16998 } 16999 const selection = searchParams.postIds ?? []; 17000 if (view.type === "list" && selection.length === 0 && posts?.length > 0) { 17001 selection.push(posts[0].id); 17002 } 17003 if (view.type === "list") { 17004 selection.splice(1); 17005 } 17006 return /* @__PURE__ */ React.createElement( 17007 page_default, 17008 { 17009 title: (0, import_i18n46.__)("Patterns"), 17010 subTitle: (0, import_i18n46.__)( 17011 "Reusable design elements for your site. Create once, use everywhere." 17012 ), 17013 className: "pattern-page", 17014 actions: /* @__PURE__ */ React.createElement(React.Fragment, null, isModified && /* @__PURE__ */ React.createElement( 17015 import_components52.Button, 17016 { 17017 variant: "tertiary", 17018 size: "compact", 17019 onClick: onReset 17020 }, 17021 (0, import_i18n46.__)("Reset view") 17022 ), labels?.add_new_item && canCreateRecord && /* @__PURE__ */ React.createElement( 17023 import_components52.Button, 17024 { 17025 variant: "primary", 17026 onClick: () => setShowPatternModal(true), 17027 size: "compact" 17028 }, 17029 labels.add_new_item 17030 )), 17031 hasPadding: false 17032 }, 17033 DEFAULT_VIEWS.length > 1 && /* @__PURE__ */ React.createElement("div", { className: "routes-pattern-list__tabs-wrapper" }, /* @__PURE__ */ React.createElement( 17034 Tabs, 17035 { 17036 onSelect: handleTabChange, 17037 selectedTabId: type ?? "all" 17038 }, 17039 /* @__PURE__ */ React.createElement(Tabs.TabList, null, DEFAULT_VIEWS.map( 17040 (filter) => /* @__PURE__ */ React.createElement( 17041 Tabs.Tab, 17042 { 17043 tabId: filter.slug, 17044 key: filter.slug 17045 }, 17046 filter.label 17047 ) 17048 )) 17049 )), 17050 /* @__PURE__ */ React.createElement( 17051 dataviews_default, 17052 { 17053 data: posts, 17054 fields, 17055 view, 17056 onChangeView, 17057 actions, 17058 isLoading: isResolving, 17059 paginationInfo: { 17060 totalItems, 17061 totalPages 17062 }, 17063 defaultLayouts: DEFAULT_LAYOUTS, 17064 selection, 17065 onChangeSelection: (items) => { 17066 navigate({ 17067 search: { 17068 ...searchParams, 17069 postIds: items.length > 0 ? items : void 0, 17070 edit: items.length === 0 ? void 0 : searchParams.edit 17071 } 17072 }); 17073 }, 17074 isItemClickable: (item) => item.type !== PATTERN_TYPES2.theme, 17075 renderItemLink: ({ 17076 item, 17077 ...props 17078 }) => /* @__PURE__ */ React.createElement( 17079 Link, 17080 { 17081 to: `/types/wp_block/edit/$encodeURIComponent( 17082 item.id 17083 )}`, 17084 ...props, 17085 onClick: (event) => { 17086 event.stopPropagation(); 17087 } 17088 } 17089 ) 17090 } 17091 ), 17092 showPatternModal && /* @__PURE__ */ React.createElement( 17093 CreatePatternModal, 17094 { 17095 onClose: () => setShowPatternModal(false), 17096 onSuccess: ({ 17097 pattern 17098 }) => { 17099 setShowPatternModal(false); 17100 navigate({ 17101 to: `/types/wp_block/edit/$encodeURIComponent( 17102 pattern.id 17103 )}` 17104 }); 17105 }, 17106 content: [] 17107 } 17108 ) 17109 ); 17110 } 17111 var stage = PatternList; 17112 export { 17113 stage 17114 }; 17115 /*! Bundled license information: 17116 17117 use-sync-external-store/cjs/use-sync-external-store-shim.development.js: 17118 (** 17119 * @license React 17120 * use-sync-external-store-shim.development.js 17121 * 17122 * Copyright (c) Meta Platforms, Inc. and affiliates. 17123 * 17124 * This source code is licensed under the MIT license found in the 17125 * LICENSE file in the root directory of this source tree. 17126 *) 17127 */
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sun Mar 8 08:20:03 2026 | Cross-referenced by PHPXref |