| [ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
1 "use strict"; 2 var wp; 3 (wp ||= {}).mediaUtils = (() => { 4 var __create = Object.create; 5 var __defProp = Object.defineProperty; 6 var __getOwnPropDesc = Object.getOwnPropertyDescriptor; 7 var __getOwnPropNames = Object.getOwnPropertyNames; 8 var __getProtoOf = Object.getPrototypeOf; 9 var __hasOwnProp = Object.prototype.hasOwnProperty; 10 var __commonJS = (cb, mod) => function __require() { 11 return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; 12 }; 13 var __export = (target, all) => { 14 for (var name in all) 15 __defProp(target, name, { get: all[name], enumerable: true }); 16 }; 17 var __copyProps = (to, from, except, desc) => { 18 if (from && typeof from === "object" || typeof from === "function") { 19 for (let key of __getOwnPropNames(from)) 20 if (!__hasOwnProp.call(to, key) && key !== except) 21 __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); 22 } 23 return to; 24 }; 25 var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( 26 // If the importer is in node compatibility mode or this is not an ESM 27 // file that has been converted to a CommonJS file using a Babel- 28 // compatible transform (i.e. "__esModule" has not been set), then set 29 // "default" to the CommonJS "module.exports" for node compatibility. 30 isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, 31 mod 32 )); 33 var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); 34 35 // package-external:@wordpress/element 36 var require_element = __commonJS({ 37 "package-external:@wordpress/element"(exports, module) { 38 module.exports = window.wp.element; 39 } 40 }); 41 42 // package-external:@wordpress/i18n 43 var require_i18n = __commonJS({ 44 "package-external:@wordpress/i18n"(exports, module) { 45 module.exports = window.wp.i18n; 46 } 47 }); 48 49 // package-external:@wordpress/blob 50 var require_blob = __commonJS({ 51 "package-external:@wordpress/blob"(exports, module) { 52 module.exports = window.wp.blob; 53 } 54 }); 55 56 // package-external:@wordpress/api-fetch 57 var require_api_fetch = __commonJS({ 58 "package-external:@wordpress/api-fetch"(exports, module) { 59 module.exports = window.wp.apiFetch; 60 } 61 }); 62 63 // package-external:@wordpress/core-data 64 var require_core_data = __commonJS({ 65 "package-external:@wordpress/core-data"(exports, module) { 66 module.exports = window.wp.coreData; 67 } 68 }); 69 70 // package-external:@wordpress/data 71 var require_data = __commonJS({ 72 "package-external:@wordpress/data"(exports, module) { 73 module.exports = window.wp.data; 74 } 75 }); 76 77 // package-external:@wordpress/components 78 var require_components = __commonJS({ 79 "package-external:@wordpress/components"(exports, module) { 80 module.exports = window.wp.components; 81 } 82 }); 83 84 // package-external:@wordpress/primitives 85 var require_primitives = __commonJS({ 86 "package-external:@wordpress/primitives"(exports, module) { 87 module.exports = window.wp.primitives; 88 } 89 }); 90 91 // vendor-external:react/jsx-runtime 92 var require_jsx_runtime = __commonJS({ 93 "vendor-external:react/jsx-runtime"(exports, module) { 94 module.exports = window.ReactJSXRuntime; 95 } 96 }); 97 98 // package-external:@wordpress/compose 99 var require_compose = __commonJS({ 100 "package-external:@wordpress/compose"(exports, module) { 101 module.exports = window.wp.compose; 102 } 103 }); 104 105 // package-external:@wordpress/keycodes 106 var require_keycodes = __commonJS({ 107 "package-external:@wordpress/keycodes"(exports, module) { 108 module.exports = window.wp.keycodes; 109 } 110 }); 111 112 // package-external:@wordpress/private-apis 113 var require_private_apis = __commonJS({ 114 "package-external:@wordpress/private-apis"(exports, module) { 115 module.exports = window.wp.privateApis; 116 } 117 }); 118 119 // vendor-external:react 120 var require_react = __commonJS({ 121 "vendor-external:react"(exports, module) { 122 module.exports = window.React; 123 } 124 }); 125 126 // node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js 127 var require_use_sync_external_store_shim_development = __commonJS({ 128 "node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js"(exports) { 129 "use strict"; 130 (function() { 131 function is(x2, y2) { 132 return x2 === y2 && (0 !== x2 || 1 / x2 === 1 / y2) || x2 !== x2 && y2 !== y2; 133 } 134 function useSyncExternalStore$2(subscribe2, getSnapshot) { 135 didWarnOld18Alpha || void 0 === React4.startTransition || (didWarnOld18Alpha = true, console.error( 136 "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." 137 )); 138 var value = getSnapshot(); 139 if (!didWarnUncachedGetSnapshot) { 140 var cachedValue = getSnapshot(); 141 objectIs(value, cachedValue) || (console.error( 142 "The result of getSnapshot should be cached to avoid an infinite loop" 143 ), didWarnUncachedGetSnapshot = true); 144 } 145 cachedValue = useState24({ 146 inst: { value, getSnapshot } 147 }); 148 var inst = cachedValue[0].inst, forceUpdate = cachedValue[1]; 149 useLayoutEffect2( 150 function() { 151 inst.value = value; 152 inst.getSnapshot = getSnapshot; 153 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 154 }, 155 [subscribe2, value, getSnapshot] 156 ); 157 useEffect17( 158 function() { 159 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 160 return subscribe2(function() { 161 checkIfSnapshotChanged(inst) && forceUpdate({ inst }); 162 }); 163 }, 164 [subscribe2] 165 ); 166 useDebugValue(value); 167 return value; 168 } 169 function checkIfSnapshotChanged(inst) { 170 var latestGetSnapshot = inst.getSnapshot; 171 inst = inst.value; 172 try { 173 var nextValue = latestGetSnapshot(); 174 return !objectIs(inst, nextValue); 175 } catch (error) { 176 return true; 177 } 178 } 179 function useSyncExternalStore$1(subscribe2, getSnapshot) { 180 return getSnapshot(); 181 } 182 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error()); 183 var React4 = require_react(), objectIs = "function" === typeof Object.is ? Object.is : is, useState24 = React4.useState, useEffect17 = React4.useEffect, useLayoutEffect2 = React4.useLayoutEffect, useDebugValue = React4.useDebugValue, didWarnOld18Alpha = false, didWarnUncachedGetSnapshot = false, shim = "undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement ? useSyncExternalStore$1 : useSyncExternalStore$2; 184 exports.useSyncExternalStore = void 0 !== React4.useSyncExternalStore ? React4.useSyncExternalStore : shim; 185 "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error()); 186 })(); 187 } 188 }); 189 190 // node_modules/use-sync-external-store/shim/index.js 191 var require_shim = __commonJS({ 192 "node_modules/use-sync-external-store/shim/index.js"(exports, module) { 193 "use strict"; 194 if (false) { 195 module.exports = null; 196 } else { 197 module.exports = require_use_sync_external_store_shim_development(); 198 } 199 } 200 }); 201 202 // vendor-external:react-dom 203 var require_react_dom = __commonJS({ 204 "vendor-external:react-dom"(exports, module) { 205 module.exports = window.ReactDOM; 206 } 207 }); 208 209 // node_modules/remove-accents/index.js 210 var require_remove_accents = __commonJS({ 211 "node_modules/remove-accents/index.js"(exports, module) { 212 var characterMap = { 213 "\xC0": "A", 214 "\xC1": "A", 215 "\xC2": "A", 216 "\xC3": "A", 217 "\xC4": "A", 218 "\xC5": "A", 219 "\u1EA4": "A", 220 "\u1EAE": "A", 221 "\u1EB2": "A", 222 "\u1EB4": "A", 223 "\u1EB6": "A", 224 "\xC6": "AE", 225 "\u1EA6": "A", 226 "\u1EB0": "A", 227 "\u0202": "A", 228 "\u1EA2": "A", 229 "\u1EA0": "A", 230 "\u1EA8": "A", 231 "\u1EAA": "A", 232 "\u1EAC": "A", 233 "\xC7": "C", 234 "\u1E08": "C", 235 "\xC8": "E", 236 "\xC9": "E", 237 "\xCA": "E", 238 "\xCB": "E", 239 "\u1EBE": "E", 240 "\u1E16": "E", 241 "\u1EC0": "E", 242 "\u1E14": "E", 243 "\u1E1C": "E", 244 "\u0206": "E", 245 "\u1EBA": "E", 246 "\u1EBC": "E", 247 "\u1EB8": "E", 248 "\u1EC2": "E", 249 "\u1EC4": "E", 250 "\u1EC6": "E", 251 "\xCC": "I", 252 "\xCD": "I", 253 "\xCE": "I", 254 "\xCF": "I", 255 "\u1E2E": "I", 256 "\u020A": "I", 257 "\u1EC8": "I", 258 "\u1ECA": "I", 259 "\xD0": "D", 260 "\xD1": "N", 261 "\xD2": "O", 262 "\xD3": "O", 263 "\xD4": "O", 264 "\xD5": "O", 265 "\xD6": "O", 266 "\xD8": "O", 267 "\u1ED0": "O", 268 "\u1E4C": "O", 269 "\u1E52": "O", 270 "\u020E": "O", 271 "\u1ECE": "O", 272 "\u1ECC": "O", 273 "\u1ED4": "O", 274 "\u1ED6": "O", 275 "\u1ED8": "O", 276 "\u1EDC": "O", 277 "\u1EDE": "O", 278 "\u1EE0": "O", 279 "\u1EDA": "O", 280 "\u1EE2": "O", 281 "\xD9": "U", 282 "\xDA": "U", 283 "\xDB": "U", 284 "\xDC": "U", 285 "\u1EE6": "U", 286 "\u1EE4": "U", 287 "\u1EEC": "U", 288 "\u1EEE": "U", 289 "\u1EF0": "U", 290 "\xDD": "Y", 291 "\xE0": "a", 292 "\xE1": "a", 293 "\xE2": "a", 294 "\xE3": "a", 295 "\xE4": "a", 296 "\xE5": "a", 297 "\u1EA5": "a", 298 "\u1EAF": "a", 299 "\u1EB3": "a", 300 "\u1EB5": "a", 301 "\u1EB7": "a", 302 "\xE6": "ae", 303 "\u1EA7": "a", 304 "\u1EB1": "a", 305 "\u0203": "a", 306 "\u1EA3": "a", 307 "\u1EA1": "a", 308 "\u1EA9": "a", 309 "\u1EAB": "a", 310 "\u1EAD": "a", 311 "\xE7": "c", 312 "\u1E09": "c", 313 "\xE8": "e", 314 "\xE9": "e", 315 "\xEA": "e", 316 "\xEB": "e", 317 "\u1EBF": "e", 318 "\u1E17": "e", 319 "\u1EC1": "e", 320 "\u1E15": "e", 321 "\u1E1D": "e", 322 "\u0207": "e", 323 "\u1EBB": "e", 324 "\u1EBD": "e", 325 "\u1EB9": "e", 326 "\u1EC3": "e", 327 "\u1EC5": "e", 328 "\u1EC7": "e", 329 "\xEC": "i", 330 "\xED": "i", 331 "\xEE": "i", 332 "\xEF": "i", 333 "\u1E2F": "i", 334 "\u020B": "i", 335 "\u1EC9": "i", 336 "\u1ECB": "i", 337 "\xF0": "d", 338 "\xF1": "n", 339 "\xF2": "o", 340 "\xF3": "o", 341 "\xF4": "o", 342 "\xF5": "o", 343 "\xF6": "o", 344 "\xF8": "o", 345 "\u1ED1": "o", 346 "\u1E4D": "o", 347 "\u1E53": "o", 348 "\u020F": "o", 349 "\u1ECF": "o", 350 "\u1ECD": "o", 351 "\u1ED5": "o", 352 "\u1ED7": "o", 353 "\u1ED9": "o", 354 "\u1EDD": "o", 355 "\u1EDF": "o", 356 "\u1EE1": "o", 357 "\u1EDB": "o", 358 "\u1EE3": "o", 359 "\xF9": "u", 360 "\xFA": "u", 361 "\xFB": "u", 362 "\xFC": "u", 363 "\u1EE7": "u", 364 "\u1EE5": "u", 365 "\u1EED": "u", 366 "\u1EEF": "u", 367 "\u1EF1": "u", 368 "\xFD": "y", 369 "\xFF": "y", 370 "\u0100": "A", 371 "\u0101": "a", 372 "\u0102": "A", 373 "\u0103": "a", 374 "\u0104": "A", 375 "\u0105": "a", 376 "\u0106": "C", 377 "\u0107": "c", 378 "\u0108": "C", 379 "\u0109": "c", 380 "\u010A": "C", 381 "\u010B": "c", 382 "\u010C": "C", 383 "\u010D": "c", 384 "C\u0306": "C", 385 "c\u0306": "c", 386 "\u010E": "D", 387 "\u010F": "d", 388 "\u0110": "D", 389 "\u0111": "d", 390 "\u0112": "E", 391 "\u0113": "e", 392 "\u0114": "E", 393 "\u0115": "e", 394 "\u0116": "E", 395 "\u0117": "e", 396 "\u0118": "E", 397 "\u0119": "e", 398 "\u011A": "E", 399 "\u011B": "e", 400 "\u011C": "G", 401 "\u01F4": "G", 402 "\u011D": "g", 403 "\u01F5": "g", 404 "\u011E": "G", 405 "\u011F": "g", 406 "\u0120": "G", 407 "\u0121": "g", 408 "\u0122": "G", 409 "\u0123": "g", 410 "\u0124": "H", 411 "\u0125": "h", 412 "\u0126": "H", 413 "\u0127": "h", 414 "\u1E2A": "H", 415 "\u1E2B": "h", 416 "\u0128": "I", 417 "\u0129": "i", 418 "\u012A": "I", 419 "\u012B": "i", 420 "\u012C": "I", 421 "\u012D": "i", 422 "\u012E": "I", 423 "\u012F": "i", 424 "\u0130": "I", 425 "\u0131": "i", 426 "\u0132": "IJ", 427 "\u0133": "ij", 428 "\u0134": "J", 429 "\u0135": "j", 430 "\u0136": "K", 431 "\u0137": "k", 432 "\u1E30": "K", 433 "\u1E31": "k", 434 "K\u0306": "K", 435 "k\u0306": "k", 436 "\u0139": "L", 437 "\u013A": "l", 438 "\u013B": "L", 439 "\u013C": "l", 440 "\u013D": "L", 441 "\u013E": "l", 442 "\u013F": "L", 443 "\u0140": "l", 444 "\u0141": "l", 445 "\u0142": "l", 446 "\u1E3E": "M", 447 "\u1E3F": "m", 448 "M\u0306": "M", 449 "m\u0306": "m", 450 "\u0143": "N", 451 "\u0144": "n", 452 "\u0145": "N", 453 "\u0146": "n", 454 "\u0147": "N", 455 "\u0148": "n", 456 "\u0149": "n", 457 "N\u0306": "N", 458 "n\u0306": "n", 459 "\u014C": "O", 460 "\u014D": "o", 461 "\u014E": "O", 462 "\u014F": "o", 463 "\u0150": "O", 464 "\u0151": "o", 465 "\u0152": "OE", 466 "\u0153": "oe", 467 "P\u0306": "P", 468 "p\u0306": "p", 469 "\u0154": "R", 470 "\u0155": "r", 471 "\u0156": "R", 472 "\u0157": "r", 473 "\u0158": "R", 474 "\u0159": "r", 475 "R\u0306": "R", 476 "r\u0306": "r", 477 "\u0212": "R", 478 "\u0213": "r", 479 "\u015A": "S", 480 "\u015B": "s", 481 "\u015C": "S", 482 "\u015D": "s", 483 "\u015E": "S", 484 "\u0218": "S", 485 "\u0219": "s", 486 "\u015F": "s", 487 "\u0160": "S", 488 "\u0161": "s", 489 "\u0162": "T", 490 "\u0163": "t", 491 "\u021B": "t", 492 "\u021A": "T", 493 "\u0164": "T", 494 "\u0165": "t", 495 "\u0166": "T", 496 "\u0167": "t", 497 "T\u0306": "T", 498 "t\u0306": "t", 499 "\u0168": "U", 500 "\u0169": "u", 501 "\u016A": "U", 502 "\u016B": "u", 503 "\u016C": "U", 504 "\u016D": "u", 505 "\u016E": "U", 506 "\u016F": "u", 507 "\u0170": "U", 508 "\u0171": "u", 509 "\u0172": "U", 510 "\u0173": "u", 511 "\u0216": "U", 512 "\u0217": "u", 513 "V\u0306": "V", 514 "v\u0306": "v", 515 "\u0174": "W", 516 "\u0175": "w", 517 "\u1E82": "W", 518 "\u1E83": "w", 519 "X\u0306": "X", 520 "x\u0306": "x", 521 "\u0176": "Y", 522 "\u0177": "y", 523 "\u0178": "Y", 524 "Y\u0306": "Y", 525 "y\u0306": "y", 526 "\u0179": "Z", 527 "\u017A": "z", 528 "\u017B": "Z", 529 "\u017C": "z", 530 "\u017D": "Z", 531 "\u017E": "z", 532 "\u017F": "s", 533 "\u0192": "f", 534 "\u01A0": "O", 535 "\u01A1": "o", 536 "\u01AF": "U", 537 "\u01B0": "u", 538 "\u01CD": "A", 539 "\u01CE": "a", 540 "\u01CF": "I", 541 "\u01D0": "i", 542 "\u01D1": "O", 543 "\u01D2": "o", 544 "\u01D3": "U", 545 "\u01D4": "u", 546 "\u01D5": "U", 547 "\u01D6": "u", 548 "\u01D7": "U", 549 "\u01D8": "u", 550 "\u01D9": "U", 551 "\u01DA": "u", 552 "\u01DB": "U", 553 "\u01DC": "u", 554 "\u1EE8": "U", 555 "\u1EE9": "u", 556 "\u1E78": "U", 557 "\u1E79": "u", 558 "\u01FA": "A", 559 "\u01FB": "a", 560 "\u01FC": "AE", 561 "\u01FD": "ae", 562 "\u01FE": "O", 563 "\u01FF": "o", 564 "\xDE": "TH", 565 "\xFE": "th", 566 "\u1E54": "P", 567 "\u1E55": "p", 568 "\u1E64": "S", 569 "\u1E65": "s", 570 "X\u0301": "X", 571 "x\u0301": "x", 572 "\u0403": "\u0413", 573 "\u0453": "\u0433", 574 "\u040C": "\u041A", 575 "\u045C": "\u043A", 576 "A\u030B": "A", 577 "a\u030B": "a", 578 "E\u030B": "E", 579 "e\u030B": "e", 580 "I\u030B": "I", 581 "i\u030B": "i", 582 "\u01F8": "N", 583 "\u01F9": "n", 584 "\u1ED2": "O", 585 "\u1ED3": "o", 586 "\u1E50": "O", 587 "\u1E51": "o", 588 "\u1EEA": "U", 589 "\u1EEB": "u", 590 "\u1E80": "W", 591 "\u1E81": "w", 592 "\u1EF2": "Y", 593 "\u1EF3": "y", 594 "\u0200": "A", 595 "\u0201": "a", 596 "\u0204": "E", 597 "\u0205": "e", 598 "\u0208": "I", 599 "\u0209": "i", 600 "\u020C": "O", 601 "\u020D": "o", 602 "\u0210": "R", 603 "\u0211": "r", 604 "\u0214": "U", 605 "\u0215": "u", 606 "B\u030C": "B", 607 "b\u030C": "b", 608 "\u010C\u0323": "C", 609 "\u010D\u0323": "c", 610 "\xCA\u030C": "E", 611 "\xEA\u030C": "e", 612 "F\u030C": "F", 613 "f\u030C": "f", 614 "\u01E6": "G", 615 "\u01E7": "g", 616 "\u021E": "H", 617 "\u021F": "h", 618 "J\u030C": "J", 619 "\u01F0": "j", 620 "\u01E8": "K", 621 "\u01E9": "k", 622 "M\u030C": "M", 623 "m\u030C": "m", 624 "P\u030C": "P", 625 "p\u030C": "p", 626 "Q\u030C": "Q", 627 "q\u030C": "q", 628 "\u0158\u0329": "R", 629 "\u0159\u0329": "r", 630 "\u1E66": "S", 631 "\u1E67": "s", 632 "V\u030C": "V", 633 "v\u030C": "v", 634 "W\u030C": "W", 635 "w\u030C": "w", 636 "X\u030C": "X", 637 "x\u030C": "x", 638 "Y\u030C": "Y", 639 "y\u030C": "y", 640 "A\u0327": "A", 641 "a\u0327": "a", 642 "B\u0327": "B", 643 "b\u0327": "b", 644 "\u1E10": "D", 645 "\u1E11": "d", 646 "\u0228": "E", 647 "\u0229": "e", 648 "\u0190\u0327": "E", 649 "\u025B\u0327": "e", 650 "\u1E28": "H", 651 "\u1E29": "h", 652 "I\u0327": "I", 653 "i\u0327": "i", 654 "\u0197\u0327": "I", 655 "\u0268\u0327": "i", 656 "M\u0327": "M", 657 "m\u0327": "m", 658 "O\u0327": "O", 659 "o\u0327": "o", 660 "Q\u0327": "Q", 661 "q\u0327": "q", 662 "U\u0327": "U", 663 "u\u0327": "u", 664 "X\u0327": "X", 665 "x\u0327": "x", 666 "Z\u0327": "Z", 667 "z\u0327": "z", 668 "\u0439": "\u0438", 669 "\u0419": "\u0418", 670 "\u0451": "\u0435", 671 "\u0401": "\u0415" 672 }; 673 var chars = Object.keys(characterMap).join("|"); 674 var allAccents = new RegExp(chars, "g"); 675 var firstAccent = new RegExp(chars, ""); 676 function matcher(match2) { 677 return characterMap[match2]; 678 } 679 var removeAccents2 = function(string) { 680 return string.replace(allAccents, matcher); 681 }; 682 var hasAccents = function(string) { 683 return !!string.match(firstAccent); 684 }; 685 module.exports = removeAccents2; 686 module.exports.has = hasAccents; 687 module.exports.remove = removeAccents2; 688 } 689 }); 690 691 // node_modules/fast-deep-equal/es6/index.js 692 var require_es6 = __commonJS({ 693 "node_modules/fast-deep-equal/es6/index.js"(exports, module) { 694 "use strict"; 695 module.exports = function equal(a2, b2) { 696 if (a2 === b2) return true; 697 if (a2 && b2 && typeof a2 == "object" && typeof b2 == "object") { 698 if (a2.constructor !== b2.constructor) return false; 699 var length, i2, keys; 700 if (Array.isArray(a2)) { 701 length = a2.length; 702 if (length != b2.length) return false; 703 for (i2 = length; i2-- !== 0; ) 704 if (!equal(a2[i2], b2[i2])) return false; 705 return true; 706 } 707 if (a2 instanceof Map && b2 instanceof Map) { 708 if (a2.size !== b2.size) return false; 709 for (i2 of a2.entries()) 710 if (!b2.has(i2[0])) return false; 711 for (i2 of a2.entries()) 712 if (!equal(i2[1], b2.get(i2[0]))) return false; 713 return true; 714 } 715 if (a2 instanceof Set && b2 instanceof Set) { 716 if (a2.size !== b2.size) return false; 717 for (i2 of a2.entries()) 718 if (!b2.has(i2[0])) return false; 719 return true; 720 } 721 if (ArrayBuffer.isView(a2) && ArrayBuffer.isView(b2)) { 722 length = a2.length; 723 if (length != b2.length) return false; 724 for (i2 = length; i2-- !== 0; ) 725 if (a2[i2] !== b2[i2]) return false; 726 return true; 727 } 728 if (a2.constructor === RegExp) return a2.source === b2.source && a2.flags === b2.flags; 729 if (a2.valueOf !== Object.prototype.valueOf) return a2.valueOf() === b2.valueOf(); 730 if (a2.toString !== Object.prototype.toString) return a2.toString() === b2.toString(); 731 keys = Object.keys(a2); 732 length = keys.length; 733 if (length !== Object.keys(b2).length) return false; 734 for (i2 = length; i2-- !== 0; ) 735 if (!Object.prototype.hasOwnProperty.call(b2, keys[i2])) return false; 736 for (i2 = length; i2-- !== 0; ) { 737 var key = keys[i2]; 738 if (!equal(a2[key], b2[key])) return false; 739 } 740 return true; 741 } 742 return a2 !== a2 && b2 !== b2; 743 }; 744 } 745 }); 746 747 // package-external:@wordpress/warning 748 var require_warning = __commonJS({ 749 "package-external:@wordpress/warning"(exports, module) { 750 module.exports = window.wp.warning; 751 } 752 }); 753 754 // package-external:@wordpress/date 755 var require_date = __commonJS({ 756 "package-external:@wordpress/date"(exports, module) { 757 module.exports = window.wp.date; 758 } 759 }); 760 761 // package-external:@wordpress/url 762 var require_url = __commonJS({ 763 "package-external:@wordpress/url"(exports, module) { 764 module.exports = window.wp.url; 765 } 766 }); 767 768 // packages/media-utils/build-module/index.js 769 var index_exports = {}; 770 __export(index_exports, { 771 MediaUpload: () => media_upload_default, 772 privateApis: () => privateApis11, 773 transformAttachment: () => transformAttachment, 774 uploadMedia: () => uploadMedia, 775 validateFileSize: () => validateFileSize, 776 validateMimeType: () => validateMimeType, 777 validateMimeTypeForUser: () => validateMimeTypeForUser 778 }); 779 780 // packages/media-utils/build-module/components/media-upload/index.js 781 var import_element = __toESM(require_element()); 782 var import_i18n = __toESM(require_i18n()); 783 var DEFAULT_EMPTY_GALLERY = []; 784 var getFeaturedImageMediaFrame = () => { 785 const { wp } = window; 786 return wp.media.view.MediaFrame.Select.extend({ 787 /** 788 * Enables the Set Featured Image Button. 789 * 790 * @param {Object} toolbar toolbar for featured image state 791 * @return {void} 792 */ 793 featuredImageToolbar(toolbar) { 794 this.createSelectToolbar(toolbar, { 795 text: wp.media.view.l10n.setFeaturedImage, 796 state: this.options.state 797 }); 798 }, 799 /** 800 * Handle the edit state requirements of selected media item. 801 * 802 * @return {void} 803 */ 804 editState() { 805 const selection = this.state("featured-image").get("selection"); 806 const view = new wp.media.view.EditImage({ 807 model: selection.single(), 808 controller: this 809 }).render(); 810 this.content.set(view); 811 view.loadEditor(); 812 }, 813 /** 814 * Create the default states. 815 * 816 * @return {void} 817 */ 818 createStates: function createStates() { 819 this.on( 820 "toolbar:create:featured-image", 821 this.featuredImageToolbar, 822 this 823 ); 824 this.on("content:render:edit-image", this.editState, this); 825 this.states.add([ 826 new wp.media.controller.FeaturedImage(), 827 new wp.media.controller.EditImage({ 828 model: this.options.editImage 829 }) 830 ]); 831 } 832 }); 833 }; 834 var getSingleMediaFrame = () => { 835 const { wp } = window; 836 return wp.media.view.MediaFrame.Select.extend({ 837 /** 838 * Create the default states on the frame. 839 */ 840 createStates() { 841 const options = this.options; 842 if (this.options.states) { 843 return; 844 } 845 this.states.add([ 846 // Main states. 847 new wp.media.controller.Library({ 848 library: wp.media.query(options.library), 849 multiple: options.multiple, 850 title: options.title, 851 priority: 20, 852 filterable: "uploaded" 853 // Allow filtering by uploaded images. 854 }), 855 new wp.media.controller.EditImage({ 856 model: options.editImage 857 }) 858 ]); 859 } 860 }); 861 }; 862 var getGalleryDetailsMediaFrame = () => { 863 const { wp } = window; 864 return wp.media.view.MediaFrame.Post.extend({ 865 /** 866 * Set up gallery toolbar. 867 * 868 * @return {void} 869 */ 870 galleryToolbar() { 871 const editing = this.state().get("editing"); 872 this.toolbar.set( 873 new wp.media.view.Toolbar({ 874 controller: this, 875 items: { 876 insert: { 877 style: "primary", 878 text: editing ? wp.media.view.l10n.updateGallery : wp.media.view.l10n.insertGallery, 879 priority: 80, 880 requires: { library: true }, 881 /** 882 * @fires wp.media.controller.State#update 883 */ 884 click() { 885 const controller = this.controller, state = controller.state(); 886 controller.close(); 887 state.trigger( 888 "update", 889 state.get("library") 890 ); 891 controller.setState(controller.options.state); 892 controller.reset(); 893 } 894 } 895 } 896 }) 897 ); 898 }, 899 /** 900 * Handle the edit state requirements of selected media item. 901 * 902 * @return {void} 903 */ 904 editState() { 905 const selection = this.state("gallery").get("selection"); 906 const view = new wp.media.view.EditImage({ 907 model: selection.single(), 908 controller: this 909 }).render(); 910 this.content.set(view); 911 view.loadEditor(); 912 }, 913 /** 914 * Create the default states. 915 * 916 * @return {void} 917 */ 918 createStates: function createStates() { 919 this.on("toolbar:create:main-gallery", this.galleryToolbar, this); 920 this.on("content:render:edit-image", this.editState, this); 921 this.states.add([ 922 new wp.media.controller.Library({ 923 id: "gallery", 924 title: wp.media.view.l10n.createGalleryTitle, 925 priority: 40, 926 toolbar: "main-gallery", 927 filterable: "uploaded", 928 multiple: "add", 929 editable: false, 930 library: wp.media.query({ 931 type: "image", 932 ...this.options.library 933 }) 934 }), 935 new wp.media.controller.EditImage({ 936 model: this.options.editImage 937 }), 938 new wp.media.controller.GalleryEdit({ 939 library: this.options.selection, 940 editing: this.options.editing, 941 menu: "gallery", 942 displaySettings: false, 943 multiple: true 944 }), 945 new wp.media.controller.GalleryAdd() 946 ]); 947 } 948 }); 949 }; 950 var slimImageObject = (img) => { 951 const attrSet = [ 952 "sizes", 953 "mime", 954 "type", 955 "subtype", 956 "id", 957 "url", 958 "alt", 959 "link", 960 "caption" 961 ]; 962 return attrSet.reduce((result, key) => { 963 if (img?.hasOwnProperty(key)) { 964 result[key] = img[key]; 965 } 966 return result; 967 }, {}); 968 }; 969 var getAttachmentsCollection = (ids) => { 970 const { wp } = window; 971 return wp.media.query({ 972 order: "ASC", 973 orderby: "post__in", 974 post__in: ids, 975 posts_per_page: -1, 976 query: true, 977 type: "image" 978 }); 979 }; 980 var MediaUpload = class extends import_element.Component { 981 constructor() { 982 super(...arguments); 983 this.openModal = this.openModal.bind(this); 984 this.onOpen = this.onOpen.bind(this); 985 this.onSelect = this.onSelect.bind(this); 986 this.onUpdate = this.onUpdate.bind(this); 987 this.onClose = this.onClose.bind(this); 988 } 989 initializeListeners() { 990 this.frame.on("select", this.onSelect); 991 this.frame.on("update", this.onUpdate); 992 this.frame.on("open", this.onOpen); 993 this.frame.on("close", this.onClose); 994 } 995 /** 996 * Sets the Gallery frame and initializes listeners. 997 * 998 * @return {void} 999 */ 1000 buildAndSetGalleryFrame() { 1001 const { 1002 addToGallery = false, 1003 allowedTypes, 1004 multiple = false, 1005 value = DEFAULT_EMPTY_GALLERY 1006 } = this.props; 1007 if (value === this.lastGalleryValue) { 1008 return; 1009 } 1010 const { wp } = window; 1011 this.lastGalleryValue = value; 1012 if (this.frame) { 1013 this.frame.remove(); 1014 } 1015 let currentState; 1016 if (addToGallery) { 1017 currentState = "gallery-library"; 1018 } else { 1019 currentState = value && value.length ? "gallery-edit" : "gallery"; 1020 } 1021 if (!this.GalleryDetailsMediaFrame) { 1022 this.GalleryDetailsMediaFrame = getGalleryDetailsMediaFrame(); 1023 } 1024 const attachments = getAttachmentsCollection(value); 1025 const selection = new wp.media.model.Selection(attachments.models, { 1026 props: attachments.props.toJSON(), 1027 multiple 1028 }); 1029 this.frame = new this.GalleryDetailsMediaFrame({ 1030 mimeType: allowedTypes, 1031 state: currentState, 1032 multiple, 1033 selection, 1034 editing: !!value?.length 1035 }); 1036 wp.media.frame = this.frame; 1037 this.initializeListeners(); 1038 } 1039 /** 1040 * Initializes the Media Library requirements for the featured image flow. 1041 * 1042 * @return {void} 1043 */ 1044 buildAndSetFeatureImageFrame() { 1045 const { wp } = window; 1046 const { value: featuredImageId, multiple, allowedTypes } = this.props; 1047 const featuredImageFrame = getFeaturedImageMediaFrame(); 1048 const attachments = getAttachmentsCollection(featuredImageId); 1049 const selection = new wp.media.model.Selection(attachments.models, { 1050 props: attachments.props.toJSON() 1051 }); 1052 this.frame = new featuredImageFrame({ 1053 mimeType: allowedTypes, 1054 state: "featured-image", 1055 multiple, 1056 selection, 1057 editing: featuredImageId 1058 }); 1059 wp.media.frame = this.frame; 1060 wp.media.view.settings.post = { 1061 ...wp.media.view.settings.post, 1062 featuredImageId: featuredImageId || -1 1063 }; 1064 } 1065 /** 1066 * Initializes the Media Library requirements for the single image flow. 1067 * 1068 * @return {void} 1069 */ 1070 buildAndSetSingleMediaFrame() { 1071 const { wp } = window; 1072 const { 1073 allowedTypes, 1074 multiple = false, 1075 title = (0, import_i18n.__)("Select or Upload Media"), 1076 value 1077 } = this.props; 1078 const frameConfig = { 1079 title, 1080 multiple 1081 }; 1082 if (!!allowedTypes) { 1083 frameConfig.library = { type: allowedTypes }; 1084 } 1085 if (this.frame) { 1086 this.frame.remove(); 1087 } 1088 const singleImageFrame = getSingleMediaFrame(); 1089 const attachments = getAttachmentsCollection(value); 1090 const selection = new wp.media.model.Selection(attachments.models, { 1091 props: attachments.props.toJSON() 1092 }); 1093 this.frame = new singleImageFrame({ 1094 mimeType: allowedTypes, 1095 multiple, 1096 selection, 1097 ...frameConfig 1098 }); 1099 wp.media.frame = this.frame; 1100 } 1101 componentWillUnmount() { 1102 this.frame?.remove(); 1103 } 1104 onUpdate(selections) { 1105 const { onSelect, multiple = false } = this.props; 1106 const state = this.frame.state(); 1107 const selectedImages = selections || state.get("selection"); 1108 if (!selectedImages || !selectedImages.models.length) { 1109 return; 1110 } 1111 if (multiple) { 1112 onSelect( 1113 selectedImages.models.map( 1114 (model) => slimImageObject(model.toJSON()) 1115 ) 1116 ); 1117 } else { 1118 onSelect(slimImageObject(selectedImages.models[0].toJSON())); 1119 } 1120 } 1121 onSelect() { 1122 const { onSelect, multiple = false } = this.props; 1123 const attachment = this.frame.state().get("selection").toJSON(); 1124 onSelect(multiple ? attachment : attachment[0]); 1125 } 1126 onOpen() { 1127 const { wp } = window; 1128 const { value } = this.props; 1129 this.updateCollection(); 1130 if (this.props.mode) { 1131 this.frame.content.mode(this.props.mode); 1132 } 1133 const hasMedia = Array.isArray(value) ? !!value?.length : !!value; 1134 if (!hasMedia) { 1135 return; 1136 } 1137 const isGallery = this.props.gallery; 1138 const selection = this.frame.state().get("selection"); 1139 const valueArray = Array.isArray(value) ? value : [value]; 1140 if (!isGallery) { 1141 valueArray.forEach((id) => { 1142 selection.add(wp.media.attachment(id)); 1143 }); 1144 } 1145 const attachments = getAttachmentsCollection(valueArray); 1146 attachments.more().done(function() { 1147 if (isGallery && attachments?.models?.length) { 1148 selection.add(attachments.models); 1149 } 1150 }); 1151 } 1152 onClose() { 1153 const { onClose } = this.props; 1154 if (onClose) { 1155 onClose(); 1156 } 1157 this.frame.detach(); 1158 } 1159 updateCollection() { 1160 const frameContent = this.frame.content.get(); 1161 if (frameContent && frameContent.collection) { 1162 const collection = frameContent.collection; 1163 collection.toArray().forEach((model) => model.trigger("destroy", model)); 1164 collection.mirroring._hasMore = true; 1165 collection.more(); 1166 } 1167 } 1168 openModal() { 1169 const { 1170 gallery = false, 1171 unstableFeaturedImageFlow = false, 1172 modalClass 1173 } = this.props; 1174 if (gallery) { 1175 this.buildAndSetGalleryFrame(); 1176 } else { 1177 this.buildAndSetSingleMediaFrame(); 1178 } 1179 if (modalClass) { 1180 this.frame.$el.addClass(modalClass); 1181 } 1182 if (unstableFeaturedImageFlow) { 1183 this.buildAndSetFeatureImageFrame(); 1184 } 1185 this.initializeListeners(); 1186 this.frame.open(); 1187 } 1188 render() { 1189 return this.props.render({ open: this.openModal }); 1190 } 1191 }; 1192 var media_upload_default = MediaUpload; 1193 1194 // packages/media-utils/build-module/utils/upload-media.js 1195 var import_i18n5 = __toESM(require_i18n()); 1196 var import_blob = __toESM(require_blob()); 1197 1198 // packages/media-utils/build-module/utils/upload-to-server.js 1199 var import_api_fetch = __toESM(require_api_fetch()); 1200 1201 // packages/media-utils/build-module/utils/flatten-form-data.js 1202 function isPlainObject(data) { 1203 return data !== null && typeof data === "object" && Object.getPrototypeOf(data) === Object.prototype; 1204 } 1205 function flattenFormData(formData, key, data) { 1206 if (isPlainObject(data)) { 1207 for (const [name, value] of Object.entries(data)) { 1208 flattenFormData(formData, `$key}[$name}]`, value); 1209 } 1210 } else if (data !== void 0) { 1211 formData.append(key, String(data)); 1212 } 1213 } 1214 1215 // packages/media-utils/build-module/utils/transform-attachment.js 1216 function transformAttachment(attachment) { 1217 const { alt_text, source_url, ...savedMediaProps } = attachment; 1218 return { 1219 ...savedMediaProps, 1220 alt: attachment.alt_text, 1221 caption: attachment.caption?.raw ?? "", 1222 title: attachment.title.raw, 1223 url: attachment.source_url, 1224 poster: attachment._embedded?.["wp:featuredmedia"]?.[0]?.source_url || void 0 1225 }; 1226 } 1227 1228 // packages/media-utils/build-module/utils/upload-to-server.js 1229 async function uploadToServer(file, additionalData = {}, signal) { 1230 const data = new FormData(); 1231 data.append("file", file, file.name || file.type.replace("/", ".")); 1232 for (const [key, value] of Object.entries(additionalData)) { 1233 flattenFormData( 1234 data, 1235 key, 1236 value 1237 ); 1238 } 1239 return transformAttachment( 1240 await (0, import_api_fetch.default)({ 1241 // This allows the video block to directly get a video's poster image. 1242 path: "/wp/v2/media?_embed=wp:featuredmedia", 1243 body: data, 1244 method: "POST", 1245 signal 1246 }) 1247 ); 1248 } 1249 1250 // packages/media-utils/build-module/utils/validate-mime-type.js 1251 var import_i18n2 = __toESM(require_i18n()); 1252 1253 // packages/media-utils/build-module/utils/upload-error.js 1254 var UploadError = class extends Error { 1255 code; 1256 file; 1257 constructor({ code, message: message2, file, cause }) { 1258 super(message2, { cause }); 1259 Object.setPrototypeOf(this, new.target.prototype); 1260 this.code = code; 1261 this.file = file; 1262 } 1263 }; 1264 1265 // packages/media-utils/build-module/utils/validate-mime-type.js 1266 function validateMimeType(file, allowedTypes) { 1267 if (!allowedTypes) { 1268 return; 1269 } 1270 const isAllowedType = allowedTypes.some((allowedType) => { 1271 if (allowedType.includes("/")) { 1272 return allowedType === file.type; 1273 } 1274 return file.type.startsWith(`$allowedType}/`); 1275 }); 1276 if (file.type && !isAllowedType) { 1277 throw new UploadError({ 1278 code: "MIME_TYPE_NOT_SUPPORTED", 1279 message: (0, import_i18n2.sprintf)( 1280 // translators: %s: file name. 1281 (0, import_i18n2.__)("%s: Sorry, this file type is not supported here."), 1282 file.name 1283 ), 1284 file 1285 }); 1286 } 1287 } 1288 1289 // packages/media-utils/build-module/utils/validate-mime-type-for-user.js 1290 var import_i18n3 = __toESM(require_i18n()); 1291 1292 // packages/media-utils/build-module/utils/get-mime-types-array.js 1293 function getMimeTypesArray(wpMimeTypesObject) { 1294 if (!wpMimeTypesObject) { 1295 return null; 1296 } 1297 return Object.entries(wpMimeTypesObject).flatMap( 1298 ([extensionsString, mime]) => { 1299 const [type] = mime.split("/"); 1300 const extensions = extensionsString.split("|"); 1301 return [ 1302 mime, 1303 ...extensions.map( 1304 (extension) => `$type}/$extension}` 1305 ) 1306 ]; 1307 } 1308 ); 1309 } 1310 1311 // packages/media-utils/build-module/utils/validate-mime-type-for-user.js 1312 function validateMimeTypeForUser(file, wpAllowedMimeTypes) { 1313 const allowedMimeTypesForUser = getMimeTypesArray(wpAllowedMimeTypes); 1314 if (!allowedMimeTypesForUser) { 1315 return; 1316 } 1317 const isAllowedMimeTypeForUser = allowedMimeTypesForUser.includes( 1318 file.type 1319 ); 1320 if (file.type && !isAllowedMimeTypeForUser) { 1321 throw new UploadError({ 1322 code: "MIME_TYPE_NOT_ALLOWED_FOR_USER", 1323 message: (0, import_i18n3.sprintf)( 1324 // translators: %s: file name. 1325 (0, import_i18n3.__)( 1326 "%s: Sorry, you are not allowed to upload this file type." 1327 ), 1328 file.name 1329 ), 1330 file 1331 }); 1332 } 1333 } 1334 1335 // packages/media-utils/build-module/utils/validate-file-size.js 1336 var import_i18n4 = __toESM(require_i18n()); 1337 function validateFileSize(file, maxUploadFileSize) { 1338 if (file.size <= 0) { 1339 throw new UploadError({ 1340 code: "EMPTY_FILE", 1341 message: (0, import_i18n4.sprintf)( 1342 // translators: %s: file name. 1343 (0, import_i18n4.__)("%s: This file is empty."), 1344 file.name 1345 ), 1346 file 1347 }); 1348 } 1349 if (maxUploadFileSize && file.size > maxUploadFileSize) { 1350 throw new UploadError({ 1351 code: "SIZE_ABOVE_LIMIT", 1352 message: (0, import_i18n4.sprintf)( 1353 // translators: %s: file name. 1354 (0, import_i18n4.__)( 1355 "%s: This file exceeds the maximum upload size for this site." 1356 ), 1357 file.name 1358 ), 1359 file 1360 }); 1361 } 1362 } 1363 1364 // packages/media-utils/build-module/utils/upload-media.js 1365 function uploadMedia({ 1366 wpAllowedMimeTypes, 1367 allowedTypes, 1368 additionalData = {}, 1369 filesList, 1370 maxUploadFileSize, 1371 onError, 1372 onFileChange, 1373 signal, 1374 multiple = true 1375 }) { 1376 if (!multiple && filesList.length > 1) { 1377 onError?.(new Error((0, import_i18n5.__)("Only one file can be used here."))); 1378 return; 1379 } 1380 const validFiles = []; 1381 const filesSet = []; 1382 const setAndUpdateFiles = (index, value) => { 1383 if (!window.__experimentalMediaProcessing) { 1384 if (filesSet[index]?.url) { 1385 (0, import_blob.revokeBlobURL)(filesSet[index].url); 1386 } 1387 } 1388 filesSet[index] = value; 1389 onFileChange?.( 1390 filesSet.filter((attachment) => attachment !== null) 1391 ); 1392 }; 1393 for (const mediaFile of filesList) { 1394 try { 1395 validateMimeTypeForUser(mediaFile, wpAllowedMimeTypes); 1396 } catch (error) { 1397 onError?.(error); 1398 continue; 1399 } 1400 try { 1401 validateMimeType(mediaFile, allowedTypes); 1402 } catch (error) { 1403 onError?.(error); 1404 continue; 1405 } 1406 try { 1407 validateFileSize(mediaFile, maxUploadFileSize); 1408 } catch (error) { 1409 onError?.(error); 1410 continue; 1411 } 1412 validFiles.push(mediaFile); 1413 if (!window.__experimentalMediaProcessing) { 1414 filesSet.push({ url: (0, import_blob.createBlobURL)(mediaFile) }); 1415 onFileChange?.(filesSet); 1416 } 1417 } 1418 validFiles.map(async (file, index) => { 1419 try { 1420 const attachment = await uploadToServer( 1421 file, 1422 additionalData, 1423 signal 1424 ); 1425 setAndUpdateFiles(index, attachment); 1426 } catch (error) { 1427 setAndUpdateFiles(index, null); 1428 let message2; 1429 if (typeof error === "object" && error !== null && "message" in error) { 1430 message2 = typeof error.message === "string" ? error.message : String(error.message); 1431 } else { 1432 message2 = (0, import_i18n5.sprintf)( 1433 // translators: %s: file name 1434 (0, import_i18n5.__)("Error while uploading file %s to the media library."), 1435 file.name 1436 ); 1437 } 1438 onError?.( 1439 new UploadError({ 1440 code: "GENERAL", 1441 message: message2, 1442 file, 1443 cause: error instanceof Error ? error : void 0 1444 }) 1445 ); 1446 } 1447 }); 1448 } 1449 1450 // packages/media-utils/build-module/utils/sideload-media.js 1451 var import_i18n6 = __toESM(require_i18n()); 1452 1453 // packages/media-utils/build-module/utils/sideload-to-server.js 1454 var import_api_fetch2 = __toESM(require_api_fetch()); 1455 async function sideloadToServer(file, attachmentId, additionalData = {}, signal) { 1456 const data = new FormData(); 1457 data.append("file", file, file.name || file.type.replace("/", ".")); 1458 for (const [key, value] of Object.entries(additionalData)) { 1459 flattenFormData( 1460 data, 1461 key, 1462 value 1463 ); 1464 } 1465 return transformAttachment( 1466 await (0, import_api_fetch2.default)({ 1467 path: `/wp/v2/media/$attachmentId}/sideload`, 1468 body: data, 1469 method: "POST", 1470 signal 1471 }) 1472 ); 1473 } 1474 1475 // packages/media-utils/build-module/utils/sideload-media.js 1476 var noop = () => { 1477 }; 1478 async function sideloadMedia({ 1479 file, 1480 attachmentId, 1481 additionalData = {}, 1482 signal, 1483 onFileChange, 1484 onError = noop 1485 }) { 1486 try { 1487 const attachment = await sideloadToServer( 1488 file, 1489 attachmentId, 1490 additionalData, 1491 signal 1492 ); 1493 onFileChange?.([attachment]); 1494 } catch (error) { 1495 let message2; 1496 if (error instanceof Error) { 1497 message2 = error.message; 1498 } else { 1499 message2 = (0, import_i18n6.sprintf)( 1500 // translators: %s: file name 1501 (0, import_i18n6.__)("Error while sideloading file %s to the server."), 1502 file.name 1503 ); 1504 } 1505 onError( 1506 new UploadError({ 1507 code: "GENERAL", 1508 message: message2, 1509 file, 1510 cause: error instanceof Error ? error : void 0 1511 }) 1512 ); 1513 } 1514 } 1515 1516 // packages/media-utils/build-module/components/media-upload-modal/index.js 1517 var import_element54 = __toESM(require_element()); 1518 var import_i18n57 = __toESM(require_i18n()); 1519 var import_core_data2 = __toESM(require_core_data()); 1520 var import_data7 = __toESM(require_data()); 1521 var import_components54 = __toESM(require_components()); 1522 1523 // packages/icons/build-module/library/arrow-down.js 1524 var import_primitives = __toESM(require_primitives()); 1525 var import_jsx_runtime = __toESM(require_jsx_runtime()); 1526 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" }) }); 1527 1528 // packages/icons/build-module/library/arrow-left.js 1529 var import_primitives2 = __toESM(require_primitives()); 1530 var import_jsx_runtime2 = __toESM(require_jsx_runtime()); 1531 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" }) }); 1532 1533 // packages/icons/build-module/library/arrow-right.js 1534 var import_primitives3 = __toESM(require_primitives()); 1535 var import_jsx_runtime3 = __toESM(require_jsx_runtime()); 1536 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" }) }); 1537 1538 // packages/icons/build-module/library/arrow-up.js 1539 var import_primitives4 = __toESM(require_primitives()); 1540 var import_jsx_runtime4 = __toESM(require_jsx_runtime()); 1541 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" }) }); 1542 1543 // packages/icons/build-module/library/audio.js 1544 var import_primitives5 = __toESM(require_primitives()); 1545 var import_jsx_runtime5 = __toESM(require_jsx_runtime()); 1546 var audio_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: "M17.7 4.3c-1.2 0-2.8 0-3.8 1-.6.6-.9 1.5-.9 2.6V14c-.6-.6-1.5-1-2.5-1C8.6 13 7 14.6 7 16.5S8.6 20 10.5 20c1.5 0 2.8-1 3.3-2.3.5-.8.7-1.8.7-2.5V7.9c0-.7.2-1.2.5-1.6.6-.6 1.8-.6 2.8-.6h.3V4.3h-.4z" }) }); 1547 1548 // packages/icons/build-module/library/block-table.js 1549 var import_primitives6 = __toESM(require_primitives()); 1550 var import_jsx_runtime6 = __toESM(require_jsx_runtime()); 1551 var block_table_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)(import_primitives6.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" }) }); 1552 1553 // packages/icons/build-module/library/category.js 1554 var import_primitives7 = __toESM(require_primitives()); 1555 var import_jsx_runtime7 = __toESM(require_jsx_runtime()); 1556 var category_default = /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_primitives7.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)( 1557 import_primitives7.Path, 1558 { 1559 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", 1560 fillRule: "evenodd", 1561 clipRule: "evenodd" 1562 } 1563 ) }); 1564 1565 // packages/icons/build-module/library/check.js 1566 var import_primitives8 = __toESM(require_primitives()); 1567 var import_jsx_runtime8 = __toESM(require_jsx_runtime()); 1568 var check_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: "M16.5 7.5 10 13.9l-2.5-2.4-1 1 3.5 3.6 7.5-7.6z" }) }); 1569 1570 // packages/icons/build-module/library/close-small.js 1571 var import_primitives9 = __toESM(require_primitives()); 1572 var import_jsx_runtime9 = __toESM(require_jsx_runtime()); 1573 var close_small_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)(import_primitives9.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" }) }); 1574 1575 // packages/icons/build-module/library/cog.js 1576 var import_primitives10 = __toESM(require_primitives()); 1577 var import_jsx_runtime10 = __toESM(require_jsx_runtime()); 1578 var cog_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)( 1579 import_primitives10.Path, 1580 { 1581 fillRule: "evenodd", 1582 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", 1583 clipRule: "evenodd" 1584 } 1585 ) }); 1586 1587 // packages/icons/build-module/library/envelope.js 1588 var import_primitives11 = __toESM(require_primitives()); 1589 var import_jsx_runtime11 = __toESM(require_jsx_runtime()); 1590 var envelope_default = /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_primitives11.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)( 1591 import_primitives11.Path, 1592 { 1593 fillRule: "evenodd", 1594 clipRule: "evenodd", 1595 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" 1596 } 1597 ) }); 1598 1599 // packages/icons/build-module/library/error.js 1600 var import_primitives12 = __toESM(require_primitives()); 1601 var import_jsx_runtime12 = __toESM(require_jsx_runtime()); 1602 var error_default = /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_primitives12.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)( 1603 import_primitives12.Path, 1604 { 1605 fillRule: "evenodd", 1606 clipRule: "evenodd", 1607 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" 1608 } 1609 ) }); 1610 1611 // packages/icons/build-module/library/file.js 1612 var import_primitives13 = __toESM(require_primitives()); 1613 var import_jsx_runtime13 = __toESM(require_jsx_runtime()); 1614 var file_default = /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_primitives13.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)( 1615 import_primitives13.Path, 1616 { 1617 fillRule: "evenodd", 1618 clipRule: "evenodd", 1619 d: "M12.848 8a1 1 0 0 1-.914-.594l-.723-1.63a.5.5 0 0 0-.447-.276H5a.5.5 0 0 0-.5.5v11.5a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5v-9A.5.5 0 0 0 19 8h-6.152Zm.612-1.5a.5.5 0 0 1-.462-.31l-.445-1.084A2 2 0 0 0 10.763 4H5a2 2 0 0 0-2 2v11.5a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-9a2 2 0 0 0-2-2h-5.54Z" 1620 } 1621 ) }); 1622 1623 // packages/icons/build-module/library/format-list-bullets-rtl.js 1624 var import_primitives14 = __toESM(require_primitives()); 1625 var import_jsx_runtime14 = __toESM(require_jsx_runtime()); 1626 var format_list_bullets_rtl_default = /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_primitives14.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" }) }); 1627 1628 // packages/icons/build-module/library/format-list-bullets.js 1629 var import_primitives15 = __toESM(require_primitives()); 1630 var import_jsx_runtime15 = __toESM(require_jsx_runtime()); 1631 var format_list_bullets_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: "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" }) }); 1632 1633 // packages/icons/build-module/library/funnel.js 1634 var import_primitives16 = __toESM(require_primitives()); 1635 var import_jsx_runtime16 = __toESM(require_jsx_runtime()); 1636 var funnel_default = /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_primitives16.Path, { d: "M10 17.5H14V16H10V17.5ZM6 6V7.5H18V6H6ZM8 12.5H16V11H8V12.5Z" }) }); 1637 1638 // packages/icons/build-module/library/image.js 1639 var import_primitives17 = __toESM(require_primitives()); 1640 var import_jsx_runtime17 = __toESM(require_jsx_runtime()); 1641 var image_default = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_primitives17.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.5v8.4l-3-2.9c-.3-.3-.8-.3-1 0L11.9 14 9 12c-.3-.2-.6-.2-.8 0l-3.6 2.6V5c-.1-.3.1-.5.4-.5zm14 15H5c-.3 0-.5-.2-.5-.5v-2.4l4.1-3 3 1.9c.3.2.7.2.9-.1L16 12l3.5 3.4V19c0 .3-.2.5-.5.5z" }) }); 1642 1643 // packages/icons/build-module/library/link.js 1644 var import_primitives18 = __toESM(require_primitives()); 1645 var import_jsx_runtime18 = __toESM(require_jsx_runtime()); 1646 var link_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: "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" }) }); 1647 1648 // packages/icons/build-module/library/mobile.js 1649 var import_primitives19 = __toESM(require_primitives()); 1650 var import_jsx_runtime19 = __toESM(require_jsx_runtime()); 1651 var mobile_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: "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" }) }); 1652 1653 // packages/icons/build-module/library/more-vertical.js 1654 var import_primitives20 = __toESM(require_primitives()); 1655 var import_jsx_runtime20 = __toESM(require_jsx_runtime()); 1656 var more_vertical_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)(import_primitives20.Path, { d: "M13 19h-2v-2h2v2zm0-6h-2v-2h2v2zm0-6h-2V5h2v2z" }) }); 1657 1658 // packages/icons/build-module/library/next.js 1659 var import_primitives21 = __toESM(require_primitives()); 1660 var import_jsx_runtime21 = __toESM(require_jsx_runtime()); 1661 var next_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: "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" }) }); 1662 1663 // packages/icons/build-module/library/previous.js 1664 var import_primitives22 = __toESM(require_primitives()); 1665 var import_jsx_runtime22 = __toESM(require_jsx_runtime()); 1666 var previous_default = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_primitives22.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" }) }); 1667 1668 // packages/icons/build-module/library/scheduled.js 1669 var import_primitives23 = __toESM(require_primitives()); 1670 var import_jsx_runtime23 = __toESM(require_jsx_runtime()); 1671 var scheduled_default = /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_primitives23.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)( 1672 import_primitives23.Path, 1673 { 1674 fillRule: "evenodd", 1675 clipRule: "evenodd", 1676 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" 1677 } 1678 ) }); 1679 1680 // packages/icons/build-module/library/search.js 1681 var import_primitives24 = __toESM(require_primitives()); 1682 var import_jsx_runtime24 = __toESM(require_jsx_runtime()); 1683 var search_default = /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_primitives24.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_primitives24.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" }) }); 1684 1685 // packages/icons/build-module/library/seen.js 1686 var import_primitives25 = __toESM(require_primitives()); 1687 var import_jsx_runtime25 = __toESM(require_jsx_runtime()); 1688 var seen_default = /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_primitives25.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_primitives25.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" }) }); 1689 1690 // packages/icons/build-module/library/unseen.js 1691 var import_primitives26 = __toESM(require_primitives()); 1692 var import_jsx_runtime26 = __toESM(require_jsx_runtime()); 1693 var unseen_default = /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_primitives26.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_primitives26.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" }) }); 1694 1695 // packages/icons/build-module/library/upload.js 1696 var import_primitives27 = __toESM(require_primitives()); 1697 var import_jsx_runtime27 = __toESM(require_jsx_runtime()); 1698 var upload_default = /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_primitives27.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_primitives27.Path, { d: "M18.5 15v3.5H13V6.7l4.5 4.1 1-1.1-6.2-5.8-5.8 5.8 1 1.1 4-4v11.7h-6V15H4v5h16v-5z" }) }); 1699 1700 // packages/icons/build-module/library/video.js 1701 var import_primitives28 = __toESM(require_primitives()); 1702 var import_jsx_runtime28 = __toESM(require_jsx_runtime()); 1703 var video_default = /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_primitives28.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_primitives28.Path, { d: "M18.7 3H5.3C4 3 3 4 3 5.3v13.4C3 20 4 21 5.3 21h13.4c1.3 0 2.3-1 2.3-2.3V5.3C21 4 20 3 18.7 3zm.8 15.7c0 .4-.4.8-.8.8H5.3c-.4 0-.8-.4-.8-.8V5.3c0-.4.4-.8.8-.8h13.4c.4 0 .8.4.8.8v13.4zM10 15l5-3-5-3v6z" }) }); 1704 1705 // packages/dataviews/build-module/components/dataviews-context/index.js 1706 var import_element2 = __toESM(require_element()); 1707 1708 // packages/dataviews/build-module/constants.js 1709 var import_i18n7 = __toESM(require_i18n()); 1710 var OPERATOR_IS_ANY = "isAny"; 1711 var OPERATOR_IS_NONE = "isNone"; 1712 var OPERATOR_IS_ALL = "isAll"; 1713 var OPERATOR_IS_NOT_ALL = "isNotAll"; 1714 var OPERATOR_BETWEEN = "between"; 1715 var OPERATOR_IN_THE_PAST = "inThePast"; 1716 var OPERATOR_OVER = "over"; 1717 var OPERATOR_IS = "is"; 1718 var OPERATOR_IS_NOT = "isNot"; 1719 var OPERATOR_LESS_THAN = "lessThan"; 1720 var OPERATOR_GREATER_THAN = "greaterThan"; 1721 var OPERATOR_LESS_THAN_OR_EQUAL = "lessThanOrEqual"; 1722 var OPERATOR_GREATER_THAN_OR_EQUAL = "greaterThanOrEqual"; 1723 var OPERATOR_BEFORE = "before"; 1724 var OPERATOR_AFTER = "after"; 1725 var OPERATOR_BEFORE_INC = "beforeInc"; 1726 var OPERATOR_AFTER_INC = "afterInc"; 1727 var OPERATOR_CONTAINS = "contains"; 1728 var OPERATOR_NOT_CONTAINS = "notContains"; 1729 var OPERATOR_STARTS_WITH = "startsWith"; 1730 var OPERATOR_ON = "on"; 1731 var OPERATOR_NOT_ON = "notOn"; 1732 var SORTING_DIRECTIONS = ["asc", "desc"]; 1733 var sortArrows = { asc: "\u2191", desc: "\u2193" }; 1734 var sortValues = { asc: "ascending", desc: "descending" }; 1735 var sortLabels = { 1736 asc: (0, import_i18n7.__)("Sort ascending"), 1737 desc: (0, import_i18n7.__)("Sort descending") 1738 }; 1739 var sortIcons = { 1740 asc: arrow_up_default, 1741 desc: arrow_down_default 1742 }; 1743 var LAYOUT_TABLE = "table"; 1744 var LAYOUT_GRID = "grid"; 1745 var LAYOUT_LIST = "list"; 1746 var LAYOUT_ACTIVITY = "activity"; 1747 var LAYOUT_PICKER_GRID = "pickerGrid"; 1748 var LAYOUT_PICKER_TABLE = "pickerTable"; 1749 1750 // packages/dataviews/build-module/components/dataviews-context/index.js 1751 var DataViewsContext = (0, import_element2.createContext)({ 1752 view: { type: LAYOUT_TABLE }, 1753 onChangeView: () => { 1754 }, 1755 fields: [], 1756 data: [], 1757 paginationInfo: { 1758 totalItems: 0, 1759 totalPages: 0 1760 }, 1761 selection: [], 1762 onChangeSelection: () => { 1763 }, 1764 setOpenedFilter: () => { 1765 }, 1766 openedFilter: null, 1767 getItemId: (item) => item.id, 1768 isItemClickable: () => true, 1769 renderItemLink: void 0, 1770 containerWidth: 0, 1771 containerRef: (0, import_element2.createRef)(), 1772 resizeObserverRef: () => { 1773 }, 1774 defaultLayouts: { list: {}, grid: {}, table: {} }, 1775 filters: [], 1776 isShowingFilter: false, 1777 setIsShowingFilter: () => { 1778 }, 1779 hasInfiniteScrollHandler: false, 1780 config: { 1781 perPageSizes: [] 1782 } 1783 }); 1784 DataViewsContext.displayName = "DataViewsContext"; 1785 var dataviews_context_default = DataViewsContext; 1786 1787 // packages/dataviews/build-module/dataviews-layouts/index.js 1788 var import_i18n26 = __toESM(require_i18n()); 1789 1790 // node_modules/clsx/dist/clsx.mjs 1791 function r(e2) { 1792 var t2, f2, n2 = ""; 1793 if ("string" == typeof e2 || "number" == typeof e2) n2 += e2; 1794 else if ("object" == typeof e2) if (Array.isArray(e2)) { 1795 var o2 = e2.length; 1796 for (t2 = 0; t2 < o2; t2++) e2[t2] && (f2 = r(e2[t2])) && (n2 && (n2 += " "), n2 += f2); 1797 } else for (f2 in e2) e2[f2] && (n2 && (n2 += " "), n2 += f2); 1798 return n2; 1799 } 1800 function clsx() { 1801 for (var e2, t2, f2 = 0, n2 = "", o2 = arguments.length; f2 < o2; f2++) (e2 = arguments[f2]) && (t2 = r(e2)) && (n2 && (n2 += " "), n2 += t2); 1802 return n2; 1803 } 1804 var clsx_default = clsx; 1805 1806 // packages/dataviews/build-module/dataviews-layouts/table/index.js 1807 var import_i18n14 = __toESM(require_i18n()); 1808 var import_components7 = __toESM(require_components()); 1809 var import_element9 = __toESM(require_element()); 1810 var import_keycodes = __toESM(require_keycodes()); 1811 1812 // packages/dataviews/build-module/components/dataviews-selection-checkbox/index.js 1813 var import_components = __toESM(require_components()); 1814 var import_i18n8 = __toESM(require_i18n()); 1815 var import_jsx_runtime29 = __toESM(require_jsx_runtime()); 1816 function DataViewsSelectionCheckbox({ 1817 selection, 1818 onChangeSelection, 1819 item, 1820 getItemId, 1821 titleField, 1822 disabled, 1823 ...extraProps 1824 }) { 1825 const id = getItemId(item); 1826 const checked = !disabled && selection.includes(id); 1827 const selectionLabel = titleField?.getValue?.({ item }) || (0, import_i18n8.__)("(no title)"); 1828 return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)( 1829 import_components.CheckboxControl, 1830 { 1831 className: "dataviews-selection-checkbox", 1832 "aria-label": selectionLabel, 1833 "aria-disabled": disabled, 1834 checked, 1835 onChange: () => { 1836 if (disabled) { 1837 return; 1838 } 1839 onChangeSelection( 1840 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id] 1841 ); 1842 }, 1843 ...extraProps 1844 } 1845 ); 1846 } 1847 1848 // packages/dataviews/build-module/components/dataviews-item-actions/index.js 1849 var import_components2 = __toESM(require_components()); 1850 var import_i18n9 = __toESM(require_i18n()); 1851 var import_element3 = __toESM(require_element()); 1852 var import_data = __toESM(require_data()); 1853 var import_compose = __toESM(require_compose()); 1854 1855 // packages/dataviews/build-module/lock-unlock.js 1856 var import_private_apis = __toESM(require_private_apis()); 1857 var { lock, unlock } = (0, import_private_apis.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 1858 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 1859 "@wordpress/dataviews" 1860 ); 1861 1862 // packages/dataviews/build-module/components/dataviews-item-actions/index.js 1863 var import_jsx_runtime30 = __toESM(require_jsx_runtime()); 1864 var { Menu, kebabCase } = unlock(import_components2.privateApis); 1865 function ButtonTrigger({ 1866 action, 1867 onClick, 1868 items, 1869 variant 1870 }) { 1871 const label = typeof action.label === "string" ? action.label : action.label(items); 1872 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 1873 import_components2.Button, 1874 { 1875 disabled: !!action.disabled, 1876 accessibleWhenDisabled: true, 1877 size: "compact", 1878 variant, 1879 onClick, 1880 children: label 1881 } 1882 ); 1883 } 1884 function MenuItemTrigger({ 1885 action, 1886 onClick, 1887 items 1888 }) { 1889 const label = typeof action.label === "string" ? action.label : action.label(items); 1890 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Menu.Item, { disabled: action.disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Menu.ItemLabel, { children: label }) }); 1891 } 1892 function ActionModal({ 1893 action, 1894 items, 1895 closeModal 1896 }) { 1897 const label = typeof action.label === "string" ? action.label : action.label(items); 1898 const modalHeader = typeof action.modalHeader === "function" ? action.modalHeader(items) : action.modalHeader; 1899 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 1900 import_components2.Modal, 1901 { 1902 title: modalHeader || label, 1903 __experimentalHideHeader: !!action.hideModalHeader, 1904 onRequestClose: closeModal, 1905 focusOnMount: action.modalFocusOnMount ?? true, 1906 size: action.modalSize || "medium", 1907 overlayClassName: `dataviews-action-modal dataviews-action-modal__$kebabCase( 1908 action.id 1909 )}`, 1910 children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(action.RenderModal, { items, closeModal }) 1911 } 1912 ); 1913 } 1914 function ActionsMenuGroup({ 1915 actions, 1916 item, 1917 registry, 1918 setActiveModalAction 1919 }) { 1920 const { primaryActions, regularActions } = (0, import_element3.useMemo)(() => { 1921 return actions.reduce( 1922 (acc, action) => { 1923 (action.isPrimary ? acc.primaryActions : acc.regularActions).push(action); 1924 return acc; 1925 }, 1926 { 1927 primaryActions: [], 1928 regularActions: [] 1929 } 1930 ); 1931 }, [actions]); 1932 const renderActionGroup = (actionList) => actionList.map((action) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 1933 MenuItemTrigger, 1934 { 1935 action, 1936 onClick: () => { 1937 if ("RenderModal" in action) { 1938 setActiveModalAction(action); 1939 return; 1940 } 1941 action.callback([item], { registry }); 1942 }, 1943 items: [item] 1944 }, 1945 action.id 1946 )); 1947 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Menu.Group, { children: [ 1948 renderActionGroup(primaryActions), 1949 primaryActions.length > 0 && regularActions.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Menu.Separator, {}), 1950 renderActionGroup(regularActions) 1951 ] }); 1952 } 1953 function ItemActions({ 1954 item, 1955 actions, 1956 isCompact 1957 }) { 1958 const registry = (0, import_data.useRegistry)(); 1959 const { primaryActions, eligibleActions } = (0, import_element3.useMemo)(() => { 1960 const _eligibleActions = actions.filter( 1961 (action) => !action.isEligible || action.isEligible(item) 1962 ); 1963 const _primaryActions = _eligibleActions.filter( 1964 (action) => action.isPrimary 1965 ); 1966 return { 1967 primaryActions: _primaryActions, 1968 eligibleActions: _eligibleActions 1969 }; 1970 }, [actions, item]); 1971 if (isCompact) { 1972 return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 1973 CompactItemActions, 1974 { 1975 item, 1976 actions: eligibleActions, 1977 isSmall: true, 1978 registry 1979 } 1980 ); 1981 } 1982 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)( 1983 import_components2.__experimentalHStack, 1984 { 1985 spacing: 0, 1986 justify: "flex-end", 1987 className: "dataviews-item-actions", 1988 style: { 1989 flexShrink: 0, 1990 width: "auto" 1991 }, 1992 children: [ 1993 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 1994 PrimaryActions, 1995 { 1996 item, 1997 actions: primaryActions, 1998 registry 1999 } 2000 ), 2001 primaryActions.length < eligibleActions.length && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2002 CompactItemActions, 2003 { 2004 item, 2005 actions: eligibleActions, 2006 registry 2007 } 2008 ) 2009 ] 2010 } 2011 ); 2012 } 2013 function CompactItemActions({ 2014 item, 2015 actions, 2016 isSmall, 2017 registry 2018 }) { 2019 const [activeModalAction, setActiveModalAction] = (0, import_element3.useState)( 2020 null 2021 ); 2022 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [ 2023 /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(Menu, { placement: "bottom-end", children: [ 2024 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2025 Menu.TriggerButton, 2026 { 2027 render: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2028 import_components2.Button, 2029 { 2030 size: isSmall ? "small" : "compact", 2031 icon: more_vertical_default, 2032 label: (0, import_i18n9.__)("Actions"), 2033 accessibleWhenDisabled: true, 2034 disabled: !actions.length, 2035 className: "dataviews-all-actions-button" 2036 } 2037 ) 2038 } 2039 ), 2040 /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Menu.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2041 ActionsMenuGroup, 2042 { 2043 actions, 2044 item, 2045 registry, 2046 setActiveModalAction 2047 } 2048 ) }) 2049 ] }), 2050 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2051 ActionModal, 2052 { 2053 action: activeModalAction, 2054 items: [item], 2055 closeModal: () => setActiveModalAction(null) 2056 } 2057 ) 2058 ] }); 2059 } 2060 function PrimaryActions({ 2061 item, 2062 actions, 2063 registry, 2064 buttonVariant 2065 }) { 2066 const [activeModalAction, setActiveModalAction] = (0, import_element3.useState)(null); 2067 const isMobileViewport = (0, import_compose.useViewportMatch)("medium", "<"); 2068 if (isMobileViewport) { 2069 return null; 2070 } 2071 if (!Array.isArray(actions) || actions.length === 0) { 2072 return null; 2073 } 2074 return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [ 2075 actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2076 ButtonTrigger, 2077 { 2078 action, 2079 onClick: () => { 2080 if ("RenderModal" in action) { 2081 setActiveModalAction(action); 2082 return; 2083 } 2084 action.callback([item], { registry }); 2085 }, 2086 items: [item], 2087 variant: buttonVariant 2088 }, 2089 action.id 2090 )), 2091 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)( 2092 ActionModal, 2093 { 2094 action: activeModalAction, 2095 items: [item], 2096 closeModal: () => setActiveModalAction(null) 2097 } 2098 ) 2099 ] }); 2100 } 2101 2102 // packages/dataviews/build-module/components/dataviews-bulk-actions/index.js 2103 var import_components3 = __toESM(require_components()); 2104 var import_i18n10 = __toESM(require_i18n()); 2105 var import_element4 = __toESM(require_element()); 2106 var import_data2 = __toESM(require_data()); 2107 var import_compose2 = __toESM(require_compose()); 2108 var import_jsx_runtime31 = __toESM(require_jsx_runtime()); 2109 function useHasAPossibleBulkAction(actions, item) { 2110 return (0, import_element4.useMemo)(() => { 2111 return actions.some((action) => { 2112 return action.supportsBulk && (!action.isEligible || action.isEligible(item)); 2113 }); 2114 }, [actions, item]); 2115 } 2116 function useSomeItemHasAPossibleBulkAction(actions, data) { 2117 return (0, import_element4.useMemo)(() => { 2118 return data.some((item) => { 2119 return actions.some((action) => { 2120 return action.supportsBulk && (!action.isEligible || action.isEligible(item)); 2121 }); 2122 }); 2123 }, [actions, data]); 2124 } 2125 function BulkSelectionCheckbox({ 2126 selection, 2127 onChangeSelection, 2128 data, 2129 actions, 2130 getItemId 2131 }) { 2132 const selectableItems = (0, import_element4.useMemo)(() => { 2133 return data.filter((item) => { 2134 return actions.some( 2135 (action) => action.supportsBulk && (!action.isEligible || action.isEligible(item)) 2136 ); 2137 }); 2138 }, [data, actions]); 2139 const selectedItems = data.filter( 2140 (item) => selection.includes(getItemId(item)) && selectableItems.includes(item) 2141 ); 2142 const areAllSelected = selectedItems.length === selectableItems.length; 2143 return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)( 2144 import_components3.CheckboxControl, 2145 { 2146 className: "dataviews-view-table-selection-checkbox", 2147 checked: areAllSelected, 2148 indeterminate: !areAllSelected && !!selectedItems.length, 2149 onChange: () => { 2150 if (areAllSelected) { 2151 onChangeSelection([]); 2152 } else { 2153 onChangeSelection( 2154 selectableItems.map((item) => getItemId(item)) 2155 ); 2156 } 2157 }, 2158 "aria-label": areAllSelected ? (0, import_i18n10.__)("Deselect all") : (0, import_i18n10.__)("Select all") 2159 } 2160 ); 2161 } 2162 2163 // packages/dataviews/build-module/dataviews-layouts/table/column-header-menu.js 2164 var import_i18n11 = __toESM(require_i18n()); 2165 var import_components4 = __toESM(require_components()); 2166 var import_element5 = __toESM(require_element()); 2167 2168 // packages/dataviews/build-module/utils/get-hideable-fields.js 2169 function getHideableFields(view, fields) { 2170 const togglableFields = [ 2171 view?.titleField, 2172 view?.mediaField, 2173 view?.descriptionField 2174 ].filter(Boolean); 2175 return fields.filter( 2176 (f2) => !togglableFields.includes(f2.id) && f2.type !== "media" && f2.enableHiding !== false 2177 ); 2178 } 2179 2180 // packages/dataviews/build-module/dataviews-layouts/table/column-header-menu.js 2181 var import_jsx_runtime32 = __toESM(require_jsx_runtime()); 2182 var { Menu: Menu2 } = unlock(import_components4.privateApis); 2183 function WithMenuSeparators({ children }) { 2184 return import_element5.Children.toArray(children).filter(Boolean).map((child, i2) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_element5.Fragment, { children: [ 2185 i2 > 0 && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.Separator, {}), 2186 child 2187 ] }, i2)); 2188 } 2189 var _HeaderMenu = (0, import_element5.forwardRef)(function HeaderMenu({ 2190 fieldId, 2191 view, 2192 fields, 2193 onChangeView, 2194 onHide, 2195 setOpenedFilter, 2196 canMove = true, 2197 canInsertLeft = true, 2198 canInsertRight = true 2199 }, ref) { 2200 const visibleFieldIds = view.fields ?? []; 2201 const index = visibleFieldIds?.indexOf(fieldId); 2202 const isSorted = view.sort?.field === fieldId; 2203 let isHidable = false; 2204 let isSortable = false; 2205 let canAddFilter = false; 2206 let operators = []; 2207 const field = fields.find((f2) => f2.id === fieldId); 2208 const { setIsShowingFilter } = (0, import_element5.useContext)(dataviews_context_default); 2209 if (!field) { 2210 return null; 2211 } 2212 isHidable = field.enableHiding !== false; 2213 isSortable = field.enableSorting !== false; 2214 const header = field.header; 2215 operators = !!field.filterBy && field.filterBy?.operators || []; 2216 canAddFilter = !view.filters?.some((_filter) => fieldId === _filter.field) && !!(field.hasElements || field.Edit) && field.filterBy !== false && !field.filterBy?.isPrimary; 2217 if (!isSortable && !canMove && !isHidable && !canAddFilter) { 2218 return header; 2219 } 2220 const hiddenFields = getHideableFields(view, fields).filter( 2221 (f2) => !visibleFieldIds.includes(f2.id) 2222 ); 2223 const canInsert = (canInsertLeft || canInsertRight) && !!hiddenFields.length; 2224 return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(Menu2, { children: [ 2225 /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)( 2226 Menu2.TriggerButton, 2227 { 2228 render: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2229 import_components4.Button, 2230 { 2231 size: "compact", 2232 className: "dataviews-view-table-header-button", 2233 ref, 2234 variant: "tertiary" 2235 } 2236 ), 2237 children: [ 2238 header, 2239 view.sort && isSorted && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { "aria-hidden": "true", children: sortArrows[view.sort.direction] }) 2240 ] 2241 } 2242 ), 2243 /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.Popover, { style: { minWidth: "240px" }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(WithMenuSeparators, { children: [ 2244 isSortable && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.Group, { children: SORTING_DIRECTIONS.map( 2245 (direction) => { 2246 const isChecked = view.sort && isSorted && view.sort.direction === direction; 2247 const value = `$fieldId}-$direction}`; 2248 return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2249 Menu2.RadioItem, 2250 { 2251 name: "view-table-sorting", 2252 value, 2253 checked: isChecked, 2254 onChange: () => { 2255 onChangeView({ 2256 ...view, 2257 sort: { 2258 field: fieldId, 2259 direction 2260 }, 2261 showLevels: false 2262 }); 2263 }, 2264 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: sortLabels[direction] }) 2265 }, 2266 value 2267 ); 2268 } 2269 ) }), 2270 canAddFilter && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2271 Menu2.Item, 2272 { 2273 prefix: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_components4.Icon, { icon: funnel_default }), 2274 onClick: () => { 2275 setOpenedFilter(fieldId); 2276 setIsShowingFilter(true); 2277 onChangeView({ 2278 ...view, 2279 page: 1, 2280 filters: [ 2281 ...view.filters || [], 2282 { 2283 field: fieldId, 2284 value: void 0, 2285 operator: operators[0] 2286 } 2287 ] 2288 }); 2289 }, 2290 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: (0, import_i18n11.__)("Add filter") }) 2291 } 2292 ) }), 2293 (canMove || isHidable || canInsert) && field && /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(Menu2.Group, { children: [ 2294 canMove && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2295 Menu2.Item, 2296 { 2297 prefix: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_components4.Icon, { icon: arrow_left_default }), 2298 disabled: index < 1, 2299 onClick: () => { 2300 onChangeView({ 2301 ...view, 2302 fields: [ 2303 ...visibleFieldIds.slice( 2304 0, 2305 index - 1 2306 ) ?? [], 2307 fieldId, 2308 visibleFieldIds[index - 1], 2309 ...visibleFieldIds.slice( 2310 index + 1 2311 ) 2312 ] 2313 }); 2314 }, 2315 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: (0, import_i18n11.__)("Move left") }) 2316 } 2317 ), 2318 canMove && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2319 Menu2.Item, 2320 { 2321 prefix: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_components4.Icon, { icon: arrow_right_default }), 2322 disabled: index >= visibleFieldIds.length - 1, 2323 onClick: () => { 2324 onChangeView({ 2325 ...view, 2326 fields: [ 2327 ...visibleFieldIds.slice( 2328 0, 2329 index 2330 ) ?? [], 2331 visibleFieldIds[index + 1], 2332 fieldId, 2333 ...visibleFieldIds.slice( 2334 index + 2 2335 ) 2336 ] 2337 }); 2338 }, 2339 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: (0, import_i18n11.__)("Move right") }) 2340 } 2341 ), 2342 canInsertLeft && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(Menu2, { children: [ 2343 /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: (0, import_i18n11.__)("Insert left") }) }), 2344 /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2345 Menu2.Item, 2346 { 2347 onClick: () => { 2348 onChangeView({ 2349 ...view, 2350 fields: [ 2351 ...visibleFieldIds.slice( 2352 0, 2353 index 2354 ), 2355 hiddenField.id, 2356 ...visibleFieldIds.slice( 2357 index 2358 ) 2359 ] 2360 }); 2361 }, 2362 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: hiddenField.label }) 2363 }, 2364 hiddenField.id 2365 )) }) 2366 ] }), 2367 canInsertRight && !!hiddenFields.length && /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(Menu2, { children: [ 2368 /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.SubmenuTriggerItem, { children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: (0, import_i18n11.__)("Insert right") }) }), 2369 /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.Popover, { children: hiddenFields.map((hiddenField) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2370 Menu2.Item, 2371 { 2372 onClick: () => { 2373 onChangeView({ 2374 ...view, 2375 fields: [ 2376 ...visibleFieldIds.slice( 2377 0, 2378 index + 1 2379 ), 2380 hiddenField.id, 2381 ...visibleFieldIds.slice( 2382 index + 1 2383 ) 2384 ] 2385 }); 2386 }, 2387 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: hiddenField.label }) 2388 }, 2389 hiddenField.id 2390 )) }) 2391 ] }), 2392 isHidable && field && /* @__PURE__ */ (0, import_jsx_runtime32.jsx)( 2393 Menu2.Item, 2394 { 2395 prefix: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_components4.Icon, { icon: unseen_default }), 2396 onClick: () => { 2397 onHide(field); 2398 onChangeView({ 2399 ...view, 2400 fields: visibleFieldIds.filter( 2401 (id) => id !== fieldId 2402 ) 2403 }); 2404 }, 2405 children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Menu2.ItemLabel, { children: (0, import_i18n11.__)("Hide column") }) 2406 } 2407 ) 2408 ] }) 2409 ] }) }) 2410 ] }); 2411 }); 2412 var ColumnHeaderMenu = _HeaderMenu; 2413 var column_header_menu_default = ColumnHeaderMenu; 2414 2415 // packages/dataviews/build-module/dataviews-layouts/table/column-primary.js 2416 var import_components5 = __toESM(require_components()); 2417 2418 // packages/dataviews/build-module/dataviews-layouts/utils/item-click-wrapper.js 2419 var import_element6 = __toESM(require_element()); 2420 var import_jsx_runtime33 = __toESM(require_jsx_runtime()); 2421 function getClickableItemProps({ 2422 item, 2423 isItemClickable: isItemClickable2, 2424 onClickItem, 2425 className 2426 }) { 2427 if (!isItemClickable2(item) || !onClickItem) { 2428 return { className }; 2429 } 2430 return { 2431 className: className ? `$className} $className}--clickable` : void 0, 2432 role: "button", 2433 tabIndex: 0, 2434 onClick: (event) => { 2435 event.stopPropagation(); 2436 onClickItem(item); 2437 }, 2438 onKeyDown: (event) => { 2439 if (event.key === "Enter" || event.key === "" || event.key === " ") { 2440 event.stopPropagation(); 2441 onClickItem(item); 2442 } 2443 } 2444 }; 2445 } 2446 function ItemClickWrapper({ 2447 item, 2448 isItemClickable: isItemClickable2, 2449 onClickItem, 2450 renderItemLink, 2451 className, 2452 children, 2453 ...extraProps 2454 }) { 2455 if (!isItemClickable2(item)) { 2456 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className, ...extraProps, children }); 2457 } 2458 if (renderItemLink) { 2459 const renderedElement = renderItemLink({ 2460 item, 2461 className: `$className} $className}--clickable`, 2462 ...extraProps, 2463 children 2464 }); 2465 return (0, import_element6.cloneElement)(renderedElement, { 2466 onClick: (event) => { 2467 event.stopPropagation(); 2468 if (renderedElement.props.onClick) { 2469 renderedElement.props.onClick(event); 2470 } 2471 }, 2472 onKeyDown: (event) => { 2473 if (event.key === "Enter" || event.key === "" || event.key === " ") { 2474 event.stopPropagation(); 2475 if (renderedElement.props.onKeyDown) { 2476 renderedElement.props.onKeyDown(event); 2477 } 2478 } 2479 } 2480 }); 2481 } 2482 const clickProps = getClickableItemProps({ 2483 item, 2484 isItemClickable: isItemClickable2, 2485 onClickItem, 2486 className 2487 }); 2488 return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { ...clickProps, ...extraProps, children }); 2489 } 2490 2491 // packages/dataviews/build-module/dataviews-layouts/table/column-primary.js 2492 var import_jsx_runtime34 = __toESM(require_jsx_runtime()); 2493 function ColumnPrimary({ 2494 item, 2495 level, 2496 titleField, 2497 mediaField, 2498 descriptionField: descriptionField2, 2499 onClickItem, 2500 renderItemLink, 2501 isItemClickable: isItemClickable2 2502 }) { 2503 return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_components5.__experimentalHStack, { spacing: 3, alignment: "flex-start", justify: "flex-start", children: [ 2504 mediaField && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( 2505 ItemClickWrapper, 2506 { 2507 item, 2508 isItemClickable: isItemClickable2, 2509 onClickItem, 2510 renderItemLink, 2511 className: "dataviews-view-table__cell-content-wrapper dataviews-column-primary__media", 2512 "aria-label": isItemClickable2(item) && (!!onClickItem || !!renderItemLink) && !!titleField ? titleField.getValue?.({ item }) : void 0, 2513 children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( 2514 mediaField.render, 2515 { 2516 item, 2517 field: mediaField, 2518 config: { sizes: "32px" } 2519 } 2520 ) 2521 } 2522 ), 2523 /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)( 2524 import_components5.__experimentalVStack, 2525 { 2526 spacing: 0, 2527 alignment: "flex-start", 2528 className: "dataviews-view-table__primary-column-content", 2529 children: [ 2530 titleField && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)( 2531 ItemClickWrapper, 2532 { 2533 item, 2534 isItemClickable: isItemClickable2, 2535 onClickItem, 2536 renderItemLink, 2537 className: "dataviews-view-table__cell-content-wrapper dataviews-title-field", 2538 children: [ 2539 level !== void 0 && level > 0 && /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "dataviews-view-table__level", children: [ 2540 "\u2014".repeat(level), 2541 "\xA0" 2542 ] }), 2543 /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(titleField.render, { item, field: titleField }) 2544 ] 2545 } 2546 ), 2547 descriptionField2 && /* @__PURE__ */ (0, import_jsx_runtime34.jsx)( 2548 descriptionField2.render, 2549 { 2550 item, 2551 field: descriptionField2 2552 } 2553 ) 2554 ] 2555 } 2556 ) 2557 ] }); 2558 } 2559 var column_primary_default = ColumnPrimary; 2560 2561 // packages/dataviews/build-module/dataviews-layouts/table/use-is-horizontal-scroll-end.js 2562 var import_compose3 = __toESM(require_compose()); 2563 var import_element7 = __toESM(require_element()); 2564 var import_i18n12 = __toESM(require_i18n()); 2565 var isScrolledToEnd = (element) => { 2566 if ((0, import_i18n12.isRTL)()) { 2567 const scrollLeft = Math.abs(element.scrollLeft); 2568 return scrollLeft <= 1; 2569 } 2570 return element.scrollLeft + element.clientWidth >= element.scrollWidth - 1; 2571 }; 2572 function useIsHorizontalScrollEnd({ 2573 scrollContainerRef, 2574 enabled = false 2575 }) { 2576 const [isHorizontalScrollEnd, setIsHorizontalScrollEnd] = (0, import_element7.useState)(false); 2577 const handleIsHorizontalScrollEnd = (0, import_compose3.useDebounce)( 2578 (0, import_element7.useCallback)(() => { 2579 const scrollContainer = scrollContainerRef.current; 2580 if (scrollContainer) { 2581 setIsHorizontalScrollEnd(isScrolledToEnd(scrollContainer)); 2582 } 2583 }, [scrollContainerRef, setIsHorizontalScrollEnd]), 2584 200 2585 ); 2586 (0, import_element7.useEffect)(() => { 2587 if (typeof window === "undefined" || !enabled || !scrollContainerRef.current) { 2588 return () => { 2589 }; 2590 } 2591 handleIsHorizontalScrollEnd(); 2592 scrollContainerRef.current.addEventListener( 2593 "scroll", 2594 handleIsHorizontalScrollEnd 2595 ); 2596 window.addEventListener("resize", handleIsHorizontalScrollEnd); 2597 return () => { 2598 scrollContainerRef.current?.removeEventListener( 2599 "scroll", 2600 handleIsHorizontalScrollEnd 2601 ); 2602 window.removeEventListener("resize", handleIsHorizontalScrollEnd); 2603 }; 2604 }, [scrollContainerRef, enabled]); 2605 return isHorizontalScrollEnd; 2606 } 2607 2608 // packages/dataviews/build-module/dataviews-layouts/utils/get-data-by-group.js 2609 function getDataByGroup(data, groupByField) { 2610 return data.reduce((groups, item) => { 2611 const groupName = groupByField.getValue({ item }); 2612 if (!groups.has(groupName)) { 2613 groups.set(groupName, []); 2614 } 2615 groups.get(groupName)?.push(item); 2616 return groups; 2617 }, /* @__PURE__ */ new Map()); 2618 } 2619 2620 // packages/dataviews/build-module/components/dataviews-view-config/properties-section.js 2621 var import_components6 = __toESM(require_components()); 2622 var import_i18n13 = __toESM(require_i18n()); 2623 var import_element8 = __toESM(require_element()); 2624 var import_jsx_runtime35 = __toESM(require_jsx_runtime()); 2625 function FieldItem({ 2626 field, 2627 isVisible: isVisible2, 2628 onToggleVisibility 2629 }) { 2630 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components6.__experimentalItem, { onClick: field.enableHiding ? onToggleVisibility : void 0, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components6.__experimentalHStack, { expanded: true, justify: "flex-start", alignment: "center", children: [ 2631 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { style: { height: 24, width: 24 }, children: isVisible2 && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components6.Icon, { icon: check_default }) }), 2632 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "dataviews-view-config__label", children: field.label }) 2633 ] }) }); 2634 } 2635 function isDefined(item) { 2636 return !!item; 2637 } 2638 function PropertiesSection({ 2639 showLabel = true 2640 }) { 2641 const { view, fields, onChangeView } = (0, import_element8.useContext)(dataviews_context_default); 2642 const regularFields = getHideableFields(view, fields); 2643 if (!regularFields?.length) { 2644 return null; 2645 } 2646 const titleField = fields.find((f2) => f2.id === view.titleField); 2647 const previewField = fields.find((f2) => f2.id === view.mediaField); 2648 const descriptionField2 = fields.find( 2649 (f2) => f2.id === view.descriptionField 2650 ); 2651 const lockedFields = [ 2652 { 2653 field: titleField, 2654 isVisibleFlag: "showTitle" 2655 }, 2656 { 2657 field: previewField, 2658 isVisibleFlag: "showMedia" 2659 }, 2660 { 2661 field: descriptionField2, 2662 isVisibleFlag: "showDescription" 2663 } 2664 ].filter(({ field }) => isDefined(field)); 2665 const visibleFieldIds = view.fields ?? []; 2666 const visibleRegularFieldsCount = regularFields.filter( 2667 (f2) => visibleFieldIds.includes(f2.id) 2668 ).length; 2669 let visibleLockedFields = lockedFields.filter( 2670 ({ field, isVisibleFlag }) => ( 2671 // @ts-expect-error 2672 isDefined(field) && (view[isVisibleFlag] ?? true) 2673 ) 2674 ); 2675 const totalVisibleFields = visibleLockedFields.length + visibleRegularFieldsCount; 2676 if (totalVisibleFields === 1) { 2677 if (visibleLockedFields.length === 1) { 2678 visibleLockedFields = visibleLockedFields.map((locked) => ({ 2679 ...locked, 2680 field: { ...locked.field, enableHiding: false } 2681 })); 2682 } 2683 } 2684 const hiddenLockedFields = lockedFields.filter( 2685 ({ field, isVisibleFlag }) => ( 2686 // @ts-expect-error 2687 isDefined(field) && !(view[isVisibleFlag] ?? true) 2688 ) 2689 ); 2690 return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components6.__experimentalVStack, { className: "dataviews-field-control", spacing: 0, children: [ 2691 showLabel && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components6.BaseControl.VisualLabel, { children: (0, import_i18n13.__)("Properties") }), 2692 /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_components6.__experimentalVStack, { className: "dataviews-view-config__properties", spacing: 0, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_components6.__experimentalItemGroup, { isBordered: true, isSeparated: true, size: "medium", children: [ 2693 visibleLockedFields.map(({ field, isVisibleFlag }) => { 2694 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 2695 FieldItem, 2696 { 2697 field, 2698 isVisible: true, 2699 onToggleVisibility: () => { 2700 onChangeView({ 2701 ...view, 2702 [isVisibleFlag]: false 2703 }); 2704 } 2705 }, 2706 field.id 2707 ); 2708 }), 2709 hiddenLockedFields.map(({ field, isVisibleFlag }) => { 2710 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 2711 FieldItem, 2712 { 2713 field, 2714 isVisible: false, 2715 onToggleVisibility: () => { 2716 onChangeView({ 2717 ...view, 2718 [isVisibleFlag]: true 2719 }); 2720 } 2721 }, 2722 field.id 2723 ); 2724 }), 2725 regularFields.map((field) => { 2726 const isVisible2 = visibleFieldIds.includes(field.id); 2727 const isLastVisible = totalVisibleFields === 1 && isVisible2; 2728 const fieldToRender = isLastVisible ? { ...field, enableHiding: false } : field; 2729 return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)( 2730 FieldItem, 2731 { 2732 field: fieldToRender, 2733 isVisible: isVisible2, 2734 onToggleVisibility: () => { 2735 onChangeView({ 2736 ...view, 2737 fields: isVisible2 ? visibleFieldIds.filter( 2738 (fieldId) => fieldId !== field.id 2739 ) : [...visibleFieldIds, field.id] 2740 }); 2741 } 2742 }, 2743 field.id 2744 ); 2745 }) 2746 ] }) }) 2747 ] }); 2748 } 2749 2750 // packages/dataviews/build-module/dataviews-layouts/table/index.js 2751 var import_jsx_runtime36 = __toESM(require_jsx_runtime()); 2752 function TableColumnField({ 2753 item, 2754 fields, 2755 column, 2756 align 2757 }) { 2758 const field = fields.find((f2) => f2.id === column); 2759 if (!field) { 2760 return null; 2761 } 2762 const className = clsx_default("dataviews-view-table__cell-content-wrapper", { 2763 "dataviews-view-table__cell-align-end": align === "end", 2764 "dataviews-view-table__cell-align-center": align === "center" 2765 }); 2766 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(field.render, { item, field }) }); 2767 } 2768 function TableRow({ 2769 hasBulkActions, 2770 item, 2771 level, 2772 actions, 2773 fields, 2774 id, 2775 view, 2776 titleField, 2777 mediaField, 2778 descriptionField: descriptionField2, 2779 selection, 2780 getItemId, 2781 isItemClickable: isItemClickable2, 2782 onClickItem, 2783 renderItemLink, 2784 onChangeSelection, 2785 isActionsColumnSticky, 2786 posinset 2787 }) { 2788 const { paginationInfo } = (0, import_element9.useContext)(dataviews_context_default); 2789 const hasPossibleBulkAction = useHasAPossibleBulkAction(actions, item); 2790 const isSelected2 = hasPossibleBulkAction && selection.includes(id); 2791 const { 2792 showTitle = true, 2793 showMedia = true, 2794 showDescription = true, 2795 infiniteScrollEnabled 2796 } = view; 2797 const isTouchDeviceRef = (0, import_element9.useRef)(false); 2798 const columns = view.fields ?? []; 2799 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField2 && showDescription; 2800 return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)( 2801 "tr", 2802 { 2803 className: clsx_default("dataviews-view-table__row", { 2804 "is-selected": hasPossibleBulkAction && isSelected2, 2805 "has-bulk-actions": hasPossibleBulkAction 2806 }), 2807 onTouchStart: () => { 2808 isTouchDeviceRef.current = true; 2809 }, 2810 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0, 2811 "aria-posinset": posinset, 2812 role: infiniteScrollEnabled ? "article" : void 0, 2813 onMouseDown: (event) => { 2814 const isMetaClick = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey; 2815 if (event.button === 0 && isMetaClick && window.navigator.userAgent.toLowerCase().includes("firefox")) { 2816 event?.preventDefault(); 2817 } 2818 }, 2819 onClick: (event) => { 2820 if (!hasPossibleBulkAction) { 2821 return; 2822 } 2823 const isModifierKeyPressed = (0, import_keycodes.isAppleOS)() ? event.metaKey : event.ctrlKey; 2824 if (isModifierKeyPressed && !isTouchDeviceRef.current && document.getSelection()?.type !== "Range") { 2825 onChangeSelection( 2826 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id] 2827 ); 2828 } 2829 }, 2830 children: [ 2831 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("td", { className: "dataviews-view-table__checkbox-column", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 2832 DataViewsSelectionCheckbox, 2833 { 2834 item, 2835 selection, 2836 onChangeSelection, 2837 getItemId, 2838 titleField, 2839 disabled: !hasPossibleBulkAction 2840 } 2841 ) }) }), 2842 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("td", { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 2843 column_primary_default, 2844 { 2845 item, 2846 level, 2847 titleField: showTitle ? titleField : void 0, 2848 mediaField: showMedia ? mediaField : void 0, 2849 descriptionField: showDescription ? descriptionField2 : void 0, 2850 isItemClickable: isItemClickable2, 2851 onClickItem, 2852 renderItemLink 2853 } 2854 ) }), 2855 columns.map((column) => { 2856 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 2857 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 2858 "td", 2859 { 2860 style: { 2861 width, 2862 maxWidth, 2863 minWidth 2864 }, 2865 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 2866 TableColumnField, 2867 { 2868 fields, 2869 item, 2870 column, 2871 align 2872 } 2873 ) 2874 }, 2875 column 2876 ); 2877 }), 2878 !!actions?.length && // Disable reason: we are not making the element interactive, 2879 // but preventing any click events from bubbling up to the 2880 // table row. This allows us to add a click handler to the row 2881 // itself (to toggle row selection) without erroneously 2882 // intercepting click events from ItemActions. 2883 /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */ 2884 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 2885 "td", 2886 { 2887 className: clsx_default("dataviews-view-table__actions-column", { 2888 "dataviews-view-table__actions-column--sticky": true, 2889 "dataviews-view-table__actions-column--stuck": isActionsColumnSticky 2890 }), 2891 onClick: (e2) => e2.stopPropagation(), 2892 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(ItemActions, { item, actions }) 2893 } 2894 ) 2895 ] 2896 } 2897 ); 2898 } 2899 function ViewTable({ 2900 actions, 2901 data, 2902 fields, 2903 getItemId, 2904 getItemLevel, 2905 isLoading = false, 2906 onChangeView, 2907 onChangeSelection, 2908 selection, 2909 setOpenedFilter, 2910 onClickItem, 2911 isItemClickable: isItemClickable2, 2912 renderItemLink, 2913 view, 2914 className, 2915 empty 2916 }) { 2917 const { containerRef } = (0, import_element9.useContext)(dataviews_context_default); 2918 const headerMenuRefs = (0, import_element9.useRef)(/* @__PURE__ */ new Map()); 2919 const headerMenuToFocusRef = (0, import_element9.useRef)(); 2920 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element9.useState)(); 2921 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data); 2922 const [contextMenuAnchor, setContextMenuAnchor] = (0, import_element9.useState)(null); 2923 (0, import_element9.useEffect)(() => { 2924 if (headerMenuToFocusRef.current) { 2925 headerMenuToFocusRef.current.focus(); 2926 headerMenuToFocusRef.current = void 0; 2927 } 2928 }); 2929 const tableNoticeId = (0, import_element9.useId)(); 2930 const isHorizontalScrollEnd = useIsHorizontalScrollEnd({ 2931 scrollContainerRef: containerRef, 2932 enabled: !!actions?.length 2933 }); 2934 if (nextHeaderMenuToFocus) { 2935 headerMenuToFocusRef.current = nextHeaderMenuToFocus; 2936 setNextHeaderMenuToFocus(void 0); 2937 return; 2938 } 2939 const onHide = (field) => { 2940 const hidden = headerMenuRefs.current.get(field.id); 2941 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0; 2942 setNextHeaderMenuToFocus(fallback?.node); 2943 }; 2944 const handleHeaderContextMenu = (event) => { 2945 event.preventDefault(); 2946 event.stopPropagation(); 2947 const virtualAnchor = { 2948 getBoundingClientRect: () => ({ 2949 x: event.clientX, 2950 y: event.clientY, 2951 top: event.clientY, 2952 left: event.clientX, 2953 right: event.clientX, 2954 bottom: event.clientY, 2955 width: 0, 2956 height: 0, 2957 toJSON: () => ({}) 2958 }) 2959 }; 2960 window.requestAnimationFrame(() => { 2961 setContextMenuAnchor(virtualAnchor); 2962 }); 2963 }; 2964 const hasData = !!data?.length; 2965 const titleField = fields.find((field) => field.id === view.titleField); 2966 const mediaField = fields.find((field) => field.id === view.mediaField); 2967 const descriptionField2 = fields.find( 2968 (field) => field.id === view.descriptionField 2969 ); 2970 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 2971 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 2972 const { showTitle = true, showMedia = true, showDescription = true } = view; 2973 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField2 && showDescription; 2974 const columns = view.fields ?? []; 2975 const headerMenuRef = (column, index) => (node) => { 2976 if (node) { 2977 headerMenuRefs.current.set(column, { 2978 node, 2979 fallback: columns[index > 0 ? index - 1 : 1] 2980 }); 2981 } else { 2982 headerMenuRefs.current.delete(column); 2983 } 2984 }; 2985 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 2986 return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [ 2987 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)( 2988 "table", 2989 { 2990 className: clsx_default("dataviews-view-table", className, { 2991 [`has-$view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes( 2992 view.layout.density 2993 ), 2994 "has-bulk-actions": hasBulkActions 2995 }), 2996 "aria-busy": isLoading, 2997 "aria-describedby": tableNoticeId, 2998 role: isInfiniteScroll ? "feed" : void 0, 2999 children: [ 3000 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("colgroup", { children: [ 3001 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("col", { className: "dataviews-view-table__col-checkbox" }), 3002 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("col", { className: "dataviews-view-table__col-first-data" }), 3003 columns.map((column, index) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3004 "col", 3005 { 3006 className: clsx_default( 3007 `dataviews-view-table__col-$column}`, 3008 { 3009 "dataviews-view-table__col-first-data": !hasPrimaryColumn && index === 0 3010 } 3011 ) 3012 }, 3013 `col-$column}` 3014 )), 3015 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("col", { className: "dataviews-view-table__col-actions" }) 3016 ] }), 3017 contextMenuAnchor && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3018 import_components7.Popover, 3019 { 3020 anchor: contextMenuAnchor, 3021 onClose: () => setContextMenuAnchor(null), 3022 placement: "bottom-start", 3023 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(PropertiesSection, { showLabel: false }) 3024 } 3025 ), 3026 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("thead", { onContextMenu: handleHeaderContextMenu, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("tr", { className: "dataviews-view-table__row", children: [ 3027 hasBulkActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3028 "th", 3029 { 3030 className: "dataviews-view-table__checkbox-column", 3031 scope: "col", 3032 onContextMenu: handleHeaderContextMenu, 3033 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3034 BulkSelectionCheckbox, 3035 { 3036 selection, 3037 onChangeSelection, 3038 data, 3039 actions, 3040 getItemId 3041 } 3042 ) 3043 } 3044 ), 3045 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("th", { scope: "col", children: titleField && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3046 column_header_menu_default, 3047 { 3048 ref: headerMenuRef( 3049 titleField.id, 3050 0 3051 ), 3052 fieldId: titleField.id, 3053 view, 3054 fields, 3055 onChangeView, 3056 onHide, 3057 setOpenedFilter, 3058 canMove: false, 3059 canInsertLeft: false, 3060 canInsertRight: view.layout?.enableMoving ?? true 3061 } 3062 ) }), 3063 columns.map((column, index) => { 3064 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 3065 const canInsertOrMove = view.layout?.enableMoving ?? true; 3066 return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3067 "th", 3068 { 3069 style: { 3070 width, 3071 maxWidth, 3072 minWidth, 3073 textAlign: align 3074 }, 3075 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0, 3076 scope: "col", 3077 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3078 column_header_menu_default, 3079 { 3080 ref: headerMenuRef(column, index), 3081 fieldId: column, 3082 view, 3083 fields, 3084 onChangeView, 3085 onHide, 3086 setOpenedFilter, 3087 canMove: canInsertOrMove, 3088 canInsertLeft: canInsertOrMove, 3089 canInsertRight: canInsertOrMove 3090 } 3091 ) 3092 }, 3093 column 3094 ); 3095 }), 3096 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3097 "th", 3098 { 3099 className: clsx_default( 3100 "dataviews-view-table__actions-column", 3101 { 3102 "dataviews-view-table__actions-column--sticky": true, 3103 "dataviews-view-table__actions-column--stuck": !isHorizontalScrollEnd 3104 } 3105 ), 3106 children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "dataviews-view-table-header", children: (0, import_i18n14.__)("Actions") }) 3107 } 3108 ) 3109 ] }) }), 3110 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map( 3111 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("tbody", { children: [ 3112 /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("tr", { className: "dataviews-view-table__group-header-row", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3113 "td", 3114 { 3115 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + (hasBulkActions ? 1 : 0) + (actions?.length ? 1 : 0), 3116 className: "dataviews-view-table__group-header-cell", 3117 children: (0, import_i18n14.sprintf)( 3118 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 3119 (0, import_i18n14.__)("%1$s: %2$s"), 3120 groupField.label, 3121 groupName 3122 ) 3123 } 3124 ) }), 3125 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3126 TableRow, 3127 { 3128 item, 3129 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0, 3130 hasBulkActions, 3131 actions, 3132 fields, 3133 id: getItemId(item) || index.toString(), 3134 view, 3135 titleField, 3136 mediaField, 3137 descriptionField: descriptionField2, 3138 selection, 3139 getItemId, 3140 onChangeSelection, 3141 onClickItem, 3142 renderItemLink, 3143 isItemClickable: isItemClickable2, 3144 isActionsColumnSticky: !isHorizontalScrollEnd 3145 }, 3146 getItemId(item) 3147 )) 3148 ] }, `group-$groupName}`) 3149 ) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("tbody", { children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)( 3150 TableRow, 3151 { 3152 item, 3153 level: view.showLevels && typeof getItemLevel === "function" ? getItemLevel(item) : void 0, 3154 hasBulkActions, 3155 actions, 3156 fields, 3157 id: getItemId(item) || index.toString(), 3158 view, 3159 titleField, 3160 mediaField, 3161 descriptionField: descriptionField2, 3162 selection, 3163 getItemId, 3164 onChangeSelection, 3165 onClickItem, 3166 renderItemLink, 3167 isItemClickable: isItemClickable2, 3168 isActionsColumnSticky: !isHorizontalScrollEnd, 3169 posinset: isInfiniteScroll ? index + 1 : void 0 3170 }, 3171 getItemId(item) 3172 )) }) 3173 ] 3174 } 3175 ), 3176 /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)( 3177 "div", 3178 { 3179 className: clsx_default({ 3180 "dataviews-loading": isLoading, 3181 "dataviews-no-results": !hasData && !isLoading 3182 }), 3183 id: tableNoticeId, 3184 children: [ 3185 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_components7.Spinner, {}) }) : empty), 3186 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_components7.Spinner, {}) }) 3187 ] 3188 } 3189 ) 3190 ] }); 3191 } 3192 var table_default = ViewTable; 3193 3194 // packages/dataviews/build-module/dataviews-layouts/grid/index.js 3195 var import_components10 = __toESM(require_components()); 3196 var import_i18n17 = __toESM(require_i18n()); 3197 3198 // packages/dataviews/build-module/dataviews-layouts/grid/composite-grid.js 3199 var import_components9 = __toESM(require_components()); 3200 var import_i18n16 = __toESM(require_i18n()); 3201 var import_compose4 = __toESM(require_compose()); 3202 var import_keycodes2 = __toESM(require_keycodes()); 3203 var import_element11 = __toESM(require_element()); 3204 3205 // packages/dataviews/build-module/dataviews-layouts/grid/preview-size-picker.js 3206 var import_components8 = __toESM(require_components()); 3207 var import_i18n15 = __toESM(require_i18n()); 3208 var import_element10 = __toESM(require_element()); 3209 var import_jsx_runtime37 = __toESM(require_jsx_runtime()); 3210 var imageSizes = [ 3211 { 3212 value: 120, 3213 breakpoint: 1 3214 }, 3215 { 3216 value: 170, 3217 breakpoint: 1 3218 }, 3219 { 3220 value: 230, 3221 breakpoint: 1 3222 }, 3223 { 3224 value: 290, 3225 breakpoint: 1112 3226 // at minimum image width, 4 images display at this container size 3227 }, 3228 { 3229 value: 350, 3230 breakpoint: 1636 3231 // at minimum image width, 6 images display at this container size 3232 }, 3233 { 3234 value: 430, 3235 breakpoint: 588 3236 // at minimum image width, 2 images display at this container size 3237 } 3238 ]; 3239 var DEFAULT_PREVIEW_SIZE = imageSizes[2].value; 3240 function useGridColumns() { 3241 const context = (0, import_element10.useContext)(dataviews_context_default); 3242 const view = context.view; 3243 return (0, import_element10.useMemo)(() => { 3244 const containerWidth = context.containerWidth; 3245 const gap = 32; 3246 const previewSize = view.layout?.previewSize ?? DEFAULT_PREVIEW_SIZE; 3247 const columns = Math.floor( 3248 (containerWidth + gap) / (previewSize + gap) 3249 ); 3250 return Math.max(1, columns); 3251 }, [context.containerWidth, view.layout?.previewSize]); 3252 } 3253 3254 // packages/dataviews/build-module/dataviews-layouts/grid/composite-grid.js 3255 var import_jsx_runtime38 = __toESM(require_jsx_runtime()); 3256 var { Badge } = unlock(import_components9.privateApis); 3257 function chunk(array, size) { 3258 const chunks = []; 3259 for (let i2 = 0, j2 = array.length; i2 < j2; i2 += size) { 3260 chunks.push(array.slice(i2, i2 + size)); 3261 } 3262 return chunks; 3263 } 3264 var GridItem = (0, import_element11.forwardRef)(function GridItem2({ 3265 view, 3266 selection, 3267 onChangeSelection, 3268 onClickItem, 3269 isItemClickable: isItemClickable2, 3270 renderItemLink, 3271 getItemId, 3272 item, 3273 actions, 3274 mediaField, 3275 titleField, 3276 descriptionField: descriptionField2, 3277 regularFields, 3278 badgeFields, 3279 hasBulkActions, 3280 config, 3281 ...props 3282 }, ref) { 3283 const { showTitle = true, showMedia = true, showDescription = true } = view; 3284 const hasBulkAction = useHasAPossibleBulkAction(actions, item); 3285 const id = getItemId(item); 3286 const instanceId = (0, import_compose4.useInstanceId)(GridItem2); 3287 const isSelected2 = selection.includes(id); 3288 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3289 mediaField.render, 3290 { 3291 item, 3292 field: mediaField, 3293 config 3294 } 3295 ) : null; 3296 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(titleField.render, { item, field: titleField }) : null; 3297 const shouldRenderMedia = showMedia && renderedMediaField; 3298 let mediaA11yProps; 3299 let titleA11yProps; 3300 if (isItemClickable2(item) && onClickItem) { 3301 if (renderedTitleField) { 3302 mediaA11yProps = { 3303 "aria-labelledby": `dataviews-view-grid__title-field-$instanceId}` 3304 }; 3305 titleA11yProps = { 3306 id: `dataviews-view-grid__title-field-$instanceId}` 3307 }; 3308 } else { 3309 mediaA11yProps = { 3310 "aria-label": (0, import_i18n16.__)("Navigate to item") 3311 }; 3312 } 3313 } 3314 return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)( 3315 import_components9.__experimentalVStack, 3316 { 3317 ...props, 3318 ref, 3319 spacing: 0, 3320 className: clsx_default( 3321 props.className, 3322 "dataviews-view-grid__row__gridcell", 3323 "dataviews-view-grid__card", 3324 { 3325 "is-selected": hasBulkAction && isSelected2 3326 } 3327 ), 3328 onClickCapture: (event) => { 3329 props.onClickCapture?.(event); 3330 if ((0, import_keycodes2.isAppleOS)() ? event.metaKey : event.ctrlKey) { 3331 event.stopPropagation(); 3332 event.preventDefault(); 3333 if (!hasBulkAction) { 3334 return; 3335 } 3336 onChangeSelection( 3337 selection.includes(id) ? selection.filter((itemId) => id !== itemId) : [...selection, id] 3338 ); 3339 } 3340 }, 3341 children: [ 3342 shouldRenderMedia && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3343 ItemClickWrapper, 3344 { 3345 item, 3346 isItemClickable: isItemClickable2, 3347 onClickItem, 3348 renderItemLink, 3349 className: "dataviews-view-grid__media", 3350 ...mediaA11yProps, 3351 children: renderedMediaField 3352 } 3353 ), 3354 hasBulkActions && shouldRenderMedia && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3355 DataViewsSelectionCheckbox, 3356 { 3357 item, 3358 selection, 3359 onChangeSelection, 3360 getItemId, 3361 titleField, 3362 disabled: !hasBulkAction 3363 } 3364 ), 3365 !showTitle && shouldRenderMedia && !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "dataviews-view-grid__media-actions", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ItemActions, { item, actions, isCompact: true }) }), 3366 showTitle && /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)( 3367 import_components9.__experimentalHStack, 3368 { 3369 justify: "space-between", 3370 className: "dataviews-view-grid__title-actions", 3371 children: [ 3372 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3373 ItemClickWrapper, 3374 { 3375 item, 3376 isItemClickable: isItemClickable2, 3377 onClickItem, 3378 renderItemLink, 3379 className: "dataviews-view-grid__title-field dataviews-title-field", 3380 ...titleA11yProps, 3381 children: renderedTitleField 3382 } 3383 ), 3384 !!actions?.length && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3385 ItemActions, 3386 { 3387 item, 3388 actions, 3389 isCompact: true 3390 } 3391 ) 3392 ] 3393 } 3394 ), 3395 /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_components9.__experimentalVStack, { spacing: 1, children: [ 3396 showDescription && descriptionField2?.render && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3397 descriptionField2.render, 3398 { 3399 item, 3400 field: descriptionField2 3401 } 3402 ), 3403 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3404 import_components9.__experimentalHStack, 3405 { 3406 className: "dataviews-view-grid__badge-fields", 3407 spacing: 2, 3408 wrap: true, 3409 alignment: "top", 3410 justify: "flex-start", 3411 children: badgeFields.map((field) => { 3412 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3413 Badge, 3414 { 3415 className: "dataviews-view-grid__field-value", 3416 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3417 field.render, 3418 { 3419 item, 3420 field 3421 } 3422 ) 3423 }, 3424 field.id 3425 ); 3426 }) 3427 } 3428 ), 3429 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3430 import_components9.__experimentalVStack, 3431 { 3432 className: "dataviews-view-grid__fields", 3433 spacing: 1, 3434 children: regularFields.map((field) => { 3435 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3436 import_components9.Flex, 3437 { 3438 className: "dataviews-view-grid__field", 3439 gap: 1, 3440 justify: "flex-start", 3441 expanded: true, 3442 style: { height: "auto" }, 3443 direction: "row", 3444 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [ 3445 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_components9.Tooltip, { text: field.label, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_components9.FlexItem, { className: "dataviews-view-grid__field-name", children: field.header }) }), 3446 /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3447 import_components9.FlexItem, 3448 { 3449 className: "dataviews-view-grid__field-value", 3450 style: { maxHeight: "none" }, 3451 children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3452 field.render, 3453 { 3454 item, 3455 field 3456 } 3457 ) 3458 } 3459 ) 3460 ] }) 3461 }, 3462 field.id 3463 ); 3464 }) 3465 } 3466 ) 3467 ] }) 3468 ] 3469 } 3470 ); 3471 }); 3472 function CompositeGrid({ 3473 data, 3474 isInfiniteScroll, 3475 className, 3476 isLoading, 3477 view, 3478 fields, 3479 selection, 3480 onChangeSelection, 3481 onClickItem, 3482 isItemClickable: isItemClickable2, 3483 renderItemLink, 3484 getItemId, 3485 actions 3486 }) { 3487 const { paginationInfo, resizeObserverRef } = (0, import_element11.useContext)(dataviews_context_default); 3488 const gridColumns = useGridColumns(); 3489 const hasBulkActions = useSomeItemHasAPossibleBulkAction(actions, data); 3490 const titleField = fields.find( 3491 (field) => field.id === view?.titleField 3492 ); 3493 const mediaField = fields.find( 3494 (field) => field.id === view?.mediaField 3495 ); 3496 const descriptionField2 = fields.find( 3497 (field) => field.id === view?.descriptionField 3498 ); 3499 const otherFields = view.fields ?? []; 3500 const { regularFields, badgeFields } = otherFields.reduce( 3501 (accumulator, fieldId) => { 3502 const field = fields.find((f2) => f2.id === fieldId); 3503 if (!field) { 3504 return accumulator; 3505 } 3506 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields"; 3507 accumulator[key].push(field); 3508 return accumulator; 3509 }, 3510 { regularFields: [], badgeFields: [] } 3511 ); 3512 const size = "900px"; 3513 const totalRows = Math.ceil(data.length / gridColumns); 3514 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3515 import_components9.Composite, 3516 { 3517 role: isInfiniteScroll ? "feed" : "grid", 3518 className: clsx_default("dataviews-view-grid", className), 3519 focusWrap: true, 3520 "aria-busy": isLoading, 3521 "aria-rowcount": isInfiniteScroll ? void 0 : totalRows, 3522 ref: resizeObserverRef, 3523 children: chunk(data, gridColumns).map((row, i2) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3524 import_components9.Composite.Row, 3525 { 3526 render: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3527 "div", 3528 { 3529 role: "row", 3530 "aria-rowindex": i2 + 1, 3531 "aria-label": (0, import_i18n16.sprintf)( 3532 /* translators: %d: The row number in the grid */ 3533 (0, import_i18n16.__)("Row %d"), 3534 i2 + 1 3535 ), 3536 className: "dataviews-view-grid__row", 3537 style: { 3538 gridTemplateColumns: `repeat( $gridColumns}, minmax(0, 1fr) )` 3539 } 3540 } 3541 ), 3542 children: row.map((item, indexInRow) => { 3543 const index = i2 * gridColumns + indexInRow; 3544 return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3545 import_components9.Composite.Item, 3546 { 3547 render: (props) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)( 3548 GridItem, 3549 { 3550 ...props, 3551 role: isInfiniteScroll ? "article" : "gridcell", 3552 "aria-setsize": isInfiniteScroll ? paginationInfo.totalItems : void 0, 3553 "aria-posinset": isInfiniteScroll ? index + 1 : void 0, 3554 view, 3555 selection, 3556 onChangeSelection, 3557 onClickItem, 3558 isItemClickable: isItemClickable2, 3559 renderItemLink, 3560 getItemId, 3561 item, 3562 actions, 3563 mediaField, 3564 titleField, 3565 descriptionField: descriptionField2, 3566 regularFields, 3567 badgeFields, 3568 hasBulkActions, 3569 config: { 3570 sizes: size 3571 } 3572 } 3573 ) 3574 }, 3575 getItemId(item) 3576 ); 3577 }) 3578 }, 3579 i2 3580 )) 3581 } 3582 ); 3583 } 3584 3585 // packages/dataviews/build-module/dataviews-layouts/grid/index.js 3586 var import_jsx_runtime39 = __toESM(require_jsx_runtime()); 3587 function ViewGrid({ 3588 actions, 3589 data, 3590 fields, 3591 getItemId, 3592 isLoading, 3593 onChangeSelection, 3594 onClickItem, 3595 isItemClickable: isItemClickable2, 3596 renderItemLink, 3597 selection, 3598 view, 3599 className, 3600 empty 3601 }) { 3602 const hasData = !!data?.length; 3603 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 3604 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 3605 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 3606 const gridProps = { 3607 className, 3608 isLoading, 3609 view, 3610 fields, 3611 selection, 3612 onChangeSelection, 3613 onClickItem, 3614 isItemClickable: isItemClickable2, 3615 renderItemLink, 3616 getItemId, 3617 actions 3618 }; 3619 return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { 3620 // Render multiple groups. 3621 children: [ 3622 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_components10.__experimentalVStack, { spacing: 4, children: Array.from(dataByGroup.entries()).map( 3623 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_components10.__experimentalVStack, { spacing: 2, children: [ 3624 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("h3", { className: "dataviews-view-grid__group-header", children: (0, import_i18n17.sprintf)( 3625 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 3626 (0, import_i18n17.__)("%1$s: %2$s"), 3627 groupField.label, 3628 groupName 3629 ) }), 3630 /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 3631 CompositeGrid, 3632 { 3633 ...gridProps, 3634 data: groupItems, 3635 isInfiniteScroll: false 3636 } 3637 ) 3638 ] }, groupName) 3639 ) }), 3640 // Render a single grid with all data. 3641 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 3642 CompositeGrid, 3643 { 3644 ...gridProps, 3645 data, 3646 isInfiniteScroll: !!isInfiniteScroll 3647 } 3648 ), 3649 // Render empty state. 3650 !hasData && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)( 3651 "div", 3652 { 3653 className: clsx_default({ 3654 "dataviews-loading": isLoading, 3655 "dataviews-no-results": !isLoading 3656 }), 3657 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_components10.Spinner, {}) }) : empty 3658 } 3659 ), 3660 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_components10.Spinner, {}) }) 3661 ] 3662 }); 3663 } 3664 var grid_default = ViewGrid; 3665 3666 // packages/dataviews/build-module/dataviews-layouts/list/index.js 3667 var import_compose5 = __toESM(require_compose()); 3668 var import_components11 = __toESM(require_components()); 3669 var import_element12 = __toESM(require_element()); 3670 var import_i18n18 = __toESM(require_i18n()); 3671 var import_data3 = __toESM(require_data()); 3672 var import_jsx_runtime40 = __toESM(require_jsx_runtime()); 3673 var { Menu: Menu3 } = unlock(import_components11.privateApis); 3674 function generateItemWrapperCompositeId(idPrefix) { 3675 return `$idPrefix}-item-wrapper`; 3676 } 3677 function generatePrimaryActionCompositeId(idPrefix, primaryActionId) { 3678 return `$idPrefix}-primary-action-$primaryActionId}`; 3679 } 3680 function generateDropdownTriggerCompositeId(idPrefix) { 3681 return `$idPrefix}-dropdown`; 3682 } 3683 function PrimaryActionGridCell({ 3684 idPrefix, 3685 primaryAction, 3686 item 3687 }) { 3688 const registry = (0, import_data3.useRegistry)(); 3689 const [isModalOpen, setIsModalOpen] = (0, import_element12.useState)(false); 3690 const compositeItemId = generatePrimaryActionCompositeId( 3691 idPrefix, 3692 primaryAction.id 3693 ); 3694 const label = typeof primaryAction.label === "string" ? primaryAction.label : primaryAction.label([item]); 3695 return "RenderModal" in primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3696 import_components11.Composite.Item, 3697 { 3698 id: compositeItemId, 3699 render: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3700 import_components11.Button, 3701 { 3702 disabled: !!primaryAction.disabled, 3703 accessibleWhenDisabled: true, 3704 text: label, 3705 size: "small", 3706 onClick: () => setIsModalOpen(true) 3707 } 3708 ), 3709 children: isModalOpen && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3710 ActionModal, 3711 { 3712 action: primaryAction, 3713 items: [item], 3714 closeModal: () => setIsModalOpen(false) 3715 } 3716 ) 3717 } 3718 ) }, primaryAction.id) : /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3719 import_components11.Composite.Item, 3720 { 3721 id: compositeItemId, 3722 render: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3723 import_components11.Button, 3724 { 3725 disabled: !!primaryAction.disabled, 3726 accessibleWhenDisabled: true, 3727 size: "small", 3728 onClick: () => { 3729 primaryAction.callback([item], { registry }); 3730 }, 3731 children: label 3732 } 3733 ) 3734 } 3735 ) }, primaryAction.id); 3736 } 3737 function ListItem({ 3738 view, 3739 actions, 3740 idPrefix, 3741 isSelected: isSelected2, 3742 item, 3743 titleField, 3744 mediaField, 3745 descriptionField: descriptionField2, 3746 onSelect, 3747 otherFields, 3748 onDropdownTriggerKeyDown, 3749 posinset 3750 }) { 3751 const { 3752 showTitle = true, 3753 showMedia = true, 3754 showDescription = true, 3755 infiniteScrollEnabled 3756 } = view; 3757 const itemRef = (0, import_element12.useRef)(null); 3758 const labelId = `$idPrefix}-label`; 3759 const descriptionId = `$idPrefix}-description`; 3760 const registry = (0, import_data3.useRegistry)(); 3761 const [isHovered, setIsHovered] = (0, import_element12.useState)(false); 3762 const [activeModalAction, setActiveModalAction] = (0, import_element12.useState)( 3763 null 3764 ); 3765 const handleHover = ({ type }) => { 3766 const isHover = type === "mouseenter"; 3767 setIsHovered(isHover); 3768 }; 3769 const { paginationInfo } = (0, import_element12.useContext)(dataviews_context_default); 3770 (0, import_element12.useEffect)(() => { 3771 if (isSelected2) { 3772 itemRef.current?.scrollIntoView({ 3773 behavior: "auto", 3774 block: "nearest", 3775 inline: "nearest" 3776 }); 3777 } 3778 }, [isSelected2]); 3779 const { primaryAction, eligibleActions } = (0, import_element12.useMemo)(() => { 3780 const _eligibleActions = actions.filter( 3781 (action) => !action.isEligible || action.isEligible(item) 3782 ); 3783 const _primaryActions = _eligibleActions.filter( 3784 (action) => action.isPrimary 3785 ); 3786 return { 3787 primaryAction: _primaryActions[0], 3788 eligibleActions: _eligibleActions 3789 }; 3790 }, [actions, item]); 3791 const hasOnlyOnePrimaryAction = primaryAction && actions.length === 1; 3792 const renderedMediaField = showMedia && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "dataviews-view-list__media-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3793 mediaField.render, 3794 { 3795 item, 3796 field: mediaField, 3797 config: { sizes: "52px" } 3798 } 3799 ) }) : null; 3800 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(titleField.render, { item, field: titleField }) : null; 3801 const usedActions = eligibleActions?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_components11.__experimentalHStack, { spacing: 3, className: "dataviews-view-list__item-actions", children: [ 3802 primaryAction && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3803 PrimaryActionGridCell, 3804 { 3805 idPrefix, 3806 primaryAction, 3807 item 3808 } 3809 ), 3810 !hasOnlyOnePrimaryAction && /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { role: "gridcell", children: [ 3811 /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(Menu3, { placement: "bottom-end", children: [ 3812 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3813 Menu3.TriggerButton, 3814 { 3815 render: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3816 import_components11.Composite.Item, 3817 { 3818 id: generateDropdownTriggerCompositeId( 3819 idPrefix 3820 ), 3821 render: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3822 import_components11.Button, 3823 { 3824 size: "small", 3825 icon: more_vertical_default, 3826 label: (0, import_i18n18.__)("Actions"), 3827 accessibleWhenDisabled: true, 3828 disabled: !actions.length, 3829 onKeyDown: onDropdownTriggerKeyDown 3830 } 3831 ) 3832 } 3833 ) 3834 } 3835 ), 3836 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Menu3.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3837 ActionsMenuGroup, 3838 { 3839 actions: eligibleActions, 3840 item, 3841 registry, 3842 setActiveModalAction 3843 } 3844 ) }) 3845 ] }), 3846 !!activeModalAction && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3847 ActionModal, 3848 { 3849 action: activeModalAction, 3850 items: [item], 3851 closeModal: () => setActiveModalAction(null) 3852 } 3853 ) 3854 ] }) 3855 ] }); 3856 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3857 import_components11.Composite.Row, 3858 { 3859 ref: itemRef, 3860 render: ( 3861 /* aria-posinset breaks Composite.Row if passed to it directly. */ 3862 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3863 "div", 3864 { 3865 "aria-posinset": posinset, 3866 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0 3867 } 3868 ) 3869 ), 3870 role: infiniteScrollEnabled ? "article" : "row", 3871 className: clsx_default({ 3872 "is-selected": isSelected2, 3873 "is-hovered": isHovered 3874 }), 3875 onMouseEnter: handleHover, 3876 onMouseLeave: handleHover, 3877 children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_components11.__experimentalHStack, { className: "dataviews-view-list__item-wrapper", spacing: 0, children: [ 3878 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { role: "gridcell", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3879 import_components11.Composite.Item, 3880 { 3881 id: generateItemWrapperCompositeId(idPrefix), 3882 "aria-pressed": isSelected2, 3883 "aria-labelledby": labelId, 3884 "aria-describedby": descriptionId, 3885 className: "dataviews-view-list__item", 3886 onClick: () => onSelect(item) 3887 } 3888 ) }), 3889 /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_components11.__experimentalHStack, { spacing: 3, justify: "start", alignment: "flex-start", children: [ 3890 renderedMediaField, 3891 /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)( 3892 import_components11.__experimentalVStack, 3893 { 3894 spacing: 1, 3895 className: "dataviews-view-list__field-wrapper", 3896 children: [ 3897 /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_components11.__experimentalHStack, { spacing: 0, children: [ 3898 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3899 "div", 3900 { 3901 className: "dataviews-title-field", 3902 id: labelId, 3903 children: renderedTitleField 3904 } 3905 ), 3906 usedActions 3907 ] }), 3908 showDescription && descriptionField2?.render && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "dataviews-view-list__field", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3909 descriptionField2.render, 3910 { 3911 item, 3912 field: descriptionField2 3913 } 3914 ) }), 3915 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3916 "div", 3917 { 3918 className: "dataviews-view-list__fields", 3919 id: descriptionId, 3920 children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)( 3921 "div", 3922 { 3923 className: "dataviews-view-list__field", 3924 children: [ 3925 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3926 import_components11.VisuallyHidden, 3927 { 3928 as: "span", 3929 className: "dataviews-view-list__field-label", 3930 children: field.label 3931 } 3932 ), 3933 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "dataviews-view-list__field-value", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 3934 field.render, 3935 { 3936 item, 3937 field 3938 } 3939 ) }) 3940 ] 3941 }, 3942 field.id 3943 )) 3944 } 3945 ) 3946 ] 3947 } 3948 ) 3949 ] }) 3950 ] }) 3951 } 3952 ); 3953 } 3954 function isDefined2(item) { 3955 return !!item; 3956 } 3957 function ViewList(props) { 3958 const { 3959 actions, 3960 data, 3961 fields, 3962 getItemId, 3963 isLoading, 3964 onChangeSelection, 3965 selection, 3966 view, 3967 className, 3968 empty 3969 } = props; 3970 const baseId = (0, import_compose5.useInstanceId)(ViewList, "view-list"); 3971 const selectedItem = data?.findLast( 3972 (item) => selection.includes(getItemId(item)) 3973 ); 3974 const titleField = fields.find((field) => field.id === view.titleField); 3975 const mediaField = fields.find((field) => field.id === view.mediaField); 3976 const descriptionField2 = fields.find( 3977 (field) => field.id === view.descriptionField 3978 ); 3979 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined2); 3980 const onSelect = (item) => onChangeSelection([getItemId(item)]); 3981 const generateCompositeItemIdPrefix = (0, import_element12.useCallback)( 3982 (item) => `$baseId}-$getItemId(item)}`, 3983 [baseId, getItemId] 3984 ); 3985 const isActiveCompositeItem = (0, import_element12.useCallback)( 3986 (item, idToCheck) => { 3987 return idToCheck.startsWith( 3988 generateCompositeItemIdPrefix(item) 3989 ); 3990 }, 3991 [generateCompositeItemIdPrefix] 3992 ); 3993 const [activeCompositeId, setActiveCompositeId] = (0, import_element12.useState)(void 0); 3994 (0, import_element12.useEffect)(() => { 3995 if (selectedItem) { 3996 setActiveCompositeId( 3997 generateItemWrapperCompositeId( 3998 generateCompositeItemIdPrefix(selectedItem) 3999 ) 4000 ); 4001 } 4002 }, [selectedItem, generateCompositeItemIdPrefix]); 4003 const activeItemIndex = data.findIndex( 4004 (item) => isActiveCompositeItem(item, activeCompositeId ?? "") 4005 ); 4006 const previousActiveItemIndex = (0, import_compose5.usePrevious)(activeItemIndex); 4007 const isActiveIdInList = activeItemIndex !== -1; 4008 const selectCompositeItem = (0, import_element12.useCallback)( 4009 (targetIndex, generateCompositeId) => { 4010 const clampedIndex = Math.min( 4011 data.length - 1, 4012 Math.max(0, targetIndex) 4013 ); 4014 if (!data[clampedIndex]) { 4015 return; 4016 } 4017 const itemIdPrefix = generateCompositeItemIdPrefix( 4018 data[clampedIndex] 4019 ); 4020 const targetCompositeItemId = generateCompositeId(itemIdPrefix); 4021 setActiveCompositeId(targetCompositeItemId); 4022 document.getElementById(targetCompositeItemId)?.focus(); 4023 }, 4024 [data, generateCompositeItemIdPrefix] 4025 ); 4026 (0, import_element12.useEffect)(() => { 4027 const wasActiveIdInList = previousActiveItemIndex !== void 0 && previousActiveItemIndex !== -1; 4028 if (!isActiveIdInList && wasActiveIdInList) { 4029 selectCompositeItem( 4030 previousActiveItemIndex, 4031 generateItemWrapperCompositeId 4032 ); 4033 } 4034 }, [isActiveIdInList, selectCompositeItem, previousActiveItemIndex]); 4035 const onDropdownTriggerKeyDown = (0, import_element12.useCallback)( 4036 (event) => { 4037 if (event.key === "ArrowDown") { 4038 event.preventDefault(); 4039 selectCompositeItem( 4040 activeItemIndex + 1, 4041 generateDropdownTriggerCompositeId 4042 ); 4043 } 4044 if (event.key === "ArrowUp") { 4045 event.preventDefault(); 4046 selectCompositeItem( 4047 activeItemIndex - 1, 4048 generateDropdownTriggerCompositeId 4049 ); 4050 } 4051 }, 4052 [selectCompositeItem, activeItemIndex] 4053 ); 4054 const hasData = data?.length; 4055 if (!hasData) { 4056 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 4057 "div", 4058 { 4059 className: clsx_default({ 4060 "dataviews-loading": isLoading, 4061 "dataviews-no-results": !hasData && !isLoading 4062 }), 4063 children: !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_components11.Spinner, {}) }) : empty) 4064 } 4065 ); 4066 } 4067 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null; 4068 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 4069 if (hasData && groupField && dataByGroup) { 4070 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 4071 import_components11.Composite, 4072 { 4073 id: `$baseId}`, 4074 render: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", {}), 4075 className: "dataviews-view-list__group", 4076 role: "grid", 4077 activeId: activeCompositeId, 4078 setActiveId: setActiveCompositeId, 4079 children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 4080 import_components11.__experimentalVStack, 4081 { 4082 spacing: 4, 4083 className: clsx_default("dataviews-view-list", className), 4084 children: Array.from(dataByGroup.entries()).map( 4085 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_components11.__experimentalVStack, { spacing: 2, children: [ 4086 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("h3", { className: "dataviews-view-list__group-header", children: (0, import_i18n18.sprintf)( 4087 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 4088 (0, import_i18n18.__)("%1$s: %2$s"), 4089 groupField.label, 4090 groupName 4091 ) }), 4092 groupItems.map((item) => { 4093 const id = generateCompositeItemIdPrefix(item); 4094 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 4095 ListItem, 4096 { 4097 view, 4098 idPrefix: id, 4099 actions, 4100 item, 4101 isSelected: item === selectedItem, 4102 onSelect, 4103 mediaField, 4104 titleField, 4105 descriptionField: descriptionField2, 4106 otherFields, 4107 onDropdownTriggerKeyDown 4108 }, 4109 id 4110 ); 4111 }) 4112 ] }, groupName) 4113 ) 4114 } 4115 ) 4116 } 4117 ); 4118 } 4119 return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [ 4120 /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 4121 import_components11.Composite, 4122 { 4123 id: baseId, 4124 render: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", {}), 4125 className: clsx_default("dataviews-view-list", className), 4126 role: view.infiniteScrollEnabled ? "feed" : "grid", 4127 activeId: activeCompositeId, 4128 setActiveId: setActiveCompositeId, 4129 children: data.map((item, index) => { 4130 const id = generateCompositeItemIdPrefix(item); 4131 return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)( 4132 ListItem, 4133 { 4134 view, 4135 idPrefix: id, 4136 actions, 4137 item, 4138 isSelected: item === selectedItem, 4139 onSelect, 4140 mediaField, 4141 titleField, 4142 descriptionField: descriptionField2, 4143 otherFields, 4144 onDropdownTriggerKeyDown, 4145 posinset: view.infiniteScrollEnabled ? index + 1 : void 0 4146 }, 4147 id 4148 ); 4149 }) 4150 } 4151 ), 4152 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_components11.Spinner, {}) }) 4153 ] }); 4154 } 4155 4156 // packages/dataviews/build-module/dataviews-layouts/activity/index.js 4157 var import_components14 = __toESM(require_components()); 4158 4159 // packages/dataviews/build-module/dataviews-layouts/activity/activity-group.js 4160 var import_components12 = __toESM(require_components()); 4161 var import_i18n19 = __toESM(require_i18n()); 4162 var import_element13 = __toESM(require_element()); 4163 var import_jsx_runtime41 = __toESM(require_jsx_runtime()); 4164 function ActivityGroup({ 4165 groupName, 4166 groupData, 4167 groupField, 4168 children 4169 }) { 4170 const groupHeader = (0, import_element13.createInterpolateElement)( 4171 // translators: %s: The label of the field e.g. "Status". 4172 (0, import_i18n19.sprintf)((0, import_i18n19.__)("%s: <groupName />"), groupField.label).trim(), 4173 { 4174 groupName: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)( 4175 groupField.render, 4176 { 4177 item: groupData[0], 4178 field: groupField 4179 } 4180 ) 4181 } 4182 ); 4183 return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)( 4184 import_components12.__experimentalVStack, 4185 { 4186 spacing: 0, 4187 className: "dataviews-view-activity__group", 4188 children: [ 4189 /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("h3", { className: "dataviews-view-activity__group-header", children: groupHeader }), 4190 children 4191 ] 4192 }, 4193 groupName 4194 ); 4195 } 4196 4197 // packages/dataviews/build-module/dataviews-layouts/activity/activity-item.js 4198 var import_components13 = __toESM(require_components()); 4199 var import_element14 = __toESM(require_element()); 4200 var import_data4 = __toESM(require_data()); 4201 var import_jsx_runtime42 = __toESM(require_jsx_runtime()); 4202 function ActivityItem(props) { 4203 const { 4204 view, 4205 actions, 4206 item, 4207 titleField, 4208 mediaField, 4209 descriptionField: descriptionField2, 4210 otherFields, 4211 posinset, 4212 onClickItem, 4213 renderItemLink, 4214 isItemClickable: isItemClickable2 4215 } = props; 4216 const { 4217 showTitle = true, 4218 showMedia = true, 4219 showDescription = true, 4220 infiniteScrollEnabled 4221 } = view; 4222 const itemRef = (0, import_element14.useRef)(null); 4223 const registry = (0, import_data4.useRegistry)(); 4224 const { paginationInfo } = (0, import_element14.useContext)(dataviews_context_default); 4225 const { primaryActions, eligibleActions } = (0, import_element14.useMemo)(() => { 4226 const _eligibleActions = actions.filter( 4227 (action) => !action.isEligible || action.isEligible(item) 4228 ); 4229 const _primaryActions = _eligibleActions.filter( 4230 (action) => action.isPrimary 4231 ); 4232 return { 4233 primaryActions: _primaryActions, 4234 eligibleActions: _eligibleActions 4235 }; 4236 }, [actions, item]); 4237 const density = view.layout?.density ?? "balanced"; 4238 const mediaContent = showMedia && density !== "compact" && mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4239 mediaField.render, 4240 { 4241 item, 4242 field: mediaField, 4243 config: { 4244 sizes: density === "comfortable" ? "32px" : "24px" 4245 } 4246 } 4247 ) : null; 4248 const renderedMediaField = /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-activity__item-type-icon", children: mediaContent || /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4249 "span", 4250 { 4251 className: "dataviews-view-activity__item-bullet", 4252 "aria-hidden": "true" 4253 } 4254 ) }); 4255 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(titleField.render, { item, field: titleField }) : null; 4256 const verticalSpacing = (0, import_element14.useMemo)(() => { 4257 switch (density) { 4258 case "comfortable": 4259 return "3"; 4260 default: 4261 return "2"; 4262 } 4263 }, [density]); 4264 return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4265 "div", 4266 { 4267 ref: itemRef, 4268 role: infiniteScrollEnabled ? "article" : void 0, 4269 "aria-posinset": posinset, 4270 "aria-setsize": infiniteScrollEnabled ? paginationInfo.totalItems : void 0, 4271 className: clsx_default( 4272 "dataviews-view-activity__item", 4273 density === "compact" && "is-compact", 4274 density === "balanced" && "is-balanced", 4275 density === "comfortable" && "is-comfortable" 4276 ), 4277 children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_components13.__experimentalHStack, { spacing: 4, justify: "start", alignment: "flex-start", children: [ 4278 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4279 import_components13.__experimentalVStack, 4280 { 4281 spacing: 1, 4282 alignment: "center", 4283 className: "dataviews-view-activity__item-type", 4284 children: renderedMediaField 4285 } 4286 ), 4287 /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)( 4288 import_components13.__experimentalVStack, 4289 { 4290 spacing: verticalSpacing, 4291 alignment: "flex-start", 4292 className: "dataviews-view-activity__item-content", 4293 children: [ 4294 renderedTitleField && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4295 ItemClickWrapper, 4296 { 4297 item, 4298 isItemClickable: isItemClickable2, 4299 onClickItem, 4300 renderItemLink, 4301 className: "dataviews-view-activity__item-title", 4302 children: renderedTitleField 4303 } 4304 ), 4305 showDescription && descriptionField2 && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-activity__item-description", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4306 descriptionField2.render, 4307 { 4308 item, 4309 field: descriptionField2 4310 } 4311 ) }), 4312 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-activity__item-fields", children: otherFields.map((field) => /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)( 4313 "div", 4314 { 4315 className: "dataviews-view-activity__item-field", 4316 children: [ 4317 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4318 import_components13.VisuallyHidden, 4319 { 4320 as: "span", 4321 className: "dataviews-view-activity__item-field-label", 4322 children: field.label 4323 } 4324 ), 4325 /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "dataviews-view-activity__item-field-value", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4326 field.render, 4327 { 4328 item, 4329 field 4330 } 4331 ) }) 4332 ] 4333 }, 4334 field.id 4335 )) }), 4336 !!primaryActions?.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4337 PrimaryActions, 4338 { 4339 item, 4340 actions: primaryActions, 4341 registry, 4342 buttonVariant: "secondary" 4343 } 4344 ) 4345 ] 4346 } 4347 ), 4348 primaryActions.length < eligibleActions.length && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "dataviews-view-activity__item-actions", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)( 4349 ItemActions, 4350 { 4351 item, 4352 actions: eligibleActions, 4353 isCompact: true 4354 } 4355 ) }) 4356 ] }) 4357 } 4358 ); 4359 } 4360 var activity_item_default = ActivityItem; 4361 4362 // packages/dataviews/build-module/dataviews-layouts/activity/activity-items.js 4363 var import_react = __toESM(require_react()); 4364 function isDefined3(item) { 4365 return !!item; 4366 } 4367 function ActivityItems(props) { 4368 const { data, fields, getItemId, view } = props; 4369 const titleField = fields.find((field) => field.id === view.titleField); 4370 const mediaField = fields.find((field) => field.id === view.mediaField); 4371 const descriptionField2 = fields.find( 4372 (field) => field.id === view.descriptionField 4373 ); 4374 const otherFields = (view?.fields ?? []).map((fieldId) => fields.find((f2) => fieldId === f2.id)).filter(isDefined3); 4375 return data.map((item, index) => { 4376 return /* @__PURE__ */ (0, import_react.createElement)( 4377 activity_item_default, 4378 { 4379 ...props, 4380 key: getItemId(item), 4381 item, 4382 mediaField, 4383 titleField, 4384 descriptionField: descriptionField2, 4385 otherFields, 4386 posinset: view.infiniteScrollEnabled ? index + 1 : void 0 4387 } 4388 ); 4389 }); 4390 } 4391 4392 // packages/dataviews/build-module/dataviews-layouts/activity/index.js 4393 var import_jsx_runtime43 = __toESM(require_jsx_runtime()); 4394 function ViewActivity(props) { 4395 const { empty, data, fields, isLoading, view, className } = props; 4396 const hasData = data?.length; 4397 if (!hasData) { 4398 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4399 "div", 4400 { 4401 className: clsx_default({ 4402 "dataviews-loading": isLoading, 4403 "dataviews-no-results": !hasData && !isLoading 4404 }), 4405 children: !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components14.Spinner, {}) }) : empty) 4406 } 4407 ); 4408 } 4409 const wrapperClassName = clsx_default("dataviews-view-activity", className); 4410 const groupField = view.groupBy?.field ? fields.find((field) => field.id === view.groupBy?.field) : null; 4411 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 4412 const groupedEntries = dataByGroup ? Array.from(dataByGroup.entries()) : []; 4413 if (hasData && groupField && dataByGroup) { 4414 return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components14.__experimentalVStack, { spacing: 2, className: wrapperClassName, children: groupedEntries.map( 4415 ([groupName, groupData]) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4416 ActivityGroup, 4417 { 4418 groupName, 4419 groupData, 4420 groupField, 4421 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4422 ActivityItems, 4423 { 4424 ...props, 4425 data: groupData 4426 } 4427 ) 4428 }, 4429 groupName 4430 ) 4431 ) }); 4432 } 4433 return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_jsx_runtime43.Fragment, { children: [ 4434 /* @__PURE__ */ (0, import_jsx_runtime43.jsx)( 4435 "div", 4436 { 4437 className: wrapperClassName, 4438 role: view.infiniteScrollEnabled ? "feed" : void 0, 4439 children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ActivityItems, { ...props }) 4440 } 4441 ), 4442 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_components14.Spinner, {}) }) 4443 ] }); 4444 } 4445 4446 // packages/dataviews/build-module/dataviews-layouts/picker-grid/index.js 4447 var import_components17 = __toESM(require_components()); 4448 var import_i18n22 = __toESM(require_i18n()); 4449 var import_compose6 = __toESM(require_compose()); 4450 var import_element18 = __toESM(require_element()); 4451 4452 // packages/dataviews/build-module/components/dataviews-picker/footer.js 4453 var import_components16 = __toESM(require_components()); 4454 var import_data5 = __toESM(require_data()); 4455 var import_element16 = __toESM(require_element()); 4456 var import_i18n21 = __toESM(require_i18n()); 4457 4458 // packages/dataviews/build-module/components/dataviews-pagination/index.js 4459 var import_components15 = __toESM(require_components()); 4460 var import_element15 = __toESM(require_element()); 4461 var import_i18n20 = __toESM(require_i18n()); 4462 var import_jsx_runtime44 = __toESM(require_jsx_runtime()); 4463 function DataViewsPagination() { 4464 const { 4465 view, 4466 onChangeView, 4467 paginationInfo: { totalItems = 0, totalPages } 4468 } = (0, import_element15.useContext)(dataviews_context_default); 4469 if (!totalItems || !totalPages || view.infiniteScrollEnabled) { 4470 return null; 4471 } 4472 const currentPage = view.page ?? 1; 4473 const pageSelectOptions = Array.from(Array(totalPages)).map( 4474 (_, i2) => { 4475 const page = i2 + 1; 4476 return { 4477 value: page.toString(), 4478 label: page.toString(), 4479 "aria-label": currentPage === page ? (0, import_i18n20.sprintf)( 4480 // translators: 1: current page number. 2: total number of pages. 4481 (0, import_i18n20.__)("Page %1$d of %2$d"), 4482 currentPage, 4483 totalPages 4484 ) : page.toString() 4485 }; 4486 } 4487 ); 4488 return !!totalItems && totalPages !== 1 && /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)( 4489 import_components15.__experimentalHStack, 4490 { 4491 expanded: false, 4492 className: "dataviews-pagination", 4493 justify: "end", 4494 spacing: 6, 4495 children: [ 4496 /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( 4497 import_components15.__experimentalHStack, 4498 { 4499 justify: "flex-start", 4500 expanded: false, 4501 spacing: 1, 4502 className: "dataviews-pagination__page-select", 4503 children: (0, import_element15.createInterpolateElement)( 4504 (0, import_i18n20.sprintf)( 4505 // translators: 1: Current page number, 2: Total number of pages. 4506 (0, import_i18n20._x)( 4507 "<div>Page</div>%1$s<div>of %2$d</div>", 4508 "paging" 4509 ), 4510 "<CurrentPage />", 4511 totalPages 4512 ), 4513 { 4514 div: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { "aria-hidden": true }), 4515 CurrentPage: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( 4516 import_components15.SelectControl, 4517 { 4518 "aria-label": (0, import_i18n20.__)("Current page"), 4519 value: currentPage.toString(), 4520 options: pageSelectOptions, 4521 onChange: (newValue) => { 4522 onChangeView({ 4523 ...view, 4524 page: +newValue 4525 }); 4526 }, 4527 size: "small", 4528 variant: "minimal" 4529 } 4530 ) 4531 } 4532 ) 4533 } 4534 ), 4535 /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_components15.__experimentalHStack, { expanded: false, spacing: 1, children: [ 4536 /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( 4537 import_components15.Button, 4538 { 4539 onClick: () => onChangeView({ 4540 ...view, 4541 page: currentPage - 1 4542 }), 4543 disabled: currentPage === 1, 4544 accessibleWhenDisabled: true, 4545 label: (0, import_i18n20.__)("Previous page"), 4546 icon: (0, import_i18n20.isRTL)() ? next_default : previous_default, 4547 showTooltip: true, 4548 size: "compact", 4549 tooltipPosition: "top" 4550 } 4551 ), 4552 /* @__PURE__ */ (0, import_jsx_runtime44.jsx)( 4553 import_components15.Button, 4554 { 4555 onClick: () => onChangeView({ ...view, page: currentPage + 1 }), 4556 disabled: currentPage >= totalPages, 4557 accessibleWhenDisabled: true, 4558 label: (0, import_i18n20.__)("Next page"), 4559 icon: (0, import_i18n20.isRTL)() ? previous_default : next_default, 4560 showTooltip: true, 4561 size: "compact", 4562 tooltipPosition: "top" 4563 } 4564 ) 4565 ] }) 4566 ] 4567 } 4568 ); 4569 } 4570 var dataviews_pagination_default = (0, import_element15.memo)(DataViewsPagination); 4571 4572 // packages/dataviews/build-module/components/dataviews-picker/footer.js 4573 var import_jsx_runtime45 = __toESM(require_jsx_runtime()); 4574 var EMPTY_ARRAY = []; 4575 function useIsMultiselectPicker(actions) { 4576 return (0, import_element16.useMemo)(() => { 4577 return actions?.every((action) => action.supportsBulk); 4578 }, [actions]); 4579 } 4580 function BulkSelectionCheckbox2({ 4581 selection, 4582 selectedItems, 4583 onChangeSelection, 4584 data, 4585 getItemId 4586 }) { 4587 const areAllSelected = selectedItems.length === data.length; 4588 return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 4589 import_components16.CheckboxControl, 4590 { 4591 className: "dataviews-view-table-selection-checkbox", 4592 checked: areAllSelected, 4593 indeterminate: !areAllSelected && !!selectedItems.length, 4594 onChange: () => { 4595 if (areAllSelected) { 4596 onChangeSelection( 4597 selection.filter( 4598 (id) => !data.some( 4599 (item) => id === getItemId(item) 4600 ) 4601 ) 4602 ); 4603 } else { 4604 const selectionSet = /* @__PURE__ */ new Set([ 4605 ...selection, 4606 ...data.map((item) => getItemId(item)) 4607 ]); 4608 onChangeSelection(Array.from(selectionSet)); 4609 } 4610 }, 4611 "aria-label": areAllSelected ? (0, import_i18n21.__)("Deselect all") : (0, import_i18n21.__)("Select all") 4612 } 4613 ); 4614 } 4615 function ActionButtons({ 4616 actions, 4617 items, 4618 selection 4619 }) { 4620 const registry = (0, import_data5.useRegistry)(); 4621 const [actionInProgress, setActionInProgress] = (0, import_element16.useState)( 4622 null 4623 ); 4624 return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_components16.__experimentalHStack, { expanded: false, spacing: 1, children: actions.map((action) => { 4625 if (!("callback" in action)) { 4626 return null; 4627 } 4628 const { id, label, icon, isPrimary, callback } = action; 4629 const _label = typeof label === "string" ? label : label(items); 4630 const variant = isPrimary ? "primary" : "tertiary"; 4631 const isInProgress = id === actionInProgress; 4632 return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 4633 import_components16.Button, 4634 { 4635 accessibleWhenDisabled: true, 4636 icon, 4637 disabled: isInProgress || !selection?.length, 4638 isBusy: isInProgress, 4639 onClick: async () => { 4640 setActionInProgress(id); 4641 await callback(items, { 4642 registry 4643 }); 4644 setActionInProgress(null); 4645 }, 4646 size: "compact", 4647 variant, 4648 children: _label 4649 }, 4650 id 4651 ); 4652 }) }); 4653 } 4654 function DataViewsPickerFooter() { 4655 const { 4656 data, 4657 selection, 4658 onChangeSelection, 4659 getItemId, 4660 actions = EMPTY_ARRAY 4661 } = (0, import_element16.useContext)(dataviews_context_default); 4662 const selectionCount = selection.length; 4663 const isMultiselect = useIsMultiselectPicker(actions); 4664 const message2 = selectionCount > 0 ? (0, import_i18n21.sprintf)( 4665 /* translators: %d: number of items. */ 4666 (0, import_i18n21._n)( 4667 "%d Item selected", 4668 "%d Items selected", 4669 selectionCount 4670 ), 4671 selectionCount 4672 ) : (0, import_i18n21.sprintf)( 4673 /* translators: %d: number of items. */ 4674 (0, import_i18n21._n)("%d Item", "%d Items", data.length), 4675 data.length 4676 ); 4677 const selectedItems = (0, import_element16.useMemo)( 4678 () => data.filter((item) => selection.includes(getItemId(item))), 4679 [selection, getItemId, data] 4680 ); 4681 return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)( 4682 import_components16.__experimentalHStack, 4683 { 4684 expanded: false, 4685 justify: "space-between", 4686 className: "dataviews-footer", 4687 children: [ 4688 /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)( 4689 import_components16.__experimentalHStack, 4690 { 4691 className: "dataviews-picker-footer__bulk-selection", 4692 expanded: false, 4693 spacing: 3, 4694 children: [ 4695 isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 4696 BulkSelectionCheckbox2, 4697 { 4698 selection, 4699 selectedItems, 4700 onChangeSelection, 4701 data, 4702 getItemId 4703 } 4704 ), 4705 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "dataviews-bulk-actions-footer__item-count", children: message2 }) 4706 ] 4707 } 4708 ), 4709 /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(dataviews_pagination_default, {}), 4710 Boolean(actions?.length) && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "dataviews-picker-footer__actions", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)( 4711 ActionButtons, 4712 { 4713 actions, 4714 items: selectedItems, 4715 selection 4716 } 4717 ) }) 4718 ] 4719 } 4720 ); 4721 } 4722 4723 // packages/dataviews/build-module/dataviews-layouts/utils/grid-items.js 4724 var import_element17 = __toESM(require_element()); 4725 var import_jsx_runtime46 = __toESM(require_jsx_runtime()); 4726 var GridItems = (0, import_element17.forwardRef)(({ className, previewSize, ...props }, ref) => { 4727 return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)( 4728 "div", 4729 { 4730 ref, 4731 className: clsx_default("dataviews-view-grid-items", className), 4732 style: { 4733 gridTemplateColumns: previewSize && `repeat(auto-fill, minmax($previewSize}px, 1fr))` 4734 }, 4735 ...props 4736 } 4737 ); 4738 }); 4739 4740 // packages/dataviews/build-module/dataviews-layouts/picker-grid/index.js 4741 var import_jsx_runtime47 = __toESM(require_jsx_runtime()); 4742 var { Badge: Badge2 } = unlock(import_components17.privateApis); 4743 function GridItem3({ 4744 view, 4745 multiselect, 4746 selection, 4747 onChangeSelection, 4748 getItemId, 4749 item, 4750 mediaField, 4751 titleField, 4752 descriptionField: descriptionField2, 4753 regularFields, 4754 badgeFields, 4755 config, 4756 posinset, 4757 setsize 4758 }) { 4759 const { showTitle = true, showMedia = true, showDescription = true } = view; 4760 const id = getItemId(item); 4761 const isSelected2 = selection.includes(id); 4762 const renderedMediaField = mediaField?.render ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4763 mediaField.render, 4764 { 4765 item, 4766 field: mediaField, 4767 config 4768 } 4769 ) : null; 4770 const renderedTitleField = showTitle && titleField?.render ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(titleField.render, { item, field: titleField }) : null; 4771 return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)( 4772 import_components17.Composite.Item, 4773 { 4774 "aria-label": titleField ? titleField.getValue({ item }) || (0, import_i18n22.__)("(no title)") : void 0, 4775 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_components17.__experimentalVStack, { spacing: 0, children, ...props }), 4776 role: "option", 4777 "aria-posinset": posinset, 4778 "aria-setsize": setsize, 4779 className: clsx_default("dataviews-view-picker-grid__card", { 4780 "is-selected": isSelected2 4781 }), 4782 "aria-selected": isSelected2, 4783 onClick: () => { 4784 if (isSelected2) { 4785 onChangeSelection( 4786 selection.filter((itemId) => id !== itemId) 4787 ); 4788 } else { 4789 const newSelection = multiselect ? [...selection, id] : [id]; 4790 onChangeSelection(newSelection); 4791 } 4792 }, 4793 children: [ 4794 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "dataviews-view-picker-grid__media", children: renderedMediaField }), 4795 showMedia && renderedMediaField && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4796 DataViewsSelectionCheckbox, 4797 { 4798 item, 4799 selection, 4800 onChangeSelection, 4801 getItemId, 4802 titleField, 4803 disabled: false, 4804 "aria-hidden": true, 4805 tabIndex: -1 4806 } 4807 ), 4808 showTitle && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4809 import_components17.__experimentalHStack, 4810 { 4811 justify: "space-between", 4812 className: "dataviews-view-picker-grid__title-actions", 4813 children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "dataviews-view-picker-grid__title-field dataviews-title-field", children: renderedTitleField }) 4814 } 4815 ), 4816 /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_components17.__experimentalVStack, { spacing: 1, children: [ 4817 showDescription && descriptionField2?.render && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4818 descriptionField2.render, 4819 { 4820 item, 4821 field: descriptionField2 4822 } 4823 ), 4824 !!badgeFields?.length && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4825 import_components17.__experimentalHStack, 4826 { 4827 className: "dataviews-view-picker-grid__badge-fields", 4828 spacing: 2, 4829 wrap: true, 4830 alignment: "top", 4831 justify: "flex-start", 4832 children: badgeFields.map((field) => { 4833 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4834 Badge2, 4835 { 4836 className: "dataviews-view-picker-grid__field-value", 4837 children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4838 field.render, 4839 { 4840 item, 4841 field 4842 } 4843 ) 4844 }, 4845 field.id 4846 ); 4847 }) 4848 } 4849 ), 4850 !!regularFields?.length && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4851 import_components17.__experimentalVStack, 4852 { 4853 className: "dataviews-view-picker-grid__fields", 4854 spacing: 1, 4855 children: regularFields.map((field) => { 4856 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4857 import_components17.Flex, 4858 { 4859 className: "dataviews-view-picker-grid__field", 4860 gap: 1, 4861 justify: "flex-start", 4862 expanded: true, 4863 style: { height: "auto" }, 4864 direction: "row", 4865 children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_jsx_runtime47.Fragment, { children: [ 4866 /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_components17.FlexItem, { className: "dataviews-view-picker-grid__field-name", children: field.header }), 4867 /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4868 import_components17.FlexItem, 4869 { 4870 className: "dataviews-view-picker-grid__field-value", 4871 style: { maxHeight: "none" }, 4872 children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4873 field.render, 4874 { 4875 item, 4876 field 4877 } 4878 ) 4879 } 4880 ) 4881 ] }) 4882 }, 4883 field.id 4884 ); 4885 }) 4886 } 4887 ) 4888 ] }) 4889 ] 4890 }, 4891 id 4892 ); 4893 } 4894 function GridGroup({ 4895 groupName, 4896 groupField, 4897 children 4898 }) { 4899 const headerId = (0, import_compose6.useInstanceId)( 4900 GridGroup, 4901 "dataviews-view-picker-grid-group__header" 4902 ); 4903 return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)( 4904 import_components17.__experimentalVStack, 4905 { 4906 spacing: 2, 4907 role: "group", 4908 "aria-labelledby": headerId, 4909 children: [ 4910 /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4911 "h3", 4912 { 4913 className: "dataviews-view-picker-grid-group__header", 4914 id: headerId, 4915 children: (0, import_i18n22.sprintf)( 4916 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 4917 (0, import_i18n22.__)("%1$s: %2$s"), 4918 groupField.label, 4919 groupName 4920 ) 4921 } 4922 ), 4923 children 4924 ] 4925 }, 4926 groupName 4927 ); 4928 } 4929 function ViewPickerGrid({ 4930 actions, 4931 data, 4932 fields, 4933 getItemId, 4934 isLoading, 4935 onChangeSelection, 4936 selection, 4937 view, 4938 className, 4939 empty 4940 }) { 4941 const { resizeObserverRef, paginationInfo, itemListLabel } = (0, import_element18.useContext)(dataviews_context_default); 4942 const titleField = fields.find( 4943 (field) => field.id === view?.titleField 4944 ); 4945 const mediaField = fields.find( 4946 (field) => field.id === view?.mediaField 4947 ); 4948 const descriptionField2 = fields.find( 4949 (field) => field.id === view?.descriptionField 4950 ); 4951 const otherFields = view.fields ?? []; 4952 const { regularFields, badgeFields } = otherFields.reduce( 4953 (accumulator, fieldId) => { 4954 const field = fields.find((f2) => f2.id === fieldId); 4955 if (!field) { 4956 return accumulator; 4957 } 4958 const key = view.layout?.badgeFields?.includes(fieldId) ? "badgeFields" : "regularFields"; 4959 accumulator[key].push(field); 4960 return accumulator; 4961 }, 4962 { regularFields: [], badgeFields: [] } 4963 ); 4964 const hasData = !!data?.length; 4965 const usedPreviewSize = view.layout?.previewSize; 4966 const isMultiselect = useIsMultiselectPicker(actions); 4967 const size = "900px"; 4968 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 4969 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 4970 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 4971 const currentPage = view?.page ?? 1; 4972 const perPage = view?.perPage ?? 0; 4973 const setSize = isInfiniteScroll ? paginationInfo?.totalItems : void 0; 4974 return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_jsx_runtime47.Fragment, { 4975 // Render multiple groups. 4976 children: [ 4977 hasData && groupField && dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4978 import_components17.Composite, 4979 { 4980 virtualFocus: true, 4981 orientation: "horizontal", 4982 role: "listbox", 4983 "aria-multiselectable": isMultiselect, 4984 className: clsx_default( 4985 "dataviews-view-picker-grid", 4986 className 4987 ), 4988 "aria-label": itemListLabel, 4989 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4990 import_components17.__experimentalVStack, 4991 { 4992 spacing: 4, 4993 children, 4994 ...props 4995 } 4996 ), 4997 children: Array.from(dataByGroup.entries()).map( 4998 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 4999 GridGroup, 5000 { 5001 groupName, 5002 groupField, 5003 children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 5004 GridItems, 5005 { 5006 previewSize: usedPreviewSize, 5007 style: { 5008 gridTemplateColumns: usedPreviewSize && `repeat(auto-fill, minmax($usedPreviewSize}px, 1fr))` 5009 }, 5010 "aria-busy": isLoading, 5011 ref: resizeObserverRef, 5012 children: groupItems.map((item) => { 5013 const posInSet = (currentPage - 1) * perPage + data.indexOf(item) + 1; 5014 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 5015 GridItem3, 5016 { 5017 view, 5018 multiselect: isMultiselect, 5019 selection, 5020 onChangeSelection, 5021 getItemId, 5022 item, 5023 mediaField, 5024 titleField, 5025 descriptionField: descriptionField2, 5026 regularFields, 5027 badgeFields, 5028 config: { 5029 sizes: size 5030 }, 5031 posinset: posInSet, 5032 setsize: setSize 5033 }, 5034 getItemId(item) 5035 ); 5036 }) 5037 } 5038 ) 5039 }, 5040 groupName 5041 ) 5042 ) 5043 } 5044 ), 5045 // Render a single grid with all data. 5046 hasData && !dataByGroup && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 5047 import_components17.Composite, 5048 { 5049 render: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 5050 GridItems, 5051 { 5052 className: clsx_default( 5053 "dataviews-view-picker-grid", 5054 className 5055 ), 5056 previewSize: usedPreviewSize, 5057 "aria-busy": isLoading, 5058 ref: resizeObserverRef 5059 } 5060 ), 5061 virtualFocus: true, 5062 orientation: "horizontal", 5063 role: "listbox", 5064 "aria-multiselectable": isMultiselect, 5065 "aria-label": itemListLabel, 5066 children: data.map((item, index) => { 5067 let posinset = isInfiniteScroll ? index + 1 : void 0; 5068 if (!isInfiniteScroll) { 5069 posinset = (currentPage - 1) * perPage + index + 1; 5070 } 5071 return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 5072 GridItem3, 5073 { 5074 view, 5075 multiselect: isMultiselect, 5076 selection, 5077 onChangeSelection, 5078 getItemId, 5079 item, 5080 mediaField, 5081 titleField, 5082 descriptionField: descriptionField2, 5083 regularFields, 5084 badgeFields, 5085 config: { 5086 sizes: size 5087 }, 5088 posinset, 5089 setsize: setSize 5090 }, 5091 getItemId(item) 5092 ); 5093 }) 5094 } 5095 ), 5096 // Render empty state. 5097 !hasData && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)( 5098 "div", 5099 { 5100 className: clsx_default({ 5101 "dataviews-loading": isLoading, 5102 "dataviews-no-results": !isLoading 5103 }), 5104 children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_components17.Spinner, {}) }) : empty 5105 } 5106 ), 5107 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_components17.Spinner, {}) }) 5108 ] 5109 }); 5110 } 5111 var picker_grid_default = ViewPickerGrid; 5112 5113 // packages/dataviews/build-module/dataviews-layouts/picker-table/index.js 5114 var import_i18n23 = __toESM(require_i18n()); 5115 var import_components18 = __toESM(require_components()); 5116 var import_element19 = __toESM(require_element()); 5117 var import_jsx_runtime48 = __toESM(require_jsx_runtime()); 5118 function TableColumnField2({ 5119 item, 5120 fields, 5121 column, 5122 align 5123 }) { 5124 const field = fields.find((f2) => f2.id === column); 5125 if (!field) { 5126 return null; 5127 } 5128 const className = clsx_default("dataviews-view-table__cell-content-wrapper", { 5129 "dataviews-view-table__cell-align-end": align === "end", 5130 "dataviews-view-table__cell-align-center": align === "center" 5131 }); 5132 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(field.render, { item, field }) }); 5133 } 5134 function TableRow2({ 5135 item, 5136 fields, 5137 id, 5138 view, 5139 titleField, 5140 mediaField, 5141 descriptionField: descriptionField2, 5142 selection, 5143 getItemId, 5144 onChangeSelection, 5145 multiselect, 5146 posinset 5147 }) { 5148 const { paginationInfo } = (0, import_element19.useContext)(dataviews_context_default); 5149 const isSelected2 = selection.includes(id); 5150 const [isHovered, setIsHovered] = (0, import_element19.useState)(false); 5151 const { 5152 showTitle = true, 5153 showMedia = true, 5154 showDescription = true, 5155 infiniteScrollEnabled 5156 } = view; 5157 const handleMouseEnter = () => { 5158 setIsHovered(true); 5159 }; 5160 const handleMouseLeave = () => { 5161 setIsHovered(false); 5162 }; 5163 const columns = view.fields ?? []; 5164 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField2 && showDescription; 5165 return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)( 5166 import_components18.Composite.Item, 5167 { 5168 render: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5169 "tr", 5170 { 5171 className: clsx_default("dataviews-view-table__row", { 5172 "is-selected": isSelected2, 5173 "is-hovered": isHovered 5174 }), 5175 onMouseEnter: handleMouseEnter, 5176 onMouseLeave: handleMouseLeave, 5177 children, 5178 ...props 5179 } 5180 ), 5181 "aria-selected": isSelected2, 5182 "aria-setsize": paginationInfo.totalItems || void 0, 5183 "aria-posinset": posinset, 5184 role: infiniteScrollEnabled ? "article" : "option", 5185 onClick: () => { 5186 if (isSelected2) { 5187 onChangeSelection( 5188 selection.filter((itemId) => id !== itemId) 5189 ); 5190 } else { 5191 const newSelection = multiselect ? [...selection, id] : [id]; 5192 onChangeSelection(newSelection); 5193 } 5194 }, 5195 children: [ 5196 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5197 "td", 5198 { 5199 className: "dataviews-view-table__checkbox-column", 5200 role: "presentation", 5201 children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "dataviews-view-table__cell-content-wrapper", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5202 DataViewsSelectionCheckbox, 5203 { 5204 item, 5205 selection, 5206 onChangeSelection, 5207 getItemId, 5208 titleField, 5209 disabled: false, 5210 "aria-hidden": true, 5211 tabIndex: -1 5212 } 5213 ) }) 5214 } 5215 ), 5216 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("td", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5217 column_primary_default, 5218 { 5219 item, 5220 titleField: showTitle ? titleField : void 0, 5221 mediaField: showMedia ? mediaField : void 0, 5222 descriptionField: showDescription ? descriptionField2 : void 0, 5223 isItemClickable: () => false 5224 } 5225 ) }), 5226 columns.map((column) => { 5227 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 5228 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5229 "td", 5230 { 5231 style: { 5232 width, 5233 maxWidth, 5234 minWidth 5235 }, 5236 role: "presentation", 5237 children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5238 TableColumnField2, 5239 { 5240 fields, 5241 item, 5242 column, 5243 align 5244 } 5245 ) 5246 }, 5247 column 5248 ); 5249 }) 5250 ] 5251 }, 5252 id 5253 ); 5254 } 5255 function ViewPickerTable({ 5256 actions, 5257 data, 5258 fields, 5259 getItemId, 5260 isLoading = false, 5261 onChangeView, 5262 onChangeSelection, 5263 selection, 5264 setOpenedFilter, 5265 view, 5266 className, 5267 empty 5268 }) { 5269 const headerMenuRefs = (0, import_element19.useRef)(/* @__PURE__ */ new Map()); 5270 const headerMenuToFocusRef = (0, import_element19.useRef)(); 5271 const [nextHeaderMenuToFocus, setNextHeaderMenuToFocus] = (0, import_element19.useState)(); 5272 const isMultiselect = useIsMultiselectPicker(actions) ?? false; 5273 (0, import_element19.useEffect)(() => { 5274 if (headerMenuToFocusRef.current) { 5275 headerMenuToFocusRef.current.focus(); 5276 headerMenuToFocusRef.current = void 0; 5277 } 5278 }); 5279 const tableNoticeId = (0, import_element19.useId)(); 5280 if (nextHeaderMenuToFocus) { 5281 headerMenuToFocusRef.current = nextHeaderMenuToFocus; 5282 setNextHeaderMenuToFocus(void 0); 5283 return; 5284 } 5285 const onHide = (field) => { 5286 const hidden = headerMenuRefs.current.get(field.id); 5287 const fallback = hidden ? headerMenuRefs.current.get(hidden.fallback) : void 0; 5288 setNextHeaderMenuToFocus(fallback?.node); 5289 }; 5290 const hasData = !!data?.length; 5291 const titleField = fields.find((field) => field.id === view.titleField); 5292 const mediaField = fields.find((field) => field.id === view.mediaField); 5293 const descriptionField2 = fields.find( 5294 (field) => field.id === view.descriptionField 5295 ); 5296 const groupField = view.groupBy?.field ? fields.find((f2) => f2.id === view.groupBy?.field) : null; 5297 const dataByGroup = groupField ? getDataByGroup(data, groupField) : null; 5298 const { showTitle = true, showMedia = true, showDescription = true } = view; 5299 const hasPrimaryColumn = titleField && showTitle || mediaField && showMedia || descriptionField2 && showDescription; 5300 const columns = view.fields ?? []; 5301 const headerMenuRef = (column, index) => (node) => { 5302 if (node) { 5303 headerMenuRefs.current.set(column, { 5304 node, 5305 fallback: columns[index > 0 ? index - 1 : 1] 5306 }); 5307 } else { 5308 headerMenuRefs.current.delete(column); 5309 } 5310 }; 5311 const isInfiniteScroll = view.infiniteScrollEnabled && !dataByGroup; 5312 return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [ 5313 /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)( 5314 "table", 5315 { 5316 className: clsx_default( 5317 "dataviews-view-table", 5318 "dataviews-view-picker-table", 5319 className, 5320 { 5321 [`has-$view.layout?.density}-density`]: view.layout?.density && ["compact", "comfortable"].includes( 5322 view.layout.density 5323 ) 5324 } 5325 ), 5326 "aria-busy": isLoading, 5327 "aria-describedby": tableNoticeId, 5328 role: isInfiniteScroll ? "feed" : "listbox", 5329 children: [ 5330 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("thead", { role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)( 5331 "tr", 5332 { 5333 className: "dataviews-view-table__row", 5334 role: "presentation", 5335 children: [ 5336 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("th", { className: "dataviews-view-table__checkbox-column", children: isMultiselect && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5337 BulkSelectionCheckbox, 5338 { 5339 selection, 5340 onChangeSelection, 5341 data, 5342 actions, 5343 getItemId 5344 } 5345 ) }), 5346 hasPrimaryColumn && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("th", { children: titleField && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5347 column_header_menu_default, 5348 { 5349 ref: headerMenuRef( 5350 titleField.id, 5351 0 5352 ), 5353 fieldId: titleField.id, 5354 view, 5355 fields, 5356 onChangeView, 5357 onHide, 5358 setOpenedFilter, 5359 canMove: false 5360 } 5361 ) }), 5362 columns.map((column, index) => { 5363 const { width, maxWidth, minWidth, align } = view.layout?.styles?.[column] ?? {}; 5364 return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5365 "th", 5366 { 5367 style: { 5368 width, 5369 maxWidth, 5370 minWidth, 5371 textAlign: align 5372 }, 5373 "aria-sort": view.sort?.direction && view.sort?.field === column ? sortValues[view.sort.direction] : void 0, 5374 scope: "col", 5375 children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5376 column_header_menu_default, 5377 { 5378 ref: headerMenuRef(column, index), 5379 fieldId: column, 5380 view, 5381 fields, 5382 onChangeView, 5383 onHide, 5384 setOpenedFilter, 5385 canMove: view.layout?.enableMoving ?? true 5386 } 5387 ) 5388 }, 5389 column 5390 ); 5391 }) 5392 ] 5393 } 5394 ) }), 5395 hasData && groupField && dataByGroup ? Array.from(dataByGroup.entries()).map( 5396 ([groupName, groupItems]) => /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)( 5397 import_components18.Composite, 5398 { 5399 virtualFocus: true, 5400 orientation: "vertical", 5401 render: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("tbody", { role: "group" }), 5402 children: [ 5403 /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5404 "tr", 5405 { 5406 className: "dataviews-view-table__group-header-row", 5407 role: "presentation", 5408 children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5409 "td", 5410 { 5411 colSpan: columns.length + (hasPrimaryColumn ? 1 : 0) + 1, 5412 className: "dataviews-view-table__group-header-cell", 5413 role: "presentation", 5414 children: (0, import_i18n23.sprintf)( 5415 // translators: 1: The label of the field e.g. "Date". 2: The value of the field, e.g.: "May 2022". 5416 (0, import_i18n23.__)("%1$s: %2$s"), 5417 groupField.label, 5418 groupName 5419 ) 5420 } 5421 ) 5422 } 5423 ), 5424 groupItems.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5425 TableRow2, 5426 { 5427 item, 5428 fields, 5429 id: getItemId(item) || index.toString(), 5430 view, 5431 titleField, 5432 mediaField, 5433 descriptionField: descriptionField2, 5434 selection, 5435 getItemId, 5436 onChangeSelection, 5437 multiselect: isMultiselect 5438 }, 5439 getItemId(item) 5440 )) 5441 ] 5442 }, 5443 `group-$groupName}` 5444 ) 5445 ) : /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5446 import_components18.Composite, 5447 { 5448 render: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("tbody", { role: "presentation" }), 5449 virtualFocus: true, 5450 orientation: "vertical", 5451 children: hasData && data.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)( 5452 TableRow2, 5453 { 5454 item, 5455 fields, 5456 id: getItemId(item) || index.toString(), 5457 view, 5458 titleField, 5459 mediaField, 5460 descriptionField: descriptionField2, 5461 selection, 5462 getItemId, 5463 onChangeSelection, 5464 multiselect: isMultiselect, 5465 posinset: index + 1 5466 }, 5467 getItemId(item) 5468 )) 5469 } 5470 ) 5471 ] 5472 } 5473 ), 5474 /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)( 5475 "div", 5476 { 5477 className: clsx_default({ 5478 "dataviews-loading": isLoading, 5479 "dataviews-no-results": !hasData && !isLoading 5480 }), 5481 id: tableNoticeId, 5482 children: [ 5483 !hasData && (isLoading ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("p", { children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_components18.Spinner, {}) }) : empty), 5484 hasData && isLoading && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("p", { className: "dataviews-loading-more", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_components18.Spinner, {}) }) 5485 ] 5486 } 5487 ) 5488 ] }); 5489 } 5490 var picker_table_default = ViewPickerTable; 5491 5492 // packages/dataviews/build-module/dataviews-layouts/utils/preview-size-picker.js 5493 var import_components19 = __toESM(require_components()); 5494 var import_i18n24 = __toESM(require_i18n()); 5495 var import_element20 = __toESM(require_element()); 5496 var import_jsx_runtime49 = __toESM(require_jsx_runtime()); 5497 var imageSizes2 = [ 5498 { 5499 value: 120, 5500 breakpoint: 1 5501 }, 5502 { 5503 value: 170, 5504 breakpoint: 1 5505 }, 5506 { 5507 value: 230, 5508 breakpoint: 1 5509 }, 5510 { 5511 value: 290, 5512 breakpoint: 1112 5513 // at minimum image width, 4 images display at this container size 5514 }, 5515 { 5516 value: 350, 5517 breakpoint: 1636 5518 // at minimum image width, 6 images display at this container size 5519 }, 5520 { 5521 value: 430, 5522 breakpoint: 588 5523 // at minimum image width, 2 images display at this container size 5524 } 5525 ]; 5526 function PreviewSizePicker() { 5527 const context = (0, import_element20.useContext)(dataviews_context_default); 5528 const view = context.view; 5529 const breakValues = imageSizes2.filter((size) => { 5530 return context.containerWidth >= size.breakpoint; 5531 }); 5532 const layoutPreviewSize = view.layout?.previewSize ?? 230; 5533 const previewSizeToUse = breakValues.map((size, index) => ({ ...size, index })).filter((size) => size.value <= layoutPreviewSize).sort((a2, b2) => b2.value - a2.value)[0]?.index ?? 0; 5534 const marks = breakValues.map((size, index) => { 5535 return { 5536 value: index 5537 }; 5538 }); 5539 return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)( 5540 import_components19.RangeControl, 5541 { 5542 __next40pxDefaultSize: true, 5543 showTooltip: false, 5544 label: (0, import_i18n24.__)("Preview size"), 5545 value: previewSizeToUse, 5546 min: 0, 5547 max: breakValues.length - 1, 5548 withInputField: false, 5549 onChange: (value = 0) => { 5550 context.onChangeView({ 5551 ...view, 5552 layout: { 5553 ...view.layout, 5554 previewSize: breakValues[value].value 5555 } 5556 }); 5557 }, 5558 step: 1, 5559 marks 5560 } 5561 ); 5562 } 5563 5564 // packages/dataviews/build-module/dataviews-layouts/table/density-picker.js 5565 var import_components20 = __toESM(require_components()); 5566 var import_i18n25 = __toESM(require_i18n()); 5567 var import_element21 = __toESM(require_element()); 5568 var import_jsx_runtime50 = __toESM(require_jsx_runtime()); 5569 function DensityPicker() { 5570 const context = (0, import_element21.useContext)(dataviews_context_default); 5571 const view = context.view; 5572 return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)( 5573 import_components20.__experimentalToggleGroupControl, 5574 { 5575 size: "__unstable-large", 5576 label: (0, import_i18n25.__)("Density"), 5577 value: view.layout?.density || "balanced", 5578 onChange: (value) => { 5579 context.onChangeView({ 5580 ...view, 5581 layout: { 5582 ...view.layout, 5583 density: value 5584 } 5585 }); 5586 }, 5587 isBlock: true, 5588 children: [ 5589 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)( 5590 import_components20.__experimentalToggleGroupControlOption, 5591 { 5592 value: "comfortable", 5593 label: (0, import_i18n25._x)( 5594 "Comfortable", 5595 "Density option for DataView layout" 5596 ) 5597 }, 5598 "comfortable" 5599 ), 5600 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)( 5601 import_components20.__experimentalToggleGroupControlOption, 5602 { 5603 value: "balanced", 5604 label: (0, import_i18n25._x)("Balanced", "Density option for DataView layout") 5605 }, 5606 "balanced" 5607 ), 5608 /* @__PURE__ */ (0, import_jsx_runtime50.jsx)( 5609 import_components20.__experimentalToggleGroupControlOption, 5610 { 5611 value: "compact", 5612 label: (0, import_i18n25._x)("Compact", "Density option for DataView layout") 5613 }, 5614 "compact" 5615 ) 5616 ] 5617 } 5618 ); 5619 } 5620 5621 // packages/dataviews/build-module/dataviews-layouts/index.js 5622 var VIEW_LAYOUTS = [ 5623 { 5624 type: LAYOUT_TABLE, 5625 label: (0, import_i18n26.__)("Table"), 5626 component: table_default, 5627 icon: block_table_default, 5628 viewConfigOptions: DensityPicker 5629 }, 5630 { 5631 type: LAYOUT_GRID, 5632 label: (0, import_i18n26.__)("Grid"), 5633 component: grid_default, 5634 icon: category_default, 5635 viewConfigOptions: PreviewSizePicker 5636 }, 5637 { 5638 type: LAYOUT_LIST, 5639 label: (0, import_i18n26.__)("List"), 5640 component: ViewList, 5641 icon: (0, import_i18n26.isRTL)() ? format_list_bullets_rtl_default : format_list_bullets_default 5642 }, 5643 { 5644 type: LAYOUT_ACTIVITY, 5645 label: (0, import_i18n26.__)("Activity"), 5646 component: ViewActivity, 5647 icon: scheduled_default, 5648 viewConfigOptions: DensityPicker 5649 }, 5650 { 5651 type: LAYOUT_PICKER_GRID, 5652 label: (0, import_i18n26.__)("Grid"), 5653 component: picker_grid_default, 5654 icon: category_default, 5655 viewConfigOptions: PreviewSizePicker, 5656 isPicker: true 5657 }, 5658 { 5659 type: LAYOUT_PICKER_TABLE, 5660 label: (0, import_i18n26.__)("Table"), 5661 component: picker_table_default, 5662 icon: block_table_default, 5663 viewConfigOptions: DensityPicker, 5664 isPicker: true 5665 } 5666 ]; 5667 5668 // packages/dataviews/build-module/components/dataviews-filters/filters.js 5669 var import_element29 = __toESM(require_element()); 5670 var import_components26 = __toESM(require_components()); 5671 5672 // packages/dataviews/build-module/components/dataviews-filters/filter.js 5673 var import_components23 = __toESM(require_components()); 5674 var import_i18n29 = __toESM(require_i18n()); 5675 var import_element26 = __toESM(require_element()); 5676 5677 // node_modules/@ariakit/react-core/esm/__chunks/3YLGPPWQ.js 5678 var __defProp2 = Object.defineProperty; 5679 var __defProps = Object.defineProperties; 5680 var __getOwnPropDescs = Object.getOwnPropertyDescriptors; 5681 var __getOwnPropSymbols = Object.getOwnPropertySymbols; 5682 var __hasOwnProp2 = Object.prototype.hasOwnProperty; 5683 var __propIsEnum = Object.prototype.propertyIsEnumerable; 5684 var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 5685 var __spreadValues = (a2, b2) => { 5686 for (var prop in b2 || (b2 = {})) 5687 if (__hasOwnProp2.call(b2, prop)) 5688 __defNormalProp(a2, prop, b2[prop]); 5689 if (__getOwnPropSymbols) 5690 for (var prop of __getOwnPropSymbols(b2)) { 5691 if (__propIsEnum.call(b2, prop)) 5692 __defNormalProp(a2, prop, b2[prop]); 5693 } 5694 return a2; 5695 }; 5696 var __spreadProps = (a2, b2) => __defProps(a2, __getOwnPropDescs(b2)); 5697 var __objRest = (source, exclude) => { 5698 var target = {}; 5699 for (var prop in source) 5700 if (__hasOwnProp2.call(source, prop) && exclude.indexOf(prop) < 0) 5701 target[prop] = source[prop]; 5702 if (source != null && __getOwnPropSymbols) 5703 for (var prop of __getOwnPropSymbols(source)) { 5704 if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) 5705 target[prop] = source[prop]; 5706 } 5707 return target; 5708 }; 5709 5710 // node_modules/@ariakit/core/esm/__chunks/3YLGPPWQ.js 5711 var __defProp3 = Object.defineProperty; 5712 var __defProps2 = Object.defineProperties; 5713 var __getOwnPropDescs2 = Object.getOwnPropertyDescriptors; 5714 var __getOwnPropSymbols2 = Object.getOwnPropertySymbols; 5715 var __hasOwnProp3 = Object.prototype.hasOwnProperty; 5716 var __propIsEnum2 = Object.prototype.propertyIsEnumerable; 5717 var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; 5718 var __spreadValues2 = (a2, b2) => { 5719 for (var prop in b2 || (b2 = {})) 5720 if (__hasOwnProp3.call(b2, prop)) 5721 __defNormalProp2(a2, prop, b2[prop]); 5722 if (__getOwnPropSymbols2) 5723 for (var prop of __getOwnPropSymbols2(b2)) { 5724 if (__propIsEnum2.call(b2, prop)) 5725 __defNormalProp2(a2, prop, b2[prop]); 5726 } 5727 return a2; 5728 }; 5729 var __spreadProps2 = (a2, b2) => __defProps2(a2, __getOwnPropDescs2(b2)); 5730 var __objRest2 = (source, exclude) => { 5731 var target = {}; 5732 for (var prop in source) 5733 if (__hasOwnProp3.call(source, prop) && exclude.indexOf(prop) < 0) 5734 target[prop] = source[prop]; 5735 if (source != null && __getOwnPropSymbols2) 5736 for (var prop of __getOwnPropSymbols2(source)) { 5737 if (exclude.indexOf(prop) < 0 && __propIsEnum2.call(source, prop)) 5738 target[prop] = source[prop]; 5739 } 5740 return target; 5741 }; 5742 5743 // node_modules/@ariakit/core/esm/__chunks/PBFD2E7P.js 5744 function noop2(..._) { 5745 } 5746 function applyState(argument, currentValue) { 5747 if (isUpdater(argument)) { 5748 const value = isLazyValue(currentValue) ? currentValue() : currentValue; 5749 return argument(value); 5750 } 5751 return argument; 5752 } 5753 function isUpdater(argument) { 5754 return typeof argument === "function"; 5755 } 5756 function isLazyValue(value) { 5757 return typeof value === "function"; 5758 } 5759 function hasOwnProperty(object, prop) { 5760 if (typeof Object.hasOwn === "function") { 5761 return Object.hasOwn(object, prop); 5762 } 5763 return Object.prototype.hasOwnProperty.call(object, prop); 5764 } 5765 function chain(...fns) { 5766 return (...args) => { 5767 for (const fn of fns) { 5768 if (typeof fn === "function") { 5769 fn(...args); 5770 } 5771 } 5772 }; 5773 } 5774 function normalizeString(str) { 5775 return str.normalize("NFD").replace(/[\u0300-\u036f]/g, ""); 5776 } 5777 function omit(object, keys) { 5778 const result = __spreadValues2({}, object); 5779 for (const key of keys) { 5780 if (hasOwnProperty(result, key)) { 5781 delete result[key]; 5782 } 5783 } 5784 return result; 5785 } 5786 function pick(object, paths) { 5787 const result = {}; 5788 for (const key of paths) { 5789 if (hasOwnProperty(object, key)) { 5790 result[key] = object[key]; 5791 } 5792 } 5793 return result; 5794 } 5795 function identity(value) { 5796 return value; 5797 } 5798 function invariant(condition, message2) { 5799 if (condition) return; 5800 if (typeof message2 !== "string") throw new Error("Invariant failed"); 5801 throw new Error(message2); 5802 } 5803 function getKeys(obj) { 5804 return Object.keys(obj); 5805 } 5806 function isFalsyBooleanCallback(booleanOrCallback, ...args) { 5807 const result = typeof booleanOrCallback === "function" ? booleanOrCallback(...args) : booleanOrCallback; 5808 if (result == null) return false; 5809 return !result; 5810 } 5811 function disabledFromProps(props) { 5812 return props.disabled || props["aria-disabled"] === true || props["aria-disabled"] === "true"; 5813 } 5814 function removeUndefinedValues(obj) { 5815 const result = {}; 5816 for (const key in obj) { 5817 if (obj[key] !== void 0) { 5818 result[key] = obj[key]; 5819 } 5820 } 5821 return result; 5822 } 5823 function defaultValue(...values) { 5824 for (const value of values) { 5825 if (value !== void 0) return value; 5826 } 5827 return void 0; 5828 } 5829 5830 // node_modules/@ariakit/react-core/esm/__chunks/SK3NAZA3.js 5831 var import_react2 = __toESM(require_react(), 1); 5832 function setRef(ref, value) { 5833 if (typeof ref === "function") { 5834 ref(value); 5835 } else if (ref) { 5836 ref.current = value; 5837 } 5838 } 5839 function isValidElementWithRef(element) { 5840 if (!element) return false; 5841 if (!(0, import_react2.isValidElement)(element)) return false; 5842 if ("ref" in element.props) return true; 5843 if ("ref" in element) return true; 5844 return false; 5845 } 5846 function getRefProperty(element) { 5847 if (!isValidElementWithRef(element)) return null; 5848 const props = __spreadValues({}, element.props); 5849 return props.ref || element.ref; 5850 } 5851 function mergeProps(base, overrides) { 5852 const props = __spreadValues({}, base); 5853 for (const key in overrides) { 5854 if (!hasOwnProperty(overrides, key)) continue; 5855 if (key === "className") { 5856 const prop = "className"; 5857 props[prop] = base[prop] ? `$base[prop]} $overrides[prop]}` : overrides[prop]; 5858 continue; 5859 } 5860 if (key === "style") { 5861 const prop = "style"; 5862 props[prop] = base[prop] ? __spreadValues(__spreadValues({}, base[prop]), overrides[prop]) : overrides[prop]; 5863 continue; 5864 } 5865 const overrideValue = overrides[key]; 5866 if (typeof overrideValue === "function" && key.startsWith("on")) { 5867 const baseValue = base[key]; 5868 if (typeof baseValue === "function") { 5869 props[key] = (...args) => { 5870 overrideValue(...args); 5871 baseValue(...args); 5872 }; 5873 continue; 5874 } 5875 } 5876 props[key] = overrideValue; 5877 } 5878 return props; 5879 } 5880 5881 // node_modules/@ariakit/core/esm/__chunks/DTR5TSDJ.js 5882 var canUseDOM = checkIsBrowser(); 5883 function checkIsBrowser() { 5884 var _a; 5885 return typeof window !== "undefined" && !!((_a = window.document) == null ? void 0 : _a.createElement); 5886 } 5887 function getDocument(node) { 5888 if (!node) return document; 5889 if ("self" in node) return node.document; 5890 return node.ownerDocument || document; 5891 } 5892 function getActiveElement(node, activeDescendant = false) { 5893 const { activeElement } = getDocument(node); 5894 if (!(activeElement == null ? void 0 : activeElement.nodeName)) { 5895 return null; 5896 } 5897 if (isFrame(activeElement) && activeElement.contentDocument) { 5898 return getActiveElement( 5899 activeElement.contentDocument.body, 5900 activeDescendant 5901 ); 5902 } 5903 if (activeDescendant) { 5904 const id = activeElement.getAttribute("aria-activedescendant"); 5905 if (id) { 5906 const element = getDocument(activeElement).getElementById(id); 5907 if (element) { 5908 return element; 5909 } 5910 } 5911 } 5912 return activeElement; 5913 } 5914 function contains(parent, child) { 5915 return parent === child || parent.contains(child); 5916 } 5917 function isFrame(element) { 5918 return element.tagName === "IFRAME"; 5919 } 5920 function isButton(element) { 5921 const tagName = element.tagName.toLowerCase(); 5922 if (tagName === "button") return true; 5923 if (tagName === "input" && element.type) { 5924 return buttonInputTypes.indexOf(element.type) !== -1; 5925 } 5926 return false; 5927 } 5928 var buttonInputTypes = [ 5929 "button", 5930 "color", 5931 "file", 5932 "image", 5933 "reset", 5934 "submit" 5935 ]; 5936 function isVisible(element) { 5937 if (typeof element.checkVisibility === "function") { 5938 return element.checkVisibility(); 5939 } 5940 const htmlElement = element; 5941 return htmlElement.offsetWidth > 0 || htmlElement.offsetHeight > 0 || element.getClientRects().length > 0; 5942 } 5943 function isTextField(element) { 5944 try { 5945 const isTextInput = element instanceof HTMLInputElement && element.selectionStart !== null; 5946 const isTextArea = element.tagName === "TEXTAREA"; 5947 return isTextInput || isTextArea || false; 5948 } catch (error) { 5949 return false; 5950 } 5951 } 5952 function isTextbox(element) { 5953 return element.isContentEditable || isTextField(element); 5954 } 5955 function getTextboxValue(element) { 5956 if (isTextField(element)) { 5957 return element.value; 5958 } 5959 if (element.isContentEditable) { 5960 const range = getDocument(element).createRange(); 5961 range.selectNodeContents(element); 5962 return range.toString(); 5963 } 5964 return ""; 5965 } 5966 function getTextboxSelection(element) { 5967 let start = 0; 5968 let end = 0; 5969 if (isTextField(element)) { 5970 start = element.selectionStart || 0; 5971 end = element.selectionEnd || 0; 5972 } else if (element.isContentEditable) { 5973 const selection = getDocument(element).getSelection(); 5974 if ((selection == null ? void 0 : selection.rangeCount) && selection.anchorNode && contains(element, selection.anchorNode) && selection.focusNode && contains(element, selection.focusNode)) { 5975 const range = selection.getRangeAt(0); 5976 const nextRange = range.cloneRange(); 5977 nextRange.selectNodeContents(element); 5978 nextRange.setEnd(range.startContainer, range.startOffset); 5979 start = nextRange.toString().length; 5980 nextRange.setEnd(range.endContainer, range.endOffset); 5981 end = nextRange.toString().length; 5982 } 5983 } 5984 return { start, end }; 5985 } 5986 function getPopupRole(element, fallback) { 5987 const allowedPopupRoles = ["dialog", "menu", "listbox", "tree", "grid"]; 5988 const role = element == null ? void 0 : element.getAttribute("role"); 5989 if (role && allowedPopupRoles.indexOf(role) !== -1) { 5990 return role; 5991 } 5992 return fallback; 5993 } 5994 function getScrollingElement(element) { 5995 if (!element) return null; 5996 const isScrollableOverflow = (overflow) => { 5997 if (overflow === "auto") return true; 5998 if (overflow === "scroll") return true; 5999 return false; 6000 }; 6001 if (element.clientHeight && element.scrollHeight > element.clientHeight) { 6002 const { overflowY } = getComputedStyle(element); 6003 if (isScrollableOverflow(overflowY)) return element; 6004 } else if (element.clientWidth && element.scrollWidth > element.clientWidth) { 6005 const { overflowX } = getComputedStyle(element); 6006 if (isScrollableOverflow(overflowX)) return element; 6007 } 6008 return getScrollingElement(element.parentElement) || document.scrollingElement || document.body; 6009 } 6010 function setSelectionRange(element, ...args) { 6011 if (/text|search|password|tel|url/i.test(element.type)) { 6012 element.setSelectionRange(...args); 6013 } 6014 } 6015 function sortBasedOnDOMPosition(items, getElement) { 6016 const pairs = items.map((item, index) => [index, item]); 6017 let isOrderDifferent = false; 6018 pairs.sort(([indexA, a2], [indexB, b2]) => { 6019 const elementA = getElement(a2); 6020 const elementB = getElement(b2); 6021 if (elementA === elementB) return 0; 6022 if (!elementA || !elementB) return 0; 6023 if (isElementPreceding(elementA, elementB)) { 6024 if (indexA > indexB) { 6025 isOrderDifferent = true; 6026 } 6027 return -1; 6028 } 6029 if (indexA < indexB) { 6030 isOrderDifferent = true; 6031 } 6032 return 1; 6033 }); 6034 if (isOrderDifferent) { 6035 return pairs.map(([_, item]) => item); 6036 } 6037 return items; 6038 } 6039 function isElementPreceding(a2, b2) { 6040 return Boolean( 6041 b2.compareDocumentPosition(a2) & Node.DOCUMENT_POSITION_PRECEDING 6042 ); 6043 } 6044 6045 // node_modules/@ariakit/core/esm/__chunks/QAGXQEUG.js 6046 function isTouchDevice() { 6047 return canUseDOM && !!navigator.maxTouchPoints; 6048 } 6049 function isApple() { 6050 if (!canUseDOM) return false; 6051 return /mac|iphone|ipad|ipod/i.test(navigator.platform); 6052 } 6053 function isSafari() { 6054 return canUseDOM && isApple() && /apple/i.test(navigator.vendor); 6055 } 6056 function isFirefox() { 6057 return canUseDOM && /firefox\//i.test(navigator.userAgent); 6058 } 6059 6060 // node_modules/@ariakit/core/esm/utils/events.js 6061 function isPortalEvent(event) { 6062 return Boolean( 6063 event.currentTarget && !contains(event.currentTarget, event.target) 6064 ); 6065 } 6066 function isSelfTarget(event) { 6067 return event.target === event.currentTarget; 6068 } 6069 function isOpeningInNewTab(event) { 6070 const element = event.currentTarget; 6071 if (!element) return false; 6072 const isAppleDevice = isApple(); 6073 if (isAppleDevice && !event.metaKey) return false; 6074 if (!isAppleDevice && !event.ctrlKey) return false; 6075 const tagName = element.tagName.toLowerCase(); 6076 if (tagName === "a") return true; 6077 if (tagName === "button" && element.type === "submit") return true; 6078 if (tagName === "input" && element.type === "submit") return true; 6079 return false; 6080 } 6081 function isDownloading(event) { 6082 const element = event.currentTarget; 6083 if (!element) return false; 6084 const tagName = element.tagName.toLowerCase(); 6085 if (!event.altKey) return false; 6086 if (tagName === "a") return true; 6087 if (tagName === "button" && element.type === "submit") return true; 6088 if (tagName === "input" && element.type === "submit") return true; 6089 return false; 6090 } 6091 function fireBlurEvent(element, eventInit) { 6092 const event = new FocusEvent("blur", eventInit); 6093 const defaultAllowed = element.dispatchEvent(event); 6094 const bubbleInit = __spreadProps2(__spreadValues2({}, eventInit), { bubbles: true }); 6095 element.dispatchEvent(new FocusEvent("focusout", bubbleInit)); 6096 return defaultAllowed; 6097 } 6098 function fireKeyboardEvent(element, type, eventInit) { 6099 const event = new KeyboardEvent(type, eventInit); 6100 return element.dispatchEvent(event); 6101 } 6102 function fireClickEvent(element, eventInit) { 6103 const event = new MouseEvent("click", eventInit); 6104 return element.dispatchEvent(event); 6105 } 6106 function isFocusEventOutside(event, container) { 6107 const containerElement = container || event.currentTarget; 6108 const relatedTarget = event.relatedTarget; 6109 return !relatedTarget || !contains(containerElement, relatedTarget); 6110 } 6111 function queueBeforeEvent(element, type, callback, timeout) { 6112 const createTimer = (callback2) => { 6113 if (timeout) { 6114 const timerId2 = setTimeout(callback2, timeout); 6115 return () => clearTimeout(timerId2); 6116 } 6117 const timerId = requestAnimationFrame(callback2); 6118 return () => cancelAnimationFrame(timerId); 6119 }; 6120 const cancelTimer = createTimer(() => { 6121 element.removeEventListener(type, callSync, true); 6122 callback(); 6123 }); 6124 const callSync = () => { 6125 cancelTimer(); 6126 callback(); 6127 }; 6128 element.addEventListener(type, callSync, { once: true, capture: true }); 6129 return cancelTimer; 6130 } 6131 function addGlobalEventListener(type, listener, options, scope = window) { 6132 const children = []; 6133 try { 6134 scope.document.addEventListener(type, listener, options); 6135 for (const frame of Array.from(scope.frames)) { 6136 children.push(addGlobalEventListener(type, listener, options, frame)); 6137 } 6138 } catch (e2) { 6139 } 6140 const removeEventListener = () => { 6141 try { 6142 scope.document.removeEventListener(type, listener, options); 6143 } catch (e2) { 6144 } 6145 for (const remove of children) { 6146 remove(); 6147 } 6148 }; 6149 return removeEventListener; 6150 } 6151 6152 // node_modules/@ariakit/react-core/esm/__chunks/ABQUS43J.js 6153 var import_react3 = __toESM(require_react(), 1); 6154 var React = __toESM(require_react(), 1); 6155 var _React = __spreadValues({}, React); 6156 var useReactId = _React.useId; 6157 var useReactDeferredValue = _React.useDeferredValue; 6158 var useReactInsertionEffect = _React.useInsertionEffect; 6159 var useSafeLayoutEffect = canUseDOM ? import_react3.useLayoutEffect : import_react3.useEffect; 6160 function useInitialValue(value) { 6161 const [initialValue] = (0, import_react3.useState)(value); 6162 return initialValue; 6163 } 6164 function useLiveRef(value) { 6165 const ref = (0, import_react3.useRef)(value); 6166 useSafeLayoutEffect(() => { 6167 ref.current = value; 6168 }); 6169 return ref; 6170 } 6171 function useEvent(callback) { 6172 const ref = (0, import_react3.useRef)(() => { 6173 throw new Error("Cannot call an event handler while rendering."); 6174 }); 6175 if (useReactInsertionEffect) { 6176 useReactInsertionEffect(() => { 6177 ref.current = callback; 6178 }); 6179 } else { 6180 ref.current = callback; 6181 } 6182 return (0, import_react3.useCallback)((...args) => { 6183 var _a; 6184 return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args); 6185 }, []); 6186 } 6187 function useTransactionState(callback) { 6188 const [state, setState] = (0, import_react3.useState)(null); 6189 useSafeLayoutEffect(() => { 6190 if (state == null) return; 6191 if (!callback) return; 6192 let prevState = null; 6193 callback((prev) => { 6194 prevState = prev; 6195 return state; 6196 }); 6197 return () => { 6198 callback(prevState); 6199 }; 6200 }, [state, callback]); 6201 return [state, setState]; 6202 } 6203 function useMergeRefs(...refs) { 6204 return (0, import_react3.useMemo)(() => { 6205 if (!refs.some(Boolean)) return; 6206 return (value) => { 6207 for (const ref of refs) { 6208 setRef(ref, value); 6209 } 6210 }; 6211 }, refs); 6212 } 6213 function useId3(defaultId) { 6214 if (useReactId) { 6215 const reactId = useReactId(); 6216 if (defaultId) return defaultId; 6217 return reactId; 6218 } 6219 const [id, setId] = (0, import_react3.useState)(defaultId); 6220 useSafeLayoutEffect(() => { 6221 if (defaultId || id) return; 6222 const random = Math.random().toString(36).slice(2, 8); 6223 setId(`id-$random}`); 6224 }, [defaultId, id]); 6225 return defaultId || id; 6226 } 6227 function useTagName(refOrElement, type) { 6228 const stringOrUndefined = (type2) => { 6229 if (typeof type2 !== "string") return; 6230 return type2; 6231 }; 6232 const [tagName, setTagName] = (0, import_react3.useState)(() => stringOrUndefined(type)); 6233 useSafeLayoutEffect(() => { 6234 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement; 6235 setTagName((element == null ? void 0 : element.tagName.toLowerCase()) || stringOrUndefined(type)); 6236 }, [refOrElement, type]); 6237 return tagName; 6238 } 6239 function useAttribute(refOrElement, attributeName, defaultValue2) { 6240 const initialValue = useInitialValue(defaultValue2); 6241 const [attribute, setAttribute] = (0, import_react3.useState)(initialValue); 6242 (0, import_react3.useEffect)(() => { 6243 const element = refOrElement && "current" in refOrElement ? refOrElement.current : refOrElement; 6244 if (!element) return; 6245 const callback = () => { 6246 const value = element.getAttribute(attributeName); 6247 setAttribute(value == null ? initialValue : value); 6248 }; 6249 const observer = new MutationObserver(callback); 6250 observer.observe(element, { attributeFilter: [attributeName] }); 6251 callback(); 6252 return () => observer.disconnect(); 6253 }, [refOrElement, attributeName, initialValue]); 6254 return attribute; 6255 } 6256 function useUpdateEffect(effect, deps) { 6257 const mounted = (0, import_react3.useRef)(false); 6258 (0, import_react3.useEffect)(() => { 6259 if (mounted.current) { 6260 return effect(); 6261 } 6262 mounted.current = true; 6263 }, deps); 6264 (0, import_react3.useEffect)( 6265 () => () => { 6266 mounted.current = false; 6267 }, 6268 [] 6269 ); 6270 } 6271 function useUpdateLayoutEffect(effect, deps) { 6272 const mounted = (0, import_react3.useRef)(false); 6273 useSafeLayoutEffect(() => { 6274 if (mounted.current) { 6275 return effect(); 6276 } 6277 mounted.current = true; 6278 }, deps); 6279 useSafeLayoutEffect( 6280 () => () => { 6281 mounted.current = false; 6282 }, 6283 [] 6284 ); 6285 } 6286 function useForceUpdate() { 6287 return (0, import_react3.useReducer)(() => [], []); 6288 } 6289 function useBooleanEvent(booleanOrCallback) { 6290 return useEvent( 6291 typeof booleanOrCallback === "function" ? booleanOrCallback : () => booleanOrCallback 6292 ); 6293 } 6294 function useWrapElement(props, callback, deps = []) { 6295 const wrapElement = (0, import_react3.useCallback)( 6296 (element) => { 6297 if (props.wrapElement) { 6298 element = props.wrapElement(element); 6299 } 6300 return callback(element); 6301 }, 6302 [...deps, props.wrapElement] 6303 ); 6304 return __spreadProps(__spreadValues({}, props), { wrapElement }); 6305 } 6306 function useMetadataProps(props, key, value) { 6307 const parent = props.onLoadedMetadataCapture; 6308 const onLoadedMetadataCapture = (0, import_react3.useMemo)(() => { 6309 return Object.assign(() => { 6310 }, __spreadProps(__spreadValues({}, parent), { [key]: value })); 6311 }, [parent, key, value]); 6312 return [parent == null ? void 0 : parent[key], { onLoadedMetadataCapture }]; 6313 } 6314 function useIsMouseMoving() { 6315 (0, import_react3.useEffect)(() => { 6316 addGlobalEventListener("mousemove", setMouseMoving, true); 6317 addGlobalEventListener("mousedown", resetMouseMoving, true); 6318 addGlobalEventListener("mouseup", resetMouseMoving, true); 6319 addGlobalEventListener("keydown", resetMouseMoving, true); 6320 addGlobalEventListener("scroll", resetMouseMoving, true); 6321 }, []); 6322 const isMouseMoving = useEvent(() => mouseMoving); 6323 return isMouseMoving; 6324 } 6325 var mouseMoving = false; 6326 var previousScreenX = 0; 6327 var previousScreenY = 0; 6328 function hasMouseMovement(event) { 6329 const movementX = event.movementX || event.screenX - previousScreenX; 6330 const movementY = event.movementY || event.screenY - previousScreenY; 6331 previousScreenX = event.screenX; 6332 previousScreenY = event.screenY; 6333 return movementX || movementY || false; 6334 } 6335 function setMouseMoving(event) { 6336 if (!hasMouseMovement(event)) return; 6337 mouseMoving = true; 6338 } 6339 function resetMouseMoving() { 6340 mouseMoving = false; 6341 } 6342 6343 // node_modules/@ariakit/react-core/esm/__chunks/LMDWO4NN.js 6344 var React2 = __toESM(require_react(), 1); 6345 var import_jsx_runtime51 = __toESM(require_jsx_runtime(), 1); 6346 function forwardRef22(render4) { 6347 const Role = React2.forwardRef((props, ref) => render4(__spreadProps(__spreadValues({}, props), { ref }))); 6348 Role.displayName = render4.displayName || render4.name; 6349 return Role; 6350 } 6351 function memo22(Component2, propsAreEqual) { 6352 return React2.memo(Component2, propsAreEqual); 6353 } 6354 function createElement2(Type, props) { 6355 const _a = props, { wrapElement, render: render4 } = _a, rest = __objRest(_a, ["wrapElement", "render"]); 6356 const mergedRef = useMergeRefs(props.ref, getRefProperty(render4)); 6357 let element; 6358 if (React2.isValidElement(render4)) { 6359 const renderProps = __spreadProps(__spreadValues({}, render4.props), { ref: mergedRef }); 6360 element = React2.cloneElement(render4, mergeProps(rest, renderProps)); 6361 } else if (render4) { 6362 element = render4(rest); 6363 } else { 6364 element = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Type, __spreadValues({}, rest)); 6365 } 6366 if (wrapElement) { 6367 return wrapElement(element); 6368 } 6369 return element; 6370 } 6371 function createHook(useProps) { 6372 const useRole = (props = {}) => { 6373 return useProps(props); 6374 }; 6375 useRole.displayName = useProps.name; 6376 return useRole; 6377 } 6378 function createStoreContext(providers = [], scopedProviders = []) { 6379 const context = React2.createContext(void 0); 6380 const scopedContext = React2.createContext(void 0); 6381 const useContext27 = () => React2.useContext(context); 6382 const useScopedContext = (onlyScoped = false) => { 6383 const scoped = React2.useContext(scopedContext); 6384 const store = useContext27(); 6385 if (onlyScoped) return scoped; 6386 return scoped || store; 6387 }; 6388 const useProviderContext = () => { 6389 const scoped = React2.useContext(scopedContext); 6390 const store = useContext27(); 6391 if (scoped && scoped === store) return; 6392 return store; 6393 }; 6394 const ContextProvider = (props) => { 6395 return providers.reduceRight( 6396 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Provider, __spreadProps(__spreadValues({}, props), { children })), 6397 /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(context.Provider, __spreadValues({}, props)) 6398 ); 6399 }; 6400 const ScopedContextProvider = (props) => { 6401 return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(ContextProvider, __spreadProps(__spreadValues({}, props), { children: scopedProviders.reduceRight( 6402 (children, Provider) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Provider, __spreadProps(__spreadValues({}, props), { children })), 6403 /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(scopedContext.Provider, __spreadValues({}, props)) 6404 ) })); 6405 }; 6406 return { 6407 context, 6408 scopedContext, 6409 useContext: useContext27, 6410 useScopedContext, 6411 useProviderContext, 6412 ContextProvider, 6413 ScopedContextProvider 6414 }; 6415 } 6416 6417 // node_modules/@ariakit/react-core/esm/__chunks/VDHZ5F7K.js 6418 var ctx = createStoreContext(); 6419 var useCollectionContext = ctx.useContext; 6420 var useCollectionScopedContext = ctx.useScopedContext; 6421 var useCollectionProviderContext = ctx.useProviderContext; 6422 var CollectionContextProvider = ctx.ContextProvider; 6423 var CollectionScopedContextProvider = ctx.ScopedContextProvider; 6424 6425 // node_modules/@ariakit/react-core/esm/__chunks/P7GR5CS5.js 6426 var import_react4 = __toESM(require_react(), 1); 6427 var ctx2 = createStoreContext( 6428 [CollectionContextProvider], 6429 [CollectionScopedContextProvider] 6430 ); 6431 var useCompositeContext = ctx2.useContext; 6432 var useCompositeScopedContext = ctx2.useScopedContext; 6433 var useCompositeProviderContext = ctx2.useProviderContext; 6434 var CompositeContextProvider = ctx2.ContextProvider; 6435 var CompositeScopedContextProvider = ctx2.ScopedContextProvider; 6436 var CompositeItemContext = (0, import_react4.createContext)( 6437 void 0 6438 ); 6439 var CompositeRowContext = (0, import_react4.createContext)( 6440 void 0 6441 ); 6442 6443 // node_modules/@ariakit/react-core/esm/__chunks/3XAVFTCA.js 6444 var import_react5 = __toESM(require_react(), 1); 6445 var TagValueContext = (0, import_react5.createContext)(null); 6446 var TagRemoveIdContext = (0, import_react5.createContext)( 6447 null 6448 ); 6449 var ctx3 = createStoreContext( 6450 [CompositeContextProvider], 6451 [CompositeScopedContextProvider] 6452 ); 6453 var useTagContext = ctx3.useContext; 6454 var useTagScopedContext = ctx3.useScopedContext; 6455 var useTagProviderContext = ctx3.useProviderContext; 6456 var TagContextProvider = ctx3.ContextProvider; 6457 var TagScopedContextProvider = ctx3.ScopedContextProvider; 6458 6459 // node_modules/@ariakit/core/esm/__chunks/BCALMBPZ.js 6460 function getInternal(store, key) { 6461 const internals = store.__unstableInternals; 6462 invariant(internals, "Invalid store"); 6463 return internals[key]; 6464 } 6465 function createStore(initialState, ...stores) { 6466 let state = initialState; 6467 let prevStateBatch = state; 6468 let lastUpdate = Symbol(); 6469 let destroy = noop2; 6470 const instances = /* @__PURE__ */ new Set(); 6471 const updatedKeys = /* @__PURE__ */ new Set(); 6472 const setups = /* @__PURE__ */ new Set(); 6473 const listeners = /* @__PURE__ */ new Set(); 6474 const batchListeners = /* @__PURE__ */ new Set(); 6475 const disposables = /* @__PURE__ */ new WeakMap(); 6476 const listenerKeys = /* @__PURE__ */ new WeakMap(); 6477 const storeSetup = (callback) => { 6478 setups.add(callback); 6479 return () => setups.delete(callback); 6480 }; 6481 const storeInit = () => { 6482 const initialized = instances.size; 6483 const instance = Symbol(); 6484 instances.add(instance); 6485 const maybeDestroy = () => { 6486 instances.delete(instance); 6487 if (instances.size) return; 6488 destroy(); 6489 }; 6490 if (initialized) return maybeDestroy; 6491 const desyncs = getKeys(state).map( 6492 (key) => chain( 6493 ...stores.map((store) => { 6494 var _a; 6495 const storeState = (_a = store == null ? void 0 : store.getState) == null ? void 0 : _a.call(store); 6496 if (!storeState) return; 6497 if (!hasOwnProperty(storeState, key)) return; 6498 return sync(store, [key], (state2) => { 6499 setState( 6500 key, 6501 state2[key], 6502 // @ts-expect-error - Not public API. This is just to prevent 6503 // infinite loops. 6504 true 6505 ); 6506 }); 6507 }) 6508 ) 6509 ); 6510 const teardowns = []; 6511 for (const setup2 of setups) { 6512 teardowns.push(setup2()); 6513 } 6514 const cleanups = stores.map(init); 6515 destroy = chain(...desyncs, ...teardowns, ...cleanups); 6516 return maybeDestroy; 6517 }; 6518 const sub = (keys, listener, set = listeners) => { 6519 set.add(listener); 6520 listenerKeys.set(listener, keys); 6521 return () => { 6522 var _a; 6523 (_a = disposables.get(listener)) == null ? void 0 : _a(); 6524 disposables.delete(listener); 6525 listenerKeys.delete(listener); 6526 set.delete(listener); 6527 }; 6528 }; 6529 const storeSubscribe = (keys, listener) => sub(keys, listener); 6530 const storeSync = (keys, listener) => { 6531 disposables.set(listener, listener(state, state)); 6532 return sub(keys, listener); 6533 }; 6534 const storeBatch = (keys, listener) => { 6535 disposables.set(listener, listener(state, prevStateBatch)); 6536 return sub(keys, listener, batchListeners); 6537 }; 6538 const storePick = (keys) => createStore(pick(state, keys), finalStore); 6539 const storeOmit = (keys) => createStore(omit(state, keys), finalStore); 6540 const getState = () => state; 6541 const setState = (key, value, fromStores = false) => { 6542 var _a; 6543 if (!hasOwnProperty(state, key)) return; 6544 const nextValue = applyState(value, state[key]); 6545 if (nextValue === state[key]) return; 6546 if (!fromStores) { 6547 for (const store of stores) { 6548 (_a = store == null ? void 0 : store.setState) == null ? void 0 : _a.call(store, key, nextValue); 6549 } 6550 } 6551 const prevState = state; 6552 state = __spreadProps2(__spreadValues2({}, state), { [key]: nextValue }); 6553 const thisUpdate = Symbol(); 6554 lastUpdate = thisUpdate; 6555 updatedKeys.add(key); 6556 const run = (listener, prev, uKeys) => { 6557 var _a2; 6558 const keys = listenerKeys.get(listener); 6559 const updated = (k) => uKeys ? uKeys.has(k) : k === key; 6560 if (!keys || keys.some(updated)) { 6561 (_a2 = disposables.get(listener)) == null ? void 0 : _a2(); 6562 disposables.set(listener, listener(state, prev)); 6563 } 6564 }; 6565 for (const listener of listeners) { 6566 run(listener, prevState); 6567 } 6568 queueMicrotask(() => { 6569 if (lastUpdate !== thisUpdate) return; 6570 const snapshot = state; 6571 for (const listener of batchListeners) { 6572 run(listener, prevStateBatch, updatedKeys); 6573 } 6574 prevStateBatch = snapshot; 6575 updatedKeys.clear(); 6576 }); 6577 }; 6578 const finalStore = { 6579 getState, 6580 setState, 6581 __unstableInternals: { 6582 setup: storeSetup, 6583 init: storeInit, 6584 subscribe: storeSubscribe, 6585 sync: storeSync, 6586 batch: storeBatch, 6587 pick: storePick, 6588 omit: storeOmit 6589 } 6590 }; 6591 return finalStore; 6592 } 6593 function setup(store, ...args) { 6594 if (!store) return; 6595 return getInternal(store, "setup")(...args); 6596 } 6597 function init(store, ...args) { 6598 if (!store) return; 6599 return getInternal(store, "init")(...args); 6600 } 6601 function subscribe(store, ...args) { 6602 if (!store) return; 6603 return getInternal(store, "subscribe")(...args); 6604 } 6605 function sync(store, ...args) { 6606 if (!store) return; 6607 return getInternal(store, "sync")(...args); 6608 } 6609 function batch(store, ...args) { 6610 if (!store) return; 6611 return getInternal(store, "batch")(...args); 6612 } 6613 function omit2(store, ...args) { 6614 if (!store) return; 6615 return getInternal(store, "omit")(...args); 6616 } 6617 function pick2(store, ...args) { 6618 if (!store) return; 6619 return getInternal(store, "pick")(...args); 6620 } 6621 function mergeStore(...stores) { 6622 const initialState = stores.reduce((state, store2) => { 6623 var _a; 6624 const nextState = (_a = store2 == null ? void 0 : store2.getState) == null ? void 0 : _a.call(store2); 6625 if (!nextState) return state; 6626 return Object.assign(state, nextState); 6627 }, {}); 6628 const store = createStore(initialState, ...stores); 6629 return Object.assign({}, ...stores, store); 6630 } 6631 function throwOnConflictingProps(props, store) { 6632 if (false) return; 6633 if (!store) return; 6634 const defaultKeys = Object.entries(props).filter(([key, value]) => key.startsWith("default") && value !== void 0).map(([key]) => { 6635 var _a; 6636 const stateKey = key.replace("default", ""); 6637 return `${((_a = stateKey[0]) == null ? void 0 : _a.toLowerCase()) || ""}$stateKey.slice(1)}`; 6638 }); 6639 if (!defaultKeys.length) return; 6640 const storeState = store.getState(); 6641 const conflictingProps = defaultKeys.filter( 6642 (key) => hasOwnProperty(storeState, key) 6643 ); 6644 if (!conflictingProps.length) return; 6645 throw new Error( 6646 `Passing a store prop in conjunction with a default state is not supported. 6647 6648 const store = useSelectStore(); 6649 <SelectProvider store={store} defaultValue="Apple" /> 6650 ^ ^ 6651 6652 Instead, pass the default state to the topmost store: 6653 6654 const store = useSelectStore({ defaultValue: "Apple" }); 6655 <SelectProvider store={store} /> 6656 6657 See https://github.com/ariakit/ariakit/pull/2745 for more details. 6658 6659 If there's a particular need for this, please submit a feature request at https://github.com/ariakit/ariakit 6660 ` 6661 ); 6662 } 6663 6664 // node_modules/@ariakit/react-core/esm/__chunks/YV4JVR4I.js 6665 var React3 = __toESM(require_react(), 1); 6666 var import_shim = __toESM(require_shim(), 1); 6667 var { useSyncExternalStore } = import_shim.default; 6668 var noopSubscribe = () => () => { 6669 }; 6670 function useStoreState(store, keyOrSelector = identity) { 6671 const storeSubscribe = React3.useCallback( 6672 (callback) => { 6673 if (!store) return noopSubscribe(); 6674 return subscribe(store, null, callback); 6675 }, 6676 [store] 6677 ); 6678 const getSnapshot = () => { 6679 const key = typeof keyOrSelector === "string" ? keyOrSelector : null; 6680 const selector2 = typeof keyOrSelector === "function" ? keyOrSelector : null; 6681 const state = store == null ? void 0 : store.getState(); 6682 if (selector2) return selector2(state); 6683 if (!state) return; 6684 if (!key) return; 6685 if (!hasOwnProperty(state, key)) return; 6686 return state[key]; 6687 }; 6688 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot); 6689 } 6690 function useStoreStateObject(store, object) { 6691 const objRef = React3.useRef( 6692 {} 6693 ); 6694 const storeSubscribe = React3.useCallback( 6695 (callback) => { 6696 if (!store) return noopSubscribe(); 6697 return subscribe(store, null, callback); 6698 }, 6699 [store] 6700 ); 6701 const getSnapshot = () => { 6702 const state = store == null ? void 0 : store.getState(); 6703 let updated = false; 6704 const obj = objRef.current; 6705 for (const prop in object) { 6706 const keyOrSelector = object[prop]; 6707 if (typeof keyOrSelector === "function") { 6708 const value = keyOrSelector(state); 6709 if (value !== obj[prop]) { 6710 obj[prop] = value; 6711 updated = true; 6712 } 6713 } 6714 if (typeof keyOrSelector === "string") { 6715 if (!state) continue; 6716 if (!hasOwnProperty(state, keyOrSelector)) continue; 6717 const value = state[keyOrSelector]; 6718 if (value !== obj[prop]) { 6719 obj[prop] = value; 6720 updated = true; 6721 } 6722 } 6723 } 6724 if (updated) { 6725 objRef.current = __spreadValues({}, obj); 6726 } 6727 return objRef.current; 6728 }; 6729 return useSyncExternalStore(storeSubscribe, getSnapshot, getSnapshot); 6730 } 6731 function useStoreProps(store, props, key, setKey) { 6732 const value = hasOwnProperty(props, key) ? props[key] : void 0; 6733 const setValue = setKey ? props[setKey] : void 0; 6734 const propsRef = useLiveRef({ value, setValue }); 6735 useSafeLayoutEffect(() => { 6736 return sync(store, [key], (state, prev) => { 6737 const { value: value2, setValue: setValue2 } = propsRef.current; 6738 if (!setValue2) return; 6739 if (state[key] === prev[key]) return; 6740 if (state[key] === value2) return; 6741 setValue2(state[key]); 6742 }); 6743 }, [store, key]); 6744 useSafeLayoutEffect(() => { 6745 if (value === void 0) return; 6746 store.setState(key, value); 6747 return batch(store, [key], () => { 6748 if (value === void 0) return; 6749 store.setState(key, value); 6750 }); 6751 }); 6752 } 6753 function useStore(createStore2, props) { 6754 const [store, setStore] = React3.useState(() => createStore2(props)); 6755 useSafeLayoutEffect(() => init(store), [store]); 6756 const useState24 = React3.useCallback( 6757 (keyOrSelector) => useStoreState(store, keyOrSelector), 6758 [store] 6759 ); 6760 const memoizedStore = React3.useMemo( 6761 () => __spreadProps(__spreadValues({}, store), { useState: useState24 }), 6762 [store, useState24] 6763 ); 6764 const updateStore = useEvent(() => { 6765 setStore((store2) => createStore2(__spreadValues(__spreadValues({}, props), store2.getState()))); 6766 }); 6767 return [memoizedStore, updateStore]; 6768 } 6769 6770 // node_modules/@ariakit/core/esm/__chunks/CYQWQL4J.js 6771 function getCommonParent(items) { 6772 var _a; 6773 const firstItem = items.find((item) => !!item.element); 6774 const lastItem = [...items].reverse().find((item) => !!item.element); 6775 let parentElement = (_a = firstItem == null ? void 0 : firstItem.element) == null ? void 0 : _a.parentElement; 6776 while (parentElement && (lastItem == null ? void 0 : lastItem.element)) { 6777 const parent = parentElement; 6778 if (lastItem && parent.contains(lastItem.element)) { 6779 return parentElement; 6780 } 6781 parentElement = parentElement.parentElement; 6782 } 6783 return getDocument(parentElement).body; 6784 } 6785 function getPrivateStore(store) { 6786 return store == null ? void 0 : store.__unstablePrivateStore; 6787 } 6788 function createCollectionStore(props = {}) { 6789 var _a; 6790 throwOnConflictingProps(props, props.store); 6791 const syncState = (_a = props.store) == null ? void 0 : _a.getState(); 6792 const items = defaultValue( 6793 props.items, 6794 syncState == null ? void 0 : syncState.items, 6795 props.defaultItems, 6796 [] 6797 ); 6798 const itemsMap = new Map(items.map((item) => [item.id, item])); 6799 const initialState = { 6800 items, 6801 renderedItems: defaultValue(syncState == null ? void 0 : syncState.renderedItems, []) 6802 }; 6803 const syncPrivateStore = getPrivateStore(props.store); 6804 const privateStore = createStore( 6805 { items, renderedItems: initialState.renderedItems }, 6806 syncPrivateStore 6807 ); 6808 const collection = createStore(initialState, props.store); 6809 const sortItems = (renderedItems) => { 6810 const sortedItems = sortBasedOnDOMPosition(renderedItems, (i2) => i2.element); 6811 privateStore.setState("renderedItems", sortedItems); 6812 collection.setState("renderedItems", sortedItems); 6813 }; 6814 setup(collection, () => init(privateStore)); 6815 setup(privateStore, () => { 6816 return batch(privateStore, ["items"], (state) => { 6817 collection.setState("items", state.items); 6818 }); 6819 }); 6820 setup(privateStore, () => { 6821 return batch(privateStore, ["renderedItems"], (state) => { 6822 let firstRun = true; 6823 let raf = requestAnimationFrame(() => { 6824 const { renderedItems } = collection.getState(); 6825 if (state.renderedItems === renderedItems) return; 6826 sortItems(state.renderedItems); 6827 }); 6828 if (typeof IntersectionObserver !== "function") { 6829 return () => cancelAnimationFrame(raf); 6830 } 6831 const ioCallback = () => { 6832 if (firstRun) { 6833 firstRun = false; 6834 return; 6835 } 6836 cancelAnimationFrame(raf); 6837 raf = requestAnimationFrame(() => sortItems(state.renderedItems)); 6838 }; 6839 const root = getCommonParent(state.renderedItems); 6840 const observer = new IntersectionObserver(ioCallback, { root }); 6841 for (const item of state.renderedItems) { 6842 if (!item.element) continue; 6843 observer.observe(item.element); 6844 } 6845 return () => { 6846 cancelAnimationFrame(raf); 6847 observer.disconnect(); 6848 }; 6849 }); 6850 }); 6851 const mergeItem = (item, setItems, canDeleteFromMap = false) => { 6852 let prevItem; 6853 setItems((items2) => { 6854 const index = items2.findIndex(({ id }) => id === item.id); 6855 const nextItems = items2.slice(); 6856 if (index !== -1) { 6857 prevItem = items2[index]; 6858 const nextItem = __spreadValues2(__spreadValues2({}, prevItem), item); 6859 nextItems[index] = nextItem; 6860 itemsMap.set(item.id, nextItem); 6861 } else { 6862 nextItems.push(item); 6863 itemsMap.set(item.id, item); 6864 } 6865 return nextItems; 6866 }); 6867 const unmergeItem = () => { 6868 setItems((items2) => { 6869 if (!prevItem) { 6870 if (canDeleteFromMap) { 6871 itemsMap.delete(item.id); 6872 } 6873 return items2.filter(({ id }) => id !== item.id); 6874 } 6875 const index = items2.findIndex(({ id }) => id === item.id); 6876 if (index === -1) return items2; 6877 const nextItems = items2.slice(); 6878 nextItems[index] = prevItem; 6879 itemsMap.set(item.id, prevItem); 6880 return nextItems; 6881 }); 6882 }; 6883 return unmergeItem; 6884 }; 6885 const registerItem = (item) => mergeItem( 6886 item, 6887 (getItems) => privateStore.setState("items", getItems), 6888 true 6889 ); 6890 return __spreadProps2(__spreadValues2({}, collection), { 6891 registerItem, 6892 renderItem: (item) => chain( 6893 registerItem(item), 6894 mergeItem( 6895 item, 6896 (getItems) => privateStore.setState("renderedItems", getItems) 6897 ) 6898 ), 6899 item: (id) => { 6900 if (!id) return null; 6901 let item = itemsMap.get(id); 6902 if (!item) { 6903 const { items: items2 } = privateStore.getState(); 6904 item = items2.find((item2) => item2.id === id); 6905 if (item) { 6906 itemsMap.set(id, item); 6907 } 6908 } 6909 return item || null; 6910 }, 6911 // @ts-expect-error Internal 6912 __unstablePrivateStore: privateStore 6913 }); 6914 } 6915 6916 // node_modules/@ariakit/react-core/esm/__chunks/C3IKGW5T.js 6917 function useCollectionStoreProps(store, update, props) { 6918 useUpdateEffect(update, [props.store]); 6919 useStoreProps(store, props, "items", "setItems"); 6920 return store; 6921 } 6922 6923 // node_modules/@ariakit/core/esm/__chunks/7PRQYBBV.js 6924 function toArray(arg) { 6925 if (Array.isArray(arg)) { 6926 return arg; 6927 } 6928 return typeof arg !== "undefined" ? [arg] : []; 6929 } 6930 function flatten2DArray(array) { 6931 const flattened = []; 6932 for (const row of array) { 6933 flattened.push(...row); 6934 } 6935 return flattened; 6936 } 6937 function reverseArray(array) { 6938 return array.slice().reverse(); 6939 } 6940 6941 // node_modules/@ariakit/core/esm/__chunks/AJZ4BYF3.js 6942 var NULL_ITEM = { id: null }; 6943 function findFirstEnabledItem(items, excludeId) { 6944 return items.find((item) => { 6945 if (excludeId) { 6946 return !item.disabled && item.id !== excludeId; 6947 } 6948 return !item.disabled; 6949 }); 6950 } 6951 function getEnabledItems(items, excludeId) { 6952 return items.filter((item) => { 6953 if (excludeId) { 6954 return !item.disabled && item.id !== excludeId; 6955 } 6956 return !item.disabled; 6957 }); 6958 } 6959 function getItemsInRow(items, rowId) { 6960 return items.filter((item) => item.rowId === rowId); 6961 } 6962 function flipItems(items, activeId, shouldInsertNullItem = false) { 6963 const index = items.findIndex((item) => item.id === activeId); 6964 return [ 6965 ...items.slice(index + 1), 6966 ...shouldInsertNullItem ? [NULL_ITEM] : [], 6967 ...items.slice(0, index) 6968 ]; 6969 } 6970 function groupItemsByRows(items) { 6971 const rows = []; 6972 for (const item of items) { 6973 const row = rows.find((currentRow) => { 6974 var _a; 6975 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId; 6976 }); 6977 if (row) { 6978 row.push(item); 6979 } else { 6980 rows.push([item]); 6981 } 6982 } 6983 return rows; 6984 } 6985 function getMaxRowLength(array) { 6986 let maxLength = 0; 6987 for (const { length } of array) { 6988 if (length > maxLength) { 6989 maxLength = length; 6990 } 6991 } 6992 return maxLength; 6993 } 6994 function createEmptyItem(rowId) { 6995 return { 6996 id: "__EMPTY_ITEM__", 6997 disabled: true, 6998 rowId 6999 }; 7000 } 7001 function normalizeRows(rows, activeId, focusShift) { 7002 const maxLength = getMaxRowLength(rows); 7003 for (const row of rows) { 7004 for (let i2 = 0; i2 < maxLength; i2 += 1) { 7005 const item = row[i2]; 7006 if (!item || focusShift && item.disabled) { 7007 const isFirst = i2 === 0; 7008 const previousItem = isFirst && focusShift ? findFirstEnabledItem(row) : row[i2 - 1]; 7009 row[i2] = previousItem && activeId !== previousItem.id && focusShift ? previousItem : createEmptyItem(previousItem == null ? void 0 : previousItem.rowId); 7010 } 7011 } 7012 } 7013 return rows; 7014 } 7015 function verticalizeItems(items) { 7016 const rows = groupItemsByRows(items); 7017 const maxLength = getMaxRowLength(rows); 7018 const verticalized = []; 7019 for (let i2 = 0; i2 < maxLength; i2 += 1) { 7020 for (const row of rows) { 7021 const item = row[i2]; 7022 if (item) { 7023 verticalized.push(__spreadProps2(__spreadValues2({}, item), { 7024 // If there's no rowId, it means that it's not a grid composite, but 7025 // a single row instead. So, instead of verticalizing it, that is, 7026 // assigning a different rowId based on the column index, we keep it 7027 // undefined so they will be part of the same row. This is useful 7028 // when using up/down on one-dimensional composites. 7029 rowId: item.rowId ? `$i2}` : void 0 7030 })); 7031 } 7032 } 7033 } 7034 return verticalized; 7035 } 7036 function createCompositeStore(props = {}) { 7037 var _a; 7038 const syncState = (_a = props.store) == null ? void 0 : _a.getState(); 7039 const collection = createCollectionStore(props); 7040 const activeId = defaultValue( 7041 props.activeId, 7042 syncState == null ? void 0 : syncState.activeId, 7043 props.defaultActiveId 7044 ); 7045 const initialState = __spreadProps2(__spreadValues2({}, collection.getState()), { 7046 id: defaultValue( 7047 props.id, 7048 syncState == null ? void 0 : syncState.id, 7049 `id-$Math.random().toString(36).slice(2, 8)}` 7050 ), 7051 activeId, 7052 baseElement: defaultValue(syncState == null ? void 0 : syncState.baseElement, null), 7053 includesBaseElement: defaultValue( 7054 props.includesBaseElement, 7055 syncState == null ? void 0 : syncState.includesBaseElement, 7056 activeId === null 7057 ), 7058 moves: defaultValue(syncState == null ? void 0 : syncState.moves, 0), 7059 orientation: defaultValue( 7060 props.orientation, 7061 syncState == null ? void 0 : syncState.orientation, 7062 "both" 7063 ), 7064 rtl: defaultValue(props.rtl, syncState == null ? void 0 : syncState.rtl, false), 7065 virtualFocus: defaultValue( 7066 props.virtualFocus, 7067 syncState == null ? void 0 : syncState.virtualFocus, 7068 false 7069 ), 7070 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, false), 7071 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, false), 7072 focusShift: defaultValue(props.focusShift, syncState == null ? void 0 : syncState.focusShift, false) 7073 }); 7074 const composite = createStore(initialState, collection, props.store); 7075 setup( 7076 composite, 7077 () => sync(composite, ["renderedItems", "activeId"], (state) => { 7078 composite.setState("activeId", (activeId2) => { 7079 var _a2; 7080 if (activeId2 !== void 0) return activeId2; 7081 return (_a2 = findFirstEnabledItem(state.renderedItems)) == null ? void 0 : _a2.id; 7082 }); 7083 }) 7084 ); 7085 const getNextId = (direction = "next", options = {}) => { 7086 var _a2, _b; 7087 const defaultState = composite.getState(); 7088 const { 7089 skip = 0, 7090 activeId: activeId2 = defaultState.activeId, 7091 focusShift = defaultState.focusShift, 7092 focusLoop = defaultState.focusLoop, 7093 focusWrap = defaultState.focusWrap, 7094 includesBaseElement = defaultState.includesBaseElement, 7095 renderedItems = defaultState.renderedItems, 7096 rtl = defaultState.rtl 7097 } = options; 7098 const isVerticalDirection = direction === "up" || direction === "down"; 7099 const isNextDirection = direction === "next" || direction === "down"; 7100 const canReverse = isNextDirection ? rtl && !isVerticalDirection : !rtl || isVerticalDirection; 7101 const canShift = focusShift && !skip; 7102 let items = !isVerticalDirection ? renderedItems : flatten2DArray( 7103 normalizeRows(groupItemsByRows(renderedItems), activeId2, canShift) 7104 ); 7105 items = canReverse ? reverseArray(items) : items; 7106 items = isVerticalDirection ? verticalizeItems(items) : items; 7107 if (activeId2 == null) { 7108 return (_a2 = findFirstEnabledItem(items)) == null ? void 0 : _a2.id; 7109 } 7110 const activeItem = items.find((item) => item.id === activeId2); 7111 if (!activeItem) { 7112 return (_b = findFirstEnabledItem(items)) == null ? void 0 : _b.id; 7113 } 7114 const isGrid2 = items.some((item) => item.rowId); 7115 const activeIndex = items.indexOf(activeItem); 7116 const nextItems = items.slice(activeIndex + 1); 7117 const nextItemsInRow = getItemsInRow(nextItems, activeItem.rowId); 7118 if (skip) { 7119 const nextEnabledItemsInRow = getEnabledItems(nextItemsInRow, activeId2); 7120 const nextItem2 = nextEnabledItemsInRow.slice(skip)[0] || // If we can't find an item, just return the last one. 7121 nextEnabledItemsInRow[nextEnabledItemsInRow.length - 1]; 7122 return nextItem2 == null ? void 0 : nextItem2.id; 7123 } 7124 const canLoop = focusLoop && (isVerticalDirection ? focusLoop !== "horizontal" : focusLoop !== "vertical"); 7125 const canWrap = isGrid2 && focusWrap && (isVerticalDirection ? focusWrap !== "horizontal" : focusWrap !== "vertical"); 7126 const hasNullItem = isNextDirection ? (!isGrid2 || isVerticalDirection) && canLoop && includesBaseElement : isVerticalDirection ? includesBaseElement : false; 7127 if (canLoop) { 7128 const loopItems = canWrap && !hasNullItem ? items : getItemsInRow(items, activeItem.rowId); 7129 const sortedItems = flipItems(loopItems, activeId2, hasNullItem); 7130 const nextItem2 = findFirstEnabledItem(sortedItems, activeId2); 7131 return nextItem2 == null ? void 0 : nextItem2.id; 7132 } 7133 if (canWrap) { 7134 const nextItem2 = findFirstEnabledItem( 7135 // We can use nextItems, which contains all the next items, including 7136 // items from other rows, to wrap between rows. However, if there is a 7137 // null item (the composite container), we'll only use the next items in 7138 // the row. So moving next from the last item will focus on the 7139 // composite container. On grid composites, horizontal navigation never 7140 // focuses on the composite container, only vertical. 7141 hasNullItem ? nextItemsInRow : nextItems, 7142 activeId2 7143 ); 7144 const nextId = hasNullItem ? (nextItem2 == null ? void 0 : nextItem2.id) || null : nextItem2 == null ? void 0 : nextItem2.id; 7145 return nextId; 7146 } 7147 const nextItem = findFirstEnabledItem(nextItemsInRow, activeId2); 7148 if (!nextItem && hasNullItem) { 7149 return null; 7150 } 7151 return nextItem == null ? void 0 : nextItem.id; 7152 }; 7153 return __spreadProps2(__spreadValues2(__spreadValues2({}, collection), composite), { 7154 setBaseElement: (element) => composite.setState("baseElement", element), 7155 setActiveId: (id) => composite.setState("activeId", id), 7156 move: (id) => { 7157 if (id === void 0) return; 7158 composite.setState("activeId", id); 7159 composite.setState("moves", (moves) => moves + 1); 7160 }, 7161 first: () => { 7162 var _a2; 7163 return (_a2 = findFirstEnabledItem(composite.getState().renderedItems)) == null ? void 0 : _a2.id; 7164 }, 7165 last: () => { 7166 var _a2; 7167 return (_a2 = findFirstEnabledItem(reverseArray(composite.getState().renderedItems))) == null ? void 0 : _a2.id; 7168 }, 7169 next: (options) => { 7170 if (options !== void 0 && typeof options === "number") { 7171 options = { skip: options }; 7172 } 7173 return getNextId("next", options); 7174 }, 7175 previous: (options) => { 7176 if (options !== void 0 && typeof options === "number") { 7177 options = { skip: options }; 7178 } 7179 return getNextId("previous", options); 7180 }, 7181 down: (options) => { 7182 if (options !== void 0 && typeof options === "number") { 7183 options = { skip: options }; 7184 } 7185 return getNextId("down", options); 7186 }, 7187 up: (options) => { 7188 if (options !== void 0 && typeof options === "number") { 7189 options = { skip: options }; 7190 } 7191 return getNextId("up", options); 7192 } 7193 }); 7194 } 7195 7196 // node_modules/@ariakit/react-core/esm/__chunks/4CMBR7SL.js 7197 function useCompositeStoreOptions(props) { 7198 const id = useId3(props.id); 7199 return __spreadValues({ id }, props); 7200 } 7201 function useCompositeStoreProps(store, update, props) { 7202 store = useCollectionStoreProps(store, update, props); 7203 useStoreProps(store, props, "activeId", "setActiveId"); 7204 useStoreProps(store, props, "includesBaseElement"); 7205 useStoreProps(store, props, "virtualFocus"); 7206 useStoreProps(store, props, "orientation"); 7207 useStoreProps(store, props, "rtl"); 7208 useStoreProps(store, props, "focusLoop"); 7209 useStoreProps(store, props, "focusWrap"); 7210 useStoreProps(store, props, "focusShift"); 7211 return store; 7212 } 7213 7214 // node_modules/@ariakit/core/esm/__chunks/RCQ5P4YE.js 7215 function createDisclosureStore(props = {}) { 7216 const store = mergeStore( 7217 props.store, 7218 omit2(props.disclosure, ["contentElement", "disclosureElement"]) 7219 ); 7220 throwOnConflictingProps(props, store); 7221 const syncState = store == null ? void 0 : store.getState(); 7222 const open = defaultValue( 7223 props.open, 7224 syncState == null ? void 0 : syncState.open, 7225 props.defaultOpen, 7226 false 7227 ); 7228 const animated = defaultValue(props.animated, syncState == null ? void 0 : syncState.animated, false); 7229 const initialState = { 7230 open, 7231 animated, 7232 animating: !!animated && open, 7233 mounted: open, 7234 contentElement: defaultValue(syncState == null ? void 0 : syncState.contentElement, null), 7235 disclosureElement: defaultValue(syncState == null ? void 0 : syncState.disclosureElement, null) 7236 }; 7237 const disclosure = createStore(initialState, store); 7238 setup( 7239 disclosure, 7240 () => sync(disclosure, ["animated", "animating"], (state) => { 7241 if (state.animated) return; 7242 disclosure.setState("animating", false); 7243 }) 7244 ); 7245 setup( 7246 disclosure, 7247 () => subscribe(disclosure, ["open"], () => { 7248 if (!disclosure.getState().animated) return; 7249 disclosure.setState("animating", true); 7250 }) 7251 ); 7252 setup( 7253 disclosure, 7254 () => sync(disclosure, ["open", "animating"], (state) => { 7255 disclosure.setState("mounted", state.open || state.animating); 7256 }) 7257 ); 7258 return __spreadProps2(__spreadValues2({}, disclosure), { 7259 disclosure: props.disclosure, 7260 setOpen: (value) => disclosure.setState("open", value), 7261 show: () => disclosure.setState("open", true), 7262 hide: () => disclosure.setState("open", false), 7263 toggle: () => disclosure.setState("open", (open2) => !open2), 7264 stopAnimation: () => disclosure.setState("animating", false), 7265 setContentElement: (value) => disclosure.setState("contentElement", value), 7266 setDisclosureElement: (value) => disclosure.setState("disclosureElement", value) 7267 }); 7268 } 7269 7270 // node_modules/@ariakit/react-core/esm/__chunks/WYCIER3C.js 7271 function useDisclosureStoreProps(store, update, props) { 7272 useUpdateEffect(update, [props.store, props.disclosure]); 7273 useStoreProps(store, props, "open", "setOpen"); 7274 useStoreProps(store, props, "mounted", "setMounted"); 7275 useStoreProps(store, props, "animated"); 7276 return Object.assign(store, { disclosure: props.disclosure }); 7277 } 7278 7279 // node_modules/@ariakit/core/esm/__chunks/FZZ2AVHF.js 7280 function createDialogStore(props = {}) { 7281 return createDisclosureStore(props); 7282 } 7283 7284 // node_modules/@ariakit/react-core/esm/__chunks/BM6PGYQY.js 7285 function useDialogStoreProps(store, update, props) { 7286 return useDisclosureStoreProps(store, update, props); 7287 } 7288 7289 // node_modules/@ariakit/core/esm/__chunks/ME2CUF3F.js 7290 function createPopoverStore(_a = {}) { 7291 var _b = _a, { 7292 popover: otherPopover 7293 } = _b, props = __objRest2(_b, [ 7294 "popover" 7295 ]); 7296 const store = mergeStore( 7297 props.store, 7298 omit2(otherPopover, [ 7299 "arrowElement", 7300 "anchorElement", 7301 "contentElement", 7302 "popoverElement", 7303 "disclosureElement" 7304 ]) 7305 ); 7306 throwOnConflictingProps(props, store); 7307 const syncState = store == null ? void 0 : store.getState(); 7308 const dialog = createDialogStore(__spreadProps2(__spreadValues2({}, props), { store })); 7309 const placement = defaultValue( 7310 props.placement, 7311 syncState == null ? void 0 : syncState.placement, 7312 "bottom" 7313 ); 7314 const initialState = __spreadProps2(__spreadValues2({}, dialog.getState()), { 7315 placement, 7316 currentPlacement: placement, 7317 anchorElement: defaultValue(syncState == null ? void 0 : syncState.anchorElement, null), 7318 popoverElement: defaultValue(syncState == null ? void 0 : syncState.popoverElement, null), 7319 arrowElement: defaultValue(syncState == null ? void 0 : syncState.arrowElement, null), 7320 rendered: Symbol("rendered") 7321 }); 7322 const popover = createStore(initialState, dialog, store); 7323 return __spreadProps2(__spreadValues2(__spreadValues2({}, dialog), popover), { 7324 setAnchorElement: (element) => popover.setState("anchorElement", element), 7325 setPopoverElement: (element) => popover.setState("popoverElement", element), 7326 setArrowElement: (element) => popover.setState("arrowElement", element), 7327 render: () => popover.setState("rendered", Symbol("rendered")) 7328 }); 7329 } 7330 7331 // node_modules/@ariakit/react-core/esm/__chunks/O2PQ2652.js 7332 function usePopoverStoreProps(store, update, props) { 7333 useUpdateEffect(update, [props.popover]); 7334 useStoreProps(store, props, "placement"); 7335 return useDialogStoreProps(store, update, props); 7336 } 7337 7338 // node_modules/@ariakit/core/esm/combobox/combobox-store.js 7339 var isTouchSafari = isSafari() && isTouchDevice(); 7340 function createComboboxStore(_a = {}) { 7341 var _b = _a, { 7342 tag 7343 } = _b, props = __objRest2(_b, [ 7344 "tag" 7345 ]); 7346 const store = mergeStore(props.store, pick2(tag, ["value", "rtl"])); 7347 throwOnConflictingProps(props, store); 7348 const tagState = tag == null ? void 0 : tag.getState(); 7349 const syncState = store == null ? void 0 : store.getState(); 7350 const activeId = defaultValue( 7351 props.activeId, 7352 syncState == null ? void 0 : syncState.activeId, 7353 props.defaultActiveId, 7354 null 7355 ); 7356 const composite = createCompositeStore(__spreadProps2(__spreadValues2({}, props), { 7357 activeId, 7358 includesBaseElement: defaultValue( 7359 props.includesBaseElement, 7360 syncState == null ? void 0 : syncState.includesBaseElement, 7361 true 7362 ), 7363 orientation: defaultValue( 7364 props.orientation, 7365 syncState == null ? void 0 : syncState.orientation, 7366 "vertical" 7367 ), 7368 focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true), 7369 focusWrap: defaultValue(props.focusWrap, syncState == null ? void 0 : syncState.focusWrap, true), 7370 virtualFocus: defaultValue( 7371 props.virtualFocus, 7372 syncState == null ? void 0 : syncState.virtualFocus, 7373 true 7374 ) 7375 })); 7376 const popover = createPopoverStore(__spreadProps2(__spreadValues2({}, props), { 7377 placement: defaultValue( 7378 props.placement, 7379 syncState == null ? void 0 : syncState.placement, 7380 "bottom-start" 7381 ) 7382 })); 7383 const value = defaultValue( 7384 props.value, 7385 syncState == null ? void 0 : syncState.value, 7386 props.defaultValue, 7387 "" 7388 ); 7389 const selectedValue = defaultValue( 7390 props.selectedValue, 7391 syncState == null ? void 0 : syncState.selectedValue, 7392 tagState == null ? void 0 : tagState.values, 7393 props.defaultSelectedValue, 7394 "" 7395 ); 7396 const multiSelectable = Array.isArray(selectedValue); 7397 const initialState = __spreadProps2(__spreadValues2(__spreadValues2({}, composite.getState()), popover.getState()), { 7398 value, 7399 selectedValue, 7400 resetValueOnSelect: defaultValue( 7401 props.resetValueOnSelect, 7402 syncState == null ? void 0 : syncState.resetValueOnSelect, 7403 multiSelectable 7404 ), 7405 resetValueOnHide: defaultValue( 7406 props.resetValueOnHide, 7407 syncState == null ? void 0 : syncState.resetValueOnHide, 7408 multiSelectable && !tag 7409 ), 7410 activeValue: syncState == null ? void 0 : syncState.activeValue 7411 }); 7412 const combobox = createStore(initialState, composite, popover, store); 7413 if (isTouchSafari) { 7414 setup( 7415 combobox, 7416 () => sync(combobox, ["virtualFocus"], () => { 7417 combobox.setState("virtualFocus", false); 7418 }) 7419 ); 7420 } 7421 setup(combobox, () => { 7422 if (!tag) return; 7423 return chain( 7424 sync(combobox, ["selectedValue"], (state) => { 7425 if (!Array.isArray(state.selectedValue)) return; 7426 tag.setValues(state.selectedValue); 7427 }), 7428 sync(tag, ["values"], (state) => { 7429 combobox.setState("selectedValue", state.values); 7430 }) 7431 ); 7432 }); 7433 setup( 7434 combobox, 7435 () => sync(combobox, ["resetValueOnHide", "mounted"], (state) => { 7436 if (!state.resetValueOnHide) return; 7437 if (state.mounted) return; 7438 combobox.setState("value", value); 7439 }) 7440 ); 7441 setup( 7442 combobox, 7443 () => sync(combobox, ["open"], (state) => { 7444 if (state.open) return; 7445 combobox.setState("activeId", activeId); 7446 combobox.setState("moves", 0); 7447 }) 7448 ); 7449 setup( 7450 combobox, 7451 () => sync(combobox, ["moves", "activeId"], (state, prevState) => { 7452 if (state.moves === prevState.moves) { 7453 combobox.setState("activeValue", void 0); 7454 } 7455 }) 7456 ); 7457 setup( 7458 combobox, 7459 () => batch(combobox, ["moves", "renderedItems"], (state, prev) => { 7460 if (state.moves === prev.moves) return; 7461 const { activeId: activeId2 } = combobox.getState(); 7462 const activeItem = composite.item(activeId2); 7463 combobox.setState("activeValue", activeItem == null ? void 0 : activeItem.value); 7464 }) 7465 ); 7466 return __spreadProps2(__spreadValues2(__spreadValues2(__spreadValues2({}, popover), composite), combobox), { 7467 tag, 7468 setValue: (value2) => combobox.setState("value", value2), 7469 resetValue: () => combobox.setState("value", initialState.value), 7470 setSelectedValue: (selectedValue2) => combobox.setState("selectedValue", selectedValue2) 7471 }); 7472 } 7473 7474 // node_modules/@ariakit/react-core/esm/__chunks/FEOFMWBY.js 7475 function useComboboxStoreOptions(props) { 7476 const tag = useTagContext(); 7477 props = __spreadProps(__spreadValues({}, props), { 7478 tag: props.tag !== void 0 ? props.tag : tag 7479 }); 7480 return useCompositeStoreOptions(props); 7481 } 7482 function useComboboxStoreProps(store, update, props) { 7483 useUpdateEffect(update, [props.tag]); 7484 useStoreProps(store, props, "value", "setValue"); 7485 useStoreProps(store, props, "selectedValue", "setSelectedValue"); 7486 useStoreProps(store, props, "resetValueOnHide"); 7487 useStoreProps(store, props, "resetValueOnSelect"); 7488 return Object.assign( 7489 useCompositeStoreProps( 7490 usePopoverStoreProps(store, update, props), 7491 update, 7492 props 7493 ), 7494 { tag: props.tag } 7495 ); 7496 } 7497 function useComboboxStore(props = {}) { 7498 props = useComboboxStoreOptions(props); 7499 const [store, update] = useStore(createComboboxStore, props); 7500 return useComboboxStoreProps(store, update, props); 7501 } 7502 7503 // node_modules/@ariakit/react-core/esm/__chunks/S6EF7IVO.js 7504 var ctx4 = createStoreContext(); 7505 var useDisclosureContext = ctx4.useContext; 7506 var useDisclosureScopedContext = ctx4.useScopedContext; 7507 var useDisclosureProviderContext = ctx4.useProviderContext; 7508 var DisclosureContextProvider = ctx4.ContextProvider; 7509 var DisclosureScopedContextProvider = ctx4.ScopedContextProvider; 7510 7511 // node_modules/@ariakit/react-core/esm/__chunks/RS7LB2H4.js 7512 var import_react6 = __toESM(require_react(), 1); 7513 var ctx5 = createStoreContext( 7514 [DisclosureContextProvider], 7515 [DisclosureScopedContextProvider] 7516 ); 7517 var useDialogContext = ctx5.useContext; 7518 var useDialogScopedContext = ctx5.useScopedContext; 7519 var useDialogProviderContext = ctx5.useProviderContext; 7520 var DialogContextProvider = ctx5.ContextProvider; 7521 var DialogScopedContextProvider = ctx5.ScopedContextProvider; 7522 var DialogHeadingContext = (0, import_react6.createContext)(void 0); 7523 var DialogDescriptionContext = (0, import_react6.createContext)(void 0); 7524 7525 // node_modules/@ariakit/react-core/esm/__chunks/MTZPJQMC.js 7526 var ctx6 = createStoreContext( 7527 [DialogContextProvider], 7528 [DialogScopedContextProvider] 7529 ); 7530 var usePopoverContext = ctx6.useContext; 7531 var usePopoverScopedContext = ctx6.useScopedContext; 7532 var usePopoverProviderContext = ctx6.useProviderContext; 7533 var PopoverContextProvider = ctx6.ContextProvider; 7534 var PopoverScopedContextProvider = ctx6.ScopedContextProvider; 7535 7536 // node_modules/@ariakit/react-core/esm/__chunks/VEVQD5MH.js 7537 var import_react7 = __toESM(require_react(), 1); 7538 var ComboboxListRoleContext = (0, import_react7.createContext)( 7539 void 0 7540 ); 7541 var ctx7 = createStoreContext( 7542 [PopoverContextProvider, CompositeContextProvider], 7543 [PopoverScopedContextProvider, CompositeScopedContextProvider] 7544 ); 7545 var useComboboxContext = ctx7.useContext; 7546 var useComboboxScopedContext = ctx7.useScopedContext; 7547 var useComboboxProviderContext = ctx7.useProviderContext; 7548 var ComboboxContextProvider = ctx7.ContextProvider; 7549 var ComboboxScopedContextProvider = ctx7.ScopedContextProvider; 7550 var ComboboxItemValueContext = (0, import_react7.createContext)( 7551 void 0 7552 ); 7553 var ComboboxItemCheckedContext = (0, import_react7.createContext)(false); 7554 7555 // node_modules/@ariakit/react-core/esm/__chunks/OMU7RWRV.js 7556 var TagName = "div"; 7557 var usePopoverAnchor = createHook( 7558 function usePopoverAnchor2(_a) { 7559 var _b = _a, { store } = _b, props = __objRest(_b, ["store"]); 7560 const context = usePopoverProviderContext(); 7561 store = store || context; 7562 props = __spreadProps(__spreadValues({}, props), { 7563 ref: useMergeRefs(store == null ? void 0 : store.setAnchorElement, props.ref) 7564 }); 7565 return props; 7566 } 7567 ); 7568 var PopoverAnchor = forwardRef22(function PopoverAnchor2(props) { 7569 const htmlProps = usePopoverAnchor(props); 7570 return createElement2(TagName, htmlProps); 7571 }); 7572 7573 // node_modules/@ariakit/react-core/esm/__chunks/5VQZOHHZ.js 7574 function findFirstEnabledItem2(items, excludeId) { 7575 return items.find((item) => { 7576 if (excludeId) { 7577 return !item.disabled && item.id !== excludeId; 7578 } 7579 return !item.disabled; 7580 }); 7581 } 7582 function getEnabledItem(store, id) { 7583 if (!id) return null; 7584 return store.item(id) || null; 7585 } 7586 function groupItemsByRows2(items) { 7587 const rows = []; 7588 for (const item of items) { 7589 const row = rows.find((currentRow) => { 7590 var _a; 7591 return ((_a = currentRow[0]) == null ? void 0 : _a.rowId) === item.rowId; 7592 }); 7593 if (row) { 7594 row.push(item); 7595 } else { 7596 rows.push([item]); 7597 } 7598 } 7599 return rows; 7600 } 7601 function selectTextField(element, collapseToEnd = false) { 7602 if (isTextField(element)) { 7603 element.setSelectionRange( 7604 collapseToEnd ? element.value.length : 0, 7605 element.value.length 7606 ); 7607 } else if (element.isContentEditable) { 7608 const selection = getDocument(element).getSelection(); 7609 selection == null ? void 0 : selection.selectAllChildren(element); 7610 if (collapseToEnd) { 7611 selection == null ? void 0 : selection.collapseToEnd(); 7612 } 7613 } 7614 } 7615 var FOCUS_SILENTLY = Symbol("FOCUS_SILENTLY"); 7616 function focusSilently(element) { 7617 element[FOCUS_SILENTLY] = true; 7618 element.focus({ preventScroll: true }); 7619 } 7620 function silentlyFocused(element) { 7621 const isSilentlyFocused = element[FOCUS_SILENTLY]; 7622 delete element[FOCUS_SILENTLY]; 7623 return isSilentlyFocused; 7624 } 7625 function isItem(store, element, exclude) { 7626 if (!element) return false; 7627 if (element === exclude) return false; 7628 const item = store.item(element.id); 7629 if (!item) return false; 7630 if (exclude && item.element === exclude) return false; 7631 return true; 7632 } 7633 7634 // node_modules/@ariakit/react-core/esm/__chunks/SWN3JYXT.js 7635 var import_react8 = __toESM(require_react(), 1); 7636 var FocusableContext = (0, import_react8.createContext)(true); 7637 7638 // node_modules/@ariakit/core/esm/utils/focus.js 7639 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'])"; 7640 function isFocusable(element) { 7641 if (!element.matches(selector)) return false; 7642 if (!isVisible(element)) return false; 7643 if (element.closest("[inert]")) return false; 7644 return true; 7645 } 7646 function getClosestFocusable(element) { 7647 while (element && !isFocusable(element)) { 7648 element = element.closest(selector); 7649 } 7650 return element || null; 7651 } 7652 function hasFocus(element) { 7653 const activeElement = getActiveElement(element); 7654 if (!activeElement) return false; 7655 if (activeElement === element) return true; 7656 const activeDescendant = activeElement.getAttribute("aria-activedescendant"); 7657 if (!activeDescendant) return false; 7658 return activeDescendant === element.id; 7659 } 7660 function hasFocusWithin(element) { 7661 const activeElement = getActiveElement(element); 7662 if (!activeElement) return false; 7663 if (contains(element, activeElement)) return true; 7664 const activeDescendant = activeElement.getAttribute("aria-activedescendant"); 7665 if (!activeDescendant) return false; 7666 if (!("id" in element)) return false; 7667 if (activeDescendant === element.id) return true; 7668 return !!element.querySelector(`#$CSS.escape(activeDescendant)}`); 7669 } 7670 function focusIfNeeded(element) { 7671 if (!hasFocusWithin(element) && isFocusable(element)) { 7672 element.focus(); 7673 } 7674 } 7675 function focusIntoView(element, options) { 7676 if (!("scrollIntoView" in element)) { 7677 element.focus(); 7678 } else { 7679 element.focus({ preventScroll: true }); 7680 element.scrollIntoView(__spreadValues2({ block: "nearest", inline: "nearest" }, options)); 7681 } 7682 } 7683 7684 // node_modules/@ariakit/react-core/esm/__chunks/LVA2YJMS.js 7685 var import_react9 = __toESM(require_react(), 1); 7686 var TagName2 = "div"; 7687 var isSafariBrowser = isSafari(); 7688 var alwaysFocusVisibleInputTypes = [ 7689 "text", 7690 "search", 7691 "url", 7692 "tel", 7693 "email", 7694 "password", 7695 "number", 7696 "date", 7697 "month", 7698 "week", 7699 "time", 7700 "datetime", 7701 "datetime-local" 7702 ]; 7703 var safariFocusAncestorSymbol = Symbol("safariFocusAncestor"); 7704 function markSafariFocusAncestor(element, value) { 7705 if (!element) return; 7706 element[safariFocusAncestorSymbol] = value; 7707 } 7708 function isAlwaysFocusVisible(element) { 7709 const { tagName, readOnly, type } = element; 7710 if (tagName === "TEXTAREA" && !readOnly) return true; 7711 if (tagName === "SELECT" && !readOnly) return true; 7712 if (tagName === "INPUT" && !readOnly) { 7713 return alwaysFocusVisibleInputTypes.includes(type); 7714 } 7715 if (element.isContentEditable) return true; 7716 const role = element.getAttribute("role"); 7717 if (role === "combobox" && element.dataset.name) { 7718 return true; 7719 } 7720 return false; 7721 } 7722 function getLabels(element) { 7723 if ("labels" in element) { 7724 return element.labels; 7725 } 7726 return null; 7727 } 7728 function isNativeCheckboxOrRadio(element) { 7729 const tagName = element.tagName.toLowerCase(); 7730 if (tagName === "input" && element.type) { 7731 return element.type === "radio" || element.type === "checkbox"; 7732 } 7733 return false; 7734 } 7735 function isNativeTabbable(tagName) { 7736 if (!tagName) return true; 7737 return tagName === "button" || tagName === "summary" || tagName === "input" || tagName === "select" || tagName === "textarea" || tagName === "a"; 7738 } 7739 function supportsDisabledAttribute(tagName) { 7740 if (!tagName) return true; 7741 return tagName === "button" || tagName === "input" || tagName === "select" || tagName === "textarea"; 7742 } 7743 function getTabIndex(focusable, trulyDisabled, nativeTabbable, supportsDisabled, tabIndexProp) { 7744 if (!focusable) { 7745 return tabIndexProp; 7746 } 7747 if (trulyDisabled) { 7748 if (nativeTabbable && !supportsDisabled) { 7749 return -1; 7750 } 7751 return; 7752 } 7753 if (nativeTabbable) { 7754 return tabIndexProp; 7755 } 7756 return tabIndexProp || 0; 7757 } 7758 function useDisableEvent(onEvent, disabled) { 7759 return useEvent((event) => { 7760 onEvent == null ? void 0 : onEvent(event); 7761 if (event.defaultPrevented) return; 7762 if (disabled) { 7763 event.stopPropagation(); 7764 event.preventDefault(); 7765 } 7766 }); 7767 } 7768 var isKeyboardModality = true; 7769 function onGlobalMouseDown(event) { 7770 const target = event.target; 7771 if (target && "hasAttribute" in target) { 7772 if (!target.hasAttribute("data-focus-visible")) { 7773 isKeyboardModality = false; 7774 } 7775 } 7776 } 7777 function onGlobalKeyDown(event) { 7778 if (event.metaKey) return; 7779 if (event.ctrlKey) return; 7780 if (event.altKey) return; 7781 isKeyboardModality = true; 7782 } 7783 var useFocusable = createHook( 7784 function useFocusable2(_a) { 7785 var _b = _a, { 7786 focusable = true, 7787 accessibleWhenDisabled, 7788 autoFocus, 7789 onFocusVisible 7790 } = _b, props = __objRest(_b, [ 7791 "focusable", 7792 "accessibleWhenDisabled", 7793 "autoFocus", 7794 "onFocusVisible" 7795 ]); 7796 const ref = (0, import_react9.useRef)(null); 7797 (0, import_react9.useEffect)(() => { 7798 if (!focusable) return; 7799 addGlobalEventListener("mousedown", onGlobalMouseDown, true); 7800 addGlobalEventListener("keydown", onGlobalKeyDown, true); 7801 }, [focusable]); 7802 if (isSafariBrowser) { 7803 (0, import_react9.useEffect)(() => { 7804 if (!focusable) return; 7805 const element = ref.current; 7806 if (!element) return; 7807 if (!isNativeCheckboxOrRadio(element)) return; 7808 const labels = getLabels(element); 7809 if (!labels) return; 7810 const onMouseUp = () => queueMicrotask(() => element.focus()); 7811 for (const label of labels) { 7812 label.addEventListener("mouseup", onMouseUp); 7813 } 7814 return () => { 7815 for (const label of labels) { 7816 label.removeEventListener("mouseup", onMouseUp); 7817 } 7818 }; 7819 }, [focusable]); 7820 } 7821 const disabled = focusable && disabledFromProps(props); 7822 const trulyDisabled = !!disabled && !accessibleWhenDisabled; 7823 const [focusVisible, setFocusVisible] = (0, import_react9.useState)(false); 7824 (0, import_react9.useEffect)(() => { 7825 if (!focusable) return; 7826 if (trulyDisabled && focusVisible) { 7827 setFocusVisible(false); 7828 } 7829 }, [focusable, trulyDisabled, focusVisible]); 7830 (0, import_react9.useEffect)(() => { 7831 if (!focusable) return; 7832 if (!focusVisible) return; 7833 const element = ref.current; 7834 if (!element) return; 7835 if (typeof IntersectionObserver === "undefined") return; 7836 const observer = new IntersectionObserver(() => { 7837 if (!isFocusable(element)) { 7838 setFocusVisible(false); 7839 } 7840 }); 7841 observer.observe(element); 7842 return () => observer.disconnect(); 7843 }, [focusable, focusVisible]); 7844 const onKeyPressCapture = useDisableEvent( 7845 props.onKeyPressCapture, 7846 disabled 7847 ); 7848 const onMouseDownCapture = useDisableEvent( 7849 props.onMouseDownCapture, 7850 disabled 7851 ); 7852 const onClickCapture = useDisableEvent(props.onClickCapture, disabled); 7853 const onMouseDownProp = props.onMouseDown; 7854 const onMouseDown = useEvent((event) => { 7855 onMouseDownProp == null ? void 0 : onMouseDownProp(event); 7856 if (event.defaultPrevented) return; 7857 if (!focusable) return; 7858 const element = event.currentTarget; 7859 if (!isSafariBrowser) return; 7860 if (isPortalEvent(event)) return; 7861 if (!isButton(element) && !isNativeCheckboxOrRadio(element)) return; 7862 let receivedFocus = false; 7863 const onFocus = () => { 7864 receivedFocus = true; 7865 }; 7866 const options = { capture: true, once: true }; 7867 element.addEventListener("focusin", onFocus, options); 7868 const focusableContainer = getClosestFocusable(element.parentElement); 7869 markSafariFocusAncestor(focusableContainer, true); 7870 queueBeforeEvent(element, "mouseup", () => { 7871 element.removeEventListener("focusin", onFocus, true); 7872 markSafariFocusAncestor(focusableContainer, false); 7873 if (receivedFocus) return; 7874 focusIfNeeded(element); 7875 }); 7876 }); 7877 const handleFocusVisible = (event, currentTarget) => { 7878 if (currentTarget) { 7879 event.currentTarget = currentTarget; 7880 } 7881 if (!focusable) return; 7882 const element = event.currentTarget; 7883 if (!element) return; 7884 if (!hasFocus(element)) return; 7885 onFocusVisible == null ? void 0 : onFocusVisible(event); 7886 if (event.defaultPrevented) return; 7887 element.dataset.focusVisible = "true"; 7888 setFocusVisible(true); 7889 }; 7890 const onKeyDownCaptureProp = props.onKeyDownCapture; 7891 const onKeyDownCapture = useEvent((event) => { 7892 onKeyDownCaptureProp == null ? void 0 : onKeyDownCaptureProp(event); 7893 if (event.defaultPrevented) return; 7894 if (!focusable) return; 7895 if (focusVisible) return; 7896 if (event.metaKey) return; 7897 if (event.altKey) return; 7898 if (event.ctrlKey) return; 7899 if (!isSelfTarget(event)) return; 7900 const element = event.currentTarget; 7901 const applyFocusVisible = () => handleFocusVisible(event, element); 7902 queueBeforeEvent(element, "focusout", applyFocusVisible); 7903 }); 7904 const onFocusCaptureProp = props.onFocusCapture; 7905 const onFocusCapture = useEvent((event) => { 7906 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event); 7907 if (event.defaultPrevented) return; 7908 if (!focusable) return; 7909 if (!isSelfTarget(event)) { 7910 setFocusVisible(false); 7911 return; 7912 } 7913 const element = event.currentTarget; 7914 const applyFocusVisible = () => handleFocusVisible(event, element); 7915 if (isKeyboardModality || isAlwaysFocusVisible(event.target)) { 7916 queueBeforeEvent(event.target, "focusout", applyFocusVisible); 7917 } else { 7918 setFocusVisible(false); 7919 } 7920 }); 7921 const onBlurProp = props.onBlur; 7922 const onBlur = useEvent((event) => { 7923 onBlurProp == null ? void 0 : onBlurProp(event); 7924 if (!focusable) return; 7925 if (!isFocusEventOutside(event)) return; 7926 setFocusVisible(false); 7927 }); 7928 const autoFocusOnShow = (0, import_react9.useContext)(FocusableContext); 7929 const autoFocusRef = useEvent((element) => { 7930 if (!focusable) return; 7931 if (!autoFocus) return; 7932 if (!element) return; 7933 if (!autoFocusOnShow) return; 7934 queueMicrotask(() => { 7935 if (hasFocus(element)) return; 7936 if (!isFocusable(element)) return; 7937 element.focus(); 7938 }); 7939 }); 7940 const tagName = useTagName(ref); 7941 const nativeTabbable = focusable && isNativeTabbable(tagName); 7942 const supportsDisabled = focusable && supportsDisabledAttribute(tagName); 7943 const styleProp = props.style; 7944 const style = (0, import_react9.useMemo)(() => { 7945 if (trulyDisabled) { 7946 return __spreadValues({ pointerEvents: "none" }, styleProp); 7947 } 7948 return styleProp; 7949 }, [trulyDisabled, styleProp]); 7950 props = __spreadProps(__spreadValues({ 7951 "data-focus-visible": focusable && focusVisible || void 0, 7952 "data-autofocus": autoFocus || void 0, 7953 "aria-disabled": disabled || void 0 7954 }, props), { 7955 ref: useMergeRefs(ref, autoFocusRef, props.ref), 7956 style, 7957 tabIndex: getTabIndex( 7958 focusable, 7959 trulyDisabled, 7960 nativeTabbable, 7961 supportsDisabled, 7962 props.tabIndex 7963 ), 7964 disabled: supportsDisabled && trulyDisabled ? true : void 0, 7965 // TODO: Test Focusable contentEditable. 7966 contentEditable: disabled ? void 0 : props.contentEditable, 7967 onKeyPressCapture, 7968 onClickCapture, 7969 onMouseDownCapture, 7970 onMouseDown, 7971 onKeyDownCapture, 7972 onFocusCapture, 7973 onBlur 7974 }); 7975 return removeUndefinedValues(props); 7976 } 7977 ); 7978 var Focusable = forwardRef22(function Focusable2(props) { 7979 const htmlProps = useFocusable(props); 7980 return createElement2(TagName2, htmlProps); 7981 }); 7982 7983 // node_modules/@ariakit/react-core/esm/__chunks/ITI7HKP4.js 7984 var import_react10 = __toESM(require_react(), 1); 7985 var import_jsx_runtime52 = __toESM(require_jsx_runtime(), 1); 7986 var TagName3 = "div"; 7987 function isGrid(items) { 7988 return items.some((item) => !!item.rowId); 7989 } 7990 function isPrintableKey(event) { 7991 const target = event.target; 7992 if (target && !isTextField(target)) return false; 7993 return event.key.length === 1 && !event.ctrlKey && !event.metaKey; 7994 } 7995 function isModifierKey(event) { 7996 return event.key === "Shift" || event.key === "Control" || event.key === "Alt" || event.key === "Meta"; 7997 } 7998 function useKeyboardEventProxy(store, onKeyboardEvent, previousElementRef) { 7999 return useEvent((event) => { 8000 var _a; 8001 onKeyboardEvent == null ? void 0 : onKeyboardEvent(event); 8002 if (event.defaultPrevented) return; 8003 if (event.isPropagationStopped()) return; 8004 if (!isSelfTarget(event)) return; 8005 if (isModifierKey(event)) return; 8006 if (isPrintableKey(event)) return; 8007 const state = store.getState(); 8008 const activeElement = (_a = getEnabledItem(store, state.activeId)) == null ? void 0 : _a.element; 8009 if (!activeElement) return; 8010 const _b = event, { view } = _b, eventInit = __objRest(_b, ["view"]); 8011 const previousElement = previousElementRef == null ? void 0 : previousElementRef.current; 8012 if (activeElement !== previousElement) { 8013 activeElement.focus(); 8014 } 8015 if (!fireKeyboardEvent(activeElement, event.type, eventInit)) { 8016 event.preventDefault(); 8017 } 8018 if (event.currentTarget.contains(activeElement)) { 8019 event.stopPropagation(); 8020 } 8021 }); 8022 } 8023 function findFirstEnabledItemInTheLastRow(items) { 8024 return findFirstEnabledItem2( 8025 flatten2DArray(reverseArray(groupItemsByRows2(items))) 8026 ); 8027 } 8028 function useScheduleFocus(store) { 8029 const [scheduled, setScheduled] = (0, import_react10.useState)(false); 8030 const schedule = (0, import_react10.useCallback)(() => setScheduled(true), []); 8031 const activeItem = store.useState( 8032 (state) => getEnabledItem(store, state.activeId) 8033 ); 8034 (0, import_react10.useEffect)(() => { 8035 const activeElement = activeItem == null ? void 0 : activeItem.element; 8036 if (!scheduled) return; 8037 if (!activeElement) return; 8038 setScheduled(false); 8039 activeElement.focus({ preventScroll: true }); 8040 }, [activeItem, scheduled]); 8041 return schedule; 8042 } 8043 var useComposite = createHook( 8044 function useComposite2(_a) { 8045 var _b = _a, { 8046 store, 8047 composite = true, 8048 focusOnMove = composite, 8049 moveOnKeyPress = true 8050 } = _b, props = __objRest(_b, [ 8051 "store", 8052 "composite", 8053 "focusOnMove", 8054 "moveOnKeyPress" 8055 ]); 8056 const context = useCompositeProviderContext(); 8057 store = store || context; 8058 invariant( 8059 store, 8060 "Composite must receive a `store` prop or be wrapped in a CompositeProvider component." 8061 ); 8062 const ref = (0, import_react10.useRef)(null); 8063 const previousElementRef = (0, import_react10.useRef)(null); 8064 const scheduleFocus = useScheduleFocus(store); 8065 const moves = store.useState("moves"); 8066 const [, setBaseElement] = useTransactionState( 8067 composite ? store.setBaseElement : null 8068 ); 8069 (0, import_react10.useEffect)(() => { 8070 var _a2; 8071 if (!store) return; 8072 if (!moves) return; 8073 if (!composite) return; 8074 if (!focusOnMove) return; 8075 const { activeId: activeId2 } = store.getState(); 8076 const itemElement = (_a2 = getEnabledItem(store, activeId2)) == null ? void 0 : _a2.element; 8077 if (!itemElement) return; 8078 focusIntoView(itemElement); 8079 }, [store, moves, composite, focusOnMove]); 8080 useSafeLayoutEffect(() => { 8081 if (!store) return; 8082 if (!moves) return; 8083 if (!composite) return; 8084 const { baseElement, activeId: activeId2 } = store.getState(); 8085 const isSelfAcive = activeId2 === null; 8086 if (!isSelfAcive) return; 8087 if (!baseElement) return; 8088 const previousElement = previousElementRef.current; 8089 previousElementRef.current = null; 8090 if (previousElement) { 8091 fireBlurEvent(previousElement, { relatedTarget: baseElement }); 8092 } 8093 if (!hasFocus(baseElement)) { 8094 baseElement.focus(); 8095 } 8096 }, [store, moves, composite]); 8097 const activeId = store.useState("activeId"); 8098 const virtualFocus = store.useState("virtualFocus"); 8099 useSafeLayoutEffect(() => { 8100 var _a2; 8101 if (!store) return; 8102 if (!composite) return; 8103 if (!virtualFocus) return; 8104 const previousElement = previousElementRef.current; 8105 previousElementRef.current = null; 8106 if (!previousElement) return; 8107 const activeElement = (_a2 = getEnabledItem(store, activeId)) == null ? void 0 : _a2.element; 8108 const relatedTarget = activeElement || getActiveElement(previousElement); 8109 if (relatedTarget === previousElement) return; 8110 fireBlurEvent(previousElement, { relatedTarget }); 8111 }, [store, activeId, virtualFocus, composite]); 8112 const onKeyDownCapture = useKeyboardEventProxy( 8113 store, 8114 props.onKeyDownCapture, 8115 previousElementRef 8116 ); 8117 const onKeyUpCapture = useKeyboardEventProxy( 8118 store, 8119 props.onKeyUpCapture, 8120 previousElementRef 8121 ); 8122 const onFocusCaptureProp = props.onFocusCapture; 8123 const onFocusCapture = useEvent((event) => { 8124 onFocusCaptureProp == null ? void 0 : onFocusCaptureProp(event); 8125 if (event.defaultPrevented) return; 8126 if (!store) return; 8127 const { virtualFocus: virtualFocus2 } = store.getState(); 8128 if (!virtualFocus2) return; 8129 const previousActiveElement = event.relatedTarget; 8130 const isSilentlyFocused = silentlyFocused(event.currentTarget); 8131 if (isSelfTarget(event) && isSilentlyFocused) { 8132 event.stopPropagation(); 8133 previousElementRef.current = previousActiveElement; 8134 } 8135 }); 8136 const onFocusProp = props.onFocus; 8137 const onFocus = useEvent((event) => { 8138 onFocusProp == null ? void 0 : onFocusProp(event); 8139 if (event.defaultPrevented) return; 8140 if (!composite) return; 8141 if (!store) return; 8142 const { relatedTarget } = event; 8143 const { virtualFocus: virtualFocus2 } = store.getState(); 8144 if (virtualFocus2) { 8145 if (isSelfTarget(event) && !isItem(store, relatedTarget)) { 8146 queueMicrotask(scheduleFocus); 8147 } 8148 } else if (isSelfTarget(event)) { 8149 store.setActiveId(null); 8150 } 8151 }); 8152 const onBlurCaptureProp = props.onBlurCapture; 8153 const onBlurCapture = useEvent((event) => { 8154 var _a2; 8155 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event); 8156 if (event.defaultPrevented) return; 8157 if (!store) return; 8158 const { virtualFocus: virtualFocus2, activeId: activeId2 } = store.getState(); 8159 if (!virtualFocus2) return; 8160 const activeElement = (_a2 = getEnabledItem(store, activeId2)) == null ? void 0 : _a2.element; 8161 const nextActiveElement = event.relatedTarget; 8162 const nextActiveElementIsItem = isItem(store, nextActiveElement); 8163 const previousElement = previousElementRef.current; 8164 previousElementRef.current = null; 8165 if (isSelfTarget(event) && nextActiveElementIsItem) { 8166 if (nextActiveElement === activeElement) { 8167 if (previousElement && previousElement !== nextActiveElement) { 8168 fireBlurEvent(previousElement, event); 8169 } 8170 } else if (activeElement) { 8171 fireBlurEvent(activeElement, event); 8172 } else if (previousElement) { 8173 fireBlurEvent(previousElement, event); 8174 } 8175 event.stopPropagation(); 8176 } else { 8177 const targetIsItem = isItem(store, event.target); 8178 if (!targetIsItem && activeElement) { 8179 fireBlurEvent(activeElement, event); 8180 } 8181 } 8182 }); 8183 const onKeyDownProp = props.onKeyDown; 8184 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); 8185 const onKeyDown = useEvent((event) => { 8186 var _a2; 8187 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8188 if (event.defaultPrevented) return; 8189 if (!store) return; 8190 if (!isSelfTarget(event)) return; 8191 const { orientation, renderedItems, activeId: activeId2 } = store.getState(); 8192 const activeItem = getEnabledItem(store, activeId2); 8193 if ((_a2 = activeItem == null ? void 0 : activeItem.element) == null ? void 0 : _a2.isConnected) return; 8194 const isVertical = orientation !== "horizontal"; 8195 const isHorizontal = orientation !== "vertical"; 8196 const grid = isGrid(renderedItems); 8197 const isHorizontalKey = event.key === "ArrowLeft" || event.key === "ArrowRight" || event.key === "Home" || event.key === "End"; 8198 if (isHorizontalKey && isTextField(event.currentTarget)) return; 8199 const up = () => { 8200 if (grid) { 8201 const item = findFirstEnabledItemInTheLastRow(renderedItems); 8202 return item == null ? void 0 : item.id; 8203 } 8204 return store == null ? void 0 : store.last(); 8205 }; 8206 const keyMap = { 8207 ArrowUp: (grid || isVertical) && up, 8208 ArrowRight: (grid || isHorizontal) && store.first, 8209 ArrowDown: (grid || isVertical) && store.first, 8210 ArrowLeft: (grid || isHorizontal) && store.last, 8211 Home: store.first, 8212 End: store.last, 8213 PageUp: store.first, 8214 PageDown: store.last 8215 }; 8216 const action = keyMap[event.key]; 8217 if (action) { 8218 const id = action(); 8219 if (id !== void 0) { 8220 if (!moveOnKeyPressProp(event)) return; 8221 event.preventDefault(); 8222 store.move(id); 8223 } 8224 } 8225 }); 8226 props = useWrapElement( 8227 props, 8228 (element) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(CompositeContextProvider, { value: store, children: element }), 8229 [store] 8230 ); 8231 const activeDescendant = store.useState((state) => { 8232 var _a2; 8233 if (!store) return; 8234 if (!composite) return; 8235 if (!state.virtualFocus) return; 8236 return (_a2 = getEnabledItem(store, state.activeId)) == null ? void 0 : _a2.id; 8237 }); 8238 props = __spreadProps(__spreadValues({ 8239 "aria-activedescendant": activeDescendant 8240 }, props), { 8241 ref: useMergeRefs(ref, setBaseElement, props.ref), 8242 onKeyDownCapture, 8243 onKeyUpCapture, 8244 onFocusCapture, 8245 onFocus, 8246 onBlurCapture, 8247 onKeyDown 8248 }); 8249 const focusable = store.useState( 8250 (state) => composite && (state.virtualFocus || state.activeId === null) 8251 ); 8252 props = useFocusable(__spreadValues({ focusable }, props)); 8253 return props; 8254 } 8255 ); 8256 var Composite5 = forwardRef22(function Composite22(props) { 8257 const htmlProps = useComposite(props); 8258 return createElement2(TagName3, htmlProps); 8259 }); 8260 8261 // node_modules/@ariakit/react-core/esm/combobox/combobox.js 8262 var import_react11 = __toESM(require_react(), 1); 8263 var TagName4 = "input"; 8264 function isFirstItemAutoSelected(items, activeValue, autoSelect) { 8265 if (!autoSelect) return false; 8266 const firstItem = items.find((item) => !item.disabled && item.value); 8267 return (firstItem == null ? void 0 : firstItem.value) === activeValue; 8268 } 8269 function hasCompletionString(value, activeValue) { 8270 if (!activeValue) return false; 8271 if (value == null) return false; 8272 value = normalizeString(value); 8273 return activeValue.length > value.length && activeValue.toLowerCase().indexOf(value.toLowerCase()) === 0; 8274 } 8275 function isInputEvent(event) { 8276 return event.type === "input"; 8277 } 8278 function isAriaAutoCompleteValue(value) { 8279 return value === "inline" || value === "list" || value === "both" || value === "none"; 8280 } 8281 function getDefaultAutoSelectId(items) { 8282 const item = items.find((item2) => { 8283 var _a; 8284 if (item2.disabled) return false; 8285 return ((_a = item2.element) == null ? void 0 : _a.getAttribute("role")) !== "tab"; 8286 }); 8287 return item == null ? void 0 : item.id; 8288 } 8289 var useCombobox = createHook( 8290 function useCombobox2(_a) { 8291 var _b = _a, { 8292 store, 8293 focusable = true, 8294 autoSelect: autoSelectProp = false, 8295 getAutoSelectId, 8296 setValueOnChange, 8297 showMinLength = 0, 8298 showOnChange, 8299 showOnMouseDown, 8300 showOnClick = showOnMouseDown, 8301 showOnKeyDown, 8302 showOnKeyPress = showOnKeyDown, 8303 blurActiveItemOnClick, 8304 setValueOnClick = true, 8305 moveOnKeyPress = true, 8306 autoComplete = "list" 8307 } = _b, props = __objRest(_b, [ 8308 "store", 8309 "focusable", 8310 "autoSelect", 8311 "getAutoSelectId", 8312 "setValueOnChange", 8313 "showMinLength", 8314 "showOnChange", 8315 "showOnMouseDown", 8316 "showOnClick", 8317 "showOnKeyDown", 8318 "showOnKeyPress", 8319 "blurActiveItemOnClick", 8320 "setValueOnClick", 8321 "moveOnKeyPress", 8322 "autoComplete" 8323 ]); 8324 const context = useComboboxProviderContext(); 8325 store = store || context; 8326 invariant( 8327 store, 8328 "Combobox must receive a `store` prop or be wrapped in a ComboboxProvider component." 8329 ); 8330 const ref = (0, import_react11.useRef)(null); 8331 const [valueUpdated, forceValueUpdate] = useForceUpdate(); 8332 const canAutoSelectRef = (0, import_react11.useRef)(false); 8333 const composingRef = (0, import_react11.useRef)(false); 8334 const autoSelect = store.useState( 8335 (state) => state.virtualFocus && autoSelectProp 8336 ); 8337 const inline = autoComplete === "inline" || autoComplete === "both"; 8338 const [canInline, setCanInline] = (0, import_react11.useState)(inline); 8339 useUpdateLayoutEffect(() => { 8340 if (!inline) return; 8341 setCanInline(true); 8342 }, [inline]); 8343 const storeValue = store.useState("value"); 8344 const prevSelectedValueRef = (0, import_react11.useRef)(); 8345 (0, import_react11.useEffect)(() => { 8346 return sync(store, ["selectedValue", "activeId"], (_, prev) => { 8347 prevSelectedValueRef.current = prev.selectedValue; 8348 }); 8349 }, []); 8350 const inlineActiveValue = store.useState((state) => { 8351 var _a2; 8352 if (!inline) return; 8353 if (!canInline) return; 8354 if (state.activeValue && Array.isArray(state.selectedValue)) { 8355 if (state.selectedValue.includes(state.activeValue)) return; 8356 if ((_a2 = prevSelectedValueRef.current) == null ? void 0 : _a2.includes(state.activeValue)) return; 8357 } 8358 return state.activeValue; 8359 }); 8360 const items = store.useState("renderedItems"); 8361 const open = store.useState("open"); 8362 const contentElement = store.useState("contentElement"); 8363 const value = (0, import_react11.useMemo)(() => { 8364 if (!inline) return storeValue; 8365 if (!canInline) return storeValue; 8366 const firstItemAutoSelected = isFirstItemAutoSelected( 8367 items, 8368 inlineActiveValue, 8369 autoSelect 8370 ); 8371 if (firstItemAutoSelected) { 8372 if (hasCompletionString(storeValue, inlineActiveValue)) { 8373 const slice = (inlineActiveValue == null ? void 0 : inlineActiveValue.slice(storeValue.length)) || ""; 8374 return storeValue + slice; 8375 } 8376 return storeValue; 8377 } 8378 return inlineActiveValue || storeValue; 8379 }, [inline, canInline, items, inlineActiveValue, autoSelect, storeValue]); 8380 (0, import_react11.useEffect)(() => { 8381 const element = ref.current; 8382 if (!element) return; 8383 const onCompositeItemMove = () => setCanInline(true); 8384 element.addEventListener("combobox-item-move", onCompositeItemMove); 8385 return () => { 8386 element.removeEventListener("combobox-item-move", onCompositeItemMove); 8387 }; 8388 }, []); 8389 (0, import_react11.useEffect)(() => { 8390 if (!inline) return; 8391 if (!canInline) return; 8392 if (!inlineActiveValue) return; 8393 const firstItemAutoSelected = isFirstItemAutoSelected( 8394 items, 8395 inlineActiveValue, 8396 autoSelect 8397 ); 8398 if (!firstItemAutoSelected) return; 8399 if (!hasCompletionString(storeValue, inlineActiveValue)) return; 8400 let cleanup = noop2; 8401 queueMicrotask(() => { 8402 const element = ref.current; 8403 if (!element) return; 8404 const { start: prevStart, end: prevEnd } = getTextboxSelection(element); 8405 const nextStart = storeValue.length; 8406 const nextEnd = inlineActiveValue.length; 8407 setSelectionRange(element, nextStart, nextEnd); 8408 cleanup = () => { 8409 if (!hasFocus(element)) return; 8410 const { start, end } = getTextboxSelection(element); 8411 if (start !== nextStart) return; 8412 if (end !== nextEnd) return; 8413 setSelectionRange(element, prevStart, prevEnd); 8414 }; 8415 }); 8416 return () => cleanup(); 8417 }, [ 8418 valueUpdated, 8419 inline, 8420 canInline, 8421 inlineActiveValue, 8422 items, 8423 autoSelect, 8424 storeValue 8425 ]); 8426 const scrollingElementRef = (0, import_react11.useRef)(null); 8427 const getAutoSelectIdProp = useEvent(getAutoSelectId); 8428 const autoSelectIdRef = (0, import_react11.useRef)(null); 8429 (0, import_react11.useEffect)(() => { 8430 if (!open) return; 8431 if (!contentElement) return; 8432 const scrollingElement = getScrollingElement(contentElement); 8433 if (!scrollingElement) return; 8434 scrollingElementRef.current = scrollingElement; 8435 const onUserScroll = () => { 8436 canAutoSelectRef.current = false; 8437 }; 8438 const onScroll = () => { 8439 if (!store) return; 8440 if (!canAutoSelectRef.current) return; 8441 const { activeId } = store.getState(); 8442 if (activeId === null) return; 8443 if (activeId === autoSelectIdRef.current) return; 8444 canAutoSelectRef.current = false; 8445 }; 8446 const options = { passive: true, capture: true }; 8447 scrollingElement.addEventListener("wheel", onUserScroll, options); 8448 scrollingElement.addEventListener("touchmove", onUserScroll, options); 8449 scrollingElement.addEventListener("scroll", onScroll, options); 8450 return () => { 8451 scrollingElement.removeEventListener("wheel", onUserScroll, true); 8452 scrollingElement.removeEventListener("touchmove", onUserScroll, true); 8453 scrollingElement.removeEventListener("scroll", onScroll, true); 8454 }; 8455 }, [open, contentElement, store]); 8456 useSafeLayoutEffect(() => { 8457 if (!storeValue) return; 8458 if (composingRef.current) return; 8459 canAutoSelectRef.current = true; 8460 }, [storeValue]); 8461 useSafeLayoutEffect(() => { 8462 if (autoSelect !== "always" && open) return; 8463 canAutoSelectRef.current = open; 8464 }, [autoSelect, open]); 8465 const resetValueOnSelect = store.useState("resetValueOnSelect"); 8466 useUpdateEffect(() => { 8467 var _a2, _b2; 8468 const canAutoSelect = canAutoSelectRef.current; 8469 if (!store) return; 8470 if (!open) return; 8471 if (!canAutoSelect && !resetValueOnSelect) return; 8472 const { baseElement, contentElement: contentElement2, activeId } = store.getState(); 8473 if (baseElement && !hasFocus(baseElement)) return; 8474 if (contentElement2 == null ? void 0 : contentElement2.hasAttribute("data-placing")) { 8475 const observer = new MutationObserver(forceValueUpdate); 8476 observer.observe(contentElement2, { attributeFilter: ["data-placing"] }); 8477 return () => observer.disconnect(); 8478 } 8479 if (autoSelect && canAutoSelect) { 8480 const userAutoSelectId = getAutoSelectIdProp(items); 8481 const autoSelectId = userAutoSelectId !== void 0 ? userAutoSelectId : (_a2 = getDefaultAutoSelectId(items)) != null ? _a2 : store.first(); 8482 autoSelectIdRef.current = autoSelectId; 8483 store.move(autoSelectId != null ? autoSelectId : null); 8484 } else { 8485 const element = (_b2 = store.item(activeId || store.first())) == null ? void 0 : _b2.element; 8486 if (element && "scrollIntoView" in element) { 8487 element.scrollIntoView({ block: "nearest", inline: "nearest" }); 8488 } 8489 } 8490 return; 8491 }, [ 8492 store, 8493 open, 8494 valueUpdated, 8495 storeValue, 8496 autoSelect, 8497 resetValueOnSelect, 8498 getAutoSelectIdProp, 8499 items 8500 ]); 8501 (0, import_react11.useEffect)(() => { 8502 if (!inline) return; 8503 const combobox = ref.current; 8504 if (!combobox) return; 8505 const elements = [combobox, contentElement].filter( 8506 (value2) => !!value2 8507 ); 8508 const onBlur2 = (event) => { 8509 if (elements.every((el) => isFocusEventOutside(event, el))) { 8510 store == null ? void 0 : store.setValue(value); 8511 } 8512 }; 8513 for (const element of elements) { 8514 element.addEventListener("focusout", onBlur2); 8515 } 8516 return () => { 8517 for (const element of elements) { 8518 element.removeEventListener("focusout", onBlur2); 8519 } 8520 }; 8521 }, [inline, contentElement, store, value]); 8522 const canShow = (event) => { 8523 const currentTarget = event.currentTarget; 8524 return currentTarget.value.length >= showMinLength; 8525 }; 8526 const onChangeProp = props.onChange; 8527 const showOnChangeProp = useBooleanEvent(showOnChange != null ? showOnChange : canShow); 8528 const setValueOnChangeProp = useBooleanEvent( 8529 // If the combobox is combined with tags, the value will be set by the tag 8530 // input component. 8531 setValueOnChange != null ? setValueOnChange : !store.tag 8532 ); 8533 const onChange = useEvent((event) => { 8534 onChangeProp == null ? void 0 : onChangeProp(event); 8535 if (event.defaultPrevented) return; 8536 if (!store) return; 8537 const currentTarget = event.currentTarget; 8538 const { value: value2, selectionStart, selectionEnd } = currentTarget; 8539 const nativeEvent = event.nativeEvent; 8540 canAutoSelectRef.current = true; 8541 if (isInputEvent(nativeEvent)) { 8542 if (nativeEvent.isComposing) { 8543 canAutoSelectRef.current = false; 8544 composingRef.current = true; 8545 } 8546 if (inline) { 8547 const textInserted = nativeEvent.inputType === "insertText" || nativeEvent.inputType === "insertCompositionText"; 8548 const caretAtEnd = selectionStart === value2.length; 8549 setCanInline(textInserted && caretAtEnd); 8550 } 8551 } 8552 if (setValueOnChangeProp(event)) { 8553 const isSameValue = value2 === store.getState().value; 8554 store.setValue(value2); 8555 queueMicrotask(() => { 8556 setSelectionRange(currentTarget, selectionStart, selectionEnd); 8557 }); 8558 if (inline && autoSelect && isSameValue) { 8559 forceValueUpdate(); 8560 } 8561 } 8562 if (showOnChangeProp(event)) { 8563 store.show(); 8564 } 8565 if (!autoSelect || !canAutoSelectRef.current) { 8566 store.setActiveId(null); 8567 } 8568 }); 8569 const onCompositionEndProp = props.onCompositionEnd; 8570 const onCompositionEnd = useEvent((event) => { 8571 canAutoSelectRef.current = true; 8572 composingRef.current = false; 8573 onCompositionEndProp == null ? void 0 : onCompositionEndProp(event); 8574 if (event.defaultPrevented) return; 8575 if (!autoSelect) return; 8576 forceValueUpdate(); 8577 }); 8578 const onMouseDownProp = props.onMouseDown; 8579 const blurActiveItemOnClickProp = useBooleanEvent( 8580 blurActiveItemOnClick != null ? blurActiveItemOnClick : () => !!(store == null ? void 0 : store.getState().includesBaseElement) 8581 ); 8582 const setValueOnClickProp = useBooleanEvent(setValueOnClick); 8583 const showOnClickProp = useBooleanEvent(showOnClick != null ? showOnClick : canShow); 8584 const onMouseDown = useEvent((event) => { 8585 onMouseDownProp == null ? void 0 : onMouseDownProp(event); 8586 if (event.defaultPrevented) return; 8587 if (event.button) return; 8588 if (event.ctrlKey) return; 8589 if (!store) return; 8590 if (blurActiveItemOnClickProp(event)) { 8591 store.setActiveId(null); 8592 } 8593 if (setValueOnClickProp(event)) { 8594 store.setValue(value); 8595 } 8596 if (showOnClickProp(event)) { 8597 queueBeforeEvent(event.currentTarget, "mouseup", store.show); 8598 } 8599 }); 8600 const onKeyDownProp = props.onKeyDown; 8601 const showOnKeyPressProp = useBooleanEvent(showOnKeyPress != null ? showOnKeyPress : canShow); 8602 const onKeyDown = useEvent((event) => { 8603 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8604 if (!event.repeat) { 8605 canAutoSelectRef.current = false; 8606 } 8607 if (event.defaultPrevented) return; 8608 if (event.ctrlKey) return; 8609 if (event.altKey) return; 8610 if (event.shiftKey) return; 8611 if (event.metaKey) return; 8612 if (!store) return; 8613 const { open: open2 } = store.getState(); 8614 if (open2) return; 8615 if (event.key === "ArrowUp" || event.key === "ArrowDown") { 8616 if (showOnKeyPressProp(event)) { 8617 event.preventDefault(); 8618 store.show(); 8619 } 8620 } 8621 }); 8622 const onBlurProp = props.onBlur; 8623 const onBlur = useEvent((event) => { 8624 canAutoSelectRef.current = false; 8625 onBlurProp == null ? void 0 : onBlurProp(event); 8626 if (event.defaultPrevented) return; 8627 }); 8628 const id = useId3(props.id); 8629 const ariaAutoComplete = isAriaAutoCompleteValue(autoComplete) ? autoComplete : void 0; 8630 const isActiveItem = store.useState((state) => state.activeId === null); 8631 props = __spreadProps(__spreadValues({ 8632 id, 8633 role: "combobox", 8634 "aria-autocomplete": ariaAutoComplete, 8635 "aria-haspopup": getPopupRole(contentElement, "listbox"), 8636 "aria-expanded": open, 8637 "aria-controls": contentElement == null ? void 0 : contentElement.id, 8638 "data-active-item": isActiveItem || void 0, 8639 value 8640 }, props), { 8641 ref: useMergeRefs(ref, props.ref), 8642 onChange, 8643 onCompositionEnd, 8644 onMouseDown, 8645 onKeyDown, 8646 onBlur 8647 }); 8648 props = useComposite(__spreadProps(__spreadValues({ 8649 store, 8650 focusable 8651 }, props), { 8652 // Enable inline autocomplete when the user moves from the combobox input 8653 // to an item. 8654 moveOnKeyPress: (event) => { 8655 if (isFalsyBooleanCallback(moveOnKeyPress, event)) return false; 8656 if (inline) setCanInline(true); 8657 return true; 8658 } 8659 })); 8660 props = usePopoverAnchor(__spreadValues({ store }, props)); 8661 return __spreadValues({ autoComplete: "off" }, props); 8662 } 8663 ); 8664 var Combobox = forwardRef22(function Combobox2(props) { 8665 const htmlProps = useCombobox(props); 8666 return createElement2(TagName4, htmlProps); 8667 }); 8668 8669 // node_modules/@ariakit/react-core/esm/combobox/combobox-provider.js 8670 var import_jsx_runtime53 = __toESM(require_jsx_runtime(), 1); 8671 function ComboboxProvider(props = {}) { 8672 const store = useComboboxStore(props); 8673 return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(ComboboxContextProvider, { value: store, children: props.children }); 8674 } 8675 8676 // node_modules/@ariakit/react-core/esm/__chunks/KUU7WJ55.js 8677 var import_react12 = __toESM(require_react(), 1); 8678 var TagName5 = "button"; 8679 function isNativeClick(event) { 8680 if (!event.isTrusted) return false; 8681 const element = event.currentTarget; 8682 if (event.key === "Enter") { 8683 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "A"; 8684 } 8685 if (event.key === " ") { 8686 return isButton(element) || element.tagName === "SUMMARY" || element.tagName === "INPUT" || element.tagName === "SELECT"; 8687 } 8688 return false; 8689 } 8690 var symbol = Symbol("command"); 8691 var useCommand = createHook( 8692 function useCommand2(_a) { 8693 var _b = _a, { clickOnEnter = true, clickOnSpace = true } = _b, props = __objRest(_b, ["clickOnEnter", "clickOnSpace"]); 8694 const ref = (0, import_react12.useRef)(null); 8695 const [isNativeButton, setIsNativeButton] = (0, import_react12.useState)(false); 8696 (0, import_react12.useEffect)(() => { 8697 if (!ref.current) return; 8698 setIsNativeButton(isButton(ref.current)); 8699 }, []); 8700 const [active, setActive] = (0, import_react12.useState)(false); 8701 const activeRef = (0, import_react12.useRef)(false); 8702 const disabled = disabledFromProps(props); 8703 const [isDuplicate, metadataProps] = useMetadataProps(props, symbol, true); 8704 const onKeyDownProp = props.onKeyDown; 8705 const onKeyDown = useEvent((event) => { 8706 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 8707 const element = event.currentTarget; 8708 if (event.defaultPrevented) return; 8709 if (isDuplicate) return; 8710 if (disabled) return; 8711 if (!isSelfTarget(event)) return; 8712 if (isTextField(element)) return; 8713 if (element.isContentEditable) return; 8714 const isEnter = clickOnEnter && event.key === "Enter"; 8715 const isSpace = clickOnSpace && event.key === " "; 8716 const shouldPreventEnter = event.key === "Enter" && !clickOnEnter; 8717 const shouldPreventSpace = event.key === " " && !clickOnSpace; 8718 if (shouldPreventEnter || shouldPreventSpace) { 8719 event.preventDefault(); 8720 return; 8721 } 8722 if (isEnter || isSpace) { 8723 const nativeClick = isNativeClick(event); 8724 if (isEnter) { 8725 if (!nativeClick) { 8726 event.preventDefault(); 8727 const _a2 = event, { view } = _a2, eventInit = __objRest(_a2, ["view"]); 8728 const click = () => fireClickEvent(element, eventInit); 8729 if (isFirefox()) { 8730 queueBeforeEvent(element, "keyup", click); 8731 } else { 8732 queueMicrotask(click); 8733 } 8734 } 8735 } else if (isSpace) { 8736 activeRef.current = true; 8737 if (!nativeClick) { 8738 event.preventDefault(); 8739 setActive(true); 8740 } 8741 } 8742 } 8743 }); 8744 const onKeyUpProp = props.onKeyUp; 8745 const onKeyUp = useEvent((event) => { 8746 onKeyUpProp == null ? void 0 : onKeyUpProp(event); 8747 if (event.defaultPrevented) return; 8748 if (isDuplicate) return; 8749 if (disabled) return; 8750 if (event.metaKey) return; 8751 const isSpace = clickOnSpace && event.key === " "; 8752 if (activeRef.current && isSpace) { 8753 activeRef.current = false; 8754 if (!isNativeClick(event)) { 8755 event.preventDefault(); 8756 setActive(false); 8757 const element = event.currentTarget; 8758 const _a2 = event, { view } = _a2, eventInit = __objRest(_a2, ["view"]); 8759 queueMicrotask(() => fireClickEvent(element, eventInit)); 8760 } 8761 } 8762 }); 8763 props = __spreadProps(__spreadValues(__spreadValues({ 8764 "data-active": active || void 0, 8765 type: isNativeButton ? "button" : void 0 8766 }, metadataProps), props), { 8767 ref: useMergeRefs(ref, props.ref), 8768 onKeyDown, 8769 onKeyUp 8770 }); 8771 props = useFocusable(props); 8772 return props; 8773 } 8774 ); 8775 var Command = forwardRef22(function Command2(props) { 8776 const htmlProps = useCommand(props); 8777 return createElement2(TagName5, htmlProps); 8778 }); 8779 8780 // node_modules/@ariakit/react-core/esm/combobox/combobox-item-value.js 8781 var import_react13 = __toESM(require_react(), 1); 8782 var import_jsx_runtime54 = __toESM(require_jsx_runtime(), 1); 8783 var TagName6 = "span"; 8784 function normalizeValue(value) { 8785 return normalizeString(value).toLowerCase(); 8786 } 8787 function getOffsets(string, values) { 8788 const offsets = []; 8789 for (const value of values) { 8790 let pos = 0; 8791 const length = value.length; 8792 while (string.indexOf(value, pos) !== -1) { 8793 const index = string.indexOf(value, pos); 8794 if (index !== -1) { 8795 offsets.push([index, length]); 8796 } 8797 pos = index + 1; 8798 } 8799 } 8800 return offsets; 8801 } 8802 function filterOverlappingOffsets(offsets) { 8803 return offsets.filter(([offset, length], i2, arr) => { 8804 return !arr.some( 8805 ([o2, l2], j2) => j2 !== i2 && o2 <= offset && o2 + l2 >= offset + length 8806 ); 8807 }); 8808 } 8809 function sortOffsets(offsets) { 8810 return offsets.sort(([a2], [b2]) => a2 - b2); 8811 } 8812 function splitValue(itemValue, userValue) { 8813 if (!itemValue) return itemValue; 8814 if (!userValue) return itemValue; 8815 const userValues = toArray(userValue).filter(Boolean).map(normalizeValue); 8816 const parts = []; 8817 const span = (value, autocomplete = false) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)( 8818 "span", 8819 { 8820 "data-autocomplete-value": autocomplete ? "" : void 0, 8821 "data-user-value": autocomplete ? void 0 : "", 8822 children: value 8823 }, 8824 parts.length 8825 ); 8826 const offsets = sortOffsets( 8827 filterOverlappingOffsets( 8828 // Convert userValues into a set to avoid duplicates 8829 getOffsets(normalizeValue(itemValue), new Set(userValues)) 8830 ) 8831 ); 8832 if (!offsets.length) { 8833 parts.push(span(itemValue, true)); 8834 return parts; 8835 } 8836 const [firstOffset] = offsets[0]; 8837 const values = [ 8838 itemValue.slice(0, firstOffset), 8839 ...offsets.flatMap(([offset, length], i2) => { 8840 var _a; 8841 const value = itemValue.slice(offset, offset + length); 8842 const nextOffset = (_a = offsets[i2 + 1]) == null ? void 0 : _a[0]; 8843 const nextValue = itemValue.slice(offset + length, nextOffset); 8844 return [value, nextValue]; 8845 }) 8846 ]; 8847 values.forEach((value, i2) => { 8848 if (!value) return; 8849 parts.push(span(value, i2 % 2 === 0)); 8850 }); 8851 return parts; 8852 } 8853 var useComboboxItemValue = createHook(function useComboboxItemValue2(_a) { 8854 var _b = _a, { store, value, userValue } = _b, props = __objRest(_b, ["store", "value", "userValue"]); 8855 const context = useComboboxScopedContext(); 8856 store = store || context; 8857 const itemContext = (0, import_react13.useContext)(ComboboxItemValueContext); 8858 const itemValue = value != null ? value : itemContext; 8859 const inputValue = useStoreState(store, (state) => userValue != null ? userValue : state == null ? void 0 : state.value); 8860 const children = (0, import_react13.useMemo)(() => { 8861 if (!itemValue) return; 8862 if (!inputValue) return itemValue; 8863 return splitValue(itemValue, inputValue); 8864 }, [itemValue, inputValue]); 8865 props = __spreadValues({ 8866 children 8867 }, props); 8868 return removeUndefinedValues(props); 8869 }); 8870 var ComboboxItemValue = forwardRef22(function ComboboxItemValue2(props) { 8871 const htmlProps = useComboboxItemValue(props); 8872 return createElement2(TagName6, htmlProps); 8873 }); 8874 8875 // node_modules/@ariakit/react-core/esm/__chunks/UQQRIHDV.js 8876 var import_react14 = __toESM(require_react(), 1); 8877 var TagName7 = "div"; 8878 function getMouseDestination(event) { 8879 const relatedTarget = event.relatedTarget; 8880 if ((relatedTarget == null ? void 0 : relatedTarget.nodeType) === Node.ELEMENT_NODE) { 8881 return relatedTarget; 8882 } 8883 return null; 8884 } 8885 function hoveringInside(event) { 8886 const nextElement = getMouseDestination(event); 8887 if (!nextElement) return false; 8888 return contains(event.currentTarget, nextElement); 8889 } 8890 var symbol2 = Symbol("composite-hover"); 8891 function movingToAnotherItem(event) { 8892 let dest = getMouseDestination(event); 8893 if (!dest) return false; 8894 do { 8895 if (hasOwnProperty(dest, symbol2) && dest[symbol2]) return true; 8896 dest = dest.parentElement; 8897 } while (dest); 8898 return false; 8899 } 8900 var useCompositeHover = createHook( 8901 function useCompositeHover2(_a) { 8902 var _b = _a, { 8903 store, 8904 focusOnHover = true, 8905 blurOnHoverEnd = !!focusOnHover 8906 } = _b, props = __objRest(_b, [ 8907 "store", 8908 "focusOnHover", 8909 "blurOnHoverEnd" 8910 ]); 8911 const context = useCompositeContext(); 8912 store = store || context; 8913 invariant( 8914 store, 8915 "CompositeHover must be wrapped in a Composite component." 8916 ); 8917 const isMouseMoving = useIsMouseMoving(); 8918 const onMouseMoveProp = props.onMouseMove; 8919 const focusOnHoverProp = useBooleanEvent(focusOnHover); 8920 const onMouseMove = useEvent((event) => { 8921 onMouseMoveProp == null ? void 0 : onMouseMoveProp(event); 8922 if (event.defaultPrevented) return; 8923 if (!isMouseMoving()) return; 8924 if (!focusOnHoverProp(event)) return; 8925 if (!hasFocusWithin(event.currentTarget)) { 8926 const baseElement = store == null ? void 0 : store.getState().baseElement; 8927 if (baseElement && !hasFocus(baseElement)) { 8928 baseElement.focus(); 8929 } 8930 } 8931 store == null ? void 0 : store.setActiveId(event.currentTarget.id); 8932 }); 8933 const onMouseLeaveProp = props.onMouseLeave; 8934 const blurOnHoverEndProp = useBooleanEvent(blurOnHoverEnd); 8935 const onMouseLeave = useEvent((event) => { 8936 var _a2; 8937 onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event); 8938 if (event.defaultPrevented) return; 8939 if (!isMouseMoving()) return; 8940 if (hoveringInside(event)) return; 8941 if (movingToAnotherItem(event)) return; 8942 if (!focusOnHoverProp(event)) return; 8943 if (!blurOnHoverEndProp(event)) return; 8944 store == null ? void 0 : store.setActiveId(null); 8945 (_a2 = store == null ? void 0 : store.getState().baseElement) == null ? void 0 : _a2.focus(); 8946 }); 8947 const ref = (0, import_react14.useCallback)((element) => { 8948 if (!element) return; 8949 element[symbol2] = true; 8950 }, []); 8951 props = __spreadProps(__spreadValues({}, props), { 8952 ref: useMergeRefs(ref, props.ref), 8953 onMouseMove, 8954 onMouseLeave 8955 }); 8956 return removeUndefinedValues(props); 8957 } 8958 ); 8959 var CompositeHover = memo22( 8960 forwardRef22(function CompositeHover2(props) { 8961 const htmlProps = useCompositeHover(props); 8962 return createElement2(TagName7, htmlProps); 8963 }) 8964 ); 8965 8966 // node_modules/@ariakit/react-core/esm/__chunks/RZ4GPYOB.js 8967 var import_react15 = __toESM(require_react(), 1); 8968 var TagName8 = "div"; 8969 var useCollectionItem = createHook( 8970 function useCollectionItem2(_a) { 8971 var _b = _a, { 8972 store, 8973 shouldRegisterItem = true, 8974 getItem = identity, 8975 element 8976 } = _b, props = __objRest(_b, [ 8977 "store", 8978 "shouldRegisterItem", 8979 "getItem", 8980 // @ts-expect-error This prop may come from a collection renderer. 8981 "element" 8982 ]); 8983 const context = useCollectionContext(); 8984 store = store || context; 8985 const id = useId3(props.id); 8986 const ref = (0, import_react15.useRef)(element); 8987 (0, import_react15.useEffect)(() => { 8988 const element2 = ref.current; 8989 if (!id) return; 8990 if (!element2) return; 8991 if (!shouldRegisterItem) return; 8992 const item = getItem({ id, element: element2 }); 8993 return store == null ? void 0 : store.renderItem(item); 8994 }, [id, shouldRegisterItem, getItem, store]); 8995 props = __spreadProps(__spreadValues({}, props), { 8996 ref: useMergeRefs(ref, props.ref) 8997 }); 8998 return removeUndefinedValues(props); 8999 } 9000 ); 9001 var CollectionItem = forwardRef22(function CollectionItem2(props) { 9002 const htmlProps = useCollectionItem(props); 9003 return createElement2(TagName8, htmlProps); 9004 }); 9005 9006 // node_modules/@ariakit/react-core/esm/__chunks/P2CTZE2T.js 9007 var import_react16 = __toESM(require_react(), 1); 9008 var import_jsx_runtime55 = __toESM(require_jsx_runtime(), 1); 9009 var TagName9 = "button"; 9010 function isEditableElement(element) { 9011 if (isTextbox(element)) return true; 9012 return element.tagName === "INPUT" && !isButton(element); 9013 } 9014 function getNextPageOffset(scrollingElement, pageUp = false) { 9015 const height = scrollingElement.clientHeight; 9016 const { top } = scrollingElement.getBoundingClientRect(); 9017 const pageSize = Math.max(height * 0.875, height - 40) * 1.5; 9018 const pageOffset = pageUp ? height - pageSize + top : pageSize + top; 9019 if (scrollingElement.tagName === "HTML") { 9020 return pageOffset + scrollingElement.scrollTop; 9021 } 9022 return pageOffset; 9023 } 9024 function getItemOffset(itemElement, pageUp = false) { 9025 const { top } = itemElement.getBoundingClientRect(); 9026 if (pageUp) { 9027 return top + itemElement.clientHeight; 9028 } 9029 return top; 9030 } 9031 function findNextPageItemId(element, store, next, pageUp = false) { 9032 var _a; 9033 if (!store) return; 9034 if (!next) return; 9035 const { renderedItems } = store.getState(); 9036 const scrollingElement = getScrollingElement(element); 9037 if (!scrollingElement) return; 9038 const nextPageOffset = getNextPageOffset(scrollingElement, pageUp); 9039 let id; 9040 let prevDifference; 9041 for (let i2 = 0; i2 < renderedItems.length; i2 += 1) { 9042 const previousId = id; 9043 id = next(i2); 9044 if (!id) break; 9045 if (id === previousId) continue; 9046 const itemElement = (_a = getEnabledItem(store, id)) == null ? void 0 : _a.element; 9047 if (!itemElement) continue; 9048 const itemOffset = getItemOffset(itemElement, pageUp); 9049 const difference = itemOffset - nextPageOffset; 9050 const absDifference = Math.abs(difference); 9051 if (pageUp && difference <= 0 || !pageUp && difference >= 0) { 9052 if (prevDifference !== void 0 && prevDifference < absDifference) { 9053 id = previousId; 9054 } 9055 break; 9056 } 9057 prevDifference = absDifference; 9058 } 9059 return id; 9060 } 9061 function targetIsAnotherItem(event, store) { 9062 if (isSelfTarget(event)) return false; 9063 return isItem(store, event.target); 9064 } 9065 var useCompositeItem = createHook( 9066 function useCompositeItem2(_a) { 9067 var _b = _a, { 9068 store, 9069 rowId: rowIdProp, 9070 preventScrollOnKeyDown = false, 9071 moveOnKeyPress = true, 9072 tabbable = false, 9073 getItem: getItemProp, 9074 "aria-setsize": ariaSetSizeProp, 9075 "aria-posinset": ariaPosInSetProp 9076 } = _b, props = __objRest(_b, [ 9077 "store", 9078 "rowId", 9079 "preventScrollOnKeyDown", 9080 "moveOnKeyPress", 9081 "tabbable", 9082 "getItem", 9083 "aria-setsize", 9084 "aria-posinset" 9085 ]); 9086 const context = useCompositeContext(); 9087 store = store || context; 9088 const id = useId3(props.id); 9089 const ref = (0, import_react16.useRef)(null); 9090 const row = (0, import_react16.useContext)(CompositeRowContext); 9091 const disabled = disabledFromProps(props); 9092 const trulyDisabled = disabled && !props.accessibleWhenDisabled; 9093 const { 9094 rowId, 9095 baseElement, 9096 isActiveItem, 9097 ariaSetSize, 9098 ariaPosInSet, 9099 isTabbable 9100 } = useStoreStateObject(store, { 9101 rowId(state) { 9102 if (rowIdProp) return rowIdProp; 9103 if (!state) return; 9104 if (!(row == null ? void 0 : row.baseElement)) return; 9105 if (row.baseElement !== state.baseElement) return; 9106 return row.id; 9107 }, 9108 baseElement(state) { 9109 return (state == null ? void 0 : state.baseElement) || void 0; 9110 }, 9111 isActiveItem(state) { 9112 return !!state && state.activeId === id; 9113 }, 9114 ariaSetSize(state) { 9115 if (ariaSetSizeProp != null) return ariaSetSizeProp; 9116 if (!state) return; 9117 if (!(row == null ? void 0 : row.ariaSetSize)) return; 9118 if (row.baseElement !== state.baseElement) return; 9119 return row.ariaSetSize; 9120 }, 9121 ariaPosInSet(state) { 9122 if (ariaPosInSetProp != null) return ariaPosInSetProp; 9123 if (!state) return; 9124 if (!(row == null ? void 0 : row.ariaPosInSet)) return; 9125 if (row.baseElement !== state.baseElement) return; 9126 const itemsInRow = state.renderedItems.filter( 9127 (item) => item.rowId === rowId 9128 ); 9129 return row.ariaPosInSet + itemsInRow.findIndex((item) => item.id === id); 9130 }, 9131 isTabbable(state) { 9132 if (!(state == null ? void 0 : state.renderedItems.length)) return true; 9133 if (state.virtualFocus) return false; 9134 if (tabbable) return true; 9135 if (state.activeId === null) return false; 9136 const item = store == null ? void 0 : store.item(state.activeId); 9137 if (item == null ? void 0 : item.disabled) return true; 9138 if (!(item == null ? void 0 : item.element)) return true; 9139 return state.activeId === id; 9140 } 9141 }); 9142 const getItem = (0, import_react16.useCallback)( 9143 (item) => { 9144 var _a2; 9145 const nextItem = __spreadProps(__spreadValues({}, item), { 9146 id: id || item.id, 9147 rowId, 9148 disabled: !!trulyDisabled, 9149 children: (_a2 = item.element) == null ? void 0 : _a2.textContent 9150 }); 9151 if (getItemProp) { 9152 return getItemProp(nextItem); 9153 } 9154 return nextItem; 9155 }, 9156 [id, rowId, trulyDisabled, getItemProp] 9157 ); 9158 const onFocusProp = props.onFocus; 9159 const hasFocusedComposite = (0, import_react16.useRef)(false); 9160 const onFocus = useEvent((event) => { 9161 onFocusProp == null ? void 0 : onFocusProp(event); 9162 if (event.defaultPrevented) return; 9163 if (isPortalEvent(event)) return; 9164 if (!id) return; 9165 if (!store) return; 9166 if (targetIsAnotherItem(event, store)) return; 9167 const { virtualFocus, baseElement: baseElement2 } = store.getState(); 9168 store.setActiveId(id); 9169 if (isTextbox(event.currentTarget)) { 9170 selectTextField(event.currentTarget); 9171 } 9172 if (!virtualFocus) return; 9173 if (!isSelfTarget(event)) return; 9174 if (isEditableElement(event.currentTarget)) return; 9175 if (!(baseElement2 == null ? void 0 : baseElement2.isConnected)) return; 9176 if (isSafari() && event.currentTarget.hasAttribute("data-autofocus")) { 9177 event.currentTarget.scrollIntoView({ 9178 block: "nearest", 9179 inline: "nearest" 9180 }); 9181 } 9182 hasFocusedComposite.current = true; 9183 const fromComposite = event.relatedTarget === baseElement2 || isItem(store, event.relatedTarget); 9184 if (fromComposite) { 9185 focusSilently(baseElement2); 9186 } else { 9187 baseElement2.focus(); 9188 } 9189 }); 9190 const onBlurCaptureProp = props.onBlurCapture; 9191 const onBlurCapture = useEvent((event) => { 9192 onBlurCaptureProp == null ? void 0 : onBlurCaptureProp(event); 9193 if (event.defaultPrevented) return; 9194 const state = store == null ? void 0 : store.getState(); 9195 if ((state == null ? void 0 : state.virtualFocus) && hasFocusedComposite.current) { 9196 hasFocusedComposite.current = false; 9197 event.preventDefault(); 9198 event.stopPropagation(); 9199 } 9200 }); 9201 const onKeyDownProp = props.onKeyDown; 9202 const preventScrollOnKeyDownProp = useBooleanEvent(preventScrollOnKeyDown); 9203 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); 9204 const onKeyDown = useEvent((event) => { 9205 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 9206 if (event.defaultPrevented) return; 9207 if (!isSelfTarget(event)) return; 9208 if (!store) return; 9209 const { currentTarget } = event; 9210 const state = store.getState(); 9211 const item = store.item(id); 9212 const isGrid2 = !!(item == null ? void 0 : item.rowId); 9213 const isVertical = state.orientation !== "horizontal"; 9214 const isHorizontal = state.orientation !== "vertical"; 9215 const canHomeEnd = () => { 9216 if (isGrid2) return true; 9217 if (isHorizontal) return true; 9218 if (!state.baseElement) return true; 9219 if (!isTextField(state.baseElement)) return true; 9220 return false; 9221 }; 9222 const keyMap = { 9223 ArrowUp: (isGrid2 || isVertical) && store.up, 9224 ArrowRight: (isGrid2 || isHorizontal) && store.next, 9225 ArrowDown: (isGrid2 || isVertical) && store.down, 9226 ArrowLeft: (isGrid2 || isHorizontal) && store.previous, 9227 Home: () => { 9228 if (!canHomeEnd()) return; 9229 if (!isGrid2 || event.ctrlKey) { 9230 return store == null ? void 0 : store.first(); 9231 } 9232 return store == null ? void 0 : store.previous(-1); 9233 }, 9234 End: () => { 9235 if (!canHomeEnd()) return; 9236 if (!isGrid2 || event.ctrlKey) { 9237 return store == null ? void 0 : store.last(); 9238 } 9239 return store == null ? void 0 : store.next(-1); 9240 }, 9241 PageUp: () => { 9242 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.up, true); 9243 }, 9244 PageDown: () => { 9245 return findNextPageItemId(currentTarget, store, store == null ? void 0 : store.down); 9246 } 9247 }; 9248 const action = keyMap[event.key]; 9249 if (action) { 9250 if (isTextbox(currentTarget)) { 9251 const selection = getTextboxSelection(currentTarget); 9252 const isLeft = isHorizontal && event.key === "ArrowLeft"; 9253 const isRight = isHorizontal && event.key === "ArrowRight"; 9254 const isUp = isVertical && event.key === "ArrowUp"; 9255 const isDown = isVertical && event.key === "ArrowDown"; 9256 if (isRight || isDown) { 9257 const { length: valueLength } = getTextboxValue(currentTarget); 9258 if (selection.end !== valueLength) return; 9259 } else if ((isLeft || isUp) && selection.start !== 0) return; 9260 } 9261 const nextId = action(); 9262 if (preventScrollOnKeyDownProp(event) || nextId !== void 0) { 9263 if (!moveOnKeyPressProp(event)) return; 9264 event.preventDefault(); 9265 store.move(nextId); 9266 } 9267 } 9268 }); 9269 const providerValue = (0, import_react16.useMemo)( 9270 () => ({ id, baseElement }), 9271 [id, baseElement] 9272 ); 9273 props = useWrapElement( 9274 props, 9275 (element) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(CompositeItemContext.Provider, { value: providerValue, children: element }), 9276 [providerValue] 9277 ); 9278 props = __spreadProps(__spreadValues({ 9279 id, 9280 "data-active-item": isActiveItem || void 0 9281 }, props), { 9282 ref: useMergeRefs(ref, props.ref), 9283 tabIndex: isTabbable ? props.tabIndex : -1, 9284 onFocus, 9285 onBlurCapture, 9286 onKeyDown 9287 }); 9288 props = useCommand(props); 9289 props = useCollectionItem(__spreadProps(__spreadValues({ 9290 store 9291 }, props), { 9292 getItem, 9293 shouldRegisterItem: id ? props.shouldRegisterItem : false 9294 })); 9295 return removeUndefinedValues(__spreadProps(__spreadValues({}, props), { 9296 "aria-setsize": ariaSetSize, 9297 "aria-posinset": ariaPosInSet 9298 })); 9299 } 9300 ); 9301 var CompositeItem = memo22( 9302 forwardRef22(function CompositeItem2(props) { 9303 const htmlProps = useCompositeItem(props); 9304 return createElement2(TagName9, htmlProps); 9305 }) 9306 ); 9307 9308 // node_modules/@ariakit/react-core/esm/__chunks/ZTDSJLD6.js 9309 var import_react17 = __toESM(require_react(), 1); 9310 var import_jsx_runtime56 = __toESM(require_jsx_runtime(), 1); 9311 var TagName10 = "div"; 9312 function isSelected(storeValue, itemValue) { 9313 if (itemValue == null) return; 9314 if (storeValue == null) return false; 9315 if (Array.isArray(storeValue)) { 9316 return storeValue.includes(itemValue); 9317 } 9318 return storeValue === itemValue; 9319 } 9320 function getItemRole(popupRole) { 9321 var _a; 9322 const itemRoleByPopupRole = { 9323 menu: "menuitem", 9324 listbox: "option", 9325 tree: "treeitem" 9326 }; 9327 const key = popupRole; 9328 return (_a = itemRoleByPopupRole[key]) != null ? _a : "option"; 9329 } 9330 var useComboboxItem = createHook( 9331 function useComboboxItem2(_a) { 9332 var _b = _a, { 9333 store, 9334 value, 9335 hideOnClick, 9336 setValueOnClick, 9337 selectValueOnClick = true, 9338 resetValueOnSelect, 9339 focusOnHover = false, 9340 moveOnKeyPress = true, 9341 getItem: getItemProp 9342 } = _b, props = __objRest(_b, [ 9343 "store", 9344 "value", 9345 "hideOnClick", 9346 "setValueOnClick", 9347 "selectValueOnClick", 9348 "resetValueOnSelect", 9349 "focusOnHover", 9350 "moveOnKeyPress", 9351 "getItem" 9352 ]); 9353 var _a2; 9354 const context = useComboboxScopedContext(); 9355 store = store || context; 9356 invariant( 9357 store, 9358 "ComboboxItem must be wrapped in a ComboboxList or ComboboxPopover component." 9359 ); 9360 const { resetValueOnSelectState, multiSelectable, selected } = useStoreStateObject(store, { 9361 resetValueOnSelectState: "resetValueOnSelect", 9362 multiSelectable(state) { 9363 return Array.isArray(state.selectedValue); 9364 }, 9365 selected(state) { 9366 return isSelected(state.selectedValue, value); 9367 } 9368 }); 9369 const getItem = (0, import_react17.useCallback)( 9370 (item) => { 9371 const nextItem = __spreadProps(__spreadValues({}, item), { value }); 9372 if (getItemProp) { 9373 return getItemProp(nextItem); 9374 } 9375 return nextItem; 9376 }, 9377 [value, getItemProp] 9378 ); 9379 setValueOnClick = setValueOnClick != null ? setValueOnClick : !multiSelectable; 9380 hideOnClick = hideOnClick != null ? hideOnClick : value != null && !multiSelectable; 9381 const onClickProp = props.onClick; 9382 const setValueOnClickProp = useBooleanEvent(setValueOnClick); 9383 const selectValueOnClickProp = useBooleanEvent(selectValueOnClick); 9384 const resetValueOnSelectProp = useBooleanEvent( 9385 (_a2 = resetValueOnSelect != null ? resetValueOnSelect : resetValueOnSelectState) != null ? _a2 : multiSelectable 9386 ); 9387 const hideOnClickProp = useBooleanEvent(hideOnClick); 9388 const onClick = useEvent((event) => { 9389 onClickProp == null ? void 0 : onClickProp(event); 9390 if (event.defaultPrevented) return; 9391 if (isDownloading(event)) return; 9392 if (isOpeningInNewTab(event)) return; 9393 if (value != null) { 9394 if (selectValueOnClickProp(event)) { 9395 if (resetValueOnSelectProp(event)) { 9396 store == null ? void 0 : store.resetValue(); 9397 } 9398 store == null ? void 0 : store.setSelectedValue((prevValue) => { 9399 if (!Array.isArray(prevValue)) return value; 9400 if (prevValue.includes(value)) { 9401 return prevValue.filter((v2) => v2 !== value); 9402 } 9403 return [...prevValue, value]; 9404 }); 9405 } 9406 if (setValueOnClickProp(event)) { 9407 store == null ? void 0 : store.setValue(value); 9408 } 9409 } 9410 if (hideOnClickProp(event)) { 9411 store == null ? void 0 : store.hide(); 9412 } 9413 }); 9414 const onKeyDownProp = props.onKeyDown; 9415 const onKeyDown = useEvent((event) => { 9416 onKeyDownProp == null ? void 0 : onKeyDownProp(event); 9417 if (event.defaultPrevented) return; 9418 const baseElement = store == null ? void 0 : store.getState().baseElement; 9419 if (!baseElement) return; 9420 if (hasFocus(baseElement)) return; 9421 const printable = event.key.length === 1; 9422 if (printable || event.key === "Backspace" || event.key === "Delete") { 9423 queueMicrotask(() => baseElement.focus()); 9424 if (isTextField(baseElement)) { 9425 store == null ? void 0 : store.setValue(baseElement.value); 9426 } 9427 } 9428 }); 9429 if (multiSelectable && selected != null) { 9430 props = __spreadValues({ 9431 "aria-selected": selected 9432 }, props); 9433 } 9434 props = useWrapElement( 9435 props, 9436 (element) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(ComboboxItemValueContext.Provider, { value, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(ComboboxItemCheckedContext.Provider, { value: selected != null ? selected : false, children: element }) }), 9437 [value, selected] 9438 ); 9439 const popupRole = (0, import_react17.useContext)(ComboboxListRoleContext); 9440 props = __spreadProps(__spreadValues({ 9441 role: getItemRole(popupRole), 9442 children: value 9443 }, props), { 9444 onClick, 9445 onKeyDown 9446 }); 9447 const moveOnKeyPressProp = useBooleanEvent(moveOnKeyPress); 9448 props = useCompositeItem(__spreadProps(__spreadValues({ 9449 store 9450 }, props), { 9451 getItem, 9452 // Dispatch a custom event on the combobox input when moving to an item 9453 // with the keyboard so the Combobox component can enable inline 9454 // autocompletion. 9455 moveOnKeyPress: (event) => { 9456 if (!moveOnKeyPressProp(event)) return false; 9457 const moveEvent = new Event("combobox-item-move"); 9458 const baseElement = store == null ? void 0 : store.getState().baseElement; 9459 baseElement == null ? void 0 : baseElement.dispatchEvent(moveEvent); 9460 return true; 9461 } 9462 })); 9463 props = useCompositeHover(__spreadValues({ store, focusOnHover }, props)); 9464 return props; 9465 } 9466 ); 9467 var ComboboxItem = memo22( 9468 forwardRef22(function ComboboxItem2(props) { 9469 const htmlProps = useComboboxItem(props); 9470 return createElement2(TagName10, htmlProps); 9471 }) 9472 ); 9473 9474 // node_modules/@ariakit/react-core/esm/combobox/combobox-label.js 9475 var TagName11 = "label"; 9476 var useComboboxLabel = createHook( 9477 function useComboboxLabel2(_a) { 9478 var _b = _a, { store } = _b, props = __objRest(_b, ["store"]); 9479 const context = useComboboxProviderContext(); 9480 store = store || context; 9481 invariant( 9482 store, 9483 "ComboboxLabel must receive a `store` prop or be wrapped in a ComboboxProvider component." 9484 ); 9485 const comboboxId = store.useState((state) => { 9486 var _a2; 9487 return (_a2 = state.baseElement) == null ? void 0 : _a2.id; 9488 }); 9489 props = __spreadValues({ 9490 htmlFor: comboboxId 9491 }, props); 9492 return removeUndefinedValues(props); 9493 } 9494 ); 9495 var ComboboxLabel = memo22( 9496 forwardRef22(function ComboboxLabel2(props) { 9497 const htmlProps = useComboboxLabel(props); 9498 return createElement2(TagName11, htmlProps); 9499 }) 9500 ); 9501 9502 // node_modules/@ariakit/react-core/esm/__chunks/VGCJ63VH.js 9503 var import_react18 = __toESM(require_react(), 1); 9504 var import_react_dom = __toESM(require_react_dom(), 1); 9505 var import_jsx_runtime57 = __toESM(require_jsx_runtime(), 1); 9506 var TagName12 = "div"; 9507 function afterTimeout(timeoutMs, cb) { 9508 const timeoutId = setTimeout(cb, timeoutMs); 9509 return () => clearTimeout(timeoutId); 9510 } 9511 function afterPaint2(cb) { 9512 let raf = requestAnimationFrame(() => { 9513 raf = requestAnimationFrame(cb); 9514 }); 9515 return () => cancelAnimationFrame(raf); 9516 } 9517 function parseCSSTime(...times) { 9518 return times.join(", ").split(", ").reduce((longestTime, currentTimeString) => { 9519 const multiplier = currentTimeString.endsWith("ms") ? 1 : 1e3; 9520 const currentTime = Number.parseFloat(currentTimeString || "0s") * multiplier; 9521 if (currentTime > longestTime) return currentTime; 9522 return longestTime; 9523 }, 0); 9524 } 9525 function isHidden(mounted, hidden, alwaysVisible) { 9526 return !alwaysVisible && hidden !== false && (!mounted || !!hidden); 9527 } 9528 var useDisclosureContent = createHook(function useDisclosureContent2(_a) { 9529 var _b = _a, { store, alwaysVisible } = _b, props = __objRest(_b, ["store", "alwaysVisible"]); 9530 const context = useDisclosureProviderContext(); 9531 store = store || context; 9532 invariant( 9533 store, 9534 "DisclosureContent must receive a `store` prop or be wrapped in a DisclosureProvider component." 9535 ); 9536 const ref = (0, import_react18.useRef)(null); 9537 const id = useId3(props.id); 9538 const [transition, setTransition] = (0, import_react18.useState)(null); 9539 const open = store.useState("open"); 9540 const mounted = store.useState("mounted"); 9541 const animated = store.useState("animated"); 9542 const contentElement = store.useState("contentElement"); 9543 const otherElement = useStoreState(store.disclosure, "contentElement"); 9544 useSafeLayoutEffect(() => { 9545 if (!ref.current) return; 9546 store == null ? void 0 : store.setContentElement(ref.current); 9547 }, [store]); 9548 useSafeLayoutEffect(() => { 9549 let previousAnimated; 9550 store == null ? void 0 : store.setState("animated", (animated2) => { 9551 previousAnimated = animated2; 9552 return true; 9553 }); 9554 return () => { 9555 if (previousAnimated === void 0) return; 9556 store == null ? void 0 : store.setState("animated", previousAnimated); 9557 }; 9558 }, [store]); 9559 useSafeLayoutEffect(() => { 9560 if (!animated) return; 9561 if (!(contentElement == null ? void 0 : contentElement.isConnected)) { 9562 setTransition(null); 9563 return; 9564 } 9565 return afterPaint2(() => { 9566 setTransition(open ? "enter" : mounted ? "leave" : null); 9567 }); 9568 }, [animated, contentElement, open, mounted]); 9569 useSafeLayoutEffect(() => { 9570 if (!store) return; 9571 if (!animated) return; 9572 if (!transition) return; 9573 if (!contentElement) return; 9574 const stopAnimation = () => store == null ? void 0 : store.setState("animating", false); 9575 const stopAnimationSync = () => (0, import_react_dom.flushSync)(stopAnimation); 9576 if (transition === "leave" && open) return; 9577 if (transition === "enter" && !open) return; 9578 if (typeof animated === "number") { 9579 const timeout2 = animated; 9580 return afterTimeout(timeout2, stopAnimationSync); 9581 } 9582 const { 9583 transitionDuration, 9584 animationDuration, 9585 transitionDelay, 9586 animationDelay 9587 } = getComputedStyle(contentElement); 9588 const { 9589 transitionDuration: transitionDuration2 = "0", 9590 animationDuration: animationDuration2 = "0", 9591 transitionDelay: transitionDelay2 = "0", 9592 animationDelay: animationDelay2 = "0" 9593 } = otherElement ? getComputedStyle(otherElement) : {}; 9594 const delay = parseCSSTime( 9595 transitionDelay, 9596 animationDelay, 9597 transitionDelay2, 9598 animationDelay2 9599 ); 9600 const duration = parseCSSTime( 9601 transitionDuration, 9602 animationDuration, 9603 transitionDuration2, 9604 animationDuration2 9605 ); 9606 const timeout = delay + duration; 9607 if (!timeout) { 9608 if (transition === "enter") { 9609 store.setState("animated", false); 9610 } 9611 stopAnimation(); 9612 return; 9613 } 9614 const frameRate = 1e3 / 60; 9615 const maxTimeout = Math.max(timeout - frameRate, 0); 9616 return afterTimeout(maxTimeout, stopAnimationSync); 9617 }, [store, animated, contentElement, otherElement, open, transition]); 9618 props = useWrapElement( 9619 props, 9620 (element) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(DialogScopedContextProvider, { value: store, children: element }), 9621 [store] 9622 ); 9623 const hidden = isHidden(mounted, props.hidden, alwaysVisible); 9624 const styleProp = props.style; 9625 const style = (0, import_react18.useMemo)(() => { 9626 if (hidden) { 9627 return __spreadProps(__spreadValues({}, styleProp), { display: "none" }); 9628 } 9629 return styleProp; 9630 }, [hidden, styleProp]); 9631 props = __spreadProps(__spreadValues({ 9632 id, 9633 "data-open": open || void 0, 9634 "data-enter": transition === "enter" || void 0, 9635 "data-leave": transition === "leave" || void 0, 9636 hidden 9637 }, props), { 9638 ref: useMergeRefs(id ? store.setContentElement : null, ref, props.ref), 9639 style 9640 }); 9641 return removeUndefinedValues(props); 9642 }); 9643 var DisclosureContentImpl = forwardRef22(function DisclosureContentImpl2(props) { 9644 const htmlProps = useDisclosureContent(props); 9645 return createElement2(TagName12, htmlProps); 9646 }); 9647 var DisclosureContent = forwardRef22(function DisclosureContent2(_a) { 9648 var _b = _a, { 9649 unmountOnHide 9650 } = _b, props = __objRest(_b, [ 9651 "unmountOnHide" 9652 ]); 9653 const context = useDisclosureProviderContext(); 9654 const store = props.store || context; 9655 const mounted = useStoreState( 9656 store, 9657 (state) => !unmountOnHide || (state == null ? void 0 : state.mounted) 9658 ); 9659 if (mounted === false) return null; 9660 return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(DisclosureContentImpl, __spreadValues({}, props)); 9661 }); 9662 9663 // node_modules/@ariakit/react-core/esm/__chunks/HUWAI7RB.js 9664 var import_react19 = __toESM(require_react(), 1); 9665 var import_jsx_runtime58 = __toESM(require_jsx_runtime(), 1); 9666 var TagName13 = "div"; 9667 var useComboboxList = createHook( 9668 function useComboboxList2(_a) { 9669 var _b = _a, { store, alwaysVisible } = _b, props = __objRest(_b, ["store", "alwaysVisible"]); 9670 const scopedContext = useComboboxScopedContext(true); 9671 const context = useComboboxContext(); 9672 store = store || context; 9673 const scopedContextSameStore = !!store && store === scopedContext; 9674 invariant( 9675 store, 9676 "ComboboxList must receive a `store` prop or be wrapped in a ComboboxProvider component." 9677 ); 9678 const ref = (0, import_react19.useRef)(null); 9679 const id = useId3(props.id); 9680 const mounted = store.useState("mounted"); 9681 const hidden = isHidden(mounted, props.hidden, alwaysVisible); 9682 const style = hidden ? __spreadProps(__spreadValues({}, props.style), { display: "none" }) : props.style; 9683 const multiSelectable = store.useState( 9684 (state) => Array.isArray(state.selectedValue) 9685 ); 9686 const role = useAttribute(ref, "role", props.role); 9687 const isCompositeRole = role === "listbox" || role === "tree" || role === "grid"; 9688 const ariaMultiSelectable = isCompositeRole ? multiSelectable || void 0 : void 0; 9689 const [hasListboxInside, setHasListboxInside] = (0, import_react19.useState)(false); 9690 const contentElement = store.useState("contentElement"); 9691 useSafeLayoutEffect(() => { 9692 if (!mounted) return; 9693 const element = ref.current; 9694 if (!element) return; 9695 if (contentElement !== element) return; 9696 const callback = () => { 9697 setHasListboxInside(!!element.querySelector("[role='listbox']")); 9698 }; 9699 const observer = new MutationObserver(callback); 9700 observer.observe(element, { 9701 subtree: true, 9702 childList: true, 9703 attributeFilter: ["role"] 9704 }); 9705 callback(); 9706 return () => observer.disconnect(); 9707 }, [mounted, contentElement]); 9708 if (!hasListboxInside) { 9709 props = __spreadValues({ 9710 role: "listbox", 9711 "aria-multiselectable": ariaMultiSelectable 9712 }, props); 9713 } 9714 props = useWrapElement( 9715 props, 9716 (element) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(ComboboxScopedContextProvider, { value: store, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(ComboboxListRoleContext.Provider, { value: role, children: element }) }), 9717 [store, role] 9718 ); 9719 const setContentElement = id && (!scopedContext || !scopedContextSameStore) ? store.setContentElement : null; 9720 props = __spreadProps(__spreadValues({ 9721 id, 9722 hidden 9723 }, props), { 9724 ref: useMergeRefs(setContentElement, ref, props.ref), 9725 style 9726 }); 9727 return removeUndefinedValues(props); 9728 } 9729 ); 9730 var ComboboxList = forwardRef22(function ComboboxList2(props) { 9731 const htmlProps = useComboboxList(props); 9732 return createElement2(TagName13, htmlProps); 9733 }); 9734 9735 // packages/dataviews/build-module/components/dataviews-filters/search-widget.js 9736 var import_remove_accents = __toESM(require_remove_accents()); 9737 var import_compose7 = __toESM(require_compose()); 9738 var import_i18n27 = __toESM(require_i18n()); 9739 var import_element23 = __toESM(require_element()); 9740 var import_components21 = __toESM(require_components()); 9741 9742 // packages/dataviews/build-module/components/dataviews-filters/utils.js 9743 var EMPTY_ARRAY2 = []; 9744 var getCurrentValue = (filterDefinition, currentFilter) => { 9745 if (filterDefinition.singleSelection) { 9746 return currentFilter?.value; 9747 } 9748 if (Array.isArray(currentFilter?.value)) { 9749 return currentFilter.value; 9750 } 9751 if (!Array.isArray(currentFilter?.value) && !!currentFilter?.value) { 9752 return [currentFilter.value]; 9753 } 9754 return EMPTY_ARRAY2; 9755 }; 9756 9757 // packages/dataviews/build-module/hooks/use-elements.js 9758 var import_element22 = __toESM(require_element()); 9759 var EMPTY_ARRAY3 = []; 9760 function useElements({ 9761 elements, 9762 getElements 9763 }) { 9764 const staticElements = Array.isArray(elements) && elements.length > 0 ? elements : EMPTY_ARRAY3; 9765 const [records, setRecords] = (0, import_element22.useState)(staticElements); 9766 const [isLoading, setIsLoading] = (0, import_element22.useState)(false); 9767 (0, import_element22.useEffect)(() => { 9768 if (!getElements) { 9769 setRecords(staticElements); 9770 return; 9771 } 9772 let cancelled = false; 9773 setIsLoading(true); 9774 getElements().then((fetchedElements) => { 9775 if (!cancelled) { 9776 const dynamicElements = Array.isArray(fetchedElements) && fetchedElements.length > 0 ? fetchedElements : staticElements; 9777 setRecords(dynamicElements); 9778 } 9779 }).catch(() => { 9780 if (!cancelled) { 9781 setRecords(staticElements); 9782 } 9783 }).finally(() => { 9784 if (!cancelled) { 9785 setIsLoading(false); 9786 } 9787 }); 9788 return () => { 9789 cancelled = true; 9790 }; 9791 }, [getElements, staticElements]); 9792 return { 9793 elements: records, 9794 isLoading 9795 }; 9796 } 9797 9798 // packages/dataviews/build-module/components/dataviews-filters/search-widget.js 9799 var import_jsx_runtime59 = __toESM(require_jsx_runtime()); 9800 function normalizeSearchInput(input = "") { 9801 return (0, import_remove_accents.default)(input.trim().toLowerCase()); 9802 } 9803 var getNewValue = (filterDefinition, currentFilter, value) => { 9804 if (filterDefinition.singleSelection) { 9805 return value; 9806 } 9807 if (Array.isArray(currentFilter?.value)) { 9808 return currentFilter.value.includes(value) ? currentFilter.value.filter((v2) => v2 !== value) : [...currentFilter.value, value]; 9809 } 9810 return [value]; 9811 }; 9812 function generateFilterElementCompositeItemId(prefix, filterElementValue) { 9813 return `$prefix}-$filterElementValue}`; 9814 } 9815 var MultiSelectionOption = ({ selected }) => { 9816 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9817 "span", 9818 { 9819 className: clsx_default( 9820 "dataviews-filters__search-widget-listitem-multi-selection", 9821 { "is-selected": selected } 9822 ), 9823 children: selected && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components21.Icon, { icon: check_default }) 9824 } 9825 ); 9826 }; 9827 var SingleSelectionOption = ({ selected }) => { 9828 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9829 "span", 9830 { 9831 className: clsx_default( 9832 "dataviews-filters__search-widget-listitem-single-selection", 9833 { "is-selected": selected } 9834 ) 9835 } 9836 ); 9837 }; 9838 function ListBox({ view, filter, onChangeView }) { 9839 const baseId = (0, import_compose7.useInstanceId)(ListBox, "dataviews-filter-list-box"); 9840 const [activeCompositeId, setActiveCompositeId] = (0, import_element23.useState)( 9841 // When there are one or less operators, the first item is set as active 9842 // (by setting the initial `activeId` to `undefined`). 9843 // With 2 or more operators, the focus is moved on the operators control 9844 // (by setting the initial `activeId` to `null`), meaning that there won't 9845 // be an active item initially. Focus is then managed via the 9846 // `onFocusVisible` callback. 9847 filter.operators?.length === 1 ? void 0 : null 9848 ); 9849 const currentFilter = view.filters?.find( 9850 (f2) => f2.field === filter.field 9851 ); 9852 const currentValue = getCurrentValue(filter, currentFilter); 9853 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9854 import_components21.Composite, 9855 { 9856 virtualFocus: true, 9857 focusLoop: true, 9858 activeId: activeCompositeId, 9859 setActiveId: setActiveCompositeId, 9860 role: "listbox", 9861 className: "dataviews-filters__search-widget-listbox", 9862 "aria-label": (0, import_i18n27.sprintf)( 9863 /* translators: List of items for a filter. 1: Filter name. e.g.: "List of: Author". */ 9864 (0, import_i18n27.__)("List of: %1$s"), 9865 filter.name 9866 ), 9867 onFocusVisible: () => { 9868 if (!activeCompositeId && filter.elements.length) { 9869 setActiveCompositeId( 9870 generateFilterElementCompositeItemId( 9871 baseId, 9872 filter.elements[0].value 9873 ) 9874 ); 9875 } 9876 }, 9877 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components21.Composite.Typeahead, {}), 9878 children: filter.elements.map((element) => /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)( 9879 import_components21.Composite.Hover, 9880 { 9881 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9882 import_components21.Composite.Item, 9883 { 9884 id: generateFilterElementCompositeItemId( 9885 baseId, 9886 element.value 9887 ), 9888 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9889 "div", 9890 { 9891 "aria-label": element.label, 9892 role: "option", 9893 className: "dataviews-filters__search-widget-listitem" 9894 } 9895 ), 9896 onClick: () => { 9897 const newFilters = currentFilter ? [ 9898 ...(view.filters ?? []).map( 9899 (_filter) => { 9900 if (_filter.field === filter.field) { 9901 return { 9902 ..._filter, 9903 operator: currentFilter.operator || filter.operators[0], 9904 value: getNewValue( 9905 filter, 9906 currentFilter, 9907 element.value 9908 ) 9909 }; 9910 } 9911 return _filter; 9912 } 9913 ) 9914 ] : [ 9915 ...view.filters ?? [], 9916 { 9917 field: filter.field, 9918 operator: filter.operators[0], 9919 value: getNewValue( 9920 filter, 9921 currentFilter, 9922 element.value 9923 ) 9924 } 9925 ]; 9926 onChangeView({ 9927 ...view, 9928 page: 1, 9929 filters: newFilters 9930 }); 9931 } 9932 } 9933 ), 9934 children: [ 9935 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9936 SingleSelectionOption, 9937 { 9938 selected: currentValue === element.value 9939 } 9940 ), 9941 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 9942 MultiSelectionOption, 9943 { 9944 selected: currentValue.includes(element.value) 9945 } 9946 ), 9947 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { children: element.label }) 9948 ] 9949 }, 9950 element.value 9951 )) 9952 } 9953 ); 9954 } 9955 function ComboboxList22({ view, filter, onChangeView }) { 9956 const [searchValue, setSearchValue] = (0, import_element23.useState)(""); 9957 const deferredSearchValue = (0, import_element23.useDeferredValue)(searchValue); 9958 const currentFilter = view.filters?.find( 9959 (_filter) => _filter.field === filter.field 9960 ); 9961 const currentValue = getCurrentValue(filter, currentFilter); 9962 const matches = (0, import_element23.useMemo)(() => { 9963 const normalizedSearch = normalizeSearchInput(deferredSearchValue); 9964 return filter.elements.filter( 9965 (item) => normalizeSearchInput(item.label).includes(normalizedSearch) 9966 ); 9967 }, [filter.elements, deferredSearchValue]); 9968 return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)( 9969 ComboboxProvider, 9970 { 9971 selectedValue: currentValue, 9972 setSelectedValue: (value) => { 9973 const newFilters = currentFilter ? [ 9974 ...(view.filters ?? []).map((_filter) => { 9975 if (_filter.field === filter.field) { 9976 return { 9977 ..._filter, 9978 operator: currentFilter.operator || filter.operators[0], 9979 value 9980 }; 9981 } 9982 return _filter; 9983 }) 9984 ] : [ 9985 ...view.filters ?? [], 9986 { 9987 field: filter.field, 9988 operator: filter.operators[0], 9989 value 9990 } 9991 ]; 9992 onChangeView({ 9993 ...view, 9994 page: 1, 9995 filters: newFilters 9996 }); 9997 }, 9998 setValue: setSearchValue, 9999 children: [ 10000 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "dataviews-filters__search-widget-filter-combobox__wrapper", children: [ 10001 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 10002 ComboboxLabel, 10003 { 10004 render: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components21.VisuallyHidden, { children: (0, import_i18n27.__)("Search items") }), 10005 children: (0, import_i18n27.__)("Search items") 10006 } 10007 ), 10008 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 10009 Combobox, 10010 { 10011 autoSelect: "always", 10012 placeholder: (0, import_i18n27.__)("Search"), 10013 className: "dataviews-filters__search-widget-filter-combobox__input" 10014 } 10015 ), 10016 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-filters__search-widget-filter-combobox__icon", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components21.Icon, { icon: search_default }) }) 10017 ] }), 10018 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)( 10019 ComboboxList, 10020 { 10021 className: "dataviews-filters__search-widget-filter-combobox-list", 10022 alwaysVisible: true, 10023 children: [ 10024 matches.map((element) => { 10025 return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)( 10026 ComboboxItem, 10027 { 10028 resetValueOnSelect: false, 10029 value: element.value, 10030 className: "dataviews-filters__search-widget-listitem", 10031 hideOnClick: false, 10032 setValueOnClick: false, 10033 focusOnHover: true, 10034 children: [ 10035 filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 10036 SingleSelectionOption, 10037 { 10038 selected: currentValue === element.value 10039 } 10040 ), 10041 !filter.singleSelection && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 10042 MultiSelectionOption, 10043 { 10044 selected: currentValue.includes( 10045 element.value 10046 ) 10047 } 10048 ), 10049 /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("span", { children: [ 10050 /* @__PURE__ */ (0, import_jsx_runtime59.jsx)( 10051 ComboboxItemValue, 10052 { 10053 className: "dataviews-filters__search-widget-filter-combobox-item-value", 10054 value: element.label 10055 } 10056 ), 10057 !!element.description && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("span", { className: "dataviews-filters__search-widget-listitem-description", children: element.description }) 10058 ] }) 10059 ] 10060 }, 10061 element.value 10062 ); 10063 }), 10064 !matches.length && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("p", { children: (0, import_i18n27.__)("No results found") }) 10065 ] 10066 } 10067 ) 10068 ] 10069 } 10070 ); 10071 } 10072 function SearchWidget(props) { 10073 const { elements, isLoading } = useElements({ 10074 elements: props.filter.elements, 10075 getElements: props.filter.getElements 10076 }); 10077 if (isLoading) { 10078 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_components21.Spinner, {}) }); 10079 } 10080 if (elements.length === 0) { 10081 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "dataviews-filters__search-widget-no-elements", children: (0, import_i18n27.__)("No elements found") }); 10082 } 10083 const Widget = elements.length > 10 ? ComboboxList22 : ListBox; 10084 return /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Widget, { ...props, filter: { ...props.filter, elements } }); 10085 } 10086 10087 // packages/dataviews/build-module/components/dataviews-filters/input-widget.js 10088 var import_es6 = __toESM(require_es6()); 10089 var import_compose8 = __toESM(require_compose()); 10090 var import_element24 = __toESM(require_element()); 10091 var import_components22 = __toESM(require_components()); 10092 var import_jsx_runtime60 = __toESM(require_jsx_runtime()); 10093 function InputWidget({ 10094 filter, 10095 view, 10096 onChangeView, 10097 fields 10098 }) { 10099 const currentFilter = view.filters?.find( 10100 (f2) => f2.field === filter.field 10101 ); 10102 const currentValue = getCurrentValue(filter, currentFilter); 10103 const field = (0, import_element24.useMemo)(() => { 10104 const currentField = fields.find((f2) => f2.id === filter.field); 10105 if (currentField) { 10106 return { 10107 ...currentField, 10108 // Deactivate validation for filters. 10109 isValid: {}, 10110 // Configure getValue/setValue as if Item was a plain object. 10111 getValue: ({ item }) => item[currentField.id], 10112 setValue: ({ value }) => ({ 10113 [currentField.id]: value 10114 }) 10115 }; 10116 } 10117 return currentField; 10118 }, [fields, filter.field]); 10119 const data = (0, import_element24.useMemo)(() => { 10120 return (view.filters ?? []).reduce( 10121 (acc, activeFilter) => { 10122 acc[activeFilter.field] = activeFilter.value; 10123 return acc; 10124 }, 10125 {} 10126 ); 10127 }, [view.filters]); 10128 const handleChange = (0, import_compose8.useEvent)((updatedData) => { 10129 if (!field || !currentFilter) { 10130 return; 10131 } 10132 const nextValue = field.getValue({ item: updatedData }); 10133 if ((0, import_es6.default)(nextValue, currentValue)) { 10134 return; 10135 } 10136 onChangeView({ 10137 ...view, 10138 filters: (view.filters ?? []).map( 10139 (_filter) => _filter.field === filter.field ? { 10140 ..._filter, 10141 operator: currentFilter.operator || filter.operators[0], 10142 // Consider empty strings as undefined: 10143 // 10144 // - undefined as value means the filter is unset: the filter widget displays no value and the search returns all records 10145 // - empty string as value means "search empty string": returns only the records that have an empty string as value 10146 // 10147 // In practice, this means the filter will not be able to find an empty string as the value. 10148 value: nextValue === "" ? void 0 : nextValue 10149 } : _filter 10150 ) 10151 }); 10152 }); 10153 if (!field || !field.Edit || !currentFilter) { 10154 return null; 10155 } 10156 return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)( 10157 import_components22.Flex, 10158 { 10159 className: "dataviews-filters__user-input-widget", 10160 gap: 2.5, 10161 direction: "column", 10162 children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)( 10163 field.Edit, 10164 { 10165 hideLabelFromVision: true, 10166 data, 10167 field, 10168 operator: currentFilter.operator, 10169 onChange: handleChange 10170 } 10171 ) 10172 } 10173 ); 10174 } 10175 10176 // packages/dataviews/build-module/utils/operators.js 10177 var import_i18n28 = __toESM(require_i18n()); 10178 var import_element25 = __toESM(require_element()); 10179 var import_jsx_runtime61 = __toESM(require_jsx_runtime()); 10180 var filterTextWrappers = { 10181 Name: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "dataviews-filters__summary-filter-text-name" }), 10182 Value: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)("span", { className: "dataviews-filters__summary-filter-text-value" }) 10183 }; 10184 var OPERATORS = [ 10185 { 10186 name: OPERATOR_IS_ANY, 10187 /* translators: DataViews operator name */ 10188 label: (0, import_i18n28.__)("Includes"), 10189 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10190 (0, import_i18n28.sprintf)( 10191 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is any: Admin, Editor". */ 10192 (0, import_i18n28.__)("<Name>%1$s includes: </Name><Value>%2$s</Value>"), 10193 filter.name, 10194 activeElements.map((element) => element.label).join(", ") 10195 ), 10196 filterTextWrappers 10197 ), 10198 selection: "multi" 10199 }, 10200 { 10201 name: OPERATOR_IS_NONE, 10202 /* translators: DataViews operator name */ 10203 label: (0, import_i18n28.__)("Is none of"), 10204 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10205 (0, import_i18n28.sprintf)( 10206 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */ 10207 (0, import_i18n28.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"), 10208 filter.name, 10209 activeElements.map((element) => element.label).join(", ") 10210 ), 10211 filterTextWrappers 10212 ), 10213 selection: "multi" 10214 }, 10215 { 10216 name: OPERATOR_IS_ALL, 10217 /* translators: DataViews operator name */ 10218 label: (0, import_i18n28.__)("Includes all"), 10219 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10220 (0, import_i18n28.sprintf)( 10221 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author includes all: Admin, Editor". */ 10222 (0, import_i18n28.__)("<Name>%1$s includes all: </Name><Value>%2$s</Value>"), 10223 filter.name, 10224 activeElements.map((element) => element.label).join(", ") 10225 ), 10226 filterTextWrappers 10227 ), 10228 selection: "multi" 10229 }, 10230 { 10231 name: OPERATOR_IS_NOT_ALL, 10232 /* translators: DataViews operator name */ 10233 label: (0, import_i18n28.__)("Is none of"), 10234 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10235 (0, import_i18n28.sprintf)( 10236 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is none of: Admin, Editor". */ 10237 (0, import_i18n28.__)("<Name>%1$s is none of: </Name><Value>%2$s</Value>"), 10238 filter.name, 10239 activeElements.map((element) => element.label).join(", ") 10240 ), 10241 filterTextWrappers 10242 ), 10243 selection: "multi" 10244 }, 10245 { 10246 name: OPERATOR_BETWEEN, 10247 /* translators: DataViews operator name */ 10248 label: (0, import_i18n28.__)("Between (inc)"), 10249 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10250 (0, import_i18n28.sprintf)( 10251 /* 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". */ 10252 (0, import_i18n28.__)( 10253 "<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>" 10254 ), 10255 filter.name, 10256 activeElements[0].label[0], 10257 activeElements[0].label[1] 10258 ), 10259 filterTextWrappers 10260 ), 10261 selection: "custom" 10262 }, 10263 { 10264 name: OPERATOR_IN_THE_PAST, 10265 /* translators: DataViews operator name */ 10266 label: (0, import_i18n28.__)("In the past"), 10267 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10268 (0, import_i18n28.sprintf)( 10269 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is in the past: 7 days". */ 10270 (0, import_i18n28.__)( 10271 "<Name>%1$s is in the past: </Name><Value>%2$s</Value>" 10272 ), 10273 filter.name, 10274 `$activeElements[0].value.value} $activeElements[0].value.unit}` 10275 ), 10276 filterTextWrappers 10277 ), 10278 selection: "custom" 10279 }, 10280 { 10281 name: OPERATOR_OVER, 10282 /* translators: DataViews operator name */ 10283 label: (0, import_i18n28.__)("Over"), 10284 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10285 (0, import_i18n28.sprintf)( 10286 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "7 days"): "Date is over: 7 days". */ 10287 (0, import_i18n28.__)("<Name>%1$s is over: </Name><Value>%2$s</Value>"), 10288 filter.name, 10289 `$activeElements[0].value.value} $activeElements[0].value.unit}` 10290 ), 10291 filterTextWrappers 10292 ), 10293 selection: "custom" 10294 }, 10295 { 10296 name: OPERATOR_IS, 10297 /* translators: DataViews operator name */ 10298 label: (0, import_i18n28.__)("Is"), 10299 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10300 (0, import_i18n28.sprintf)( 10301 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is: Admin". */ 10302 (0, import_i18n28.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"), 10303 filter.name, 10304 activeElements[0].label 10305 ), 10306 filterTextWrappers 10307 ), 10308 selection: "single" 10309 }, 10310 { 10311 name: OPERATOR_IS_NOT, 10312 /* translators: DataViews operator name */ 10313 label: (0, import_i18n28.__)("Is not"), 10314 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10315 (0, import_i18n28.sprintf)( 10316 /* translators: 1: Filter name (e.g. "Author"). 2: Filter value (e.g. "Admin"): "Author is not: Admin". */ 10317 (0, import_i18n28.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"), 10318 filter.name, 10319 activeElements[0].label 10320 ), 10321 filterTextWrappers 10322 ), 10323 selection: "single" 10324 }, 10325 { 10326 name: OPERATOR_LESS_THAN, 10327 /* translators: DataViews operator name */ 10328 label: (0, import_i18n28.__)("Less than"), 10329 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10330 (0, import_i18n28.sprintf)( 10331 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than: 10". */ 10332 (0, import_i18n28.__)("<Name>%1$s is less than: </Name><Value>%2$s</Value>"), 10333 filter.name, 10334 activeElements[0].label 10335 ), 10336 filterTextWrappers 10337 ), 10338 selection: "single" 10339 }, 10340 { 10341 name: OPERATOR_GREATER_THAN, 10342 /* translators: DataViews operator name */ 10343 label: (0, import_i18n28.__)("Greater than"), 10344 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10345 (0, import_i18n28.sprintf)( 10346 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than: 10". */ 10347 (0, import_i18n28.__)( 10348 "<Name>%1$s is greater than: </Name><Value>%2$s</Value>" 10349 ), 10350 filter.name, 10351 activeElements[0].label 10352 ), 10353 filterTextWrappers 10354 ), 10355 selection: "single" 10356 }, 10357 { 10358 name: OPERATOR_LESS_THAN_OR_EQUAL, 10359 /* translators: DataViews operator name */ 10360 label: (0, import_i18n28.__)("Less than or equal"), 10361 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10362 (0, import_i18n28.sprintf)( 10363 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is less than or equal to: 10". */ 10364 (0, import_i18n28.__)( 10365 "<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>" 10366 ), 10367 filter.name, 10368 activeElements[0].label 10369 ), 10370 filterTextWrappers 10371 ), 10372 selection: "single" 10373 }, 10374 { 10375 name: OPERATOR_GREATER_THAN_OR_EQUAL, 10376 /* translators: DataViews operator name */ 10377 label: (0, import_i18n28.__)("Greater than or equal"), 10378 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10379 (0, import_i18n28.sprintf)( 10380 /* translators: 1: Filter name (e.g. "Count"). 2: Filter value (e.g. "10"): "Count is greater than or equal to: 10". */ 10381 (0, import_i18n28.__)( 10382 "<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>" 10383 ), 10384 filter.name, 10385 activeElements[0].label 10386 ), 10387 filterTextWrappers 10388 ), 10389 selection: "single" 10390 }, 10391 { 10392 name: OPERATOR_BEFORE, 10393 /* translators: DataViews operator name */ 10394 label: (0, import_i18n28.__)("Before"), 10395 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10396 (0, import_i18n28.sprintf)( 10397 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is before: 2024-01-01". */ 10398 (0, import_i18n28.__)("<Name>%1$s is before: </Name><Value>%2$s</Value>"), 10399 filter.name, 10400 activeElements[0].label 10401 ), 10402 filterTextWrappers 10403 ), 10404 selection: "single" 10405 }, 10406 { 10407 name: OPERATOR_AFTER, 10408 /* translators: DataViews operator name */ 10409 label: (0, import_i18n28.__)("After"), 10410 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10411 (0, import_i18n28.sprintf)( 10412 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is after: 2024-01-01". */ 10413 (0, import_i18n28.__)("<Name>%1$s is after: </Name><Value>%2$s</Value>"), 10414 filter.name, 10415 activeElements[0].label 10416 ), 10417 filterTextWrappers 10418 ), 10419 selection: "single" 10420 }, 10421 { 10422 name: OPERATOR_BEFORE_INC, 10423 /* translators: DataViews operator name */ 10424 label: (0, import_i18n28.__)("Before (inc)"), 10425 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10426 (0, import_i18n28.sprintf)( 10427 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or before: 2024-01-01". */ 10428 (0, import_i18n28.__)( 10429 "<Name>%1$s is on or before: </Name><Value>%2$s</Value>" 10430 ), 10431 filter.name, 10432 activeElements[0].label 10433 ), 10434 filterTextWrappers 10435 ), 10436 selection: "single" 10437 }, 10438 { 10439 name: OPERATOR_AFTER_INC, 10440 /* translators: DataViews operator name */ 10441 label: (0, import_i18n28.__)("After (inc)"), 10442 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10443 (0, import_i18n28.sprintf)( 10444 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is on or after: 2024-01-01". */ 10445 (0, import_i18n28.__)( 10446 "<Name>%1$s is on or after: </Name><Value>%2$s</Value>" 10447 ), 10448 filter.name, 10449 activeElements[0].label 10450 ), 10451 filterTextWrappers 10452 ), 10453 selection: "single" 10454 }, 10455 { 10456 name: OPERATOR_CONTAINS, 10457 /* translators: DataViews operator name */ 10458 label: (0, import_i18n28.__)("Contains"), 10459 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10460 (0, import_i18n28.sprintf)( 10461 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title contains: Hello". */ 10462 (0, import_i18n28.__)("<Name>%1$s contains: </Name><Value>%2$s</Value>"), 10463 filter.name, 10464 activeElements[0].label 10465 ), 10466 filterTextWrappers 10467 ), 10468 selection: "single" 10469 }, 10470 { 10471 name: OPERATOR_NOT_CONTAINS, 10472 /* translators: DataViews operator name */ 10473 label: (0, import_i18n28.__)("Doesn't contain"), 10474 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10475 (0, import_i18n28.sprintf)( 10476 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title doesn't contain: Hello". */ 10477 (0, import_i18n28.__)( 10478 "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>" 10479 ), 10480 filter.name, 10481 activeElements[0].label 10482 ), 10483 filterTextWrappers 10484 ), 10485 selection: "single" 10486 }, 10487 { 10488 name: OPERATOR_STARTS_WITH, 10489 /* translators: DataViews operator name */ 10490 label: (0, import_i18n28.__)("Starts with"), 10491 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10492 (0, import_i18n28.sprintf)( 10493 /* translators: 1: Filter name (e.g. "Title"). 2: Filter value (e.g. "Hello"): "Title starts with: Hello". */ 10494 (0, import_i18n28.__)("<Name>%1$s starts with: </Name><Value>%2$s</Value>"), 10495 filter.name, 10496 activeElements[0].label 10497 ), 10498 filterTextWrappers 10499 ), 10500 selection: "single" 10501 }, 10502 { 10503 name: OPERATOR_ON, 10504 /* translators: DataViews operator name */ 10505 label: (0, import_i18n28.__)("On"), 10506 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10507 (0, import_i18n28.sprintf)( 10508 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is: 2024-01-01". */ 10509 (0, import_i18n28.__)("<Name>%1$s is: </Name><Value>%2$s</Value>"), 10510 filter.name, 10511 activeElements[0].label 10512 ), 10513 filterTextWrappers 10514 ), 10515 selection: "single" 10516 }, 10517 { 10518 name: OPERATOR_NOT_ON, 10519 /* translators: DataViews operator name */ 10520 label: (0, import_i18n28.__)("Not on"), 10521 filterText: (filter, activeElements) => (0, import_element25.createInterpolateElement)( 10522 (0, import_i18n28.sprintf)( 10523 /* translators: 1: Filter name (e.g. "Date"). 2: Filter value (e.g. "2024-01-01"): "Date is not: 2024-01-01". */ 10524 (0, import_i18n28.__)("<Name>%1$s is not: </Name><Value>%2$s</Value>"), 10525 filter.name, 10526 activeElements[0].label 10527 ), 10528 filterTextWrappers 10529 ), 10530 selection: "single" 10531 } 10532 ]; 10533 var getOperatorByName = (name) => OPERATORS.find((op) => op.name === name); 10534 var getAllOperatorNames = () => OPERATORS.map((op) => op.name); 10535 var isSingleSelectionOperator = (name) => OPERATORS.filter((op) => op.selection === "single").some( 10536 (op) => op.name === name 10537 ); 10538 var isRegisteredOperator = (name) => OPERATORS.some((op) => op.name === name); 10539 10540 // packages/dataviews/build-module/components/dataviews-filters/filter.js 10541 var import_jsx_runtime62 = __toESM(require_jsx_runtime()); 10542 var ENTER = "Enter"; 10543 var SPACE = " "; 10544 var FilterText = ({ 10545 activeElements, 10546 filterInView, 10547 filter 10548 }) => { 10549 if (activeElements === void 0 || activeElements.length === 0) { 10550 return filter.name; 10551 } 10552 const operator = getOperatorByName(filterInView?.operator); 10553 if (operator !== void 0) { 10554 return operator.filterText(filter, activeElements); 10555 } 10556 return (0, import_i18n29.sprintf)( 10557 /* translators: 1: Filter name e.g.: "Unknown status for Author". */ 10558 (0, import_i18n29.__)("Unknown status for %1$s"), 10559 filter.name 10560 ); 10561 }; 10562 function OperatorSelector({ 10563 filter, 10564 view, 10565 onChangeView 10566 }) { 10567 const operatorOptions = filter.operators?.map((operator) => ({ 10568 value: operator, 10569 label: getOperatorByName(operator)?.label || operator 10570 })); 10571 const currentFilter = view.filters?.find( 10572 (_filter) => _filter.field === filter.field 10573 ); 10574 const value = currentFilter?.operator || filter.operators[0]; 10575 return operatorOptions.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)( 10576 import_components23.__experimentalHStack, 10577 { 10578 spacing: 2, 10579 justify: "flex-start", 10580 className: "dataviews-filters__summary-operators-container", 10581 children: [ 10582 /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_components23.FlexItem, { className: "dataviews-filters__summary-operators-filter-name", children: filter.name }), 10583 /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10584 import_components23.SelectControl, 10585 { 10586 className: "dataviews-filters__summary-operators-filter-select", 10587 label: (0, import_i18n29.__)("Conditions"), 10588 value, 10589 options: operatorOptions, 10590 onChange: (newValue) => { 10591 const newOperator = newValue; 10592 const currentOperator = currentFilter?.operator; 10593 const newFilters = currentFilter ? [ 10594 ...(view.filters ?? []).map( 10595 (_filter) => { 10596 if (_filter.field === filter.field) { 10597 const currentOpSelectionModel = getOperatorByName( 10598 currentOperator 10599 )?.selection; 10600 const newOpSelectionModel = getOperatorByName( 10601 newOperator 10602 )?.selection; 10603 const shouldResetValue = currentOpSelectionModel !== newOpSelectionModel || [ 10604 currentOpSelectionModel, 10605 newOpSelectionModel 10606 ].includes("custom"); 10607 return { 10608 ..._filter, 10609 value: shouldResetValue ? void 0 : _filter.value, 10610 operator: newOperator 10611 }; 10612 } 10613 return _filter; 10614 } 10615 ) 10616 ] : [ 10617 ...view.filters ?? [], 10618 { 10619 field: filter.field, 10620 operator: newOperator, 10621 value: void 0 10622 } 10623 ]; 10624 onChangeView({ 10625 ...view, 10626 page: 1, 10627 filters: newFilters 10628 }); 10629 }, 10630 size: "small", 10631 variant: "minimal", 10632 hideLabelFromVision: true 10633 } 10634 ) 10635 ] 10636 } 10637 ); 10638 } 10639 function Filter({ 10640 addFilterRef, 10641 openedFilter, 10642 fields, 10643 ...commonProps 10644 }) { 10645 const toggleRef = (0, import_element26.useRef)(null); 10646 const { filter, view, onChangeView } = commonProps; 10647 const filterInView = view.filters?.find( 10648 (f2) => f2.field === filter.field 10649 ); 10650 let activeElements = []; 10651 const field = (0, import_element26.useMemo)(() => { 10652 const currentField = fields.find((f2) => f2.id === filter.field); 10653 if (currentField) { 10654 return { 10655 ...currentField, 10656 // Configure getValue as if Item was a plain object. 10657 // See related input-widget.tsx 10658 getValue: ({ item }) => item[currentField.id] 10659 }; 10660 } 10661 return currentField; 10662 }, [fields, filter.field]); 10663 const { elements } = useElements({ 10664 elements: filter.elements, 10665 getElements: filter.getElements 10666 }); 10667 if (elements.length > 0) { 10668 activeElements = elements.filter((element) => { 10669 if (filter.singleSelection) { 10670 return element.value === filterInView?.value; 10671 } 10672 return filterInView?.value?.includes(element.value); 10673 }); 10674 } else if (Array.isArray(filterInView?.value)) { 10675 const label = filterInView.value.map((v2) => { 10676 const formattedValue = field?.getValueFormatted({ 10677 item: { [field.id]: v2 }, 10678 field 10679 }); 10680 return formattedValue || String(v2); 10681 }); 10682 activeElements = [ 10683 { 10684 value: filterInView.value, 10685 // @ts-ignore 10686 label 10687 } 10688 ]; 10689 } else if (typeof filterInView?.value === "object") { 10690 activeElements = [ 10691 { value: filterInView.value, label: filterInView.value } 10692 ]; 10693 } else if (filterInView?.value !== void 0) { 10694 const label = field !== void 0 ? field.getValueFormatted({ 10695 item: { [field.id]: filterInView.value }, 10696 field 10697 }) : String(filterInView.value); 10698 activeElements = [ 10699 { 10700 value: filterInView.value, 10701 label 10702 } 10703 ]; 10704 } 10705 const isPrimary = filter.isPrimary; 10706 const isLocked = filterInView?.isLocked; 10707 const hasValues = !isLocked && filterInView?.value !== void 0; 10708 const canResetOrRemove = !isLocked && (!isPrimary || hasValues); 10709 return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10710 import_components23.Dropdown, 10711 { 10712 defaultOpen: openedFilter === filter.field, 10713 contentClassName: "dataviews-filters__summary-popover", 10714 popoverProps: { placement: "bottom-start", role: "dialog" }, 10715 onClose: () => { 10716 toggleRef.current?.focus(); 10717 }, 10718 renderToggle: ({ isOpen, onToggle }) => /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)("div", { className: "dataviews-filters__summary-chip-container", children: [ 10719 /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10720 import_components23.Tooltip, 10721 { 10722 text: (0, import_i18n29.sprintf)( 10723 /* translators: 1: Filter name. */ 10724 (0, import_i18n29.__)("Filter by: %1$s"), 10725 filter.name.toLowerCase() 10726 ), 10727 placement: "top", 10728 children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10729 "div", 10730 { 10731 className: clsx_default( 10732 "dataviews-filters__summary-chip", 10733 { 10734 "has-reset": canResetOrRemove, 10735 "has-values": hasValues, 10736 "is-not-clickable": isLocked 10737 } 10738 ), 10739 role: "button", 10740 tabIndex: isLocked ? -1 : 0, 10741 onClick: () => { 10742 if (!isLocked) { 10743 onToggle(); 10744 } 10745 }, 10746 onKeyDown: (event) => { 10747 if (!isLocked && [ENTER, SPACE].includes(event.key)) { 10748 onToggle(); 10749 event.preventDefault(); 10750 } 10751 }, 10752 "aria-disabled": isLocked, 10753 "aria-pressed": isOpen, 10754 "aria-expanded": isOpen, 10755 ref: toggleRef, 10756 children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10757 FilterText, 10758 { 10759 activeElements, 10760 filterInView, 10761 filter 10762 } 10763 ) 10764 } 10765 ) 10766 } 10767 ), 10768 canResetOrRemove && /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10769 import_components23.Tooltip, 10770 { 10771 text: isPrimary ? (0, import_i18n29.__)("Reset") : (0, import_i18n29.__)("Remove"), 10772 placement: "top", 10773 children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10774 "button", 10775 { 10776 className: clsx_default( 10777 "dataviews-filters__summary-chip-remove", 10778 { "has-values": hasValues } 10779 ), 10780 onClick: () => { 10781 onChangeView({ 10782 ...view, 10783 page: 1, 10784 filters: view.filters?.filter( 10785 (_filter) => _filter.field !== filter.field 10786 ) 10787 }); 10788 if (!isPrimary) { 10789 addFilterRef.current?.focus(); 10790 } else { 10791 toggleRef.current?.focus(); 10792 } 10793 }, 10794 children: /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_components23.Icon, { icon: close_small_default }) 10795 } 10796 ) 10797 } 10798 ) 10799 ] }), 10800 renderContent: () => { 10801 return /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_components23.__experimentalVStack, { spacing: 0, justify: "flex-start", children: [ 10802 /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(OperatorSelector, { ...commonProps }), 10803 commonProps.filter.hasElements ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)( 10804 SearchWidget, 10805 { 10806 ...commonProps, 10807 filter: { 10808 ...commonProps.filter, 10809 elements 10810 } 10811 } 10812 ) : /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(InputWidget, { ...commonProps, fields }) 10813 ] }); 10814 } 10815 } 10816 ); 10817 } 10818 10819 // packages/dataviews/build-module/components/dataviews-filters/add-filter.js 10820 var import_components24 = __toESM(require_components()); 10821 var import_i18n30 = __toESM(require_i18n()); 10822 var import_element27 = __toESM(require_element()); 10823 var import_jsx_runtime63 = __toESM(require_jsx_runtime()); 10824 var { Menu: Menu4 } = unlock(import_components24.privateApis); 10825 function AddFilterMenu({ 10826 filters, 10827 view, 10828 onChangeView, 10829 setOpenedFilter, 10830 triggerProps 10831 }) { 10832 const inactiveFilters = filters.filter((filter) => !filter.isVisible); 10833 return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(Menu4, { children: [ 10834 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Menu4.TriggerButton, { ...triggerProps }), 10835 /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Menu4.Popover, { children: inactiveFilters.map((filter) => { 10836 return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)( 10837 Menu4.Item, 10838 { 10839 onClick: () => { 10840 setOpenedFilter(filter.field); 10841 onChangeView({ 10842 ...view, 10843 page: 1, 10844 filters: [ 10845 ...view.filters || [], 10846 { 10847 field: filter.field, 10848 value: void 0, 10849 operator: filter.operators[0] 10850 } 10851 ] 10852 }); 10853 }, 10854 children: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(Menu4.ItemLabel, { children: filter.name }) 10855 }, 10856 filter.field 10857 ); 10858 }) }) 10859 ] }); 10860 } 10861 function AddFilter({ filters, view, onChangeView, setOpenedFilter }, ref) { 10862 if (!filters.length || filters.every(({ isPrimary }) => isPrimary)) { 10863 return null; 10864 } 10865 const inactiveFilters = filters.filter((filter) => !filter.isVisible); 10866 return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)( 10867 AddFilterMenu, 10868 { 10869 triggerProps: { 10870 render: /* @__PURE__ */ (0, import_jsx_runtime63.jsx)( 10871 import_components24.Button, 10872 { 10873 accessibleWhenDisabled: true, 10874 size: "compact", 10875 className: "dataviews-filters-button", 10876 variant: "tertiary", 10877 disabled: !inactiveFilters.length, 10878 ref 10879 } 10880 ), 10881 children: (0, import_i18n30.__)("Add filter") 10882 }, 10883 ...{ filters, view, onChangeView, setOpenedFilter } 10884 } 10885 ); 10886 } 10887 var add_filter_default = (0, import_element27.forwardRef)(AddFilter); 10888 10889 // packages/dataviews/build-module/components/dataviews-filters/reset-filters.js 10890 var import_components25 = __toESM(require_components()); 10891 var import_i18n31 = __toESM(require_i18n()); 10892 var import_jsx_runtime64 = __toESM(require_jsx_runtime()); 10893 function ResetFilter({ 10894 filters, 10895 view, 10896 onChangeView 10897 }) { 10898 const isPrimary = (field) => filters.some( 10899 (_filter) => _filter.field === field && _filter.isPrimary 10900 ); 10901 const isDisabled = !view.search && !view.filters?.some( 10902 (_filter) => !_filter.isLocked && (_filter.value !== void 0 || !isPrimary(_filter.field)) 10903 ); 10904 return /* @__PURE__ */ (0, import_jsx_runtime64.jsx)( 10905 import_components25.Button, 10906 { 10907 disabled: isDisabled, 10908 accessibleWhenDisabled: true, 10909 size: "compact", 10910 variant: "tertiary", 10911 className: "dataviews-filters__reset-button", 10912 onClick: () => { 10913 onChangeView({ 10914 ...view, 10915 page: 1, 10916 search: "", 10917 filters: view.filters?.filter((f2) => !!f2.isLocked) || [] 10918 }); 10919 }, 10920 children: (0, import_i18n31.__)("Reset") 10921 } 10922 ); 10923 } 10924 10925 // packages/dataviews/build-module/components/dataviews-filters/use-filters.js 10926 var import_element28 = __toESM(require_element()); 10927 function useFilters(fields, view) { 10928 return (0, import_element28.useMemo)(() => { 10929 const filters = []; 10930 fields.forEach((field) => { 10931 if (field.filterBy === false || !field.hasElements && !field.Edit) { 10932 return; 10933 } 10934 const operators = field.filterBy.operators; 10935 const isPrimary = !!field.filterBy?.isPrimary; 10936 const isLocked = view.filters?.some( 10937 (f2) => f2.field === field.id && !!f2.isLocked 10938 ) ?? false; 10939 filters.push({ 10940 field: field.id, 10941 name: field.label, 10942 elements: field.elements, 10943 getElements: field.getElements, 10944 hasElements: field.hasElements, 10945 singleSelection: operators.some( 10946 (op) => isSingleSelectionOperator(op) 10947 ), 10948 operators, 10949 isVisible: isLocked || isPrimary || !!view.filters?.some( 10950 (f2) => f2.field === field.id && isRegisteredOperator(f2.operator) 10951 ), 10952 isPrimary, 10953 isLocked 10954 }); 10955 }); 10956 filters.sort((a2, b2) => { 10957 if (a2.isLocked && !b2.isLocked) { 10958 return -1; 10959 } 10960 if (!a2.isLocked && b2.isLocked) { 10961 return 1; 10962 } 10963 if (a2.isPrimary && !b2.isPrimary) { 10964 return -1; 10965 } 10966 if (!a2.isPrimary && b2.isPrimary) { 10967 return 1; 10968 } 10969 return a2.name.localeCompare(b2.name); 10970 }); 10971 return filters; 10972 }, [fields, view]); 10973 } 10974 var use_filters_default = useFilters; 10975 10976 // packages/dataviews/build-module/components/dataviews-filters/filters.js 10977 var import_jsx_runtime65 = __toESM(require_jsx_runtime()); 10978 function Filters({ className }) { 10979 const { fields, view, onChangeView, openedFilter, setOpenedFilter } = (0, import_element29.useContext)(dataviews_context_default); 10980 const addFilterRef = (0, import_element29.useRef)(null); 10981 const filters = use_filters_default(fields, view); 10982 const addFilter = /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( 10983 add_filter_default, 10984 { 10985 filters, 10986 view, 10987 onChangeView, 10988 ref: addFilterRef, 10989 setOpenedFilter 10990 }, 10991 "add-filter" 10992 ); 10993 const visibleFilters = filters.filter((filter) => filter.isVisible); 10994 if (visibleFilters.length === 0) { 10995 return null; 10996 } 10997 const filterComponents = [ 10998 ...visibleFilters.map((filter) => { 10999 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( 11000 Filter, 11001 { 11002 filter, 11003 view, 11004 fields, 11005 onChangeView, 11006 addFilterRef, 11007 openedFilter 11008 }, 11009 filter.field 11010 ); 11011 }), 11012 addFilter 11013 ]; 11014 filterComponents.push( 11015 /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( 11016 ResetFilter, 11017 { 11018 filters, 11019 view, 11020 onChangeView 11021 }, 11022 "reset-filters" 11023 ) 11024 ); 11025 return /* @__PURE__ */ (0, import_jsx_runtime65.jsx)( 11026 import_components26.__experimentalHStack, 11027 { 11028 justify: "flex-start", 11029 style: { width: "fit-content" }, 11030 wrap: true, 11031 className, 11032 children: filterComponents 11033 } 11034 ); 11035 } 11036 var filters_default = (0, import_element29.memo)(Filters); 11037 11038 // packages/dataviews/build-module/components/dataviews-filters/toggle.js 11039 var import_element30 = __toESM(require_element()); 11040 var import_components27 = __toESM(require_components()); 11041 var import_i18n32 = __toESM(require_i18n()); 11042 var import_jsx_runtime66 = __toESM(require_jsx_runtime()); 11043 function FiltersToggle() { 11044 const { 11045 filters, 11046 view, 11047 onChangeView, 11048 setOpenedFilter, 11049 isShowingFilter, 11050 setIsShowingFilter 11051 } = (0, import_element30.useContext)(dataviews_context_default); 11052 const buttonRef = (0, import_element30.useRef)(null); 11053 const onChangeViewWithFilterVisibility = (0, import_element30.useCallback)( 11054 (_view) => { 11055 onChangeView(_view); 11056 setIsShowingFilter(true); 11057 }, 11058 [onChangeView, setIsShowingFilter] 11059 ); 11060 const visibleFilters = filters.filter((filter) => filter.isVisible); 11061 const hasVisibleFilters = !!visibleFilters.length; 11062 if (filters.length === 0) { 11063 return null; 11064 } 11065 const addFilterButtonProps = { 11066 label: (0, import_i18n32.__)("Add filter"), 11067 "aria-expanded": false, 11068 isPressed: false 11069 }; 11070 const toggleFiltersButtonProps = { 11071 label: (0, import_i18n32._x)("Filter", "verb"), 11072 "aria-expanded": isShowingFilter, 11073 isPressed: isShowingFilter, 11074 onClick: () => { 11075 if (!isShowingFilter) { 11076 setOpenedFilter(null); 11077 } 11078 setIsShowingFilter(!isShowingFilter); 11079 } 11080 }; 11081 const buttonComponent = /* @__PURE__ */ (0, import_jsx_runtime66.jsx)( 11082 import_components27.Button, 11083 { 11084 ref: buttonRef, 11085 className: "dataviews-filters__visibility-toggle", 11086 size: "compact", 11087 icon: funnel_default, 11088 ...hasVisibleFilters ? toggleFiltersButtonProps : addFilterButtonProps 11089 } 11090 ); 11091 return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "dataviews-filters__container-visibility-toggle", children: !hasVisibleFilters ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)( 11092 AddFilterMenu, 11093 { 11094 filters, 11095 view, 11096 onChangeView: onChangeViewWithFilterVisibility, 11097 setOpenedFilter, 11098 triggerProps: { render: buttonComponent } 11099 } 11100 ) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)( 11101 FilterVisibilityToggle, 11102 { 11103 buttonRef, 11104 filtersCount: view.filters?.length, 11105 children: buttonComponent 11106 } 11107 ) }); 11108 } 11109 function FilterVisibilityToggle({ 11110 buttonRef, 11111 filtersCount, 11112 children 11113 }) { 11114 (0, import_element30.useEffect)( 11115 () => () => { 11116 buttonRef.current?.focus(); 11117 }, 11118 [buttonRef] 11119 ); 11120 return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(import_jsx_runtime66.Fragment, { children: [ 11121 children, 11122 !!filtersCount && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "dataviews-filters-toggle__count", children: filtersCount }) 11123 ] }); 11124 } 11125 var toggle_default = FiltersToggle; 11126 11127 // packages/dataviews/build-module/components/dataviews-filters/filters-toggled.js 11128 var import_element31 = __toESM(require_element()); 11129 var import_jsx_runtime67 = __toESM(require_jsx_runtime()); 11130 function FiltersToggled(props) { 11131 const { isShowingFilter } = (0, import_element31.useContext)(dataviews_context_default); 11132 if (!isShowingFilter) { 11133 return null; 11134 } 11135 return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(filters_default, { ...props }); 11136 } 11137 var filters_toggled_default = FiltersToggled; 11138 11139 // packages/dataviews/build-module/components/dataviews-layout/index.js 11140 var import_element32 = __toESM(require_element()); 11141 var import_i18n33 = __toESM(require_i18n()); 11142 var import_jsx_runtime68 = __toESM(require_jsx_runtime()); 11143 function DataViewsLayout({ className }) { 11144 const { 11145 actions = [], 11146 data, 11147 fields, 11148 getItemId, 11149 getItemLevel, 11150 isLoading, 11151 view, 11152 onChangeView, 11153 selection, 11154 onChangeSelection, 11155 setOpenedFilter, 11156 onClickItem, 11157 isItemClickable: isItemClickable2, 11158 renderItemLink, 11159 defaultLayouts, 11160 empty = /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { children: (0, import_i18n33.__)("No results") }) 11161 } = (0, import_element32.useContext)(dataviews_context_default); 11162 const ViewComponent = VIEW_LAYOUTS.find( 11163 (v2) => v2.type === view.type && defaultLayouts[v2.type] 11164 )?.component; 11165 return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)( 11166 ViewComponent, 11167 { 11168 className, 11169 actions, 11170 data, 11171 fields, 11172 getItemId, 11173 getItemLevel, 11174 isLoading, 11175 onChangeView, 11176 onChangeSelection, 11177 selection, 11178 setOpenedFilter, 11179 onClickItem, 11180 renderItemLink, 11181 isItemClickable: isItemClickable2, 11182 view, 11183 empty 11184 } 11185 ); 11186 } 11187 11188 // packages/dataviews/build-module/components/dataviews-search/index.js 11189 var import_i18n34 = __toESM(require_i18n()); 11190 var import_element33 = __toESM(require_element()); 11191 var import_components28 = __toESM(require_components()); 11192 var import_compose9 = __toESM(require_compose()); 11193 var import_jsx_runtime69 = __toESM(require_jsx_runtime()); 11194 var DataViewsSearch = (0, import_element33.memo)(function Search({ label }) { 11195 const { view, onChangeView } = (0, import_element33.useContext)(dataviews_context_default); 11196 const [search, setSearch, debouncedSearch] = (0, import_compose9.useDebouncedInput)( 11197 view.search 11198 ); 11199 (0, import_element33.useEffect)(() => { 11200 setSearch(view.search ?? ""); 11201 }, [view.search, setSearch]); 11202 const onChangeViewRef = (0, import_element33.useRef)(onChangeView); 11203 const viewRef = (0, import_element33.useRef)(view); 11204 (0, import_element33.useEffect)(() => { 11205 onChangeViewRef.current = onChangeView; 11206 viewRef.current = view; 11207 }, [onChangeView, view]); 11208 (0, import_element33.useEffect)(() => { 11209 if (debouncedSearch !== viewRef.current?.search) { 11210 onChangeViewRef.current({ 11211 ...viewRef.current, 11212 page: 1, 11213 search: debouncedSearch 11214 }); 11215 } 11216 }, [debouncedSearch]); 11217 const searchLabel = label || (0, import_i18n34.__)("Search"); 11218 return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)( 11219 import_components28.SearchControl, 11220 { 11221 className: "dataviews-search", 11222 onChange: setSearch, 11223 value: search, 11224 label: searchLabel, 11225 placeholder: searchLabel, 11226 size: "compact" 11227 } 11228 ); 11229 }); 11230 var dataviews_search_default = DataViewsSearch; 11231 11232 // packages/dataviews/build-module/components/dataviews-view-config/index.js 11233 var import_components30 = __toESM(require_components()); 11234 var import_i18n36 = __toESM(require_i18n()); 11235 var import_element35 = __toESM(require_element()); 11236 var import_warning = __toESM(require_warning()); 11237 var import_compose10 = __toESM(require_compose()); 11238 11239 // packages/dataviews/build-module/components/dataviews-view-config/infinite-scroll-toggle.js 11240 var import_components29 = __toESM(require_components()); 11241 var import_i18n35 = __toESM(require_i18n()); 11242 var import_element34 = __toESM(require_element()); 11243 var import_jsx_runtime70 = __toESM(require_jsx_runtime()); 11244 function InfiniteScrollToggle() { 11245 const context = (0, import_element34.useContext)(dataviews_context_default); 11246 const { view, onChangeView } = context; 11247 const infiniteScrollEnabled = view.infiniteScrollEnabled ?? false; 11248 if (!context.hasInfiniteScrollHandler) { 11249 return null; 11250 } 11251 return /* @__PURE__ */ (0, import_jsx_runtime70.jsx)( 11252 import_components29.ToggleControl, 11253 { 11254 label: (0, import_i18n35.__)("Enable infinite scroll"), 11255 help: (0, import_i18n35.__)( 11256 "Automatically load more content as you scroll, instead of showing pagination links." 11257 ), 11258 checked: infiniteScrollEnabled, 11259 onChange: (newValue) => { 11260 onChangeView({ 11261 ...view, 11262 infiniteScrollEnabled: newValue 11263 }); 11264 } 11265 } 11266 ); 11267 } 11268 11269 // packages/dataviews/build-module/components/dataviews-view-config/index.js 11270 var import_jsx_runtime71 = __toESM(require_jsx_runtime()); 11271 var { Menu: Menu5 } = unlock(import_components30.privateApis); 11272 var DATAVIEWS_CONFIG_POPOVER_PROPS = { 11273 className: "dataviews-config__popover", 11274 placement: "bottom-end", 11275 offset: 9 11276 }; 11277 function ViewTypeMenu() { 11278 const { view, onChangeView, defaultLayouts } = (0, import_element35.useContext)(dataviews_context_default); 11279 const availableLayouts = Object.keys(defaultLayouts); 11280 if (availableLayouts.length <= 1) { 11281 return null; 11282 } 11283 const activeView = VIEW_LAYOUTS.find((v2) => view.type === v2.type); 11284 return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(Menu5, { children: [ 11285 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11286 Menu5.TriggerButton, 11287 { 11288 render: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11289 import_components30.Button, 11290 { 11291 size: "compact", 11292 icon: activeView?.icon, 11293 label: (0, import_i18n36.__)("Layout") 11294 } 11295 ) 11296 } 11297 ), 11298 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Menu5.Popover, { children: availableLayouts.map((layout) => { 11299 const config = VIEW_LAYOUTS.find( 11300 (v2) => v2.type === layout 11301 ); 11302 if (!config) { 11303 return null; 11304 } 11305 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11306 Menu5.RadioItem, 11307 { 11308 value: layout, 11309 name: "view-actions-available-view", 11310 checked: layout === view.type, 11311 hideOnClick: true, 11312 onChange: (e2) => { 11313 switch (e2.target.value) { 11314 case "list": 11315 case "grid": 11316 case "table": 11317 case "pickerGrid": 11318 case "pickerTable": 11319 case "activity": 11320 const viewWithoutLayout = { ...view }; 11321 if ("layout" in viewWithoutLayout) { 11322 delete viewWithoutLayout.layout; 11323 } 11324 return onChangeView({ 11325 ...viewWithoutLayout, 11326 type: e2.target.value, 11327 ...defaultLayouts[e2.target.value] 11328 }); 11329 } 11330 (0, import_warning.default)("Invalid dataview"); 11331 }, 11332 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(Menu5.ItemLabel, { children: config.label }) 11333 }, 11334 layout 11335 ); 11336 }) }) 11337 ] }); 11338 } 11339 function SortFieldControl() { 11340 const { view, fields, onChangeView } = (0, import_element35.useContext)(dataviews_context_default); 11341 const orderOptions = (0, import_element35.useMemo)(() => { 11342 const sortableFields = fields.filter( 11343 (field) => field.enableSorting !== false 11344 ); 11345 return sortableFields.map((field) => { 11346 return { 11347 label: field.label, 11348 value: field.id 11349 }; 11350 }); 11351 }, [fields]); 11352 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11353 import_components30.SelectControl, 11354 { 11355 __next40pxDefaultSize: true, 11356 label: (0, import_i18n36.__)("Sort by"), 11357 value: view.sort?.field, 11358 options: orderOptions, 11359 onChange: (value) => { 11360 onChangeView({ 11361 ...view, 11362 sort: { 11363 direction: view?.sort?.direction || "desc", 11364 field: value 11365 }, 11366 showLevels: false 11367 }); 11368 } 11369 } 11370 ); 11371 } 11372 function SortDirectionControl() { 11373 const { view, fields, onChangeView } = (0, import_element35.useContext)(dataviews_context_default); 11374 const sortableFields = fields.filter( 11375 (field) => field.enableSorting !== false 11376 ); 11377 if (sortableFields.length === 0) { 11378 return null; 11379 } 11380 let value = view.sort?.direction; 11381 if (!value && view.sort?.field) { 11382 value = "desc"; 11383 } 11384 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11385 import_components30.__experimentalToggleGroupControl, 11386 { 11387 className: "dataviews-view-config__sort-direction", 11388 __next40pxDefaultSize: true, 11389 isBlock: true, 11390 label: (0, import_i18n36.__)("Order"), 11391 value, 11392 onChange: (newDirection) => { 11393 if (newDirection === "asc" || newDirection === "desc") { 11394 onChangeView({ 11395 ...view, 11396 sort: { 11397 direction: newDirection, 11398 field: view.sort?.field || // If there is no field assigned as the sorting field assign the first sortable field. 11399 fields.find( 11400 (field) => field.enableSorting !== false 11401 )?.id || "" 11402 }, 11403 showLevels: false 11404 }); 11405 return; 11406 } 11407 (0, import_warning.default)("Invalid direction"); 11408 }, 11409 children: SORTING_DIRECTIONS.map((direction) => { 11410 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11411 import_components30.__experimentalToggleGroupControlOptionIcon, 11412 { 11413 value: direction, 11414 icon: sortIcons[direction], 11415 label: sortLabels[direction] 11416 }, 11417 direction 11418 ); 11419 }) 11420 } 11421 ); 11422 } 11423 function ItemsPerPageControl() { 11424 const { view, config, onChangeView } = (0, import_element35.useContext)(dataviews_context_default); 11425 const { infiniteScrollEnabled } = view; 11426 if (!config || !config.perPageSizes || config.perPageSizes.length < 2 || config.perPageSizes.length > 6 || infiniteScrollEnabled) { 11427 return null; 11428 } 11429 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11430 import_components30.__experimentalToggleGroupControl, 11431 { 11432 __next40pxDefaultSize: true, 11433 isBlock: true, 11434 label: (0, import_i18n36.__)("Items per page"), 11435 value: view.perPage || 10, 11436 disabled: !view?.sort?.field, 11437 onChange: (newItemsPerPage) => { 11438 const newItemsPerPageNumber = typeof newItemsPerPage === "number" || newItemsPerPage === void 0 ? newItemsPerPage : parseInt(newItemsPerPage, 10); 11439 onChangeView({ 11440 ...view, 11441 perPage: newItemsPerPageNumber, 11442 page: 1 11443 }); 11444 }, 11445 children: config.perPageSizes.map((value) => { 11446 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11447 import_components30.__experimentalToggleGroupControlOption, 11448 { 11449 value, 11450 label: value.toString() 11451 }, 11452 value 11453 ); 11454 }) 11455 } 11456 ); 11457 } 11458 function SettingsSection({ 11459 title, 11460 description, 11461 children 11462 }) { 11463 return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components30.__experimentalGrid, { columns: 12, className: "dataviews-settings-section", gap: 4, children: [ 11464 /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: "dataviews-settings-section__sidebar", children: [ 11465 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11466 import_components30.__experimentalHeading, 11467 { 11468 level: 2, 11469 className: "dataviews-settings-section__title", 11470 children: title 11471 } 11472 ), 11473 description && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11474 import_components30.__experimentalText, 11475 { 11476 variant: "muted", 11477 className: "dataviews-settings-section__description", 11478 children: description 11479 } 11480 ) 11481 ] }), 11482 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11483 import_components30.__experimentalGrid, 11484 { 11485 columns: 8, 11486 gap: 4, 11487 className: "dataviews-settings-section__content", 11488 children 11489 } 11490 ) 11491 ] }); 11492 } 11493 function DataviewsViewConfigDropdown() { 11494 const { view } = (0, import_element35.useContext)(dataviews_context_default); 11495 const popoverId = (0, import_compose10.useInstanceId)( 11496 _DataViewsViewConfig, 11497 "dataviews-view-config-dropdown" 11498 ); 11499 const activeLayout = VIEW_LAYOUTS.find( 11500 (layout) => layout.type === view.type 11501 ); 11502 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11503 import_components30.Dropdown, 11504 { 11505 expandOnMobile: true, 11506 popoverProps: { 11507 ...DATAVIEWS_CONFIG_POPOVER_PROPS, 11508 id: popoverId 11509 }, 11510 renderToggle: ({ onToggle, isOpen }) => { 11511 return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11512 import_components30.Button, 11513 { 11514 size: "compact", 11515 icon: cog_default, 11516 label: (0, import_i18n36._x)("View options", "View is used as a noun"), 11517 onClick: onToggle, 11518 "aria-expanded": isOpen ? "true" : "false", 11519 "aria-controls": popoverId 11520 } 11521 ); 11522 }, 11523 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)( 11524 import_components30.__experimentalDropdownContentWrapper, 11525 { 11526 paddingSize: "medium", 11527 className: "dataviews-config__popover-content-wrapper", 11528 children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_components30.__experimentalVStack, { className: "dataviews-view-config", spacing: 6, children: /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(SettingsSection, { title: (0, import_i18n36.__)("Appearance"), children: [ 11529 /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_components30.__experimentalHStack, { expanded: true, className: "is-divided-in-two", children: [ 11530 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(SortFieldControl, {}), 11531 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(SortDirectionControl, {}) 11532 ] }), 11533 !!activeLayout?.viewConfigOptions && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(activeLayout.viewConfigOptions, {}), 11534 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(InfiniteScrollToggle, {}), 11535 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ItemsPerPageControl, {}), 11536 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(PropertiesSection, {}) 11537 ] }) }) 11538 } 11539 ) 11540 } 11541 ); 11542 } 11543 function _DataViewsViewConfig() { 11544 return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [ 11545 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(ViewTypeMenu, {}), 11546 /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(DataviewsViewConfigDropdown, {}) 11547 ] }); 11548 } 11549 var DataViewsViewConfig = (0, import_element35.memo)(_DataViewsViewConfig); 11550 var dataviews_view_config_default = DataViewsViewConfig; 11551 11552 // packages/dataviews/build-module/dataform-controls/checkbox.js 11553 var import_components31 = __toESM(require_components()); 11554 var import_element36 = __toESM(require_element()); 11555 11556 // packages/dataviews/build-module/dataform-controls/utils/get-custom-validity.js 11557 function getCustomValidity(isValid2, validity) { 11558 let customValidity; 11559 if (isValid2?.required && validity?.required) { 11560 customValidity = validity?.required?.message ? validity.required : void 0; 11561 } else if (isValid2?.pattern && validity?.pattern) { 11562 customValidity = validity.pattern; 11563 } else if (isValid2?.min && validity?.min) { 11564 customValidity = validity.min; 11565 } else if (isValid2?.max && validity?.max) { 11566 customValidity = validity.max; 11567 } else if (isValid2?.minLength && validity?.minLength) { 11568 customValidity = validity.minLength; 11569 } else if (isValid2?.maxLength && validity?.maxLength) { 11570 customValidity = validity.maxLength; 11571 } else if (isValid2?.elements && validity?.elements) { 11572 customValidity = validity.elements; 11573 } else if (validity?.custom) { 11574 customValidity = validity.custom; 11575 } 11576 return customValidity; 11577 } 11578 11579 // packages/dataviews/build-module/dataform-controls/checkbox.js 11580 var import_jsx_runtime72 = __toESM(require_jsx_runtime()); 11581 var { ValidatedCheckboxControl } = unlock(import_components31.privateApis); 11582 function Checkbox({ 11583 field, 11584 onChange, 11585 data, 11586 hideLabelFromVision, 11587 validity 11588 }) { 11589 const { getValue, setValue, label, description, isValid: isValid2 } = field; 11590 const onChangeControl = (0, import_element36.useCallback)(() => { 11591 onChange( 11592 setValue({ item: data, value: !getValue({ item: data }) }) 11593 ); 11594 }, [data, getValue, onChange, setValue]); 11595 return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)( 11596 ValidatedCheckboxControl, 11597 { 11598 required: !!field.isValid?.required, 11599 customValidity: getCustomValidity(isValid2, validity), 11600 hidden: hideLabelFromVision, 11601 label, 11602 help: description, 11603 checked: getValue({ item: data }), 11604 onChange: onChangeControl 11605 } 11606 ); 11607 } 11608 11609 // packages/dataviews/node_modules/date-fns/constants.js 11610 var daysInYear = 365.2425; 11611 var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1e3; 11612 var minTime = -maxTime; 11613 var millisecondsInWeek = 6048e5; 11614 var millisecondsInDay = 864e5; 11615 var secondsInHour = 3600; 11616 var secondsInDay = secondsInHour * 24; 11617 var secondsInWeek = secondsInDay * 7; 11618 var secondsInYear = secondsInDay * daysInYear; 11619 var secondsInMonth = secondsInYear / 12; 11620 var secondsInQuarter = secondsInMonth * 3; 11621 var constructFromSymbol = Symbol.for("constructDateFrom"); 11622 11623 // packages/dataviews/node_modules/date-fns/constructFrom.js 11624 function constructFrom(date, value) { 11625 if (typeof date === "function") return date(value); 11626 if (date && typeof date === "object" && constructFromSymbol in date) 11627 return date[constructFromSymbol](value); 11628 if (date instanceof Date) return new date.constructor(value); 11629 return new Date(value); 11630 } 11631 11632 // packages/dataviews/node_modules/date-fns/toDate.js 11633 function toDate(argument, context) { 11634 return constructFrom(context || argument, argument); 11635 } 11636 11637 // packages/dataviews/node_modules/date-fns/addDays.js 11638 function addDays(date, amount, options) { 11639 const _date = toDate(date, options?.in); 11640 if (isNaN(amount)) return constructFrom(options?.in || date, NaN); 11641 if (!amount) return _date; 11642 _date.setDate(_date.getDate() + amount); 11643 return _date; 11644 } 11645 11646 // packages/dataviews/node_modules/date-fns/addMonths.js 11647 function addMonths(date, amount, options) { 11648 const _date = toDate(date, options?.in); 11649 if (isNaN(amount)) return constructFrom(options?.in || date, NaN); 11650 if (!amount) { 11651 return _date; 11652 } 11653 const dayOfMonth = _date.getDate(); 11654 const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime()); 11655 endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0); 11656 const daysInMonth = endOfDesiredMonth.getDate(); 11657 if (dayOfMonth >= daysInMonth) { 11658 return endOfDesiredMonth; 11659 } else { 11660 _date.setFullYear( 11661 endOfDesiredMonth.getFullYear(), 11662 endOfDesiredMonth.getMonth(), 11663 dayOfMonth 11664 ); 11665 return _date; 11666 } 11667 } 11668 11669 // packages/dataviews/node_modules/date-fns/_lib/defaultOptions.js 11670 var defaultOptions = {}; 11671 function getDefaultOptions() { 11672 return defaultOptions; 11673 } 11674 11675 // packages/dataviews/node_modules/date-fns/startOfWeek.js 11676 function startOfWeek(date, options) { 11677 const defaultOptions2 = getDefaultOptions(); 11678 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0; 11679 const _date = toDate(date, options?.in); 11680 const day = _date.getDay(); 11681 const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn; 11682 _date.setDate(_date.getDate() - diff); 11683 _date.setHours(0, 0, 0, 0); 11684 return _date; 11685 } 11686 11687 // packages/dataviews/node_modules/date-fns/startOfISOWeek.js 11688 function startOfISOWeek(date, options) { 11689 return startOfWeek(date, { ...options, weekStartsOn: 1 }); 11690 } 11691 11692 // packages/dataviews/node_modules/date-fns/getISOWeekYear.js 11693 function getISOWeekYear(date, options) { 11694 const _date = toDate(date, options?.in); 11695 const year = _date.getFullYear(); 11696 const fourthOfJanuaryOfNextYear = constructFrom(_date, 0); 11697 fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4); 11698 fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0); 11699 const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear); 11700 const fourthOfJanuaryOfThisYear = constructFrom(_date, 0); 11701 fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4); 11702 fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0); 11703 const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear); 11704 if (_date.getTime() >= startOfNextYear.getTime()) { 11705 return year + 1; 11706 } else if (_date.getTime() >= startOfThisYear.getTime()) { 11707 return year; 11708 } else { 11709 return year - 1; 11710 } 11711 } 11712 11713 // packages/dataviews/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js 11714 function getTimezoneOffsetInMilliseconds(date) { 11715 const _date = toDate(date); 11716 const utcDate = new Date( 11717 Date.UTC( 11718 _date.getFullYear(), 11719 _date.getMonth(), 11720 _date.getDate(), 11721 _date.getHours(), 11722 _date.getMinutes(), 11723 _date.getSeconds(), 11724 _date.getMilliseconds() 11725 ) 11726 ); 11727 utcDate.setUTCFullYear(_date.getFullYear()); 11728 return +date - +utcDate; 11729 } 11730 11731 // packages/dataviews/node_modules/date-fns/_lib/normalizeDates.js 11732 function normalizeDates(context, ...dates) { 11733 const normalize = constructFrom.bind( 11734 null, 11735 context || dates.find((date) => typeof date === "object") 11736 ); 11737 return dates.map(normalize); 11738 } 11739 11740 // packages/dataviews/node_modules/date-fns/startOfDay.js 11741 function startOfDay(date, options) { 11742 const _date = toDate(date, options?.in); 11743 _date.setHours(0, 0, 0, 0); 11744 return _date; 11745 } 11746 11747 // packages/dataviews/node_modules/date-fns/differenceInCalendarDays.js 11748 function differenceInCalendarDays(laterDate, earlierDate, options) { 11749 const [laterDate_, earlierDate_] = normalizeDates( 11750 options?.in, 11751 laterDate, 11752 earlierDate 11753 ); 11754 const laterStartOfDay = startOfDay(laterDate_); 11755 const earlierStartOfDay = startOfDay(earlierDate_); 11756 const laterTimestamp = +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay); 11757 const earlierTimestamp = +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay); 11758 return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay); 11759 } 11760 11761 // packages/dataviews/node_modules/date-fns/startOfISOWeekYear.js 11762 function startOfISOWeekYear(date, options) { 11763 const year = getISOWeekYear(date, options); 11764 const fourthOfJanuary = constructFrom(options?.in || date, 0); 11765 fourthOfJanuary.setFullYear(year, 0, 4); 11766 fourthOfJanuary.setHours(0, 0, 0, 0); 11767 return startOfISOWeek(fourthOfJanuary); 11768 } 11769 11770 // packages/dataviews/node_modules/date-fns/addYears.js 11771 function addYears(date, amount, options) { 11772 return addMonths(date, amount * 12, options); 11773 } 11774 11775 // packages/dataviews/node_modules/date-fns/isDate.js 11776 function isDate(value) { 11777 return value instanceof Date || typeof value === "object" && Object.prototype.toString.call(value) === "[object Date]"; 11778 } 11779 11780 // packages/dataviews/node_modules/date-fns/isValid.js 11781 function isValid(date) { 11782 return !(!isDate(date) && typeof date !== "number" || isNaN(+toDate(date))); 11783 } 11784 11785 // packages/dataviews/node_modules/date-fns/startOfMonth.js 11786 function startOfMonth(date, options) { 11787 const _date = toDate(date, options?.in); 11788 _date.setDate(1); 11789 _date.setHours(0, 0, 0, 0); 11790 return _date; 11791 } 11792 11793 // packages/dataviews/node_modules/date-fns/startOfYear.js 11794 function startOfYear(date, options) { 11795 const date_ = toDate(date, options?.in); 11796 date_.setFullYear(date_.getFullYear(), 0, 1); 11797 date_.setHours(0, 0, 0, 0); 11798 return date_; 11799 } 11800 11801 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatDistance.js 11802 var formatDistanceLocale = { 11803 lessThanXSeconds: { 11804 one: "less than a second", 11805 other: "less than {{count}} seconds" 11806 }, 11807 xSeconds: { 11808 one: "1 second", 11809 other: "{{count}} seconds" 11810 }, 11811 halfAMinute: "half a minute", 11812 lessThanXMinutes: { 11813 one: "less than a minute", 11814 other: "less than {{count}} minutes" 11815 }, 11816 xMinutes: { 11817 one: "1 minute", 11818 other: "{{count}} minutes" 11819 }, 11820 aboutXHours: { 11821 one: "about 1 hour", 11822 other: "about {{count}} hours" 11823 }, 11824 xHours: { 11825 one: "1 hour", 11826 other: "{{count}} hours" 11827 }, 11828 xDays: { 11829 one: "1 day", 11830 other: "{{count}} days" 11831 }, 11832 aboutXWeeks: { 11833 one: "about 1 week", 11834 other: "about {{count}} weeks" 11835 }, 11836 xWeeks: { 11837 one: "1 week", 11838 other: "{{count}} weeks" 11839 }, 11840 aboutXMonths: { 11841 one: "about 1 month", 11842 other: "about {{count}} months" 11843 }, 11844 xMonths: { 11845 one: "1 month", 11846 other: "{{count}} months" 11847 }, 11848 aboutXYears: { 11849 one: "about 1 year", 11850 other: "about {{count}} years" 11851 }, 11852 xYears: { 11853 one: "1 year", 11854 other: "{{count}} years" 11855 }, 11856 overXYears: { 11857 one: "over 1 year", 11858 other: "over {{count}} years" 11859 }, 11860 almostXYears: { 11861 one: "almost 1 year", 11862 other: "almost {{count}} years" 11863 } 11864 }; 11865 var formatDistance = (token, count, options) => { 11866 let result; 11867 const tokenValue = formatDistanceLocale[token]; 11868 if (typeof tokenValue === "string") { 11869 result = tokenValue; 11870 } else if (count === 1) { 11871 result = tokenValue.one; 11872 } else { 11873 result = tokenValue.other.replace("{{count}}", count.toString()); 11874 } 11875 if (options?.addSuffix) { 11876 if (options.comparison && options.comparison > 0) { 11877 return "in " + result; 11878 } else { 11879 return result + " ago"; 11880 } 11881 } 11882 return result; 11883 }; 11884 11885 // packages/dataviews/node_modules/date-fns/locale/_lib/buildFormatLongFn.js 11886 function buildFormatLongFn(args) { 11887 return (options = {}) => { 11888 const width = options.width ? String(options.width) : args.defaultWidth; 11889 const format6 = args.formats[width] || args.formats[args.defaultWidth]; 11890 return format6; 11891 }; 11892 } 11893 11894 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatLong.js 11895 var dateFormats = { 11896 full: "EEEE, MMMM do, y", 11897 long: "MMMM do, y", 11898 medium: "MMM d, y", 11899 short: "MM/dd/yyyy" 11900 }; 11901 var timeFormats = { 11902 full: "h:mm:ss a zzzz", 11903 long: "h:mm:ss a z", 11904 medium: "h:mm:ss a", 11905 short: "h:mm a" 11906 }; 11907 var dateTimeFormats = { 11908 full: "{{date}} 'at' {{time}}", 11909 long: "{{date}} 'at' {{time}}", 11910 medium: "{{date}}, {{time}}", 11911 short: "{{date}}, {{time}}" 11912 }; 11913 var formatLong = { 11914 date: buildFormatLongFn({ 11915 formats: dateFormats, 11916 defaultWidth: "full" 11917 }), 11918 time: buildFormatLongFn({ 11919 formats: timeFormats, 11920 defaultWidth: "full" 11921 }), 11922 dateTime: buildFormatLongFn({ 11923 formats: dateTimeFormats, 11924 defaultWidth: "full" 11925 }) 11926 }; 11927 11928 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/formatRelative.js 11929 var formatRelativeLocale = { 11930 lastWeek: "'last' eeee 'at' p", 11931 yesterday: "'yesterday at' p", 11932 today: "'today at' p", 11933 tomorrow: "'tomorrow at' p", 11934 nextWeek: "eeee 'at' p", 11935 other: "P" 11936 }; 11937 var formatRelative = (token, _date, _baseDate, _options) => formatRelativeLocale[token]; 11938 11939 // packages/dataviews/node_modules/date-fns/locale/_lib/buildLocalizeFn.js 11940 function buildLocalizeFn(args) { 11941 return (value, options) => { 11942 const context = options?.context ? String(options.context) : "standalone"; 11943 let valuesArray; 11944 if (context === "formatting" && args.formattingValues) { 11945 const defaultWidth = args.defaultFormattingWidth || args.defaultWidth; 11946 const width = options?.width ? String(options.width) : defaultWidth; 11947 valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth]; 11948 } else { 11949 const defaultWidth = args.defaultWidth; 11950 const width = options?.width ? String(options.width) : args.defaultWidth; 11951 valuesArray = args.values[width] || args.values[defaultWidth]; 11952 } 11953 const index = args.argumentCallback ? args.argumentCallback(value) : value; 11954 return valuesArray[index]; 11955 }; 11956 } 11957 11958 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/localize.js 11959 var eraValues = { 11960 narrow: ["B", "A"], 11961 abbreviated: ["BC", "AD"], 11962 wide: ["Before Christ", "Anno Domini"] 11963 }; 11964 var quarterValues = { 11965 narrow: ["1", "2", "3", "4"], 11966 abbreviated: ["Q1", "Q2", "Q3", "Q4"], 11967 wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"] 11968 }; 11969 var monthValues = { 11970 narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], 11971 abbreviated: [ 11972 "Jan", 11973 "Feb", 11974 "Mar", 11975 "Apr", 11976 "May", 11977 "Jun", 11978 "Jul", 11979 "Aug", 11980 "Sep", 11981 "Oct", 11982 "Nov", 11983 "Dec" 11984 ], 11985 wide: [ 11986 "January", 11987 "February", 11988 "March", 11989 "April", 11990 "May", 11991 "June", 11992 "July", 11993 "August", 11994 "September", 11995 "October", 11996 "November", 11997 "December" 11998 ] 11999 }; 12000 var dayValues = { 12001 narrow: ["S", "M", "T", "W", "T", "F", "S"], 12002 short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], 12003 abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], 12004 wide: [ 12005 "Sunday", 12006 "Monday", 12007 "Tuesday", 12008 "Wednesday", 12009 "Thursday", 12010 "Friday", 12011 "Saturday" 12012 ] 12013 }; 12014 var dayPeriodValues = { 12015 narrow: { 12016 am: "a", 12017 pm: "p", 12018 midnight: "mi", 12019 noon: "n", 12020 morning: "morning", 12021 afternoon: "afternoon", 12022 evening: "evening", 12023 night: "night" 12024 }, 12025 abbreviated: { 12026 am: "AM", 12027 pm: "PM", 12028 midnight: "midnight", 12029 noon: "noon", 12030 morning: "morning", 12031 afternoon: "afternoon", 12032 evening: "evening", 12033 night: "night" 12034 }, 12035 wide: { 12036 am: "a.m.", 12037 pm: "p.m.", 12038 midnight: "midnight", 12039 noon: "noon", 12040 morning: "morning", 12041 afternoon: "afternoon", 12042 evening: "evening", 12043 night: "night" 12044 } 12045 }; 12046 var formattingDayPeriodValues = { 12047 narrow: { 12048 am: "a", 12049 pm: "p", 12050 midnight: "mi", 12051 noon: "n", 12052 morning: "in the morning", 12053 afternoon: "in the afternoon", 12054 evening: "in the evening", 12055 night: "at night" 12056 }, 12057 abbreviated: { 12058 am: "AM", 12059 pm: "PM", 12060 midnight: "midnight", 12061 noon: "noon", 12062 morning: "in the morning", 12063 afternoon: "in the afternoon", 12064 evening: "in the evening", 12065 night: "at night" 12066 }, 12067 wide: { 12068 am: "a.m.", 12069 pm: "p.m.", 12070 midnight: "midnight", 12071 noon: "noon", 12072 morning: "in the morning", 12073 afternoon: "in the afternoon", 12074 evening: "in the evening", 12075 night: "at night" 12076 } 12077 }; 12078 var ordinalNumber = (dirtyNumber, _options) => { 12079 const number = Number(dirtyNumber); 12080 const rem100 = number % 100; 12081 if (rem100 > 20 || rem100 < 10) { 12082 switch (rem100 % 10) { 12083 case 1: 12084 return number + "st"; 12085 case 2: 12086 return number + "nd"; 12087 case 3: 12088 return number + "rd"; 12089 } 12090 } 12091 return number + "th"; 12092 }; 12093 var localize = { 12094 ordinalNumber, 12095 era: buildLocalizeFn({ 12096 values: eraValues, 12097 defaultWidth: "wide" 12098 }), 12099 quarter: buildLocalizeFn({ 12100 values: quarterValues, 12101 defaultWidth: "wide", 12102 argumentCallback: (quarter) => quarter - 1 12103 }), 12104 month: buildLocalizeFn({ 12105 values: monthValues, 12106 defaultWidth: "wide" 12107 }), 12108 day: buildLocalizeFn({ 12109 values: dayValues, 12110 defaultWidth: "wide" 12111 }), 12112 dayPeriod: buildLocalizeFn({ 12113 values: dayPeriodValues, 12114 defaultWidth: "wide", 12115 formattingValues: formattingDayPeriodValues, 12116 defaultFormattingWidth: "wide" 12117 }) 12118 }; 12119 12120 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchFn.js 12121 function buildMatchFn(args) { 12122 return (string, options = {}) => { 12123 const width = options.width; 12124 const matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth]; 12125 const matchResult = string.match(matchPattern); 12126 if (!matchResult) { 12127 return null; 12128 } 12129 const matchedString = matchResult[0]; 12130 const parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth]; 12131 const key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString)) : ( 12132 // [TODO] -- I challenge you to fix the type 12133 findKey(parsePatterns, (pattern) => pattern.test(matchedString)) 12134 ); 12135 let value; 12136 value = args.valueCallback ? args.valueCallback(key) : key; 12137 value = options.valueCallback ? ( 12138 // [TODO] -- I challenge you to fix the type 12139 options.valueCallback(value) 12140 ) : value; 12141 const rest = string.slice(matchedString.length); 12142 return { value, rest }; 12143 }; 12144 } 12145 function findKey(object, predicate) { 12146 for (const key in object) { 12147 if (Object.prototype.hasOwnProperty.call(object, key) && predicate(object[key])) { 12148 return key; 12149 } 12150 } 12151 return void 0; 12152 } 12153 function findIndex(array, predicate) { 12154 for (let key = 0; key < array.length; key++) { 12155 if (predicate(array[key])) { 12156 return key; 12157 } 12158 } 12159 return void 0; 12160 } 12161 12162 // packages/dataviews/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js 12163 function buildMatchPatternFn(args) { 12164 return (string, options = {}) => { 12165 const matchResult = string.match(args.matchPattern); 12166 if (!matchResult) return null; 12167 const matchedString = matchResult[0]; 12168 const parseResult = string.match(args.parsePattern); 12169 if (!parseResult) return null; 12170 let value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0]; 12171 value = options.valueCallback ? options.valueCallback(value) : value; 12172 const rest = string.slice(matchedString.length); 12173 return { value, rest }; 12174 }; 12175 } 12176 12177 // packages/dataviews/node_modules/date-fns/locale/en-US/_lib/match.js 12178 var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i; 12179 var parseOrdinalNumberPattern = /\d+/i; 12180 var matchEraPatterns = { 12181 narrow: /^(b|a)/i, 12182 abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i, 12183 wide: /^(before christ|before common era|anno domini|common era)/i 12184 }; 12185 var parseEraPatterns = { 12186 any: [/^b/i, /^(a|c)/i] 12187 }; 12188 var matchQuarterPatterns = { 12189 narrow: /^[1234]/i, 12190 abbreviated: /^q[1234]/i, 12191 wide: /^[1234](th|st|nd|rd)? quarter/i 12192 }; 12193 var parseQuarterPatterns = { 12194 any: [/1/i, /2/i, /3/i, /4/i] 12195 }; 12196 var matchMonthPatterns = { 12197 narrow: /^[jfmasond]/i, 12198 abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i, 12199 wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i 12200 }; 12201 var parseMonthPatterns = { 12202 narrow: [ 12203 /^j/i, 12204 /^f/i, 12205 /^m/i, 12206 /^a/i, 12207 /^m/i, 12208 /^j/i, 12209 /^j/i, 12210 /^a/i, 12211 /^s/i, 12212 /^o/i, 12213 /^n/i, 12214 /^d/i 12215 ], 12216 any: [ 12217 /^ja/i, 12218 /^f/i, 12219 /^mar/i, 12220 /^ap/i, 12221 /^may/i, 12222 /^jun/i, 12223 /^jul/i, 12224 /^au/i, 12225 /^s/i, 12226 /^o/i, 12227 /^n/i, 12228 /^d/i 12229 ] 12230 }; 12231 var matchDayPatterns = { 12232 narrow: /^[smtwf]/i, 12233 short: /^(su|mo|tu|we|th|fr|sa)/i, 12234 abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i, 12235 wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i 12236 }; 12237 var parseDayPatterns = { 12238 narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i], 12239 any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i] 12240 }; 12241 var matchDayPeriodPatterns = { 12242 narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i, 12243 any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i 12244 }; 12245 var parseDayPeriodPatterns = { 12246 any: { 12247 am: /^a/i, 12248 pm: /^p/i, 12249 midnight: /^mi/i, 12250 noon: /^no/i, 12251 morning: /morning/i, 12252 afternoon: /afternoon/i, 12253 evening: /evening/i, 12254 night: /night/i 12255 } 12256 }; 12257 var match = { 12258 ordinalNumber: buildMatchPatternFn({ 12259 matchPattern: matchOrdinalNumberPattern, 12260 parsePattern: parseOrdinalNumberPattern, 12261 valueCallback: (value) => parseInt(value, 10) 12262 }), 12263 era: buildMatchFn({ 12264 matchPatterns: matchEraPatterns, 12265 defaultMatchWidth: "wide", 12266 parsePatterns: parseEraPatterns, 12267 defaultParseWidth: "any" 12268 }), 12269 quarter: buildMatchFn({ 12270 matchPatterns: matchQuarterPatterns, 12271 defaultMatchWidth: "wide", 12272 parsePatterns: parseQuarterPatterns, 12273 defaultParseWidth: "any", 12274 valueCallback: (index) => index + 1 12275 }), 12276 month: buildMatchFn({ 12277 matchPatterns: matchMonthPatterns, 12278 defaultMatchWidth: "wide", 12279 parsePatterns: parseMonthPatterns, 12280 defaultParseWidth: "any" 12281 }), 12282 day: buildMatchFn({ 12283 matchPatterns: matchDayPatterns, 12284 defaultMatchWidth: "wide", 12285 parsePatterns: parseDayPatterns, 12286 defaultParseWidth: "any" 12287 }), 12288 dayPeriod: buildMatchFn({ 12289 matchPatterns: matchDayPeriodPatterns, 12290 defaultMatchWidth: "any", 12291 parsePatterns: parseDayPeriodPatterns, 12292 defaultParseWidth: "any" 12293 }) 12294 }; 12295 12296 // packages/dataviews/node_modules/date-fns/locale/en-US.js 12297 var enUS = { 12298 code: "en-US", 12299 formatDistance, 12300 formatLong, 12301 formatRelative, 12302 localize, 12303 match, 12304 options: { 12305 weekStartsOn: 0, 12306 firstWeekContainsDate: 1 12307 } 12308 }; 12309 12310 // packages/dataviews/node_modules/date-fns/getDayOfYear.js 12311 function getDayOfYear(date, options) { 12312 const _date = toDate(date, options?.in); 12313 const diff = differenceInCalendarDays(_date, startOfYear(_date)); 12314 const dayOfYear = diff + 1; 12315 return dayOfYear; 12316 } 12317 12318 // packages/dataviews/node_modules/date-fns/getISOWeek.js 12319 function getISOWeek(date, options) { 12320 const _date = toDate(date, options?.in); 12321 const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date); 12322 return Math.round(diff / millisecondsInWeek) + 1; 12323 } 12324 12325 // packages/dataviews/node_modules/date-fns/getWeekYear.js 12326 function getWeekYear(date, options) { 12327 const _date = toDate(date, options?.in); 12328 const year = _date.getFullYear(); 12329 const defaultOptions2 = getDefaultOptions(); 12330 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1; 12331 const firstWeekOfNextYear = constructFrom(options?.in || date, 0); 12332 firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate); 12333 firstWeekOfNextYear.setHours(0, 0, 0, 0); 12334 const startOfNextYear = startOfWeek(firstWeekOfNextYear, options); 12335 const firstWeekOfThisYear = constructFrom(options?.in || date, 0); 12336 firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate); 12337 firstWeekOfThisYear.setHours(0, 0, 0, 0); 12338 const startOfThisYear = startOfWeek(firstWeekOfThisYear, options); 12339 if (+_date >= +startOfNextYear) { 12340 return year + 1; 12341 } else if (+_date >= +startOfThisYear) { 12342 return year; 12343 } else { 12344 return year - 1; 12345 } 12346 } 12347 12348 // packages/dataviews/node_modules/date-fns/startOfWeekYear.js 12349 function startOfWeekYear(date, options) { 12350 const defaultOptions2 = getDefaultOptions(); 12351 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1; 12352 const year = getWeekYear(date, options); 12353 const firstWeek = constructFrom(options?.in || date, 0); 12354 firstWeek.setFullYear(year, 0, firstWeekContainsDate); 12355 firstWeek.setHours(0, 0, 0, 0); 12356 const _date = startOfWeek(firstWeek, options); 12357 return _date; 12358 } 12359 12360 // packages/dataviews/node_modules/date-fns/getWeek.js 12361 function getWeek(date, options) { 12362 const _date = toDate(date, options?.in); 12363 const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options); 12364 return Math.round(diff / millisecondsInWeek) + 1; 12365 } 12366 12367 // packages/dataviews/node_modules/date-fns/_lib/addLeadingZeros.js 12368 function addLeadingZeros(number, targetLength) { 12369 const sign = number < 0 ? "-" : ""; 12370 const output = Math.abs(number).toString().padStart(targetLength, "0"); 12371 return sign + output; 12372 } 12373 12374 // packages/dataviews/node_modules/date-fns/_lib/format/lightFormatters.js 12375 var lightFormatters = { 12376 // Year 12377 y(date, token) { 12378 const signedYear = date.getFullYear(); 12379 const year = signedYear > 0 ? signedYear : 1 - signedYear; 12380 return addLeadingZeros(token === "yy" ? year % 100 : year, token.length); 12381 }, 12382 // Month 12383 M(date, token) { 12384 const month = date.getMonth(); 12385 return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2); 12386 }, 12387 // Day of the month 12388 d(date, token) { 12389 return addLeadingZeros(date.getDate(), token.length); 12390 }, 12391 // AM or PM 12392 a(date, token) { 12393 const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am"; 12394 switch (token) { 12395 case "a": 12396 case "aa": 12397 return dayPeriodEnumValue.toUpperCase(); 12398 case "aaa": 12399 return dayPeriodEnumValue; 12400 case "aaaaa": 12401 return dayPeriodEnumValue[0]; 12402 case "aaaa": 12403 default: 12404 return dayPeriodEnumValue === "am" ? "a.m." : "p.m."; 12405 } 12406 }, 12407 // Hour [1-12] 12408 h(date, token) { 12409 return addLeadingZeros(date.getHours() % 12 || 12, token.length); 12410 }, 12411 // Hour [0-23] 12412 H(date, token) { 12413 return addLeadingZeros(date.getHours(), token.length); 12414 }, 12415 // Minute 12416 m(date, token) { 12417 return addLeadingZeros(date.getMinutes(), token.length); 12418 }, 12419 // Second 12420 s(date, token) { 12421 return addLeadingZeros(date.getSeconds(), token.length); 12422 }, 12423 // Fraction of second 12424 S(date, token) { 12425 const numberOfDigits = token.length; 12426 const milliseconds = date.getMilliseconds(); 12427 const fractionalSeconds = Math.trunc( 12428 milliseconds * Math.pow(10, numberOfDigits - 3) 12429 ); 12430 return addLeadingZeros(fractionalSeconds, token.length); 12431 } 12432 }; 12433 12434 // packages/dataviews/node_modules/date-fns/_lib/format/formatters.js 12435 var dayPeriodEnum = { 12436 am: "am", 12437 pm: "pm", 12438 midnight: "midnight", 12439 noon: "noon", 12440 morning: "morning", 12441 afternoon: "afternoon", 12442 evening: "evening", 12443 night: "night" 12444 }; 12445 var formatters = { 12446 // Era 12447 G: function(date, token, localize2) { 12448 const era = date.getFullYear() > 0 ? 1 : 0; 12449 switch (token) { 12450 // AD, BC 12451 case "G": 12452 case "GG": 12453 case "GGG": 12454 return localize2.era(era, { width: "abbreviated" }); 12455 // A, B 12456 case "GGGGG": 12457 return localize2.era(era, { width: "narrow" }); 12458 // Anno Domini, Before Christ 12459 case "GGGG": 12460 default: 12461 return localize2.era(era, { width: "wide" }); 12462 } 12463 }, 12464 // Year 12465 y: function(date, token, localize2) { 12466 if (token === "yo") { 12467 const signedYear = date.getFullYear(); 12468 const year = signedYear > 0 ? signedYear : 1 - signedYear; 12469 return localize2.ordinalNumber(year, { unit: "year" }); 12470 } 12471 return lightFormatters.y(date, token); 12472 }, 12473 // Local week-numbering year 12474 Y: function(date, token, localize2, options) { 12475 const signedWeekYear = getWeekYear(date, options); 12476 const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear; 12477 if (token === "YY") { 12478 const twoDigitYear = weekYear % 100; 12479 return addLeadingZeros(twoDigitYear, 2); 12480 } 12481 if (token === "Yo") { 12482 return localize2.ordinalNumber(weekYear, { unit: "year" }); 12483 } 12484 return addLeadingZeros(weekYear, token.length); 12485 }, 12486 // ISO week-numbering year 12487 R: function(date, token) { 12488 const isoWeekYear = getISOWeekYear(date); 12489 return addLeadingZeros(isoWeekYear, token.length); 12490 }, 12491 // Extended year. This is a single number designating the year of this calendar system. 12492 // The main difference between `y` and `u` localizers are B.C. years: 12493 // | Year | `y` | `u` | 12494 // |------|-----|-----| 12495 // | AC 1 | 1 | 1 | 12496 // | BC 1 | 1 | 0 | 12497 // | BC 2 | 2 | -1 | 12498 // Also `yy` always returns the last two digits of a year, 12499 // while `uu` pads single digit years to 2 characters and returns other years unchanged. 12500 u: function(date, token) { 12501 const year = date.getFullYear(); 12502 return addLeadingZeros(year, token.length); 12503 }, 12504 // Quarter 12505 Q: function(date, token, localize2) { 12506 const quarter = Math.ceil((date.getMonth() + 1) / 3); 12507 switch (token) { 12508 // 1, 2, 3, 4 12509 case "Q": 12510 return String(quarter); 12511 // 01, 02, 03, 04 12512 case "QQ": 12513 return addLeadingZeros(quarter, 2); 12514 // 1st, 2nd, 3rd, 4th 12515 case "Qo": 12516 return localize2.ordinalNumber(quarter, { unit: "quarter" }); 12517 // Q1, Q2, Q3, Q4 12518 case "QQQ": 12519 return localize2.quarter(quarter, { 12520 width: "abbreviated", 12521 context: "formatting" 12522 }); 12523 // 1, 2, 3, 4 (narrow quarter; could be not numerical) 12524 case "QQQQQ": 12525 return localize2.quarter(quarter, { 12526 width: "narrow", 12527 context: "formatting" 12528 }); 12529 // 1st quarter, 2nd quarter, ... 12530 case "QQQQ": 12531 default: 12532 return localize2.quarter(quarter, { 12533 width: "wide", 12534 context: "formatting" 12535 }); 12536 } 12537 }, 12538 // Stand-alone quarter 12539 q: function(date, token, localize2) { 12540 const quarter = Math.ceil((date.getMonth() + 1) / 3); 12541 switch (token) { 12542 // 1, 2, 3, 4 12543 case "q": 12544 return String(quarter); 12545 // 01, 02, 03, 04 12546 case "qq": 12547 return addLeadingZeros(quarter, 2); 12548 // 1st, 2nd, 3rd, 4th 12549 case "qo": 12550 return localize2.ordinalNumber(quarter, { unit: "quarter" }); 12551 // Q1, Q2, Q3, Q4 12552 case "qqq": 12553 return localize2.quarter(quarter, { 12554 width: "abbreviated", 12555 context: "standalone" 12556 }); 12557 // 1, 2, 3, 4 (narrow quarter; could be not numerical) 12558 case "qqqqq": 12559 return localize2.quarter(quarter, { 12560 width: "narrow", 12561 context: "standalone" 12562 }); 12563 // 1st quarter, 2nd quarter, ... 12564 case "qqqq": 12565 default: 12566 return localize2.quarter(quarter, { 12567 width: "wide", 12568 context: "standalone" 12569 }); 12570 } 12571 }, 12572 // Month 12573 M: function(date, token, localize2) { 12574 const month = date.getMonth(); 12575 switch (token) { 12576 case "M": 12577 case "MM": 12578 return lightFormatters.M(date, token); 12579 // 1st, 2nd, ..., 12th 12580 case "Mo": 12581 return localize2.ordinalNumber(month + 1, { unit: "month" }); 12582 // Jan, Feb, ..., Dec 12583 case "MMM": 12584 return localize2.month(month, { 12585 width: "abbreviated", 12586 context: "formatting" 12587 }); 12588 // J, F, ..., D 12589 case "MMMMM": 12590 return localize2.month(month, { 12591 width: "narrow", 12592 context: "formatting" 12593 }); 12594 // January, February, ..., December 12595 case "MMMM": 12596 default: 12597 return localize2.month(month, { width: "wide", context: "formatting" }); 12598 } 12599 }, 12600 // Stand-alone month 12601 L: function(date, token, localize2) { 12602 const month = date.getMonth(); 12603 switch (token) { 12604 // 1, 2, ..., 12 12605 case "L": 12606 return String(month + 1); 12607 // 01, 02, ..., 12 12608 case "LL": 12609 return addLeadingZeros(month + 1, 2); 12610 // 1st, 2nd, ..., 12th 12611 case "Lo": 12612 return localize2.ordinalNumber(month + 1, { unit: "month" }); 12613 // Jan, Feb, ..., Dec 12614 case "LLL": 12615 return localize2.month(month, { 12616 width: "abbreviated", 12617 context: "standalone" 12618 }); 12619 // J, F, ..., D 12620 case "LLLLL": 12621 return localize2.month(month, { 12622 width: "narrow", 12623 context: "standalone" 12624 }); 12625 // January, February, ..., December 12626 case "LLLL": 12627 default: 12628 return localize2.month(month, { width: "wide", context: "standalone" }); 12629 } 12630 }, 12631 // Local week of year 12632 w: function(date, token, localize2, options) { 12633 const week = getWeek(date, options); 12634 if (token === "wo") { 12635 return localize2.ordinalNumber(week, { unit: "week" }); 12636 } 12637 return addLeadingZeros(week, token.length); 12638 }, 12639 // ISO week of year 12640 I: function(date, token, localize2) { 12641 const isoWeek = getISOWeek(date); 12642 if (token === "Io") { 12643 return localize2.ordinalNumber(isoWeek, { unit: "week" }); 12644 } 12645 return addLeadingZeros(isoWeek, token.length); 12646 }, 12647 // Day of the month 12648 d: function(date, token, localize2) { 12649 if (token === "do") { 12650 return localize2.ordinalNumber(date.getDate(), { unit: "date" }); 12651 } 12652 return lightFormatters.d(date, token); 12653 }, 12654 // Day of year 12655 D: function(date, token, localize2) { 12656 const dayOfYear = getDayOfYear(date); 12657 if (token === "Do") { 12658 return localize2.ordinalNumber(dayOfYear, { unit: "dayOfYear" }); 12659 } 12660 return addLeadingZeros(dayOfYear, token.length); 12661 }, 12662 // Day of week 12663 E: function(date, token, localize2) { 12664 const dayOfWeek = date.getDay(); 12665 switch (token) { 12666 // Tue 12667 case "E": 12668 case "EE": 12669 case "EEE": 12670 return localize2.day(dayOfWeek, { 12671 width: "abbreviated", 12672 context: "formatting" 12673 }); 12674 // T 12675 case "EEEEE": 12676 return localize2.day(dayOfWeek, { 12677 width: "narrow", 12678 context: "formatting" 12679 }); 12680 // Tu 12681 case "EEEEEE": 12682 return localize2.day(dayOfWeek, { 12683 width: "short", 12684 context: "formatting" 12685 }); 12686 // Tuesday 12687 case "EEEE": 12688 default: 12689 return localize2.day(dayOfWeek, { 12690 width: "wide", 12691 context: "formatting" 12692 }); 12693 } 12694 }, 12695 // Local day of week 12696 e: function(date, token, localize2, options) { 12697 const dayOfWeek = date.getDay(); 12698 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; 12699 switch (token) { 12700 // Numerical value (Nth day of week with current locale or weekStartsOn) 12701 case "e": 12702 return String(localDayOfWeek); 12703 // Padded numerical value 12704 case "ee": 12705 return addLeadingZeros(localDayOfWeek, 2); 12706 // 1st, 2nd, ..., 7th 12707 case "eo": 12708 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" }); 12709 case "eee": 12710 return localize2.day(dayOfWeek, { 12711 width: "abbreviated", 12712 context: "formatting" 12713 }); 12714 // T 12715 case "eeeee": 12716 return localize2.day(dayOfWeek, { 12717 width: "narrow", 12718 context: "formatting" 12719 }); 12720 // Tu 12721 case "eeeeee": 12722 return localize2.day(dayOfWeek, { 12723 width: "short", 12724 context: "formatting" 12725 }); 12726 // Tuesday 12727 case "eeee": 12728 default: 12729 return localize2.day(dayOfWeek, { 12730 width: "wide", 12731 context: "formatting" 12732 }); 12733 } 12734 }, 12735 // Stand-alone local day of week 12736 c: function(date, token, localize2, options) { 12737 const dayOfWeek = date.getDay(); 12738 const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7; 12739 switch (token) { 12740 // Numerical value (same as in `e`) 12741 case "c": 12742 return String(localDayOfWeek); 12743 // Padded numerical value 12744 case "cc": 12745 return addLeadingZeros(localDayOfWeek, token.length); 12746 // 1st, 2nd, ..., 7th 12747 case "co": 12748 return localize2.ordinalNumber(localDayOfWeek, { unit: "day" }); 12749 case "ccc": 12750 return localize2.day(dayOfWeek, { 12751 width: "abbreviated", 12752 context: "standalone" 12753 }); 12754 // T 12755 case "ccccc": 12756 return localize2.day(dayOfWeek, { 12757 width: "narrow", 12758 context: "standalone" 12759 }); 12760 // Tu 12761 case "cccccc": 12762 return localize2.day(dayOfWeek, { 12763 width: "short", 12764 context: "standalone" 12765 }); 12766 // Tuesday 12767 case "cccc": 12768 default: 12769 return localize2.day(dayOfWeek, { 12770 width: "wide", 12771 context: "standalone" 12772 }); 12773 } 12774 }, 12775 // ISO day of week 12776 i: function(date, token, localize2) { 12777 const dayOfWeek = date.getDay(); 12778 const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek; 12779 switch (token) { 12780 // 2 12781 case "i": 12782 return String(isoDayOfWeek); 12783 // 02 12784 case "ii": 12785 return addLeadingZeros(isoDayOfWeek, token.length); 12786 // 2nd 12787 case "io": 12788 return localize2.ordinalNumber(isoDayOfWeek, { unit: "day" }); 12789 // Tue 12790 case "iii": 12791 return localize2.day(dayOfWeek, { 12792 width: "abbreviated", 12793 context: "formatting" 12794 }); 12795 // T 12796 case "iiiii": 12797 return localize2.day(dayOfWeek, { 12798 width: "narrow", 12799 context: "formatting" 12800 }); 12801 // Tu 12802 case "iiiiii": 12803 return localize2.day(dayOfWeek, { 12804 width: "short", 12805 context: "formatting" 12806 }); 12807 // Tuesday 12808 case "iiii": 12809 default: 12810 return localize2.day(dayOfWeek, { 12811 width: "wide", 12812 context: "formatting" 12813 }); 12814 } 12815 }, 12816 // AM or PM 12817 a: function(date, token, localize2) { 12818 const hours = date.getHours(); 12819 const dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am"; 12820 switch (token) { 12821 case "a": 12822 case "aa": 12823 return localize2.dayPeriod(dayPeriodEnumValue, { 12824 width: "abbreviated", 12825 context: "formatting" 12826 }); 12827 case "aaa": 12828 return localize2.dayPeriod(dayPeriodEnumValue, { 12829 width: "abbreviated", 12830 context: "formatting" 12831 }).toLowerCase(); 12832 case "aaaaa": 12833 return localize2.dayPeriod(dayPeriodEnumValue, { 12834 width: "narrow", 12835 context: "formatting" 12836 }); 12837 case "aaaa": 12838 default: 12839 return localize2.dayPeriod(dayPeriodEnumValue, { 12840 width: "wide", 12841 context: "formatting" 12842 }); 12843 } 12844 }, 12845 // AM, PM, midnight, noon 12846 b: function(date, token, localize2) { 12847 const hours = date.getHours(); 12848 let dayPeriodEnumValue; 12849 if (hours === 12) { 12850 dayPeriodEnumValue = dayPeriodEnum.noon; 12851 } else if (hours === 0) { 12852 dayPeriodEnumValue = dayPeriodEnum.midnight; 12853 } else { 12854 dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am"; 12855 } 12856 switch (token) { 12857 case "b": 12858 case "bb": 12859 return localize2.dayPeriod(dayPeriodEnumValue, { 12860 width: "abbreviated", 12861 context: "formatting" 12862 }); 12863 case "bbb": 12864 return localize2.dayPeriod(dayPeriodEnumValue, { 12865 width: "abbreviated", 12866 context: "formatting" 12867 }).toLowerCase(); 12868 case "bbbbb": 12869 return localize2.dayPeriod(dayPeriodEnumValue, { 12870 width: "narrow", 12871 context: "formatting" 12872 }); 12873 case "bbbb": 12874 default: 12875 return localize2.dayPeriod(dayPeriodEnumValue, { 12876 width: "wide", 12877 context: "formatting" 12878 }); 12879 } 12880 }, 12881 // in the morning, in the afternoon, in the evening, at night 12882 B: function(date, token, localize2) { 12883 const hours = date.getHours(); 12884 let dayPeriodEnumValue; 12885 if (hours >= 17) { 12886 dayPeriodEnumValue = dayPeriodEnum.evening; 12887 } else if (hours >= 12) { 12888 dayPeriodEnumValue = dayPeriodEnum.afternoon; 12889 } else if (hours >= 4) { 12890 dayPeriodEnumValue = dayPeriodEnum.morning; 12891 } else { 12892 dayPeriodEnumValue = dayPeriodEnum.night; 12893 } 12894 switch (token) { 12895 case "B": 12896 case "BB": 12897 case "BBB": 12898 return localize2.dayPeriod(dayPeriodEnumValue, { 12899 width: "abbreviated", 12900 context: "formatting" 12901 }); 12902 case "BBBBB": 12903 return localize2.dayPeriod(dayPeriodEnumValue, { 12904 width: "narrow", 12905 context: "formatting" 12906 }); 12907 case "BBBB": 12908 default: 12909 return localize2.dayPeriod(dayPeriodEnumValue, { 12910 width: "wide", 12911 context: "formatting" 12912 }); 12913 } 12914 }, 12915 // Hour [1-12] 12916 h: function(date, token, localize2) { 12917 if (token === "ho") { 12918 let hours = date.getHours() % 12; 12919 if (hours === 0) hours = 12; 12920 return localize2.ordinalNumber(hours, { unit: "hour" }); 12921 } 12922 return lightFormatters.h(date, token); 12923 }, 12924 // Hour [0-23] 12925 H: function(date, token, localize2) { 12926 if (token === "Ho") { 12927 return localize2.ordinalNumber(date.getHours(), { unit: "hour" }); 12928 } 12929 return lightFormatters.H(date, token); 12930 }, 12931 // Hour [0-11] 12932 K: function(date, token, localize2) { 12933 const hours = date.getHours() % 12; 12934 if (token === "Ko") { 12935 return localize2.ordinalNumber(hours, { unit: "hour" }); 12936 } 12937 return addLeadingZeros(hours, token.length); 12938 }, 12939 // Hour [1-24] 12940 k: function(date, token, localize2) { 12941 let hours = date.getHours(); 12942 if (hours === 0) hours = 24; 12943 if (token === "ko") { 12944 return localize2.ordinalNumber(hours, { unit: "hour" }); 12945 } 12946 return addLeadingZeros(hours, token.length); 12947 }, 12948 // Minute 12949 m: function(date, token, localize2) { 12950 if (token === "mo") { 12951 return localize2.ordinalNumber(date.getMinutes(), { unit: "minute" }); 12952 } 12953 return lightFormatters.m(date, token); 12954 }, 12955 // Second 12956 s: function(date, token, localize2) { 12957 if (token === "so") { 12958 return localize2.ordinalNumber(date.getSeconds(), { unit: "second" }); 12959 } 12960 return lightFormatters.s(date, token); 12961 }, 12962 // Fraction of second 12963 S: function(date, token) { 12964 return lightFormatters.S(date, token); 12965 }, 12966 // Timezone (ISO-8601. If offset is 0, output is always `'Z'`) 12967 X: function(date, token, _localize) { 12968 const timezoneOffset = date.getTimezoneOffset(); 12969 if (timezoneOffset === 0) { 12970 return "Z"; 12971 } 12972 switch (token) { 12973 // Hours and optional minutes 12974 case "X": 12975 return formatTimezoneWithOptionalMinutes(timezoneOffset); 12976 // Hours, minutes and optional seconds without `:` delimiter 12977 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 12978 // so this token always has the same output as `XX` 12979 case "XXXX": 12980 case "XX": 12981 return formatTimezone(timezoneOffset); 12982 // Hours, minutes and optional seconds with `:` delimiter 12983 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 12984 // so this token always has the same output as `XXX` 12985 case "XXXXX": 12986 case "XXX": 12987 // Hours and minutes with `:` delimiter 12988 default: 12989 return formatTimezone(timezoneOffset, ":"); 12990 } 12991 }, 12992 // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent) 12993 x: function(date, token, _localize) { 12994 const timezoneOffset = date.getTimezoneOffset(); 12995 switch (token) { 12996 // Hours and optional minutes 12997 case "x": 12998 return formatTimezoneWithOptionalMinutes(timezoneOffset); 12999 // Hours, minutes and optional seconds without `:` delimiter 13000 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 13001 // so this token always has the same output as `xx` 13002 case "xxxx": 13003 case "xx": 13004 return formatTimezone(timezoneOffset); 13005 // Hours, minutes and optional seconds with `:` delimiter 13006 // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets 13007 // so this token always has the same output as `xxx` 13008 case "xxxxx": 13009 case "xxx": 13010 // Hours and minutes with `:` delimiter 13011 default: 13012 return formatTimezone(timezoneOffset, ":"); 13013 } 13014 }, 13015 // Timezone (GMT) 13016 O: function(date, token, _localize) { 13017 const timezoneOffset = date.getTimezoneOffset(); 13018 switch (token) { 13019 // Short 13020 case "O": 13021 case "OO": 13022 case "OOO": 13023 return "GMT" + formatTimezoneShort(timezoneOffset, ":"); 13024 // Long 13025 case "OOOO": 13026 default: 13027 return "GMT" + formatTimezone(timezoneOffset, ":"); 13028 } 13029 }, 13030 // Timezone (specific non-location) 13031 z: function(date, token, _localize) { 13032 const timezoneOffset = date.getTimezoneOffset(); 13033 switch (token) { 13034 // Short 13035 case "z": 13036 case "zz": 13037 case "zzz": 13038 return "GMT" + formatTimezoneShort(timezoneOffset, ":"); 13039 // Long 13040 case "zzzz": 13041 default: 13042 return "GMT" + formatTimezone(timezoneOffset, ":"); 13043 } 13044 }, 13045 // Seconds timestamp 13046 t: function(date, token, _localize) { 13047 const timestamp = Math.trunc(+date / 1e3); 13048 return addLeadingZeros(timestamp, token.length); 13049 }, 13050 // Milliseconds timestamp 13051 T: function(date, token, _localize) { 13052 return addLeadingZeros(+date, token.length); 13053 } 13054 }; 13055 function formatTimezoneShort(offset, delimiter = "") { 13056 const sign = offset > 0 ? "-" : "+"; 13057 const absOffset = Math.abs(offset); 13058 const hours = Math.trunc(absOffset / 60); 13059 const minutes = absOffset % 60; 13060 if (minutes === 0) { 13061 return sign + String(hours); 13062 } 13063 return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2); 13064 } 13065 function formatTimezoneWithOptionalMinutes(offset, delimiter) { 13066 if (offset % 60 === 0) { 13067 const sign = offset > 0 ? "-" : "+"; 13068 return sign + addLeadingZeros(Math.abs(offset) / 60, 2); 13069 } 13070 return formatTimezone(offset, delimiter); 13071 } 13072 function formatTimezone(offset, delimiter = "") { 13073 const sign = offset > 0 ? "-" : "+"; 13074 const absOffset = Math.abs(offset); 13075 const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2); 13076 const minutes = addLeadingZeros(absOffset % 60, 2); 13077 return sign + hours + delimiter + minutes; 13078 } 13079 13080 // packages/dataviews/node_modules/date-fns/_lib/format/longFormatters.js 13081 var dateLongFormatter = (pattern, formatLong2) => { 13082 switch (pattern) { 13083 case "P": 13084 return formatLong2.date({ width: "short" }); 13085 case "PP": 13086 return formatLong2.date({ width: "medium" }); 13087 case "PPP": 13088 return formatLong2.date({ width: "long" }); 13089 case "PPPP": 13090 default: 13091 return formatLong2.date({ width: "full" }); 13092 } 13093 }; 13094 var timeLongFormatter = (pattern, formatLong2) => { 13095 switch (pattern) { 13096 case "p": 13097 return formatLong2.time({ width: "short" }); 13098 case "pp": 13099 return formatLong2.time({ width: "medium" }); 13100 case "ppp": 13101 return formatLong2.time({ width: "long" }); 13102 case "pppp": 13103 default: 13104 return formatLong2.time({ width: "full" }); 13105 } 13106 }; 13107 var dateTimeLongFormatter = (pattern, formatLong2) => { 13108 const matchResult = pattern.match(/(P+)(p+)?/) || []; 13109 const datePattern = matchResult[1]; 13110 const timePattern = matchResult[2]; 13111 if (!timePattern) { 13112 return dateLongFormatter(pattern, formatLong2); 13113 } 13114 let dateTimeFormat; 13115 switch (datePattern) { 13116 case "P": 13117 dateTimeFormat = formatLong2.dateTime({ width: "short" }); 13118 break; 13119 case "PP": 13120 dateTimeFormat = formatLong2.dateTime({ width: "medium" }); 13121 break; 13122 case "PPP": 13123 dateTimeFormat = formatLong2.dateTime({ width: "long" }); 13124 break; 13125 case "PPPP": 13126 default: 13127 dateTimeFormat = formatLong2.dateTime({ width: "full" }); 13128 break; 13129 } 13130 return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2)); 13131 }; 13132 var longFormatters = { 13133 p: timeLongFormatter, 13134 P: dateTimeLongFormatter 13135 }; 13136 13137 // packages/dataviews/node_modules/date-fns/_lib/protectedTokens.js 13138 var dayOfYearTokenRE = /^D+$/; 13139 var weekYearTokenRE = /^Y+$/; 13140 var throwTokens = ["D", "DD", "YY", "YYYY"]; 13141 function isProtectedDayOfYearToken(token) { 13142 return dayOfYearTokenRE.test(token); 13143 } 13144 function isProtectedWeekYearToken(token) { 13145 return weekYearTokenRE.test(token); 13146 } 13147 function warnOrThrowProtectedError(token, format6, input) { 13148 const _message = message(token, format6, input); 13149 console.warn(_message); 13150 if (throwTokens.includes(token)) throw new RangeError(_message); 13151 } 13152 function message(token, format6, input) { 13153 const subject = token[0] === "Y" ? "years" : "days of the month"; 13154 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`; 13155 } 13156 13157 // packages/dataviews/node_modules/date-fns/format.js 13158 var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g; 13159 var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g; 13160 var escapedStringRegExp = /^'([^]*?)'?$/; 13161 var doubleQuoteRegExp = /''/g; 13162 var unescapedLatinCharacterRegExp = /[a-zA-Z]/; 13163 function format(date, formatStr, options) { 13164 const defaultOptions2 = getDefaultOptions(); 13165 const locale = options?.locale ?? defaultOptions2.locale ?? enUS; 13166 const firstWeekContainsDate = options?.firstWeekContainsDate ?? options?.locale?.options?.firstWeekContainsDate ?? defaultOptions2.firstWeekContainsDate ?? defaultOptions2.locale?.options?.firstWeekContainsDate ?? 1; 13167 const weekStartsOn = options?.weekStartsOn ?? options?.locale?.options?.weekStartsOn ?? defaultOptions2.weekStartsOn ?? defaultOptions2.locale?.options?.weekStartsOn ?? 0; 13168 const originalDate = toDate(date, options?.in); 13169 if (!isValid(originalDate)) { 13170 throw new RangeError("Invalid time value"); 13171 } 13172 let parts = formatStr.match(longFormattingTokensRegExp).map((substring) => { 13173 const firstCharacter = substring[0]; 13174 if (firstCharacter === "p" || firstCharacter === "P") { 13175 const longFormatter = longFormatters[firstCharacter]; 13176 return longFormatter(substring, locale.formatLong); 13177 } 13178 return substring; 13179 }).join("").match(formattingTokensRegExp).map((substring) => { 13180 if (substring === "''") { 13181 return { isToken: false, value: "'" }; 13182 } 13183 const firstCharacter = substring[0]; 13184 if (firstCharacter === "'") { 13185 return { isToken: false, value: cleanEscapedString(substring) }; 13186 } 13187 if (formatters[firstCharacter]) { 13188 return { isToken: true, value: substring }; 13189 } 13190 if (firstCharacter.match(unescapedLatinCharacterRegExp)) { 13191 throw new RangeError( 13192 "Format string contains an unescaped latin alphabet character `" + firstCharacter + "`" 13193 ); 13194 } 13195 return { isToken: false, value: substring }; 13196 }); 13197 if (locale.localize.preprocessor) { 13198 parts = locale.localize.preprocessor(originalDate, parts); 13199 } 13200 const formatterOptions = { 13201 firstWeekContainsDate, 13202 weekStartsOn, 13203 locale 13204 }; 13205 return parts.map((part) => { 13206 if (!part.isToken) return part.value; 13207 const token = part.value; 13208 if (!options?.useAdditionalWeekYearTokens && isProtectedWeekYearToken(token) || !options?.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(token)) { 13209 warnOrThrowProtectedError(token, formatStr, String(date)); 13210 } 13211 const formatter = formatters[token[0]]; 13212 return formatter(originalDate, token, locale.localize, formatterOptions); 13213 }).join(""); 13214 } 13215 function cleanEscapedString(input) { 13216 const matched = input.match(escapedStringRegExp); 13217 if (!matched) { 13218 return input; 13219 } 13220 return matched[1].replace(doubleQuoteRegExp, "'"); 13221 } 13222 13223 // packages/dataviews/node_modules/date-fns/subDays.js 13224 function subDays(date, amount, options) { 13225 return addDays(date, -amount, options); 13226 } 13227 13228 // packages/dataviews/node_modules/date-fns/subMonths.js 13229 function subMonths(date, amount, options) { 13230 return addMonths(date, -amount, options); 13231 } 13232 13233 // packages/dataviews/node_modules/date-fns/subYears.js 13234 function subYears(date, amount, options) { 13235 return addYears(date, -amount, options); 13236 } 13237 13238 // packages/dataviews/build-module/dataform-controls/datetime.js 13239 var import_components33 = __toESM(require_components()); 13240 var import_element38 = __toESM(require_element()); 13241 var import_i18n38 = __toESM(require_i18n()); 13242 var import_date2 = __toESM(require_date()); 13243 13244 // packages/dataviews/build-module/dataform-controls/utils/relative-date-control.js 13245 var import_components32 = __toESM(require_components()); 13246 var import_element37 = __toESM(require_element()); 13247 var import_i18n37 = __toESM(require_i18n()); 13248 var import_jsx_runtime73 = __toESM(require_jsx_runtime()); 13249 var TIME_UNITS_OPTIONS = { 13250 [OPERATOR_IN_THE_PAST]: [ 13251 { value: "days", label: (0, import_i18n37.__)("Days") }, 13252 { value: "weeks", label: (0, import_i18n37.__)("Weeks") }, 13253 { value: "months", label: (0, import_i18n37.__)("Months") }, 13254 { value: "years", label: (0, import_i18n37.__)("Years") } 13255 ], 13256 [OPERATOR_OVER]: [ 13257 { value: "days", label: (0, import_i18n37.__)("Days ago") }, 13258 { value: "weeks", label: (0, import_i18n37.__)("Weeks ago") }, 13259 { value: "months", label: (0, import_i18n37.__)("Months ago") }, 13260 { value: "years", label: (0, import_i18n37.__)("Years ago") } 13261 ] 13262 }; 13263 function RelativeDateControl({ 13264 className, 13265 data, 13266 field, 13267 onChange, 13268 hideLabelFromVision, 13269 operator 13270 }) { 13271 const options = TIME_UNITS_OPTIONS[operator === OPERATOR_IN_THE_PAST ? "inThePast" : "over"]; 13272 const { id, label, getValue, setValue } = field; 13273 const fieldValue = getValue({ item: data }); 13274 const { value: relValue = "", unit = options[0].value } = fieldValue && typeof fieldValue === "object" ? fieldValue : {}; 13275 const onChangeValue = (0, import_element37.useCallback)( 13276 (newValue) => onChange( 13277 setValue({ 13278 item: data, 13279 value: { value: Number(newValue), unit } 13280 }) 13281 ), 13282 [onChange, setValue, data, unit] 13283 ); 13284 const onChangeUnit = (0, import_element37.useCallback)( 13285 (newUnit) => onChange( 13286 setValue({ 13287 item: data, 13288 value: { value: relValue, unit: newUnit } 13289 }) 13290 ), 13291 [onChange, setValue, data, relValue] 13292 ); 13293 return /* @__PURE__ */ (0, import_jsx_runtime73.jsx)( 13294 import_components32.BaseControl, 13295 { 13296 id, 13297 className: clsx_default(className, "dataviews-controls__relative-date"), 13298 label, 13299 hideLabelFromVision, 13300 children: /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(import_components32.__experimentalHStack, { spacing: 2.5, children: [ 13301 /* @__PURE__ */ (0, import_jsx_runtime73.jsx)( 13302 import_components32.__experimentalNumberControl, 13303 { 13304 __next40pxDefaultSize: true, 13305 className: "dataviews-controls__relative-date-number", 13306 spinControls: "none", 13307 min: 1, 13308 step: 1, 13309 value: relValue, 13310 onChange: onChangeValue 13311 } 13312 ), 13313 /* @__PURE__ */ (0, import_jsx_runtime73.jsx)( 13314 import_components32.SelectControl, 13315 { 13316 className: "dataviews-controls__relative-date-unit", 13317 __next40pxDefaultSize: true, 13318 label: (0, import_i18n37.__)("Unit"), 13319 value: unit, 13320 options, 13321 onChange: onChangeUnit, 13322 hideLabelFromVision: true 13323 } 13324 ) 13325 ] }) 13326 } 13327 ); 13328 } 13329 13330 // packages/dataviews/build-module/field-types/utils/parse-date-time.js 13331 var import_date = __toESM(require_date()); 13332 function parseDateTime(dateTimeString) { 13333 if (!dateTimeString) { 13334 return null; 13335 } 13336 const parsed = (0, import_date.getDate)(dateTimeString); 13337 return parsed && isValid(parsed) ? parsed : null; 13338 } 13339 13340 // packages/dataviews/build-module/dataform-controls/datetime.js 13341 var import_jsx_runtime74 = __toESM(require_jsx_runtime()); 13342 var { DateCalendar, ValidatedInputControl } = unlock(import_components33.privateApis); 13343 var formatDateTime = (date) => { 13344 if (!date) { 13345 return ""; 13346 } 13347 if (typeof date === "string") { 13348 return date; 13349 } 13350 return format(date, "yyyy-MM-dd'T'HH:mm"); 13351 }; 13352 function CalendarDateTimeControl({ 13353 data, 13354 field, 13355 onChange, 13356 hideLabelFromVision, 13357 validity 13358 }) { 13359 const { id, label, description, setValue, getValue, isValid: isValid2 } = field; 13360 const fieldValue = getValue({ item: data }); 13361 const value = typeof fieldValue === "string" ? fieldValue : void 0; 13362 const [calendarMonth, setCalendarMonth] = (0, import_element38.useState)(() => { 13363 const parsedDate = parseDateTime(value); 13364 return parsedDate || /* @__PURE__ */ new Date(); 13365 }); 13366 const inputControlRef = (0, import_element38.useRef)(null); 13367 const validationTimeoutRef = (0, import_element38.useRef)(); 13368 const previousFocusRef = (0, import_element38.useRef)(null); 13369 const onChangeCallback = (0, import_element38.useCallback)( 13370 (newValue) => onChange(setValue({ item: data, value: newValue })), 13371 [data, onChange, setValue] 13372 ); 13373 (0, import_element38.useEffect)(() => { 13374 return () => { 13375 if (validationTimeoutRef.current) { 13376 clearTimeout(validationTimeoutRef.current); 13377 } 13378 }; 13379 }, []); 13380 const onSelectDate = (0, import_element38.useCallback)( 13381 (newDate) => { 13382 let dateTimeValue; 13383 if (newDate) { 13384 let finalDateTime = newDate; 13385 if (value) { 13386 const currentDateTime = parseDateTime(value); 13387 if (currentDateTime) { 13388 finalDateTime = new Date(newDate); 13389 finalDateTime.setHours(currentDateTime.getHours()); 13390 finalDateTime.setMinutes( 13391 currentDateTime.getMinutes() 13392 ); 13393 } 13394 } 13395 dateTimeValue = finalDateTime.toISOString(); 13396 onChangeCallback(dateTimeValue); 13397 if (validationTimeoutRef.current) { 13398 clearTimeout(validationTimeoutRef.current); 13399 } 13400 } else { 13401 onChangeCallback(void 0); 13402 } 13403 previousFocusRef.current = inputControlRef.current && inputControlRef.current.ownerDocument.activeElement; 13404 validationTimeoutRef.current = setTimeout(() => { 13405 if (inputControlRef.current) { 13406 inputControlRef.current.focus(); 13407 inputControlRef.current.blur(); 13408 onChangeCallback(dateTimeValue); 13409 if (previousFocusRef.current && previousFocusRef.current instanceof HTMLElement) { 13410 previousFocusRef.current.focus(); 13411 } 13412 } 13413 }, 0); 13414 }, 13415 [onChangeCallback, value] 13416 ); 13417 const handleManualDateTimeChange = (0, import_element38.useCallback)( 13418 (newValue) => { 13419 if (newValue) { 13420 const dateTime = new Date(newValue); 13421 onChangeCallback(dateTime.toISOString()); 13422 const parsedDate = parseDateTime(dateTime.toISOString()); 13423 if (parsedDate) { 13424 setCalendarMonth(parsedDate); 13425 } 13426 } else { 13427 onChangeCallback(void 0); 13428 } 13429 }, 13430 [onChangeCallback] 13431 ); 13432 const { format: fieldFormat } = field; 13433 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date2.getSettings)().l10n.startOfWeek; 13434 const { 13435 timezone: { string: timezoneString } 13436 } = (0, import_date2.getSettings)(); 13437 const displayLabel = isValid2?.required && !hideLabelFromVision ? `$label} (${(0, import_i18n38.__)("Required")})` : label; 13438 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)( 13439 import_components33.BaseControl, 13440 { 13441 id, 13442 label: displayLabel, 13443 help: description, 13444 hideLabelFromVision, 13445 children: /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(import_components33.__experimentalVStack, { spacing: 4, children: [ 13446 /* @__PURE__ */ (0, import_jsx_runtime74.jsx)( 13447 DateCalendar, 13448 { 13449 style: { width: "100%" }, 13450 selected: value ? parseDateTime(value) || void 0 : void 0, 13451 onSelect: onSelectDate, 13452 month: calendarMonth, 13453 onMonthChange: setCalendarMonth, 13454 timeZone: timezoneString || void 0, 13455 weekStartsOn 13456 } 13457 ), 13458 /* @__PURE__ */ (0, import_jsx_runtime74.jsx)( 13459 ValidatedInputControl, 13460 { 13461 ref: inputControlRef, 13462 __next40pxDefaultSize: true, 13463 required: !!isValid2?.required, 13464 customValidity: getCustomValidity(isValid2, validity), 13465 type: "datetime-local", 13466 label: (0, import_i18n38.__)("Date time"), 13467 hideLabelFromVision: true, 13468 value: value ? formatDateTime( 13469 parseDateTime(value) || void 0 13470 ) : "", 13471 onChange: handleManualDateTimeChange 13472 } 13473 ) 13474 ] }) 13475 } 13476 ); 13477 } 13478 function DateTime({ 13479 data, 13480 field, 13481 onChange, 13482 hideLabelFromVision, 13483 operator, 13484 validity 13485 }) { 13486 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) { 13487 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)( 13488 RelativeDateControl, 13489 { 13490 className: "dataviews-controls__datetime", 13491 data, 13492 field, 13493 onChange, 13494 hideLabelFromVision, 13495 operator 13496 } 13497 ); 13498 } 13499 return /* @__PURE__ */ (0, import_jsx_runtime74.jsx)( 13500 CalendarDateTimeControl, 13501 { 13502 data, 13503 field, 13504 onChange, 13505 hideLabelFromVision, 13506 validity 13507 } 13508 ); 13509 } 13510 13511 // packages/dataviews/build-module/dataform-controls/date.js 13512 var import_components34 = __toESM(require_components()); 13513 var import_element39 = __toESM(require_element()); 13514 var import_i18n39 = __toESM(require_i18n()); 13515 var import_date3 = __toESM(require_date()); 13516 var import_jsx_runtime75 = __toESM(require_jsx_runtime()); 13517 var { DateCalendar: DateCalendar2, DateRangeCalendar } = unlock(import_components34.privateApis); 13518 var DATE_PRESETS = [ 13519 { 13520 id: "today", 13521 label: (0, import_i18n39.__)("Today"), 13522 getValue: () => (0, import_date3.getDate)(null) 13523 }, 13524 { 13525 id: "yesterday", 13526 label: (0, import_i18n39.__)("Yesterday"), 13527 getValue: () => { 13528 const today = (0, import_date3.getDate)(null); 13529 return subDays(today, 1); 13530 } 13531 }, 13532 { 13533 id: "past-week", 13534 label: (0, import_i18n39.__)("Past week"), 13535 getValue: () => { 13536 const today = (0, import_date3.getDate)(null); 13537 return subDays(today, 7); 13538 } 13539 }, 13540 { 13541 id: "past-month", 13542 label: (0, import_i18n39.__)("Past month"), 13543 getValue: () => { 13544 const today = (0, import_date3.getDate)(null); 13545 return subMonths(today, 1); 13546 } 13547 } 13548 ]; 13549 var DATE_RANGE_PRESETS = [ 13550 { 13551 id: "last-7-days", 13552 label: (0, import_i18n39.__)("Last 7 days"), 13553 getValue: () => { 13554 const today = (0, import_date3.getDate)(null); 13555 return [subDays(today, 7), today]; 13556 } 13557 }, 13558 { 13559 id: "last-30-days", 13560 label: (0, import_i18n39.__)("Last 30 days"), 13561 getValue: () => { 13562 const today = (0, import_date3.getDate)(null); 13563 return [subDays(today, 30), today]; 13564 } 13565 }, 13566 { 13567 id: "month-to-date", 13568 label: (0, import_i18n39.__)("Month to date"), 13569 getValue: () => { 13570 const today = (0, import_date3.getDate)(null); 13571 return [startOfMonth(today), today]; 13572 } 13573 }, 13574 { 13575 id: "last-year", 13576 label: (0, import_i18n39.__)("Last year"), 13577 getValue: () => { 13578 const today = (0, import_date3.getDate)(null); 13579 return [subYears(today, 1), today]; 13580 } 13581 }, 13582 { 13583 id: "year-to-date", 13584 label: (0, import_i18n39.__)("Year to date"), 13585 getValue: () => { 13586 const today = (0, import_date3.getDate)(null); 13587 return [startOfYear(today), today]; 13588 } 13589 } 13590 ]; 13591 var parseDate = (dateString) => { 13592 if (!dateString) { 13593 return null; 13594 } 13595 const parsed = (0, import_date3.getDate)(dateString); 13596 return parsed && isValid(parsed) ? parsed : null; 13597 }; 13598 var formatDate = (date) => { 13599 if (!date) { 13600 return ""; 13601 } 13602 return typeof date === "string" ? date : format(date, "yyyy-MM-dd"); 13603 }; 13604 function ValidatedDateControl({ 13605 field, 13606 validity, 13607 inputRefs, 13608 isTouched, 13609 setIsTouched, 13610 children 13611 }) { 13612 const { isValid: isValid2 } = field; 13613 const [customValidity, setCustomValidity] = (0, import_element39.useState)(void 0); 13614 const validateRefs = (0, import_element39.useCallback)(() => { 13615 const refs = Array.isArray(inputRefs) ? inputRefs : [inputRefs]; 13616 for (const ref of refs) { 13617 const input = ref.current; 13618 if (input && !input.validity.valid) { 13619 setCustomValidity({ 13620 type: "invalid", 13621 message: input.validationMessage 13622 }); 13623 return; 13624 } 13625 } 13626 setCustomValidity(void 0); 13627 }, [inputRefs]); 13628 (0, import_element39.useEffect)(() => { 13629 if (isTouched) { 13630 const timeoutId = setTimeout(() => { 13631 if (validity) { 13632 setCustomValidity(getCustomValidity(isValid2, validity)); 13633 } else { 13634 validateRefs(); 13635 } 13636 }, 0); 13637 return () => clearTimeout(timeoutId); 13638 } 13639 return void 0; 13640 }, [isTouched, isValid2, validity, validateRefs]); 13641 const onBlur = (event) => { 13642 if (isTouched) { 13643 return; 13644 } 13645 if (!event.relatedTarget || !event.currentTarget.contains(event.relatedTarget)) { 13646 setIsTouched(true); 13647 } 13648 }; 13649 return /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { onBlur, children: [ 13650 children, 13651 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)("div", { "aria-live": "polite", children: customValidity && /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)( 13652 "p", 13653 { 13654 className: clsx_default( 13655 "components-validated-control__indicator", 13656 customValidity.type === "invalid" ? "is-invalid" : void 0, 13657 customValidity.type === "valid" ? "is-valid" : void 0 13658 ), 13659 children: [ 13660 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13661 import_components34.Icon, 13662 { 13663 className: "components-validated-control__indicator-icon", 13664 icon: error_default, 13665 size: 16, 13666 fill: "currentColor" 13667 } 13668 ), 13669 customValidity.message 13670 ] 13671 } 13672 ) }) 13673 ] }); 13674 } 13675 function CalendarDateControl({ 13676 data, 13677 field, 13678 onChange, 13679 hideLabelFromVision, 13680 validity 13681 }) { 13682 const { 13683 id, 13684 label, 13685 setValue, 13686 getValue, 13687 isValid: isValid2, 13688 format: fieldFormat 13689 } = field; 13690 const [selectedPresetId, setSelectedPresetId] = (0, import_element39.useState)( 13691 null 13692 ); 13693 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek; 13694 const fieldValue = getValue({ item: data }); 13695 const value = typeof fieldValue === "string" ? fieldValue : void 0; 13696 const [calendarMonth, setCalendarMonth] = (0, import_element39.useState)(() => { 13697 const parsedDate = parseDate(value); 13698 return parsedDate || /* @__PURE__ */ new Date(); 13699 }); 13700 const [isTouched, setIsTouched] = (0, import_element39.useState)(false); 13701 const validityTargetRef = (0, import_element39.useRef)(null); 13702 const onChangeCallback = (0, import_element39.useCallback)( 13703 (newValue) => onChange(setValue({ item: data, value: newValue })), 13704 [data, onChange, setValue] 13705 ); 13706 const onSelectDate = (0, import_element39.useCallback)( 13707 (newDate) => { 13708 const dateValue = newDate ? format(newDate, "yyyy-MM-dd") : void 0; 13709 onChangeCallback(dateValue); 13710 setSelectedPresetId(null); 13711 setIsTouched(true); 13712 }, 13713 [onChangeCallback] 13714 ); 13715 const handlePresetClick = (0, import_element39.useCallback)( 13716 (preset) => { 13717 const presetDate = preset.getValue(); 13718 const dateValue = formatDate(presetDate); 13719 setCalendarMonth(presetDate); 13720 onChangeCallback(dateValue); 13721 setSelectedPresetId(preset.id); 13722 setIsTouched(true); 13723 }, 13724 [onChangeCallback] 13725 ); 13726 const handleManualDateChange = (0, import_element39.useCallback)( 13727 (newValue) => { 13728 onChangeCallback(newValue); 13729 if (newValue) { 13730 const parsedDate = parseDate(newValue); 13731 if (parsedDate) { 13732 setCalendarMonth(parsedDate); 13733 } 13734 } 13735 setSelectedPresetId(null); 13736 setIsTouched(true); 13737 }, 13738 [onChangeCallback] 13739 ); 13740 const { 13741 timezone: { string: timezoneString } 13742 } = (0, import_date3.getSettings)(); 13743 const displayLabel = isValid2?.required ? `$label} (${(0, import_i18n39.__)("Required")})` : label; 13744 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13745 ValidatedDateControl, 13746 { 13747 field, 13748 validity, 13749 inputRefs: validityTargetRef, 13750 isTouched, 13751 setIsTouched, 13752 children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13753 import_components34.BaseControl, 13754 { 13755 id, 13756 className: "dataviews-controls__date", 13757 label: displayLabel, 13758 hideLabelFromVision, 13759 children: /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(import_components34.__experimentalVStack, { spacing: 4, children: [ 13760 /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(import_components34.__experimentalHStack, { spacing: 2, wrap: true, justify: "flex-start", children: [ 13761 DATE_PRESETS.map((preset) => { 13762 const isSelected2 = selectedPresetId === preset.id; 13763 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13764 import_components34.Button, 13765 { 13766 className: "dataviews-controls__date-preset", 13767 variant: "tertiary", 13768 isPressed: isSelected2, 13769 size: "small", 13770 onClick: () => handlePresetClick(preset), 13771 children: preset.label 13772 }, 13773 preset.id 13774 ); 13775 }), 13776 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13777 import_components34.Button, 13778 { 13779 className: "dataviews-controls__date-preset", 13780 variant: "tertiary", 13781 isPressed: !selectedPresetId, 13782 size: "small", 13783 disabled: !!selectedPresetId, 13784 accessibleWhenDisabled: false, 13785 children: (0, import_i18n39.__)("Custom") 13786 } 13787 ) 13788 ] }), 13789 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13790 import_components34.__experimentalInputControl, 13791 { 13792 __next40pxDefaultSize: true, 13793 ref: validityTargetRef, 13794 type: "date", 13795 label: (0, import_i18n39.__)("Date"), 13796 hideLabelFromVision: true, 13797 value, 13798 onChange: handleManualDateChange, 13799 required: !!field.isValid?.required 13800 } 13801 ), 13802 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13803 DateCalendar2, 13804 { 13805 style: { width: "100%" }, 13806 selected: value ? parseDate(value) || void 0 : void 0, 13807 onSelect: onSelectDate, 13808 month: calendarMonth, 13809 onMonthChange: setCalendarMonth, 13810 timeZone: timezoneString || void 0, 13811 weekStartsOn 13812 } 13813 ) 13814 ] }) 13815 } 13816 ) 13817 } 13818 ); 13819 } 13820 function CalendarDateRangeControl({ 13821 data, 13822 field, 13823 onChange, 13824 hideLabelFromVision, 13825 validity 13826 }) { 13827 const { id, label, getValue, setValue, format: fieldFormat } = field; 13828 let value; 13829 const fieldValue = getValue({ item: data }); 13830 if (Array.isArray(fieldValue) && fieldValue.length === 2 && fieldValue.every((date) => typeof date === "string")) { 13831 value = fieldValue; 13832 } 13833 const weekStartsOn = fieldFormat.weekStartsOn ?? (0, import_date3.getSettings)().l10n.startOfWeek; 13834 const onChangeCallback = (0, import_element39.useCallback)( 13835 (newValue) => { 13836 onChange( 13837 setValue({ 13838 item: data, 13839 value: newValue 13840 }) 13841 ); 13842 }, 13843 [data, onChange, setValue] 13844 ); 13845 const [selectedPresetId, setSelectedPresetId] = (0, import_element39.useState)( 13846 null 13847 ); 13848 const selectedRange = (0, import_element39.useMemo)(() => { 13849 if (!value) { 13850 return { from: void 0, to: void 0 }; 13851 } 13852 const [from, to] = value; 13853 return { 13854 from: parseDate(from) || void 0, 13855 to: parseDate(to) || void 0 13856 }; 13857 }, [value]); 13858 const [calendarMonth, setCalendarMonth] = (0, import_element39.useState)(() => { 13859 return selectedRange.from || /* @__PURE__ */ new Date(); 13860 }); 13861 const [isTouched, setIsTouched] = (0, import_element39.useState)(false); 13862 const fromInputRef = (0, import_element39.useRef)(null); 13863 const toInputRef = (0, import_element39.useRef)(null); 13864 const updateDateRange = (0, import_element39.useCallback)( 13865 (fromDate, toDate2) => { 13866 if (fromDate && toDate2) { 13867 onChangeCallback([ 13868 formatDate(fromDate), 13869 formatDate(toDate2) 13870 ]); 13871 } else if (!fromDate && !toDate2) { 13872 onChangeCallback(void 0); 13873 } 13874 }, 13875 [onChangeCallback] 13876 ); 13877 const onSelectCalendarRange = (0, import_element39.useCallback)( 13878 (newRange) => { 13879 updateDateRange(newRange?.from, newRange?.to); 13880 setSelectedPresetId(null); 13881 setIsTouched(true); 13882 }, 13883 [updateDateRange] 13884 ); 13885 const handlePresetClick = (0, import_element39.useCallback)( 13886 (preset) => { 13887 const [startDate, endDate] = preset.getValue(); 13888 setCalendarMonth(startDate); 13889 updateDateRange(startDate, endDate); 13890 setSelectedPresetId(preset.id); 13891 setIsTouched(true); 13892 }, 13893 [updateDateRange] 13894 ); 13895 const handleManualDateChange = (0, import_element39.useCallback)( 13896 (fromOrTo, newValue) => { 13897 const [currentFrom, currentTo] = value || [ 13898 void 0, 13899 void 0 13900 ]; 13901 const updatedFrom = fromOrTo === "from" ? newValue : currentFrom; 13902 const updatedTo = fromOrTo === "to" ? newValue : currentTo; 13903 updateDateRange(updatedFrom, updatedTo); 13904 if (newValue) { 13905 const parsedDate = parseDate(newValue); 13906 if (parsedDate) { 13907 setCalendarMonth(parsedDate); 13908 } 13909 } 13910 setSelectedPresetId(null); 13911 setIsTouched(true); 13912 }, 13913 [value, updateDateRange] 13914 ); 13915 const { timezone } = (0, import_date3.getSettings)(); 13916 const displayLabel = field.isValid?.required ? `$label} (${(0, import_i18n39.__)("Required")})` : label; 13917 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13918 ValidatedDateControl, 13919 { 13920 field, 13921 validity, 13922 inputRefs: [fromInputRef, toInputRef], 13923 isTouched, 13924 setIsTouched, 13925 children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13926 import_components34.BaseControl, 13927 { 13928 id, 13929 className: "dataviews-controls__date", 13930 label: displayLabel, 13931 hideLabelFromVision, 13932 children: /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(import_components34.__experimentalVStack, { spacing: 4, children: [ 13933 /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(import_components34.__experimentalHStack, { spacing: 2, wrap: true, justify: "flex-start", children: [ 13934 DATE_RANGE_PRESETS.map((preset) => { 13935 const isSelected2 = selectedPresetId === preset.id; 13936 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13937 import_components34.Button, 13938 { 13939 className: "dataviews-controls__date-preset", 13940 variant: "tertiary", 13941 isPressed: isSelected2, 13942 size: "small", 13943 onClick: () => handlePresetClick(preset), 13944 children: preset.label 13945 }, 13946 preset.id 13947 ); 13948 }), 13949 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13950 import_components34.Button, 13951 { 13952 className: "dataviews-controls__date-preset", 13953 variant: "tertiary", 13954 isPressed: !selectedPresetId, 13955 size: "small", 13956 accessibleWhenDisabled: false, 13957 disabled: !!selectedPresetId, 13958 children: (0, import_i18n39.__)("Custom") 13959 } 13960 ) 13961 ] }), 13962 /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(import_components34.__experimentalHStack, { spacing: 2, children: [ 13963 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13964 import_components34.__experimentalInputControl, 13965 { 13966 __next40pxDefaultSize: true, 13967 ref: fromInputRef, 13968 type: "date", 13969 label: (0, import_i18n39.__)("From"), 13970 hideLabelFromVision: true, 13971 value: value?.[0], 13972 onChange: (newValue) => handleManualDateChange("from", newValue), 13973 required: !!field.isValid?.required 13974 } 13975 ), 13976 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13977 import_components34.__experimentalInputControl, 13978 { 13979 __next40pxDefaultSize: true, 13980 ref: toInputRef, 13981 type: "date", 13982 label: (0, import_i18n39.__)("To"), 13983 hideLabelFromVision: true, 13984 value: value?.[1], 13985 onChange: (newValue) => handleManualDateChange("to", newValue), 13986 required: !!field.isValid?.required 13987 } 13988 ) 13989 ] }), 13990 /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 13991 DateRangeCalendar, 13992 { 13993 style: { width: "100%" }, 13994 selected: selectedRange, 13995 onSelect: onSelectCalendarRange, 13996 month: calendarMonth, 13997 onMonthChange: setCalendarMonth, 13998 timeZone: timezone.string || void 0, 13999 weekStartsOn 14000 } 14001 ) 14002 ] }) 14003 } 14004 ) 14005 } 14006 ); 14007 } 14008 function DateControl({ 14009 data, 14010 field, 14011 onChange, 14012 hideLabelFromVision, 14013 operator, 14014 validity 14015 }) { 14016 if (operator === OPERATOR_IN_THE_PAST || operator === OPERATOR_OVER) { 14017 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 14018 RelativeDateControl, 14019 { 14020 className: "dataviews-controls__date", 14021 data, 14022 field, 14023 onChange, 14024 hideLabelFromVision, 14025 operator 14026 } 14027 ); 14028 } 14029 if (operator === OPERATOR_BETWEEN) { 14030 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 14031 CalendarDateRangeControl, 14032 { 14033 data, 14034 field, 14035 onChange, 14036 hideLabelFromVision, 14037 validity 14038 } 14039 ); 14040 } 14041 return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)( 14042 CalendarDateControl, 14043 { 14044 data, 14045 field, 14046 onChange, 14047 hideLabelFromVision, 14048 validity 14049 } 14050 ); 14051 } 14052 14053 // packages/dataviews/build-module/dataform-controls/email.js 14054 var import_components36 = __toESM(require_components()); 14055 14056 // packages/dataviews/build-module/dataform-controls/utils/validated-input.js 14057 var import_components35 = __toESM(require_components()); 14058 var import_element40 = __toESM(require_element()); 14059 var import_jsx_runtime76 = __toESM(require_jsx_runtime()); 14060 var { ValidatedInputControl: ValidatedInputControl2 } = unlock(import_components35.privateApis); 14061 function ValidatedText({ 14062 data, 14063 field, 14064 onChange, 14065 hideLabelFromVision, 14066 type, 14067 prefix, 14068 suffix, 14069 validity 14070 }) { 14071 const { label, placeholder, description, getValue, setValue, isValid: isValid2 } = field; 14072 const value = getValue({ item: data }); 14073 const onChangeControl = (0, import_element40.useCallback)( 14074 (newValue) => onChange( 14075 setValue({ 14076 item: data, 14077 value: newValue 14078 }) 14079 ), 14080 [data, setValue, onChange] 14081 ); 14082 return /* @__PURE__ */ (0, import_jsx_runtime76.jsx)( 14083 ValidatedInputControl2, 14084 { 14085 required: !!isValid2.required, 14086 customValidity: getCustomValidity(isValid2, validity), 14087 label, 14088 placeholder, 14089 value: value ?? "", 14090 help: description, 14091 onChange: onChangeControl, 14092 hideLabelFromVision, 14093 type, 14094 prefix, 14095 suffix, 14096 pattern: isValid2.pattern ? isValid2.pattern.constraint : void 0, 14097 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0, 14098 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0, 14099 __next40pxDefaultSize: true 14100 } 14101 ); 14102 } 14103 14104 // packages/dataviews/build-module/dataform-controls/email.js 14105 var import_jsx_runtime77 = __toESM(require_jsx_runtime()); 14106 function Email({ 14107 data, 14108 field, 14109 onChange, 14110 hideLabelFromVision, 14111 validity 14112 }) { 14113 return /* @__PURE__ */ (0, import_jsx_runtime77.jsx)( 14114 ValidatedText, 14115 { 14116 ...{ 14117 data, 14118 field, 14119 onChange, 14120 hideLabelFromVision, 14121 validity, 14122 type: "email", 14123 prefix: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(import_components36.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(import_components36.Icon, { icon: envelope_default }) }) 14124 } 14125 } 14126 ); 14127 } 14128 14129 // packages/dataviews/build-module/dataform-controls/telephone.js 14130 var import_components37 = __toESM(require_components()); 14131 var import_jsx_runtime78 = __toESM(require_jsx_runtime()); 14132 function Telephone({ 14133 data, 14134 field, 14135 onChange, 14136 hideLabelFromVision, 14137 validity 14138 }) { 14139 return /* @__PURE__ */ (0, import_jsx_runtime78.jsx)( 14140 ValidatedText, 14141 { 14142 ...{ 14143 data, 14144 field, 14145 onChange, 14146 hideLabelFromVision, 14147 validity, 14148 type: "tel", 14149 prefix: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_components37.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_components37.Icon, { icon: mobile_default }) }) 14150 } 14151 } 14152 ); 14153 } 14154 14155 // packages/dataviews/build-module/dataform-controls/url.js 14156 var import_components38 = __toESM(require_components()); 14157 var import_jsx_runtime79 = __toESM(require_jsx_runtime()); 14158 function Url({ 14159 data, 14160 field, 14161 onChange, 14162 hideLabelFromVision, 14163 validity 14164 }) { 14165 return /* @__PURE__ */ (0, import_jsx_runtime79.jsx)( 14166 ValidatedText, 14167 { 14168 ...{ 14169 data, 14170 field, 14171 onChange, 14172 hideLabelFromVision, 14173 validity, 14174 type: "url", 14175 prefix: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components38.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime79.jsx)(import_components38.Icon, { icon: link_default }) }) 14176 } 14177 } 14178 ); 14179 } 14180 14181 // packages/dataviews/build-module/dataform-controls/utils/validated-number.js 14182 var import_components39 = __toESM(require_components()); 14183 var import_element41 = __toESM(require_element()); 14184 var import_i18n40 = __toESM(require_i18n()); 14185 var import_jsx_runtime80 = __toESM(require_jsx_runtime()); 14186 var { ValidatedNumberControl } = unlock(import_components39.privateApis); 14187 function toNumberOrEmpty(value) { 14188 if (value === "" || value === void 0) { 14189 return ""; 14190 } 14191 const number = Number(value); 14192 return Number.isFinite(number) ? number : ""; 14193 } 14194 function BetweenControls({ 14195 value, 14196 onChange, 14197 hideLabelFromVision, 14198 step 14199 }) { 14200 const [min = "", max = ""] = value; 14201 const onChangeMin = (0, import_element41.useCallback)( 14202 (newValue) => onChange([toNumberOrEmpty(newValue), max]), 14203 [onChange, max] 14204 ); 14205 const onChangeMax = (0, import_element41.useCallback)( 14206 (newValue) => onChange([min, toNumberOrEmpty(newValue)]), 14207 [onChange, min] 14208 ); 14209 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)( 14210 import_components39.BaseControl, 14211 { 14212 help: (0, import_i18n40.__)("The max. value must be greater than the min. value."), 14213 children: /* @__PURE__ */ (0, import_jsx_runtime80.jsxs)(import_components39.Flex, { direction: "row", gap: 4, children: [ 14214 /* @__PURE__ */ (0, import_jsx_runtime80.jsx)( 14215 import_components39.__experimentalNumberControl, 14216 { 14217 label: (0, import_i18n40.__)("Min."), 14218 value: min, 14219 max: max ? Number(max) - step : void 0, 14220 onChange: onChangeMin, 14221 __next40pxDefaultSize: true, 14222 hideLabelFromVision, 14223 step 14224 } 14225 ), 14226 /* @__PURE__ */ (0, import_jsx_runtime80.jsx)( 14227 import_components39.__experimentalNumberControl, 14228 { 14229 label: (0, import_i18n40.__)("Max."), 14230 value: max, 14231 min: min ? Number(min) + step : void 0, 14232 onChange: onChangeMax, 14233 __next40pxDefaultSize: true, 14234 hideLabelFromVision, 14235 step 14236 } 14237 ) 14238 ] }) 14239 } 14240 ); 14241 } 14242 function ValidatedNumber({ 14243 data, 14244 field, 14245 onChange, 14246 hideLabelFromVision, 14247 operator, 14248 validity 14249 }) { 14250 const decimals = field.format?.decimals ?? 0; 14251 const step = Math.pow(10, Math.abs(decimals) * -1); 14252 const { label, description, getValue, setValue, isValid: isValid2 } = field; 14253 const value = getValue({ item: data }) ?? ""; 14254 const onChangeControl = (0, import_element41.useCallback)( 14255 (newValue) => { 14256 onChange( 14257 setValue({ 14258 item: data, 14259 // Do not convert an empty string or undefined to a number, 14260 // otherwise there's a mismatch between the UI control (empty) 14261 // and the data relied by onChange (0). 14262 value: ["", void 0].includes(newValue) ? void 0 : Number(newValue) 14263 }) 14264 ); 14265 }, 14266 [data, onChange, setValue] 14267 ); 14268 const onChangeBetweenControls = (0, import_element41.useCallback)( 14269 (newValue) => { 14270 onChange( 14271 setValue({ 14272 item: data, 14273 value: newValue 14274 }) 14275 ); 14276 }, 14277 [data, onChange, setValue] 14278 ); 14279 if (operator === OPERATOR_BETWEEN) { 14280 let valueBetween = ["", ""]; 14281 if (Array.isArray(value) && value.length === 2 && value.every( 14282 (element) => typeof element === "number" || element === "" 14283 )) { 14284 valueBetween = value; 14285 } 14286 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)( 14287 BetweenControls, 14288 { 14289 value: valueBetween, 14290 onChange: onChangeBetweenControls, 14291 hideLabelFromVision, 14292 step 14293 } 14294 ); 14295 } 14296 return /* @__PURE__ */ (0, import_jsx_runtime80.jsx)( 14297 ValidatedNumberControl, 14298 { 14299 required: !!isValid2.required, 14300 customValidity: getCustomValidity(isValid2, validity), 14301 label, 14302 help: description, 14303 value, 14304 onChange: onChangeControl, 14305 __next40pxDefaultSize: true, 14306 hideLabelFromVision, 14307 step, 14308 min: isValid2.min ? isValid2.min.constraint : void 0, 14309 max: isValid2.max ? isValid2.max.constraint : void 0 14310 } 14311 ); 14312 } 14313 14314 // packages/dataviews/build-module/dataform-controls/integer.js 14315 var import_jsx_runtime81 = __toESM(require_jsx_runtime()); 14316 function Integer(props) { 14317 return /* @__PURE__ */ (0, import_jsx_runtime81.jsx)(ValidatedNumber, { ...props }); 14318 } 14319 14320 // packages/dataviews/build-module/dataform-controls/number.js 14321 var import_jsx_runtime82 = __toESM(require_jsx_runtime()); 14322 function Number2(props) { 14323 return /* @__PURE__ */ (0, import_jsx_runtime82.jsx)(ValidatedNumber, { ...props }); 14324 } 14325 14326 // packages/dataviews/build-module/dataform-controls/radio.js 14327 var import_components40 = __toESM(require_components()); 14328 var import_element42 = __toESM(require_element()); 14329 var import_jsx_runtime83 = __toESM(require_jsx_runtime()); 14330 var { ValidatedRadioControl } = unlock(import_components40.privateApis); 14331 function Radio({ 14332 data, 14333 field, 14334 onChange, 14335 hideLabelFromVision, 14336 validity 14337 }) { 14338 const { label, description, getValue, setValue, isValid: isValid2 } = field; 14339 const { elements, isLoading } = useElements({ 14340 elements: field.elements, 14341 getElements: field.getElements 14342 }); 14343 const value = getValue({ item: data }); 14344 const onChangeControl = (0, import_element42.useCallback)( 14345 (newValue) => onChange(setValue({ item: data, value: newValue })), 14346 [data, onChange, setValue] 14347 ); 14348 if (isLoading) { 14349 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)(import_components40.Spinner, {}); 14350 } 14351 return /* @__PURE__ */ (0, import_jsx_runtime83.jsx)( 14352 ValidatedRadioControl, 14353 { 14354 required: !!field.isValid?.required, 14355 customValidity: getCustomValidity(isValid2, validity), 14356 label, 14357 help: description, 14358 onChange: onChangeControl, 14359 options: elements, 14360 selected: value, 14361 hideLabelFromVision 14362 } 14363 ); 14364 } 14365 14366 // packages/dataviews/build-module/dataform-controls/select.js 14367 var import_components41 = __toESM(require_components()); 14368 var import_element43 = __toESM(require_element()); 14369 var import_jsx_runtime84 = __toESM(require_jsx_runtime()); 14370 var { ValidatedSelectControl } = unlock(import_components41.privateApis); 14371 function Select({ 14372 data, 14373 field, 14374 onChange, 14375 hideLabelFromVision, 14376 validity 14377 }) { 14378 const { type, label, description, getValue, setValue, isValid: isValid2 } = field; 14379 const isMultiple = type === "array"; 14380 const value = getValue({ item: data }) ?? (isMultiple ? [] : ""); 14381 const onChangeControl = (0, import_element43.useCallback)( 14382 (newValue) => onChange(setValue({ item: data, value: newValue })), 14383 [data, onChange, setValue] 14384 ); 14385 const { elements, isLoading } = useElements({ 14386 elements: field.elements, 14387 getElements: field.getElements 14388 }); 14389 if (isLoading) { 14390 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)(import_components41.Spinner, {}); 14391 } 14392 return /* @__PURE__ */ (0, import_jsx_runtime84.jsx)( 14393 ValidatedSelectControl, 14394 { 14395 required: !!field.isValid?.required, 14396 customValidity: getCustomValidity(isValid2, validity), 14397 label, 14398 value, 14399 help: description, 14400 options: elements, 14401 onChange: onChangeControl, 14402 __next40pxDefaultSize: true, 14403 hideLabelFromVision, 14404 multiple: isMultiple 14405 } 14406 ); 14407 } 14408 14409 // packages/dataviews/build-module/dataform-controls/text.js 14410 var import_element44 = __toESM(require_element()); 14411 var import_jsx_runtime85 = __toESM(require_jsx_runtime()); 14412 function Text2({ 14413 data, 14414 field, 14415 onChange, 14416 hideLabelFromVision, 14417 config, 14418 validity 14419 }) { 14420 const { prefix, suffix } = config || {}; 14421 return /* @__PURE__ */ (0, import_jsx_runtime85.jsx)( 14422 ValidatedText, 14423 { 14424 ...{ 14425 data, 14426 field, 14427 onChange, 14428 hideLabelFromVision, 14429 validity, 14430 prefix: prefix ? (0, import_element44.createElement)(prefix) : void 0, 14431 suffix: suffix ? (0, import_element44.createElement)(suffix) : void 0 14432 } 14433 } 14434 ); 14435 } 14436 14437 // packages/dataviews/build-module/dataform-controls/toggle.js 14438 var import_components42 = __toESM(require_components()); 14439 var import_element45 = __toESM(require_element()); 14440 var import_jsx_runtime86 = __toESM(require_jsx_runtime()); 14441 var { ValidatedToggleControl } = unlock(import_components42.privateApis); 14442 function Toggle({ 14443 field, 14444 onChange, 14445 data, 14446 hideLabelFromVision, 14447 validity 14448 }) { 14449 const { label, description, getValue, setValue, isValid: isValid2 } = field; 14450 const onChangeControl = (0, import_element45.useCallback)(() => { 14451 onChange( 14452 setValue({ item: data, value: !getValue({ item: data }) }) 14453 ); 14454 }, [onChange, setValue, data, getValue]); 14455 return /* @__PURE__ */ (0, import_jsx_runtime86.jsx)( 14456 ValidatedToggleControl, 14457 { 14458 required: !!isValid2.required, 14459 customValidity: getCustomValidity(isValid2, validity), 14460 hidden: hideLabelFromVision, 14461 label, 14462 help: description, 14463 checked: getValue({ item: data }), 14464 onChange: onChangeControl 14465 } 14466 ); 14467 } 14468 14469 // packages/dataviews/build-module/dataform-controls/textarea.js 14470 var import_components43 = __toESM(require_components()); 14471 var import_element46 = __toESM(require_element()); 14472 var import_jsx_runtime87 = __toESM(require_jsx_runtime()); 14473 var { ValidatedTextareaControl } = unlock(import_components43.privateApis); 14474 function Textarea({ 14475 data, 14476 field, 14477 onChange, 14478 hideLabelFromVision, 14479 config, 14480 validity 14481 }) { 14482 const { rows = 4 } = config || {}; 14483 const { label, placeholder, description, setValue, isValid: isValid2 } = field; 14484 const value = field.getValue({ item: data }); 14485 const onChangeControl = (0, import_element46.useCallback)( 14486 (newValue) => onChange(setValue({ item: data, value: newValue })), 14487 [data, onChange, setValue] 14488 ); 14489 return /* @__PURE__ */ (0, import_jsx_runtime87.jsx)( 14490 ValidatedTextareaControl, 14491 { 14492 required: !!isValid2.required, 14493 customValidity: getCustomValidity(isValid2, validity), 14494 label, 14495 placeholder, 14496 value: value ?? "", 14497 help: description, 14498 onChange: onChangeControl, 14499 rows, 14500 minLength: isValid2.minLength ? isValid2.minLength.constraint : void 0, 14501 maxLength: isValid2.maxLength ? isValid2.maxLength.constraint : void 0, 14502 __next40pxDefaultSize: true, 14503 hideLabelFromVision 14504 } 14505 ); 14506 } 14507 14508 // packages/dataviews/build-module/dataform-controls/toggle-group.js 14509 var import_components44 = __toESM(require_components()); 14510 var import_element47 = __toESM(require_element()); 14511 var import_jsx_runtime88 = __toESM(require_jsx_runtime()); 14512 var { ValidatedToggleGroupControl } = unlock(import_components44.privateApis); 14513 function ToggleGroup({ 14514 data, 14515 field, 14516 onChange, 14517 hideLabelFromVision, 14518 validity 14519 }) { 14520 const { getValue, setValue, isValid: isValid2 } = field; 14521 const value = getValue({ item: data }); 14522 const onChangeControl = (0, import_element47.useCallback)( 14523 (newValue) => onChange(setValue({ item: data, value: newValue })), 14524 [data, onChange, setValue] 14525 ); 14526 const { elements, isLoading } = useElements({ 14527 elements: field.elements, 14528 getElements: field.getElements 14529 }); 14530 if (isLoading) { 14531 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_components44.Spinner, {}); 14532 } 14533 if (elements.length === 0) { 14534 return null; 14535 } 14536 const selectedOption = elements.find((el) => el.value === value); 14537 return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)( 14538 ValidatedToggleGroupControl, 14539 { 14540 required: !!field.isValid?.required, 14541 customValidity: getCustomValidity(isValid2, validity), 14542 __next40pxDefaultSize: true, 14543 isBlock: true, 14544 label: field.label, 14545 help: selectedOption?.description || field.description, 14546 onChange: onChangeControl, 14547 value, 14548 hideLabelFromVision, 14549 children: elements.map((el) => /* @__PURE__ */ (0, import_jsx_runtime88.jsx)( 14550 import_components44.__experimentalToggleGroupControlOption, 14551 { 14552 label: el.label, 14553 value: el.value 14554 }, 14555 el.value 14556 )) 14557 } 14558 ); 14559 } 14560 14561 // packages/dataviews/build-module/dataform-controls/array.js 14562 var import_components45 = __toESM(require_components()); 14563 var import_element48 = __toESM(require_element()); 14564 var import_jsx_runtime89 = __toESM(require_jsx_runtime()); 14565 var { ValidatedFormTokenField } = unlock(import_components45.privateApis); 14566 function ArrayControl({ 14567 data, 14568 field, 14569 onChange, 14570 hideLabelFromVision, 14571 validity 14572 }) { 14573 const { label, placeholder, getValue, setValue, isValid: isValid2 } = field; 14574 const value = getValue({ item: data }); 14575 const { elements, isLoading } = useElements({ 14576 elements: field.elements, 14577 getElements: field.getElements 14578 }); 14579 const arrayValueAsElements = (0, import_element48.useMemo)( 14580 () => Array.isArray(value) ? value.map((token) => { 14581 const element = elements?.find( 14582 (suggestion) => suggestion.value === token 14583 ); 14584 return element || { value: token, label: token }; 14585 }) : [], 14586 [value, elements] 14587 ); 14588 const onChangeControl = (0, import_element48.useCallback)( 14589 (tokens) => { 14590 const valueTokens = tokens.map((token) => { 14591 if (typeof token === "object" && "value" in token) { 14592 return token.value; 14593 } 14594 return token; 14595 }); 14596 onChange(setValue({ item: data, value: valueTokens })); 14597 }, 14598 [onChange, setValue, data] 14599 ); 14600 if (isLoading) { 14601 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)(import_components45.Spinner, {}); 14602 } 14603 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)( 14604 ValidatedFormTokenField, 14605 { 14606 required: !!isValid2?.required, 14607 customValidity: getCustomValidity(isValid2, validity), 14608 label: hideLabelFromVision ? void 0 : label, 14609 value: arrayValueAsElements, 14610 onChange: onChangeControl, 14611 placeholder, 14612 suggestions: elements?.map((element) => element.value), 14613 __experimentalValidateInput: (token) => { 14614 if (field.isValid?.elements && elements) { 14615 return elements.some( 14616 (element) => element.value === token || element.label === token 14617 ); 14618 } 14619 return true; 14620 }, 14621 __experimentalExpandOnFocus: elements && elements.length > 0, 14622 __experimentalShowHowTo: !field.isValid?.elements, 14623 displayTransform: (token) => { 14624 if (typeof token === "object" && "label" in token) { 14625 return token.label; 14626 } 14627 if (typeof token === "string" && elements) { 14628 const element = elements.find( 14629 (el) => el.value === token 14630 ); 14631 return element?.label || token; 14632 } 14633 return token; 14634 }, 14635 __experimentalRenderItem: ({ item }) => { 14636 if (typeof item === "string" && elements) { 14637 const element = elements.find( 14638 (el) => el.value === item 14639 ); 14640 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)("span", { children: element?.label || item }); 14641 } 14642 return /* @__PURE__ */ (0, import_jsx_runtime89.jsx)("span", { children: item }); 14643 } 14644 } 14645 ); 14646 } 14647 14648 // node_modules/colord/index.mjs 14649 var r2 = { grad: 0.9, turn: 360, rad: 360 / (2 * Math.PI) }; 14650 var t = function(r3) { 14651 return "string" == typeof r3 ? r3.length > 0 : "number" == typeof r3; 14652 }; 14653 var n = function(r3, t2, n2) { 14654 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = Math.pow(10, t2)), Math.round(n2 * r3) / n2 + 0; 14655 }; 14656 var e = function(r3, t2, n2) { 14657 return void 0 === t2 && (t2 = 0), void 0 === n2 && (n2 = 1), r3 > n2 ? n2 : r3 > t2 ? r3 : t2; 14658 }; 14659 var u = function(r3) { 14660 return (r3 = isFinite(r3) ? r3 % 360 : 0) > 0 ? r3 : r3 + 360; 14661 }; 14662 var a = function(r3) { 14663 return { r: e(r3.r, 0, 255), g: e(r3.g, 0, 255), b: e(r3.b, 0, 255), a: e(r3.a) }; 14664 }; 14665 var o = function(r3) { 14666 return { r: n(r3.r), g: n(r3.g), b: n(r3.b), a: n(r3.a, 3) }; 14667 }; 14668 var i = /^#([0-9a-f]{3,8})$/i; 14669 var s = function(r3) { 14670 var t2 = r3.toString(16); 14671 return t2.length < 2 ? "0" + t2 : t2; 14672 }; 14673 var h = function(r3) { 14674 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; 14675 return { h: 60 * (i2 < 0 ? i2 + 6 : i2), s: a2 ? o2 / a2 * 100 : 0, v: a2 / 255 * 100, a: u2 }; 14676 }; 14677 var b = function(r3) { 14678 var t2 = r3.h, n2 = r3.s, e2 = r3.v, u2 = r3.a; 14679 t2 = t2 / 360 * 6, n2 /= 100, e2 /= 100; 14680 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; 14681 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 }; 14682 }; 14683 var g = function(r3) { 14684 return { h: u(r3.h), s: e(r3.s, 0, 100), l: e(r3.l, 0, 100), a: e(r3.a) }; 14685 }; 14686 var d = function(r3) { 14687 return { h: n(r3.h), s: n(r3.s), l: n(r3.l), a: n(r3.a, 3) }; 14688 }; 14689 var f = function(r3) { 14690 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 })); 14691 var t2, n2, e2; 14692 }; 14693 var c = function(r3) { 14694 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 }; 14695 var t2, n2, e2, u2; 14696 }; 14697 var l = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14698 var p = /^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14699 var v = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14700 var m = /^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i; 14701 var y = { string: [[function(r3) { 14702 var t2 = i.exec(r3); 14703 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; 14704 }, "hex"], [function(r3) { 14705 var t2 = v.exec(r3) || m.exec(r3); 14706 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; 14707 }, "rgb"], [function(t2) { 14708 var n2 = l.exec(t2) || p.exec(t2); 14709 if (!n2) return null; 14710 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) }); 14711 return f(a2); 14712 }, "hsl"]], object: [[function(r3) { 14713 var n2 = r3.r, e2 = r3.g, u2 = r3.b, o2 = r3.a, i2 = void 0 === o2 ? 1 : o2; 14714 return t(n2) && t(e2) && t(u2) ? a({ r: Number(n2), g: Number(e2), b: Number(u2), a: Number(i2) }) : null; 14715 }, "rgb"], [function(r3) { 14716 var n2 = r3.h, e2 = r3.s, u2 = r3.l, a2 = r3.a, o2 = void 0 === a2 ? 1 : a2; 14717 if (!t(n2) || !t(e2) || !t(u2)) return null; 14718 var i2 = g({ h: Number(n2), s: Number(e2), l: Number(u2), a: Number(o2) }); 14719 return f(i2); 14720 }, "hsl"], [function(r3) { 14721 var n2 = r3.h, a2 = r3.s, o2 = r3.v, i2 = r3.a, s2 = void 0 === i2 ? 1 : i2; 14722 if (!t(n2) || !t(a2) || !t(o2)) return null; 14723 var h2 = (function(r4) { 14724 return { h: u(r4.h), s: e(r4.s, 0, 100), v: e(r4.v, 0, 100), a: e(r4.a) }; 14725 })({ h: Number(n2), s: Number(a2), v: Number(o2), a: Number(s2) }); 14726 return b(h2); 14727 }, "hsv"]] }; 14728 var N = function(r3, t2) { 14729 for (var n2 = 0; n2 < t2.length; n2++) { 14730 var e2 = t2[n2][0](r3); 14731 if (e2) return [e2, t2[n2][1]]; 14732 } 14733 return [null, void 0]; 14734 }; 14735 var x = function(r3) { 14736 return "string" == typeof r3 ? N(r3.trim(), y.string) : "object" == typeof r3 && null !== r3 ? N(r3, y.object) : [null, void 0]; 14737 }; 14738 var M = function(r3, t2) { 14739 var n2 = c(r3); 14740 return { h: n2.h, s: e(n2.s + 100 * t2, 0, 100), l: n2.l, a: n2.a }; 14741 }; 14742 var H = function(r3) { 14743 return (299 * r3.r + 587 * r3.g + 114 * r3.b) / 1e3 / 255; 14744 }; 14745 var $ = function(r3, t2) { 14746 var n2 = c(r3); 14747 return { h: n2.h, s: n2.s, l: e(n2.l + 100 * t2, 0, 100), a: n2.a }; 14748 }; 14749 var j = (function() { 14750 function r3(r4) { 14751 this.parsed = x(r4)[0], this.rgba = this.parsed || { r: 0, g: 0, b: 0, a: 1 }; 14752 } 14753 return r3.prototype.isValid = function() { 14754 return null !== this.parsed; 14755 }, r3.prototype.brightness = function() { 14756 return n(H(this.rgba), 2); 14757 }, r3.prototype.isDark = function() { 14758 return H(this.rgba) < 0.5; 14759 }, r3.prototype.isLight = function() { 14760 return H(this.rgba) >= 0.5; 14761 }, r3.prototype.toHex = function() { 14762 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; 14763 var r4, t2, e2, u2, a2, i2; 14764 }, r3.prototype.toRgb = function() { 14765 return o(this.rgba); 14766 }, r3.prototype.toRgbString = function() { 14767 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 + ")"; 14768 var r4, t2, n2, e2, u2; 14769 }, r3.prototype.toHsl = function() { 14770 return d(c(this.rgba)); 14771 }, r3.prototype.toHslString = function() { 14772 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 + "%)"; 14773 var r4, t2, n2, e2, u2; 14774 }, r3.prototype.toHsv = function() { 14775 return r4 = h(this.rgba), { h: n(r4.h), s: n(r4.s), v: n(r4.v), a: n(r4.a, 3) }; 14776 var r4; 14777 }, r3.prototype.invert = function() { 14778 return w({ r: 255 - (r4 = this.rgba).r, g: 255 - r4.g, b: 255 - r4.b, a: r4.a }); 14779 var r4; 14780 }, r3.prototype.saturate = function(r4) { 14781 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, r4)); 14782 }, r3.prototype.desaturate = function(r4) { 14783 return void 0 === r4 && (r4 = 0.1), w(M(this.rgba, -r4)); 14784 }, r3.prototype.grayscale = function() { 14785 return w(M(this.rgba, -1)); 14786 }, r3.prototype.lighten = function(r4) { 14787 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, r4)); 14788 }, r3.prototype.darken = function(r4) { 14789 return void 0 === r4 && (r4 = 0.1), w($(this.rgba, -r4)); 14790 }, r3.prototype.rotate = function(r4) { 14791 return void 0 === r4 && (r4 = 15), this.hue(this.hue() + r4); 14792 }, r3.prototype.alpha = function(r4) { 14793 return "number" == typeof r4 ? w({ r: (t2 = this.rgba).r, g: t2.g, b: t2.b, a: r4 }) : n(this.rgba.a, 3); 14794 var t2; 14795 }, r3.prototype.hue = function(r4) { 14796 var t2 = c(this.rgba); 14797 return "number" == typeof r4 ? w({ h: r4, s: t2.s, l: t2.l, a: t2.a }) : n(t2.h); 14798 }, r3.prototype.isEqual = function(r4) { 14799 return this.toHex() === w(r4).toHex(); 14800 }, r3; 14801 })(); 14802 var w = function(r3) { 14803 return r3 instanceof j ? r3 : new j(r3); 14804 }; 14805 14806 // packages/dataviews/build-module/dataform-controls/color.js 14807 var import_components46 = __toESM(require_components()); 14808 var import_element49 = __toESM(require_element()); 14809 var import_jsx_runtime90 = __toESM(require_jsx_runtime()); 14810 var { ValidatedInputControl: ValidatedInputControl3, Picker } = unlock(import_components46.privateApis); 14811 var ColorPicker = ({ 14812 color, 14813 onColorChange 14814 }) => { 14815 const validColor = color && w(color).isValid() ? color : "#ffffff"; 14816 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)( 14817 import_components46.Dropdown, 14818 { 14819 renderToggle: ({ onToggle, isOpen }) => /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_components46.__experimentalInputControlPrefixWrapper, { variant: "icon", children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)( 14820 "button", 14821 { 14822 type: "button", 14823 onClick: onToggle, 14824 style: { 14825 width: "24px", 14826 height: "24px", 14827 borderRadius: "50%", 14828 backgroundColor: validColor, 14829 border: "1px solid #ddd", 14830 cursor: "pointer", 14831 outline: isOpen ? "2px solid #007cba" : "none", 14832 outlineOffset: "2px", 14833 display: "flex", 14834 alignItems: "center", 14835 justifyContent: "center", 14836 padding: 0, 14837 margin: 0 14838 }, 14839 "aria-label": "Open color picker" 14840 } 14841 ) }), 14842 renderContent: () => /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("div", { style: { padding: "16px" }, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)( 14843 Picker, 14844 { 14845 color: w(validColor), 14846 onChange: onColorChange, 14847 enableAlpha: true 14848 } 14849 ) }) 14850 } 14851 ); 14852 }; 14853 function Color({ 14854 data, 14855 field, 14856 onChange, 14857 hideLabelFromVision, 14858 validity 14859 }) { 14860 const { label, placeholder, description, setValue, isValid: isValid2 } = field; 14861 const value = field.getValue({ item: data }) || ""; 14862 const handleColorChange = (0, import_element49.useCallback)( 14863 (colorObject) => { 14864 onChange(setValue({ item: data, value: colorObject.toHex() })); 14865 }, 14866 [data, onChange, setValue] 14867 ); 14868 const handleInputChange = (0, import_element49.useCallback)( 14869 (newValue) => { 14870 onChange(setValue({ item: data, value: newValue || "" })); 14871 }, 14872 [data, onChange, setValue] 14873 ); 14874 return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)( 14875 ValidatedInputControl3, 14876 { 14877 required: !!field.isValid?.required, 14878 customValidity: getCustomValidity(isValid2, validity), 14879 label, 14880 placeholder, 14881 value, 14882 help: description, 14883 onChange: handleInputChange, 14884 hideLabelFromVision, 14885 type: "text", 14886 prefix: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)( 14887 ColorPicker, 14888 { 14889 color: value, 14890 onColorChange: handleColorChange 14891 } 14892 ) 14893 } 14894 ); 14895 } 14896 14897 // packages/dataviews/build-module/dataform-controls/password.js 14898 var import_components47 = __toESM(require_components()); 14899 var import_element50 = __toESM(require_element()); 14900 var import_i18n41 = __toESM(require_i18n()); 14901 var import_jsx_runtime91 = __toESM(require_jsx_runtime()); 14902 function Password({ 14903 data, 14904 field, 14905 onChange, 14906 hideLabelFromVision, 14907 validity 14908 }) { 14909 const [isVisible2, setIsVisible] = (0, import_element50.useState)(false); 14910 const toggleVisibility = (0, import_element50.useCallback)(() => { 14911 setIsVisible((prev) => !prev); 14912 }, []); 14913 return /* @__PURE__ */ (0, import_jsx_runtime91.jsx)( 14914 ValidatedText, 14915 { 14916 ...{ 14917 data, 14918 field, 14919 onChange, 14920 hideLabelFromVision, 14921 validity, 14922 type: isVisible2 ? "text" : "password", 14923 suffix: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(import_components47.__experimentalInputControlSuffixWrapper, { variant: "control", children: /* @__PURE__ */ (0, import_jsx_runtime91.jsx)( 14924 import_components47.Button, 14925 { 14926 icon: isVisible2 ? unseen_default : seen_default, 14927 onClick: toggleVisibility, 14928 size: "small", 14929 label: isVisible2 ? (0, import_i18n41.__)("Hide password") : (0, import_i18n41.__)("Show password") 14930 } 14931 ) }) 14932 } 14933 } 14934 ); 14935 } 14936 14937 // packages/dataviews/build-module/field-types/utils/has-elements.js 14938 function hasElements(field) { 14939 return Array.isArray(field.elements) && field.elements.length > 0 || typeof field.getElements === "function"; 14940 } 14941 14942 // packages/dataviews/build-module/dataform-controls/index.js 14943 var import_jsx_runtime92 = __toESM(require_jsx_runtime()); 14944 var FORM_CONTROLS = { 14945 array: ArrayControl, 14946 checkbox: Checkbox, 14947 color: Color, 14948 datetime: DateTime, 14949 date: DateControl, 14950 email: Email, 14951 telephone: Telephone, 14952 url: Url, 14953 integer: Integer, 14954 number: Number2, 14955 password: Password, 14956 radio: Radio, 14957 select: Select, 14958 text: Text2, 14959 toggle: Toggle, 14960 textarea: Textarea, 14961 toggleGroup: ToggleGroup 14962 }; 14963 function isEditConfig(value) { 14964 return value && typeof value === "object" && typeof value.control === "string"; 14965 } 14966 function createConfiguredControl(config) { 14967 const { control, ...controlConfig } = config; 14968 const BaseControlType = getControlByType(control); 14969 if (BaseControlType === null) { 14970 return null; 14971 } 14972 return function ConfiguredControl(props) { 14973 return /* @__PURE__ */ (0, import_jsx_runtime92.jsx)(BaseControlType, { ...props, config: controlConfig }); 14974 }; 14975 } 14976 function getControl(field, fallback) { 14977 if (typeof field.Edit === "function") { 14978 return field.Edit; 14979 } 14980 if (typeof field.Edit === "string") { 14981 return getControlByType(field.Edit); 14982 } 14983 if (isEditConfig(field.Edit)) { 14984 return createConfiguredControl(field.Edit); 14985 } 14986 if (hasElements(field) && field.type !== "array") { 14987 return getControlByType("select"); 14988 } 14989 if (fallback === null) { 14990 return null; 14991 } 14992 return getControlByType(fallback); 14993 } 14994 function getControlByType(type) { 14995 if (Object.keys(FORM_CONTROLS).includes(type)) { 14996 return FORM_CONTROLS[type]; 14997 } 14998 return null; 14999 } 15000 15001 // packages/dataviews/build-module/field-types/utils/get-filter-by.js 15002 function getFilterBy(field, defaultOperators, validOperators) { 15003 if (field.filterBy === false) { 15004 return false; 15005 } 15006 const operators = field.filterBy?.operators?.filter( 15007 (op) => validOperators.includes(op) 15008 ) ?? defaultOperators; 15009 if (operators.length === 0) { 15010 return false; 15011 } 15012 return { 15013 isPrimary: !!field.filterBy?.isPrimary, 15014 operators 15015 }; 15016 } 15017 var get_filter_by_default = getFilterBy; 15018 15019 // packages/dataviews/build-module/field-types/utils/get-value-from-id.js 15020 var getValueFromId = (id) => ({ item }) => { 15021 const path = id.split("."); 15022 let value = item; 15023 for (const segment of path) { 15024 if (value.hasOwnProperty(segment)) { 15025 value = value[segment]; 15026 } else { 15027 value = void 0; 15028 } 15029 } 15030 return value; 15031 }; 15032 var get_value_from_id_default = getValueFromId; 15033 15034 // packages/dataviews/build-module/field-types/utils/set-value-from-id.js 15035 var setValueFromId = (id) => ({ value }) => { 15036 const path = id.split("."); 15037 const result = {}; 15038 let current = result; 15039 for (const segment of path.slice(0, -1)) { 15040 current[segment] = {}; 15041 current = current[segment]; 15042 } 15043 current[path.at(-1)] = value; 15044 return result; 15045 }; 15046 var set_value_from_id_default = setValueFromId; 15047 15048 // packages/dataviews/build-module/field-types/email.js 15049 var import_i18n42 = __toESM(require_i18n()); 15050 15051 // packages/dataviews/build-module/field-types/utils/render-from-elements.js 15052 function RenderFromElements({ 15053 item, 15054 field 15055 }) { 15056 const { elements, isLoading } = useElements({ 15057 elements: field.elements, 15058 getElements: field.getElements 15059 }); 15060 const value = field.getValue({ item }); 15061 if (isLoading) { 15062 return value; 15063 } 15064 if (elements.length === 0) { 15065 return value; 15066 } 15067 return elements?.find((element) => element.value === value)?.label || field.getValue({ item }); 15068 } 15069 15070 // packages/dataviews/build-module/field-types/utils/render-default.js 15071 var import_jsx_runtime93 = __toESM(require_jsx_runtime()); 15072 function render({ 15073 item, 15074 field 15075 }) { 15076 if (field.hasElements) { 15077 return /* @__PURE__ */ (0, import_jsx_runtime93.jsx)(RenderFromElements, { item, field }); 15078 } 15079 return field.getValueFormatted({ item, field }); 15080 } 15081 15082 // packages/dataviews/build-module/field-types/utils/sort-text.js 15083 var sort_text_default = (a2, b2, direction) => { 15084 return direction === "asc" ? a2.localeCompare(b2) : b2.localeCompare(a2); 15085 }; 15086 15087 // packages/dataviews/build-module/field-types/utils/is-valid-required.js 15088 function isValidRequired(item, field) { 15089 const value = field.getValue({ item }); 15090 return ![void 0, "", null].includes(value); 15091 } 15092 15093 // packages/dataviews/build-module/field-types/utils/is-valid-min-length.js 15094 function isValidMinLength(item, field) { 15095 if (typeof field.isValid.minLength?.constraint !== "number") { 15096 return false; 15097 } 15098 const value = field.getValue({ item }); 15099 if ([void 0, "", null].includes(value)) { 15100 return true; 15101 } 15102 return String(value).length >= field.isValid.minLength.constraint; 15103 } 15104 15105 // packages/dataviews/build-module/field-types/utils/is-valid-max-length.js 15106 function isValidMaxLength(item, field) { 15107 if (typeof field.isValid.maxLength?.constraint !== "number") { 15108 return false; 15109 } 15110 const value = field.getValue({ item }); 15111 if ([void 0, "", null].includes(value)) { 15112 return true; 15113 } 15114 return String(value).length <= field.isValid.maxLength.constraint; 15115 } 15116 15117 // packages/dataviews/build-module/field-types/utils/is-valid-pattern.js 15118 function isValidPattern(item, field) { 15119 if (field.isValid.pattern?.constraint === void 0) { 15120 return true; 15121 } 15122 try { 15123 const regexp = new RegExp(field.isValid.pattern.constraint); 15124 const value = field.getValue({ item }); 15125 if ([void 0, "", null].includes(value)) { 15126 return true; 15127 } 15128 return regexp.test(String(value)); 15129 } catch { 15130 return false; 15131 } 15132 } 15133 15134 // packages/dataviews/build-module/field-types/utils/is-valid-elements.js 15135 function isValidElements(item, field) { 15136 const elements = field.elements ?? []; 15137 const validValues = elements.map((el) => el.value); 15138 if (validValues.length === 0) { 15139 return true; 15140 } 15141 const value = field.getValue({ item }); 15142 return [].concat(value).every((v2) => validValues.includes(v2)); 15143 } 15144 15145 // packages/dataviews/build-module/field-types/utils/get-value-formatted-default.js 15146 function getValueFormatted({ 15147 item, 15148 field 15149 }) { 15150 return field.getValue({ item }); 15151 } 15152 var get_value_formatted_default_default = getValueFormatted; 15153 15154 // packages/dataviews/build-module/field-types/email.js 15155 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])?)*$/; 15156 function isValidCustom(item, field) { 15157 const value = field.getValue({ item }); 15158 if (![void 0, "", null].includes(value) && !emailRegex.test(value)) { 15159 return (0, import_i18n42.__)("Value must be a valid email address."); 15160 } 15161 return null; 15162 } 15163 var email_default = { 15164 type: "email", 15165 render, 15166 Edit: "email", 15167 sort: sort_text_default, 15168 enableSorting: true, 15169 enableGlobalSearch: false, 15170 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15171 validOperators: [ 15172 OPERATOR_IS, 15173 OPERATOR_IS_NOT, 15174 OPERATOR_CONTAINS, 15175 OPERATOR_NOT_CONTAINS, 15176 OPERATOR_STARTS_WITH, 15177 // Multiple selection 15178 OPERATOR_IS_ANY, 15179 OPERATOR_IS_NONE, 15180 OPERATOR_IS_ALL, 15181 OPERATOR_IS_NOT_ALL 15182 ], 15183 format: {}, 15184 getValueFormatted: get_value_formatted_default_default, 15185 validate: { 15186 required: isValidRequired, 15187 pattern: isValidPattern, 15188 minLength: isValidMinLength, 15189 maxLength: isValidMaxLength, 15190 elements: isValidElements, 15191 custom: isValidCustom 15192 } 15193 }; 15194 15195 // packages/dataviews/build-module/field-types/integer.js 15196 var import_i18n43 = __toESM(require_i18n()); 15197 15198 // packages/dataviews/build-module/field-types/utils/sort-number.js 15199 var sort_number_default = (a2, b2, direction) => { 15200 return direction === "asc" ? a2 - b2 : b2 - a2; 15201 }; 15202 15203 // packages/dataviews/build-module/field-types/utils/is-valid-min.js 15204 function isValidMin(item, field) { 15205 if (typeof field.isValid.min?.constraint !== "number") { 15206 return false; 15207 } 15208 const value = field.getValue({ item }); 15209 if ([void 0, "", null].includes(value)) { 15210 return true; 15211 } 15212 return Number(value) >= field.isValid.min.constraint; 15213 } 15214 15215 // packages/dataviews/build-module/field-types/utils/is-valid-max.js 15216 function isValidMax(item, field) { 15217 if (typeof field.isValid.max?.constraint !== "number") { 15218 return false; 15219 } 15220 const value = field.getValue({ item }); 15221 if ([void 0, "", null].includes(value)) { 15222 return true; 15223 } 15224 return Number(value) <= field.isValid.max.constraint; 15225 } 15226 15227 // packages/dataviews/build-module/field-types/integer.js 15228 var format2 = { 15229 separatorThousand: "," 15230 }; 15231 function getValueFormatted2({ 15232 item, 15233 field 15234 }) { 15235 let value = field.getValue({ item }); 15236 if (value === null || value === void 0) { 15237 return ""; 15238 } 15239 value = Number(value); 15240 if (!Number.isFinite(value)) { 15241 return String(value); 15242 } 15243 let formatInteger; 15244 if (field.type !== "integer") { 15245 formatInteger = format2; 15246 } else { 15247 formatInteger = field.format; 15248 } 15249 const { separatorThousand } = formatInteger; 15250 const integerValue = Math.trunc(value); 15251 if (!separatorThousand) { 15252 return String(integerValue); 15253 } 15254 return String(integerValue).replace( 15255 /\B(?=(\d{3})+(?!\d))/g, 15256 separatorThousand 15257 ); 15258 } 15259 function isValidCustom2(item, field) { 15260 const value = field.getValue({ item }); 15261 if (![void 0, "", null].includes(value) && !Number.isInteger(value)) { 15262 return (0, import_i18n43.__)("Value must be an integer."); 15263 } 15264 return null; 15265 } 15266 var integer_default = { 15267 type: "integer", 15268 render, 15269 Edit: "integer", 15270 sort: sort_number_default, 15271 enableSorting: true, 15272 enableGlobalSearch: false, 15273 defaultOperators: [ 15274 OPERATOR_IS, 15275 OPERATOR_IS_NOT, 15276 OPERATOR_LESS_THAN, 15277 OPERATOR_GREATER_THAN, 15278 OPERATOR_LESS_THAN_OR_EQUAL, 15279 OPERATOR_GREATER_THAN_OR_EQUAL, 15280 OPERATOR_BETWEEN 15281 ], 15282 validOperators: [ 15283 // Single-selection 15284 OPERATOR_IS, 15285 OPERATOR_IS_NOT, 15286 OPERATOR_LESS_THAN, 15287 OPERATOR_GREATER_THAN, 15288 OPERATOR_LESS_THAN_OR_EQUAL, 15289 OPERATOR_GREATER_THAN_OR_EQUAL, 15290 OPERATOR_BETWEEN, 15291 // Multiple-selection 15292 OPERATOR_IS_ANY, 15293 OPERATOR_IS_NONE, 15294 OPERATOR_IS_ALL, 15295 OPERATOR_IS_NOT_ALL 15296 ], 15297 format: format2, 15298 getValueFormatted: getValueFormatted2, 15299 validate: { 15300 required: isValidRequired, 15301 min: isValidMin, 15302 max: isValidMax, 15303 elements: isValidElements, 15304 custom: isValidCustom2 15305 } 15306 }; 15307 15308 // packages/dataviews/build-module/field-types/number.js 15309 var import_i18n44 = __toESM(require_i18n()); 15310 var format3 = { 15311 separatorThousand: ",", 15312 separatorDecimal: ".", 15313 decimals: 2 15314 }; 15315 function getValueFormatted3({ 15316 item, 15317 field 15318 }) { 15319 let value = field.getValue({ item }); 15320 if (value === null || value === void 0) { 15321 return ""; 15322 } 15323 value = Number(value); 15324 if (!Number.isFinite(value)) { 15325 return String(value); 15326 } 15327 let formatNumber; 15328 if (field.type !== "number") { 15329 formatNumber = format3; 15330 } else { 15331 formatNumber = field.format; 15332 } 15333 const { separatorThousand, separatorDecimal, decimals } = formatNumber; 15334 const fixedValue = value.toFixed(decimals); 15335 const [integerPart, decimalPart] = fixedValue.split("."); 15336 const formattedInteger = separatorThousand ? integerPart.replace(/\B(?=(\d{3})+(?!\d))/g, separatorThousand) : integerPart; 15337 return decimals === 0 ? formattedInteger : formattedInteger + separatorDecimal + decimalPart; 15338 } 15339 function isEmpty2(value) { 15340 return value === "" || value === void 0 || value === null; 15341 } 15342 function isValidCustom3(item, field) { 15343 const value = field.getValue({ item }); 15344 if (!isEmpty2(value) && !Number.isFinite(value)) { 15345 return (0, import_i18n44.__)("Value must be a number."); 15346 } 15347 return null; 15348 } 15349 var number_default = { 15350 type: "number", 15351 render, 15352 Edit: "number", 15353 sort: sort_number_default, 15354 enableSorting: true, 15355 enableGlobalSearch: false, 15356 defaultOperators: [ 15357 OPERATOR_IS, 15358 OPERATOR_IS_NOT, 15359 OPERATOR_LESS_THAN, 15360 OPERATOR_GREATER_THAN, 15361 OPERATOR_LESS_THAN_OR_EQUAL, 15362 OPERATOR_GREATER_THAN_OR_EQUAL, 15363 OPERATOR_BETWEEN 15364 ], 15365 validOperators: [ 15366 // Single-selection 15367 OPERATOR_IS, 15368 OPERATOR_IS_NOT, 15369 OPERATOR_LESS_THAN, 15370 OPERATOR_GREATER_THAN, 15371 OPERATOR_LESS_THAN_OR_EQUAL, 15372 OPERATOR_GREATER_THAN_OR_EQUAL, 15373 OPERATOR_BETWEEN, 15374 // Multiple-selection 15375 OPERATOR_IS_ANY, 15376 OPERATOR_IS_NONE, 15377 OPERATOR_IS_ALL, 15378 OPERATOR_IS_NOT_ALL 15379 ], 15380 format: format3, 15381 getValueFormatted: getValueFormatted3, 15382 validate: { 15383 required: isValidRequired, 15384 min: isValidMin, 15385 max: isValidMax, 15386 elements: isValidElements, 15387 custom: isValidCustom3 15388 } 15389 }; 15390 15391 // packages/dataviews/build-module/field-types/text.js 15392 var text_default = { 15393 type: "text", 15394 render, 15395 Edit: "text", 15396 sort: sort_text_default, 15397 enableSorting: true, 15398 enableGlobalSearch: false, 15399 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15400 validOperators: [ 15401 // Single selection 15402 OPERATOR_IS, 15403 OPERATOR_IS_NOT, 15404 OPERATOR_CONTAINS, 15405 OPERATOR_NOT_CONTAINS, 15406 OPERATOR_STARTS_WITH, 15407 // Multiple selection 15408 OPERATOR_IS_ANY, 15409 OPERATOR_IS_NONE, 15410 OPERATOR_IS_ALL, 15411 OPERATOR_IS_NOT_ALL 15412 ], 15413 format: {}, 15414 getValueFormatted: get_value_formatted_default_default, 15415 validate: { 15416 required: isValidRequired, 15417 pattern: isValidPattern, 15418 minLength: isValidMinLength, 15419 maxLength: isValidMaxLength, 15420 elements: isValidElements 15421 } 15422 }; 15423 15424 // packages/dataviews/build-module/field-types/datetime.js 15425 var import_date5 = __toESM(require_date()); 15426 var format4 = { 15427 datetime: (0, import_date5.getSettings)().formats.datetime, 15428 weekStartsOn: (0, import_date5.getSettings)().l10n.startOfWeek 15429 }; 15430 function getValueFormatted4({ 15431 item, 15432 field 15433 }) { 15434 const value = field.getValue({ item }); 15435 if (["", void 0, null].includes(value)) { 15436 return ""; 15437 } 15438 let formatDatetime; 15439 if (field.type !== "datetime") { 15440 formatDatetime = format4; 15441 } else { 15442 formatDatetime = field.format; 15443 } 15444 return (0, import_date5.dateI18n)(formatDatetime.datetime, (0, import_date5.getDate)(value)); 15445 } 15446 var sort = (a2, b2, direction) => { 15447 const timeA = new Date(a2).getTime(); 15448 const timeB = new Date(b2).getTime(); 15449 return direction === "asc" ? timeA - timeB : timeB - timeA; 15450 }; 15451 var datetime_default = { 15452 type: "datetime", 15453 render, 15454 Edit: "datetime", 15455 sort, 15456 enableSorting: true, 15457 enableGlobalSearch: false, 15458 defaultOperators: [ 15459 OPERATOR_ON, 15460 OPERATOR_NOT_ON, 15461 OPERATOR_BEFORE, 15462 OPERATOR_AFTER, 15463 OPERATOR_BEFORE_INC, 15464 OPERATOR_AFTER_INC, 15465 OPERATOR_IN_THE_PAST, 15466 OPERATOR_OVER 15467 ], 15468 validOperators: [ 15469 OPERATOR_ON, 15470 OPERATOR_NOT_ON, 15471 OPERATOR_BEFORE, 15472 OPERATOR_AFTER, 15473 OPERATOR_BEFORE_INC, 15474 OPERATOR_AFTER_INC, 15475 OPERATOR_IN_THE_PAST, 15476 OPERATOR_OVER 15477 ], 15478 format: format4, 15479 getValueFormatted: getValueFormatted4, 15480 validate: { 15481 required: isValidRequired, 15482 elements: isValidElements 15483 } 15484 }; 15485 15486 // packages/dataviews/build-module/field-types/date.js 15487 var import_date6 = __toESM(require_date()); 15488 var format5 = { 15489 date: (0, import_date6.getSettings)().formats.date, 15490 weekStartsOn: (0, import_date6.getSettings)().l10n.startOfWeek 15491 }; 15492 function getValueFormatted5({ 15493 item, 15494 field 15495 }) { 15496 const value = field.getValue({ item }); 15497 if (["", void 0, null].includes(value)) { 15498 return ""; 15499 } 15500 let formatDate2; 15501 if (field.type !== "date") { 15502 formatDate2 = format5; 15503 } else { 15504 formatDate2 = field.format; 15505 } 15506 return (0, import_date6.dateI18n)(formatDate2.date, (0, import_date6.getDate)(value)); 15507 } 15508 var sort2 = (a2, b2, direction) => { 15509 const timeA = new Date(a2).getTime(); 15510 const timeB = new Date(b2).getTime(); 15511 return direction === "asc" ? timeA - timeB : timeB - timeA; 15512 }; 15513 var date_default = { 15514 type: "date", 15515 render, 15516 Edit: "date", 15517 sort: sort2, 15518 enableSorting: true, 15519 enableGlobalSearch: false, 15520 defaultOperators: [ 15521 OPERATOR_ON, 15522 OPERATOR_NOT_ON, 15523 OPERATOR_BEFORE, 15524 OPERATOR_AFTER, 15525 OPERATOR_BEFORE_INC, 15526 OPERATOR_AFTER_INC, 15527 OPERATOR_IN_THE_PAST, 15528 OPERATOR_OVER, 15529 OPERATOR_BETWEEN 15530 ], 15531 validOperators: [ 15532 OPERATOR_ON, 15533 OPERATOR_NOT_ON, 15534 OPERATOR_BEFORE, 15535 OPERATOR_AFTER, 15536 OPERATOR_BEFORE_INC, 15537 OPERATOR_AFTER_INC, 15538 OPERATOR_IN_THE_PAST, 15539 OPERATOR_OVER, 15540 OPERATOR_BETWEEN 15541 ], 15542 format: format5, 15543 getValueFormatted: getValueFormatted5, 15544 validate: { 15545 required: isValidRequired, 15546 elements: isValidElements 15547 } 15548 }; 15549 15550 // packages/dataviews/build-module/field-types/boolean.js 15551 var import_i18n45 = __toESM(require_i18n()); 15552 15553 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-bool.js 15554 function isValidRequiredForBool(item, field) { 15555 const value = field.getValue({ item }); 15556 return value === true; 15557 } 15558 15559 // packages/dataviews/build-module/field-types/boolean.js 15560 function getValueFormatted6({ 15561 item, 15562 field 15563 }) { 15564 const value = field.getValue({ item }); 15565 if (value === true) { 15566 return (0, import_i18n45.__)("True"); 15567 } 15568 if (value === false) { 15569 return (0, import_i18n45.__)("False"); 15570 } 15571 return ""; 15572 } 15573 function isValidCustom4(item, field) { 15574 const value = field.getValue({ item }); 15575 if (![void 0, "", null].includes(value) && ![true, false].includes(value)) { 15576 return (0, import_i18n45.__)("Value must be true, false, or undefined"); 15577 } 15578 return null; 15579 } 15580 var sort3 = (a2, b2, direction) => { 15581 const boolA = Boolean(a2); 15582 const boolB = Boolean(b2); 15583 if (boolA === boolB) { 15584 return 0; 15585 } 15586 if (direction === "asc") { 15587 return boolA ? 1 : -1; 15588 } 15589 return boolA ? -1 : 1; 15590 }; 15591 var boolean_default = { 15592 type: "boolean", 15593 render, 15594 Edit: "checkbox", 15595 sort: sort3, 15596 validate: { 15597 required: isValidRequiredForBool, 15598 elements: isValidElements, 15599 custom: isValidCustom4 15600 }, 15601 enableSorting: true, 15602 enableGlobalSearch: false, 15603 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT], 15604 validOperators: [OPERATOR_IS, OPERATOR_IS_NOT], 15605 format: {}, 15606 getValueFormatted: getValueFormatted6 15607 }; 15608 15609 // packages/dataviews/build-module/field-types/media.js 15610 var media_default = { 15611 type: "media", 15612 render: () => null, 15613 Edit: null, 15614 sort: () => 0, 15615 enableSorting: false, 15616 enableGlobalSearch: false, 15617 defaultOperators: [], 15618 validOperators: [], 15619 format: {}, 15620 getValueFormatted: get_value_formatted_default_default, 15621 // cannot validate any constraint, so 15622 // the only available validation for the field author 15623 // would be providing a custom validator. 15624 validate: {} 15625 }; 15626 15627 // packages/dataviews/build-module/field-types/array.js 15628 var import_i18n46 = __toESM(require_i18n()); 15629 15630 // packages/dataviews/build-module/field-types/utils/is-valid-required-for-array.js 15631 function isValidRequiredForArray(item, field) { 15632 const value = field.getValue({ item }); 15633 return Array.isArray(value) && value.length > 0 && value.every( 15634 (element) => ![void 0, "", null].includes(element) 15635 ); 15636 } 15637 15638 // packages/dataviews/build-module/field-types/array.js 15639 function getValueFormatted7({ 15640 item, 15641 field 15642 }) { 15643 const value = field.getValue({ item }); 15644 const arr = Array.isArray(value) ? value : []; 15645 return arr.join(", "); 15646 } 15647 function render2({ item, field }) { 15648 return getValueFormatted7({ item, field }); 15649 } 15650 function isValidCustom5(item, field) { 15651 const value = field.getValue({ item }); 15652 if (![void 0, "", null].includes(value) && !Array.isArray(value)) { 15653 return (0, import_i18n46.__)("Value must be an array."); 15654 } 15655 if (!value.every((v2) => typeof v2 === "string")) { 15656 return (0, import_i18n46.__)("Every value must be a string."); 15657 } 15658 return null; 15659 } 15660 var sort4 = (a2, b2, direction) => { 15661 const arrA = Array.isArray(a2) ? a2 : []; 15662 const arrB = Array.isArray(b2) ? b2 : []; 15663 if (arrA.length !== arrB.length) { 15664 return direction === "asc" ? arrA.length - arrB.length : arrB.length - arrA.length; 15665 } 15666 const joinedA = arrA.join(","); 15667 const joinedB = arrB.join(","); 15668 return direction === "asc" ? joinedA.localeCompare(joinedB) : joinedB.localeCompare(joinedA); 15669 }; 15670 var array_default = { 15671 type: "array", 15672 render: render2, 15673 Edit: "array", 15674 sort: sort4, 15675 enableSorting: true, 15676 enableGlobalSearch: false, 15677 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15678 validOperators: [ 15679 OPERATOR_IS_ANY, 15680 OPERATOR_IS_NONE, 15681 OPERATOR_IS_ALL, 15682 OPERATOR_IS_NOT_ALL 15683 ], 15684 format: {}, 15685 getValueFormatted: getValueFormatted7, 15686 validate: { 15687 required: isValidRequiredForArray, 15688 elements: isValidElements, 15689 custom: isValidCustom5 15690 } 15691 }; 15692 15693 // packages/dataviews/build-module/field-types/password.js 15694 function getValueFormatted8({ 15695 item, 15696 field 15697 }) { 15698 return field.getValue({ item }) ? "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" : ""; 15699 } 15700 var password_default = { 15701 type: "password", 15702 render, 15703 Edit: "password", 15704 sort: () => 0, 15705 // Passwords should not be sortable for security reasons 15706 enableSorting: false, 15707 enableGlobalSearch: false, 15708 defaultOperators: [], 15709 validOperators: [], 15710 format: {}, 15711 getValueFormatted: getValueFormatted8, 15712 validate: { 15713 required: isValidRequired, 15714 pattern: isValidPattern, 15715 minLength: isValidMinLength, 15716 maxLength: isValidMaxLength, 15717 elements: isValidElements 15718 } 15719 }; 15720 15721 // packages/dataviews/build-module/field-types/telephone.js 15722 var telephone_default = { 15723 type: "telephone", 15724 render, 15725 Edit: "telephone", 15726 sort: sort_text_default, 15727 enableSorting: true, 15728 enableGlobalSearch: false, 15729 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15730 validOperators: [ 15731 OPERATOR_IS, 15732 OPERATOR_IS_NOT, 15733 OPERATOR_CONTAINS, 15734 OPERATOR_NOT_CONTAINS, 15735 OPERATOR_STARTS_WITH, 15736 // Multiple selection 15737 OPERATOR_IS_ANY, 15738 OPERATOR_IS_NONE, 15739 OPERATOR_IS_ALL, 15740 OPERATOR_IS_NOT_ALL 15741 ], 15742 format: {}, 15743 getValueFormatted: get_value_formatted_default_default, 15744 validate: { 15745 required: isValidRequired, 15746 pattern: isValidPattern, 15747 minLength: isValidMinLength, 15748 maxLength: isValidMaxLength, 15749 elements: isValidElements 15750 } 15751 }; 15752 15753 // packages/dataviews/build-module/field-types/color.js 15754 var import_i18n47 = __toESM(require_i18n()); 15755 var import_jsx_runtime94 = __toESM(require_jsx_runtime()); 15756 function render3({ item, field }) { 15757 if (field.hasElements) { 15758 return /* @__PURE__ */ (0, import_jsx_runtime94.jsx)(RenderFromElements, { item, field }); 15759 } 15760 const value = get_value_formatted_default_default({ item, field }); 15761 if (!value || !w(value).isValid()) { 15762 return value; 15763 } 15764 return /* @__PURE__ */ (0, import_jsx_runtime94.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [ 15765 /* @__PURE__ */ (0, import_jsx_runtime94.jsx)( 15766 "div", 15767 { 15768 style: { 15769 width: "16px", 15770 height: "16px", 15771 borderRadius: "50%", 15772 backgroundColor: value, 15773 border: "1px solid #ddd", 15774 flexShrink: 0 15775 } 15776 } 15777 ), 15778 /* @__PURE__ */ (0, import_jsx_runtime94.jsx)("span", { children: value }) 15779 ] }); 15780 } 15781 function isValidCustom6(item, field) { 15782 const value = field.getValue({ item }); 15783 if (![void 0, "", null].includes(value) && !w(value).isValid()) { 15784 return (0, import_i18n47.__)("Value must be a valid color."); 15785 } 15786 return null; 15787 } 15788 var sort5 = (a2, b2, direction) => { 15789 const colorA = w(a2); 15790 const colorB = w(b2); 15791 if (!colorA.isValid() && !colorB.isValid()) { 15792 return 0; 15793 } 15794 if (!colorA.isValid()) { 15795 return direction === "asc" ? 1 : -1; 15796 } 15797 if (!colorB.isValid()) { 15798 return direction === "asc" ? -1 : 1; 15799 } 15800 const hslA = colorA.toHsl(); 15801 const hslB = colorB.toHsl(); 15802 if (hslA.h !== hslB.h) { 15803 return direction === "asc" ? hslA.h - hslB.h : hslB.h - hslA.h; 15804 } 15805 if (hslA.s !== hslB.s) { 15806 return direction === "asc" ? hslA.s - hslB.s : hslB.s - hslA.s; 15807 } 15808 return direction === "asc" ? hslA.l - hslB.l : hslB.l - hslA.l; 15809 }; 15810 var color_default = { 15811 type: "color", 15812 render: render3, 15813 Edit: "color", 15814 sort: sort5, 15815 enableSorting: true, 15816 enableGlobalSearch: false, 15817 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15818 validOperators: [ 15819 OPERATOR_IS, 15820 OPERATOR_IS_NOT, 15821 OPERATOR_IS_ANY, 15822 OPERATOR_IS_NONE 15823 ], 15824 format: {}, 15825 getValueFormatted: get_value_formatted_default_default, 15826 validate: { 15827 required: isValidRequired, 15828 elements: isValidElements, 15829 custom: isValidCustom6 15830 } 15831 }; 15832 15833 // packages/dataviews/build-module/field-types/url.js 15834 var url_default = { 15835 type: "url", 15836 render, 15837 Edit: "url", 15838 sort: sort_text_default, 15839 enableSorting: true, 15840 enableGlobalSearch: false, 15841 defaultOperators: [OPERATOR_IS_ANY, OPERATOR_IS_NONE], 15842 validOperators: [ 15843 OPERATOR_IS, 15844 OPERATOR_IS_NOT, 15845 OPERATOR_CONTAINS, 15846 OPERATOR_NOT_CONTAINS, 15847 OPERATOR_STARTS_WITH, 15848 // Multiple selection 15849 OPERATOR_IS_ANY, 15850 OPERATOR_IS_NONE, 15851 OPERATOR_IS_ALL, 15852 OPERATOR_IS_NOT_ALL 15853 ], 15854 format: {}, 15855 getValueFormatted: get_value_formatted_default_default, 15856 validate: { 15857 required: isValidRequired, 15858 pattern: isValidPattern, 15859 minLength: isValidMinLength, 15860 maxLength: isValidMaxLength, 15861 elements: isValidElements 15862 } 15863 }; 15864 15865 // packages/dataviews/build-module/field-types/no-type.js 15866 var sort6 = (a2, b2, direction) => { 15867 if (typeof a2 === "number" && typeof b2 === "number") { 15868 return sort_number_default(a2, b2, direction); 15869 } 15870 return sort_text_default(a2, b2, direction); 15871 }; 15872 var no_type_default = { 15873 // type: no type for this one 15874 render, 15875 Edit: null, 15876 sort: sort6, 15877 enableSorting: true, 15878 enableGlobalSearch: false, 15879 defaultOperators: [OPERATOR_IS, OPERATOR_IS_NOT], 15880 validOperators: getAllOperatorNames(), 15881 format: {}, 15882 getValueFormatted: get_value_formatted_default_default, 15883 validate: { 15884 required: isValidRequired, 15885 elements: isValidElements 15886 } 15887 }; 15888 15889 // packages/dataviews/build-module/field-types/utils/get-is-valid.js 15890 function getIsValid(field, fieldType) { 15891 let required; 15892 if (field.isValid?.required === true && fieldType.validate.required !== void 0) { 15893 required = { 15894 constraint: true, 15895 validate: fieldType.validate.required 15896 }; 15897 } 15898 let elements; 15899 if ((field.isValid?.elements === true || // elements is enabled unless the field opts-out 15900 field.isValid?.elements === void 0 && (!!field.elements || !!field.getElements)) && fieldType.validate.elements !== void 0) { 15901 elements = { 15902 constraint: true, 15903 validate: fieldType.validate.elements 15904 }; 15905 } 15906 let min; 15907 if (typeof field.isValid?.min === "number" && fieldType.validate.min !== void 0) { 15908 min = { 15909 constraint: field.isValid.min, 15910 validate: fieldType.validate.min 15911 }; 15912 } 15913 let max; 15914 if (typeof field.isValid?.max === "number" && fieldType.validate.max !== void 0) { 15915 max = { 15916 constraint: field.isValid.max, 15917 validate: fieldType.validate.max 15918 }; 15919 } 15920 let minLength; 15921 if (typeof field.isValid?.minLength === "number" && fieldType.validate.minLength !== void 0) { 15922 minLength = { 15923 constraint: field.isValid.minLength, 15924 validate: fieldType.validate.minLength 15925 }; 15926 } 15927 let maxLength; 15928 if (typeof field.isValid?.maxLength === "number" && fieldType.validate.maxLength !== void 0) { 15929 maxLength = { 15930 constraint: field.isValid.maxLength, 15931 validate: fieldType.validate.maxLength 15932 }; 15933 } 15934 let pattern; 15935 if (field.isValid?.pattern !== void 0 && fieldType.validate.pattern !== void 0) { 15936 pattern = { 15937 constraint: field.isValid?.pattern, 15938 validate: fieldType.validate.pattern 15939 }; 15940 } 15941 const custom = field.isValid?.custom ?? fieldType.validate.custom; 15942 return { 15943 required, 15944 elements, 15945 min, 15946 max, 15947 minLength, 15948 maxLength, 15949 pattern, 15950 custom 15951 }; 15952 } 15953 15954 // packages/dataviews/build-module/field-types/utils/get-format.js 15955 function getFormat(field, fieldType) { 15956 return { 15957 ...fieldType.format, 15958 ...field.format 15959 }; 15960 } 15961 var get_format_default = getFormat; 15962 15963 // packages/dataviews/build-module/field-types/index.js 15964 function getFieldTypeByName(type) { 15965 const found = [ 15966 email_default, 15967 integer_default, 15968 number_default, 15969 text_default, 15970 datetime_default, 15971 date_default, 15972 boolean_default, 15973 media_default, 15974 array_default, 15975 password_default, 15976 telephone_default, 15977 color_default, 15978 url_default 15979 ].find((fieldType) => fieldType?.type === type); 15980 if (!!found) { 15981 return found; 15982 } 15983 return no_type_default; 15984 } 15985 function normalizeFields(fields) { 15986 return fields.map((field) => { 15987 const fieldType = getFieldTypeByName(field.type); 15988 const getValue = field.getValue || get_value_from_id_default(field.id); 15989 const sort7 = function(a2, b2, direction) { 15990 const aValue = getValue({ item: a2 }); 15991 const bValue = getValue({ item: b2 }); 15992 return field.sort ? field.sort(aValue, bValue, direction) : fieldType.sort(aValue, bValue, direction); 15993 }; 15994 return { 15995 id: field.id, 15996 label: field.label || field.id, 15997 header: field.header || field.label || field.id, 15998 description: field.description, 15999 placeholder: field.placeholder, 16000 getValue, 16001 setValue: field.setValue || set_value_from_id_default(field.id), 16002 elements: field.elements, 16003 getElements: field.getElements, 16004 hasElements: hasElements(field), 16005 isVisible: field.isVisible, 16006 enableHiding: field.enableHiding ?? true, 16007 readOnly: field.readOnly ?? false, 16008 // The type provides defaults for the following props 16009 type: fieldType.type, 16010 render: field.render ?? fieldType.render, 16011 Edit: getControl(field, fieldType.Edit), 16012 sort: sort7, 16013 enableSorting: field.enableSorting ?? fieldType.enableSorting, 16014 enableGlobalSearch: field.enableGlobalSearch ?? fieldType.enableGlobalSearch, 16015 isValid: getIsValid(field, fieldType), 16016 filterBy: get_filter_by_default( 16017 field, 16018 fieldType.defaultOperators, 16019 fieldType.validOperators 16020 ), 16021 format: get_format_default(field, fieldType), 16022 getValueFormatted: field.getValueFormatted ?? fieldType.getValueFormatted 16023 }; 16024 }); 16025 } 16026 16027 // packages/dataviews/build-module/components/dataviews-picker/index.js 16028 var import_components48 = __toESM(require_components()); 16029 var import_element51 = __toESM(require_element()); 16030 var import_compose11 = __toESM(require_compose()); 16031 var import_jsx_runtime95 = __toESM(require_jsx_runtime()); 16032 var isItemClickable = () => false; 16033 var dataViewsPickerLayouts = VIEW_LAYOUTS.filter( 16034 (viewLayout) => viewLayout.isPicker 16035 ); 16036 var defaultGetItemId = (item) => item.id; 16037 var EMPTY_ARRAY4 = []; 16038 function DefaultUI({ 16039 search = true, 16040 searchLabel = void 0 16041 }) { 16042 return /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)(import_jsx_runtime95.Fragment, { children: [ 16043 /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)( 16044 import_components48.__experimentalHStack, 16045 { 16046 alignment: "top", 16047 justify: "space-between", 16048 className: "dataviews__view-actions", 16049 spacing: 1, 16050 children: [ 16051 /* @__PURE__ */ (0, import_jsx_runtime95.jsxs)( 16052 import_components48.__experimentalHStack, 16053 { 16054 justify: "start", 16055 expanded: false, 16056 className: "dataviews__search", 16057 children: [ 16058 search && /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(dataviews_search_default, { label: searchLabel }), 16059 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(toggle_default, {}) 16060 ] 16061 } 16062 ), 16063 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)( 16064 import_components48.__experimentalHStack, 16065 { 16066 spacing: 1, 16067 expanded: false, 16068 style: { flexShrink: 0 }, 16069 children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(dataviews_view_config_default, {}) 16070 } 16071 ) 16072 ] 16073 } 16074 ), 16075 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(filters_toggled_default, { className: "dataviews-filters__container" }), 16076 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(DataViewsLayout, {}), 16077 /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(DataViewsPickerFooter, {}) 16078 ] }); 16079 } 16080 function DataViewsPicker({ 16081 view, 16082 onChangeView, 16083 fields, 16084 search = true, 16085 searchLabel = void 0, 16086 actions = EMPTY_ARRAY4, 16087 data, 16088 getItemId = defaultGetItemId, 16089 isLoading = false, 16090 paginationInfo, 16091 defaultLayouts: defaultLayoutsProperty, 16092 selection, 16093 onChangeSelection, 16094 children, 16095 config = { perPageSizes: [10, 20, 50, 100] }, 16096 itemListLabel, 16097 empty 16098 }) { 16099 const { infiniteScrollHandler } = paginationInfo; 16100 const containerRef = (0, import_element51.useRef)(null); 16101 const [containerWidth, setContainerWidth] = (0, import_element51.useState)(0); 16102 const resizeObserverRef = (0, import_compose11.useResizeObserver)( 16103 (resizeObserverEntries) => { 16104 setContainerWidth( 16105 resizeObserverEntries[0].borderBoxSize[0].inlineSize 16106 ); 16107 }, 16108 { box: "border-box" } 16109 ); 16110 const [openedFilter, setOpenedFilter] = (0, import_element51.useState)(null); 16111 function setSelectionWithChange(value) { 16112 const newValue = typeof value === "function" ? value(selection) : value; 16113 if (onChangeSelection) { 16114 onChangeSelection(newValue); 16115 } 16116 } 16117 const _fields = (0, import_element51.useMemo)(() => normalizeFields(fields), [fields]); 16118 const filters = use_filters_default(_fields, view); 16119 const hasPrimaryOrLockedFilters = (0, import_element51.useMemo)( 16120 () => (filters || []).some( 16121 (filter) => filter.isPrimary || filter.isLocked 16122 ), 16123 [filters] 16124 ); 16125 const [isShowingFilter, setIsShowingFilter] = (0, import_element51.useState)( 16126 hasPrimaryOrLockedFilters 16127 ); 16128 (0, import_element51.useEffect)(() => { 16129 if (hasPrimaryOrLockedFilters && !isShowingFilter) { 16130 setIsShowingFilter(true); 16131 } 16132 }, [hasPrimaryOrLockedFilters, isShowingFilter]); 16133 (0, import_element51.useEffect)(() => { 16134 if (!view.infiniteScrollEnabled || !containerRef.current) { 16135 return; 16136 } 16137 const handleScroll = (0, import_compose11.throttle)((event) => { 16138 const target = event.target; 16139 const scrollTop = target.scrollTop; 16140 const scrollHeight = target.scrollHeight; 16141 const clientHeight = target.clientHeight; 16142 if (scrollTop + clientHeight >= scrollHeight - 100) { 16143 infiniteScrollHandler?.(); 16144 } 16145 }, 100); 16146 const container = containerRef.current; 16147 container.addEventListener("scroll", handleScroll); 16148 return () => { 16149 container.removeEventListener("scroll", handleScroll); 16150 handleScroll.cancel(); 16151 }; 16152 }, [infiniteScrollHandler, view.infiniteScrollEnabled]); 16153 const defaultLayouts = (0, import_element51.useMemo)( 16154 () => Object.fromEntries( 16155 Object.entries(defaultLayoutsProperty).filter( 16156 ([layoutType]) => { 16157 return dataViewsPickerLayouts.some( 16158 (viewLayout) => viewLayout.type === layoutType 16159 ); 16160 } 16161 ) 16162 ), 16163 [defaultLayoutsProperty] 16164 ); 16165 if (!defaultLayouts[view.type]) { 16166 return null; 16167 } 16168 return /* @__PURE__ */ (0, import_jsx_runtime95.jsx)( 16169 dataviews_context_default.Provider, 16170 { 16171 value: { 16172 view, 16173 onChangeView, 16174 fields: _fields, 16175 actions, 16176 data, 16177 isLoading, 16178 paginationInfo, 16179 isItemClickable, 16180 selection, 16181 onChangeSelection: setSelectionWithChange, 16182 openedFilter, 16183 setOpenedFilter, 16184 getItemId, 16185 containerWidth, 16186 containerRef, 16187 resizeObserverRef, 16188 defaultLayouts, 16189 filters, 16190 isShowingFilter, 16191 setIsShowingFilter, 16192 config, 16193 itemListLabel, 16194 empty, 16195 hasInfiniteScrollHandler: !!infiniteScrollHandler 16196 }, 16197 children: /* @__PURE__ */ (0, import_jsx_runtime95.jsx)("div", { className: "dataviews-picker-wrapper", ref: containerRef, children: children ?? /* @__PURE__ */ (0, import_jsx_runtime95.jsx)(DefaultUI, { search, searchLabel }) }) 16198 } 16199 ); 16200 } 16201 var DataViewsPickerSubComponents = DataViewsPicker; 16202 DataViewsPickerSubComponents.BulkActionToolbar = DataViewsPickerFooter; 16203 DataViewsPickerSubComponents.Filters = filters_default; 16204 DataViewsPickerSubComponents.FiltersToggled = filters_toggled_default; 16205 DataViewsPickerSubComponents.FiltersToggle = toggle_default; 16206 DataViewsPickerSubComponents.Layout = DataViewsLayout; 16207 DataViewsPickerSubComponents.LayoutSwitcher = ViewTypeMenu; 16208 DataViewsPickerSubComponents.Pagination = DataViewsPagination; 16209 DataViewsPickerSubComponents.Search = dataviews_search_default; 16210 DataViewsPickerSubComponents.ViewConfig = DataviewsViewConfigDropdown; 16211 var dataviews_picker_default = DataViewsPickerSubComponents; 16212 16213 // packages/media-fields/build-module/alt_text/index.js 16214 var import_i18n48 = __toESM(require_i18n()); 16215 var import_components49 = __toESM(require_components()); 16216 var import_jsx_runtime96 = __toESM(require_jsx_runtime()); 16217 var altTextField = { 16218 id: "alt_text", 16219 type: "text", 16220 label: (0, import_i18n48.__)("Alt text"), 16221 isVisible: (item) => item?.media_type === "image", 16222 render: ({ item }) => item?.alt_text || "-", 16223 Edit: ({ field, onChange, data }) => { 16224 return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)( 16225 import_components49.TextareaControl, 16226 { 16227 label: field.label, 16228 value: data.alt_text || "", 16229 onChange: (value) => onChange({ alt_text: value }), 16230 rows: 2 16231 } 16232 ); 16233 }, 16234 enableSorting: false, 16235 filterBy: false 16236 }; 16237 var alt_text_default = altTextField; 16238 16239 // packages/media-fields/build-module/caption/index.js 16240 var import_i18n49 = __toESM(require_i18n()); 16241 var import_components50 = __toESM(require_components()); 16242 16243 // packages/media-fields/build-module/utils/get-raw-content.js 16244 function getRawContent(content) { 16245 if (!content) { 16246 return ""; 16247 } 16248 if (typeof content === "string") { 16249 return content; 16250 } 16251 if (typeof content === "object" && "raw" in content) { 16252 return content.raw || ""; 16253 } 16254 return ""; 16255 } 16256 16257 // packages/media-fields/build-module/caption/index.js 16258 var import_jsx_runtime97 = __toESM(require_jsx_runtime()); 16259 var captionField = { 16260 id: "caption", 16261 type: "text", 16262 label: (0, import_i18n49.__)("Caption"), 16263 getValue: ({ item }) => getRawContent(item?.caption), 16264 render: ({ item }) => getRawContent(item?.caption) || "-", 16265 Edit: ({ field, onChange, data }) => { 16266 return /* @__PURE__ */ (0, import_jsx_runtime97.jsx)( 16267 import_components50.TextareaControl, 16268 { 16269 label: field.label, 16270 value: getRawContent(data.caption) || "", 16271 onChange: (value) => onChange({ caption: value }), 16272 rows: 2 16273 } 16274 ); 16275 }, 16276 enableSorting: false, 16277 filterBy: false 16278 }; 16279 var caption_default = captionField; 16280 16281 // packages/media-fields/build-module/description/index.js 16282 var import_i18n50 = __toESM(require_i18n()); 16283 var import_components51 = __toESM(require_components()); 16284 var import_jsx_runtime98 = __toESM(require_jsx_runtime()); 16285 var descriptionField = { 16286 id: "description", 16287 type: "text", 16288 label: (0, import_i18n50.__)("Description"), 16289 getValue: ({ item }) => getRawContent(item?.description), 16290 render: ({ item }) => /* @__PURE__ */ (0, import_jsx_runtime98.jsx)("div", { children: getRawContent(item?.description) || "-" }), 16291 Edit: ({ field, onChange, data }) => { 16292 return /* @__PURE__ */ (0, import_jsx_runtime98.jsx)( 16293 import_components51.TextareaControl, 16294 { 16295 label: field.label, 16296 value: getRawContent(data.description) || "", 16297 onChange: (value) => onChange({ description: value }), 16298 rows: 5 16299 } 16300 ); 16301 }, 16302 enableSorting: false, 16303 filterBy: false 16304 }; 16305 var description_default = descriptionField; 16306 16307 // packages/media-fields/build-module/filename/index.js 16308 var import_i18n51 = __toESM(require_i18n()); 16309 var import_url4 = __toESM(require_url()); 16310 16311 // packages/media-fields/build-module/filename/view.js 16312 var import_components52 = __toESM(require_components()); 16313 var import_element52 = __toESM(require_element()); 16314 var import_url3 = __toESM(require_url()); 16315 var import_jsx_runtime99 = __toESM(require_jsx_runtime()); 16316 var TRUNCATE_LENGTH = 15; 16317 function FileNameView({ 16318 item 16319 }) { 16320 const fileName = (0, import_element52.useMemo)( 16321 () => item?.source_url ? (0, import_url3.getFilename)(item.source_url) : null, 16322 [item?.source_url] 16323 ); 16324 if (!fileName) { 16325 return ""; 16326 } 16327 return fileName.length > TRUNCATE_LENGTH ? /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(import_components52.Tooltip, { text: fileName, children: /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(import_components52.__experimentalTruncate, { children: fileName }) }) : /* @__PURE__ */ (0, import_jsx_runtime99.jsx)(import_jsx_runtime99.Fragment, { children: fileName }); 16328 } 16329 16330 // packages/media-fields/build-module/filename/index.js 16331 var filenameField = { 16332 id: "filename", 16333 type: "text", 16334 label: (0, import_i18n51.__)("File name"), 16335 getValue: ({ item }) => (0, import_url4.getFilename)(item?.source_url || ""), 16336 render: FileNameView, 16337 enableSorting: false, 16338 filterBy: false, 16339 readOnly: true 16340 }; 16341 var filename_default = filenameField; 16342 16343 // packages/media-fields/build-module/filesize/index.js 16344 var import_i18n52 = __toESM(require_i18n()); 16345 var KB_IN_BYTES = 1024; 16346 var MB_IN_BYTES = 1024 * KB_IN_BYTES; 16347 var GB_IN_BYTES = 1024 * MB_IN_BYTES; 16348 var TB_IN_BYTES = 1024 * GB_IN_BYTES; 16349 var PB_IN_BYTES = 1024 * TB_IN_BYTES; 16350 var EB_IN_BYTES = 1024 * PB_IN_BYTES; 16351 var ZB_IN_BYTES = 1024 * EB_IN_BYTES; 16352 var YB_IN_BYTES = 1024 * ZB_IN_BYTES; 16353 function getBytesString(bytes, unitSymbol, decimals = 2) { 16354 return (0, import_i18n52.sprintf)( 16355 // translators: 1: Actual bytes of a file. 2: The unit symbol (e.g. MB). 16356 (0, import_i18n52._x)("%1$s %2$s", "file size"), 16357 bytes.toLocaleString(void 0, { 16358 minimumFractionDigits: 0, 16359 maximumFractionDigits: decimals 16360 }), 16361 unitSymbol 16362 ); 16363 } 16364 function formatFileSize(bytes, decimals = 2) { 16365 if (bytes === 0) { 16366 return getBytesString(0, (0, import_i18n52._x)("B", "unit symbol"), decimals); 16367 } 16368 const quant = { 16369 /* translators: Unit symbol for yottabyte. */ 16370 [(0, import_i18n52._x)("YB", "unit symbol")]: YB_IN_BYTES, 16371 /* translators: Unit symbol for zettabyte. */ 16372 [(0, import_i18n52._x)("ZB", "unit symbol")]: ZB_IN_BYTES, 16373 /* translators: Unit symbol for exabyte. */ 16374 [(0, import_i18n52._x)("EB", "unit symbol")]: EB_IN_BYTES, 16375 /* translators: Unit symbol for petabyte. */ 16376 [(0, import_i18n52._x)("PB", "unit symbol")]: PB_IN_BYTES, 16377 /* translators: Unit symbol for terabyte. */ 16378 [(0, import_i18n52._x)("TB", "unit symbol")]: TB_IN_BYTES, 16379 /* translators: Unit symbol for gigabyte. */ 16380 [(0, import_i18n52._x)("GB", "unit symbol")]: GB_IN_BYTES, 16381 /* translators: Unit symbol for megabyte. */ 16382 [(0, import_i18n52._x)("MB", "unit symbol")]: MB_IN_BYTES, 16383 /* translators: Unit symbol for kilobyte. */ 16384 [(0, import_i18n52._x)("KB", "unit symbol")]: KB_IN_BYTES, 16385 /* translators: Unit symbol for byte. */ 16386 [(0, import_i18n52._x)("B", "unit symbol")]: 1 16387 }; 16388 for (const [unit, mag] of Object.entries(quant)) { 16389 if (bytes >= mag) { 16390 return getBytesString(bytes / mag, unit, decimals); 16391 } 16392 } 16393 return ""; 16394 } 16395 var filesizeField = { 16396 id: "filesize", 16397 type: "text", 16398 label: (0, import_i18n52.__)("File size"), 16399 getValue: ({ item }) => item?.media_details?.filesize ? formatFileSize(item?.media_details?.filesize) : "", 16400 isVisible: (item) => { 16401 return !!item?.media_details?.filesize; 16402 }, 16403 enableSorting: false, 16404 filterBy: false, 16405 readOnly: true 16406 }; 16407 var filesize_default = filesizeField; 16408 16409 // packages/media-fields/build-module/media_dimensions/index.js 16410 var import_i18n53 = __toESM(require_i18n()); 16411 var mediaDimensionsField = { 16412 id: "media_dimensions", 16413 type: "text", 16414 label: (0, import_i18n53.__)("Dimensions"), 16415 getValue: ({ item }) => item?.media_details?.width && item?.media_details?.height ? (0, import_i18n53.sprintf)( 16416 // translators: 1: Width. 2: Height. 16417 (0, import_i18n53._x)("%1$s \xD7 %2$s", "image dimensions"), 16418 item?.media_details?.width?.toString(), 16419 item?.media_details?.height?.toString() 16420 ) : "", 16421 isVisible: (item) => { 16422 return !!(item?.media_details?.width && item?.media_details?.height); 16423 }, 16424 enableSorting: false, 16425 filterBy: false, 16426 readOnly: true 16427 }; 16428 var media_dimensions_default = mediaDimensionsField; 16429 16430 // packages/media-fields/build-module/media_thumbnail/index.js 16431 var import_i18n55 = __toESM(require_i18n()); 16432 16433 // packages/media-fields/build-module/media_thumbnail/view.js 16434 var import_data6 = __toESM(require_data()); 16435 var import_core_data = __toESM(require_core_data()); 16436 var import_components53 = __toESM(require_components()); 16437 var import_element53 = __toESM(require_element()); 16438 var import_url5 = __toESM(require_url()); 16439 16440 // packages/media-fields/build-module/utils/get-media-type-from-mime-type.js 16441 var import_i18n54 = __toESM(require_i18n()); 16442 function getMediaTypeFromMimeType(mimeType) { 16443 if (mimeType.startsWith("image/")) { 16444 return { 16445 type: "image", 16446 label: (0, import_i18n54.__)("Image"), 16447 icon: image_default 16448 }; 16449 } 16450 if (mimeType.startsWith("video/")) { 16451 return { 16452 type: "video", 16453 label: (0, import_i18n54.__)("Video"), 16454 icon: video_default 16455 }; 16456 } 16457 if (mimeType.startsWith("audio/")) { 16458 return { 16459 type: "audio", 16460 label: (0, import_i18n54.__)("Audio"), 16461 icon: audio_default 16462 }; 16463 } 16464 return { 16465 type: "application", 16466 label: (0, import_i18n54.__)("Application"), 16467 icon: file_default 16468 }; 16469 } 16470 16471 // packages/media-fields/build-module/media_thumbnail/view.js 16472 var import_jsx_runtime100 = __toESM(require_jsx_runtime()); 16473 function FallbackView({ 16474 item, 16475 filename 16476 }) { 16477 return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)("div", { className: "dataviews-media-field__media-thumbnail", children: /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)( 16478 import_components53.__experimentalVStack, 16479 { 16480 justify: "center", 16481 alignment: "center", 16482 className: "dataviews-media-field__media-thumbnail__stack", 16483 spacing: 0, 16484 children: [ 16485 /* @__PURE__ */ (0, import_jsx_runtime100.jsx)( 16486 import_components53.Icon, 16487 { 16488 className: "dataviews-media-field__media-thumbnail--icon", 16489 icon: getMediaTypeFromMimeType(item.mime_type).icon, 16490 size: 24 16491 } 16492 ), 16493 !!filename && /* @__PURE__ */ (0, import_jsx_runtime100.jsx)("div", { className: "dataviews-media-field__media-thumbnail__filename", children: /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(import_components53.__experimentalTruncate, { className: "dataviews-media-field__media-thumbnail__filename__truncate", children: filename }) }) 16494 ] 16495 } 16496 ) }); 16497 } 16498 function MediaThumbnailView({ 16499 item, 16500 config 16501 }) { 16502 const [imageError, setImageError] = (0, import_element53.useState)(false); 16503 const _featuredMedia = (0, import_data6.useSelect)( 16504 (select) => { 16505 if (!item.featured_media) { 16506 return; 16507 } 16508 return select(import_core_data.store).getEntityRecord( 16509 "postType", 16510 "attachment", 16511 item.featured_media 16512 ); 16513 }, 16514 [item.featured_media] 16515 ); 16516 const featuredMedia = item.featured_media ? _featuredMedia : item; 16517 if (!featuredMedia) { 16518 return null; 16519 } 16520 const filename = (0, import_url5.getFilename)(featuredMedia.source_url || ""); 16521 if (imageError || getMediaTypeFromMimeType(featuredMedia.mime_type).type !== "image") { 16522 return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)(FallbackView, { item: featuredMedia, filename: filename || "" }); 16523 } 16524 return /* @__PURE__ */ (0, import_jsx_runtime100.jsx)("div", { className: "dataviews-media-field__media-thumbnail", children: /* @__PURE__ */ (0, import_jsx_runtime100.jsx)( 16525 "img", 16526 { 16527 className: "dataviews-media-field__media-thumbnail--image", 16528 src: featuredMedia.source_url, 16529 srcSet: featuredMedia?.media_details?.sizes ? Object.values( 16530 featuredMedia.media_details.sizes 16531 ).map( 16532 (size) => `$size.source_url} $size.width}w` 16533 ).join(", ") : void 0, 16534 sizes: config?.sizes || "100vw", 16535 alt: featuredMedia.alt_text || featuredMedia.title.raw, 16536 onError: () => setImageError(true) 16537 } 16538 ) }); 16539 } 16540 16541 // packages/media-fields/build-module/media_thumbnail/index.js 16542 var mediaThumbnailField = { 16543 id: "media_thumbnail", 16544 type: "media", 16545 label: (0, import_i18n55.__)("Thumbnail"), 16546 render: MediaThumbnailView, 16547 enableSorting: false, 16548 filterBy: false 16549 }; 16550 var media_thumbnail_default = mediaThumbnailField; 16551 16552 // packages/media-fields/build-module/mime_type/index.js 16553 var import_i18n56 = __toESM(require_i18n()); 16554 var mimeTypeField = { 16555 id: "mime_type", 16556 type: "text", 16557 label: (0, import_i18n56.__)("File type"), 16558 getValue: ({ item }) => item?.mime_type || "", 16559 render: ({ item }) => item?.mime_type || "-", 16560 enableSorting: true, 16561 filterBy: false, 16562 readOnly: true 16563 }; 16564 var mime_type_default = mimeTypeField; 16565 16566 // packages/media-utils/build-module/lock-unlock.js 16567 var import_private_apis2 = __toESM(require_private_apis()); 16568 var { lock: lock2, unlock: unlock2 } = (0, import_private_apis2.__dangerousOptInToUnstableAPIsOnlyForCoreModules)( 16569 "I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.", 16570 "@wordpress/media-utils" 16571 ); 16572 16573 // packages/media-utils/build-module/components/media-upload-modal/index.js 16574 var import_jsx_runtime101 = __toESM(require_jsx_runtime()); 16575 var { useEntityRecordsWithPermissions } = unlock2(import_core_data2.privateApis); 16576 var LAYOUT_PICKER_GRID2 = "pickerGrid"; 16577 var LAYOUT_PICKER_TABLE2 = "pickerTable"; 16578 function MediaUploadModal({ 16579 allowedTypes = ["image"], 16580 multiple = false, 16581 value, 16582 onSelect, 16583 onClose, 16584 onUpload, 16585 title = (0, import_i18n57.__)("Select Media"), 16586 isOpen, 16587 isDismissible = true, 16588 modalClass, 16589 search = true, 16590 searchLabel = (0, import_i18n57.__)("Search media") 16591 }) { 16592 const [selection, setSelection] = (0, import_element54.useState)(() => { 16593 if (!value) { 16594 return []; 16595 } 16596 return Array.isArray(value) ? value.map(String) : [String(value)]; 16597 }); 16598 const [view, setView] = (0, import_element54.useState)(() => ({ 16599 type: LAYOUT_PICKER_GRID2, 16600 fields: [], 16601 showTitle: false, 16602 titleField: "title", 16603 mediaField: "media_thumbnail", 16604 search: "", 16605 page: 1, 16606 perPage: 20, 16607 filters: [] 16608 })); 16609 const queryArgs = (0, import_element54.useMemo)(() => { 16610 const filters = {}; 16611 view.filters?.forEach((filter) => { 16612 if (filter.field === "media_type") { 16613 filters.media_type = filter.value; 16614 } 16615 if (filter.field === "author") { 16616 filters.author = filter.value; 16617 } 16618 if (filter.field === "date") { 16619 filters.after = filter.value?.after; 16620 filters.before = filter.value?.before; 16621 } 16622 if (filter.field === "mime_type") { 16623 filters.mime_type = filter.value; 16624 } 16625 }); 16626 if (!filters.media_type) { 16627 filters.media_type = allowedTypes.includes("*") ? void 0 : allowedTypes; 16628 } 16629 return { 16630 per_page: view.perPage || 20, 16631 page: view.page || 1, 16632 status: "inherit", 16633 order: view.sort?.direction, 16634 orderby: view.sort?.field, 16635 search: view.search, 16636 ...filters 16637 }; 16638 }, [view, allowedTypes]); 16639 const { 16640 records: mediaRecords, 16641 isResolving: isLoading, 16642 totalItems, 16643 totalPages 16644 } = useEntityRecordsWithPermissions("postType", "attachment", queryArgs); 16645 const fields = (0, import_element54.useMemo)( 16646 () => [ 16647 { 16648 id: "title", 16649 type: "text", 16650 label: (0, import_i18n57.__)("Title"), 16651 getValue: ({ item }) => { 16652 const titleValue = item.title.raw || item.title.rendered; 16653 return titleValue || (0, import_i18n57.__)("(no title)"); 16654 } 16655 }, 16656 // Media field definitions from @wordpress/media-fields 16657 // Cast is safe because RestAttachment has the same properties as Attachment 16658 media_thumbnail_default, 16659 alt_text_default, 16660 caption_default, 16661 description_default, 16662 filename_default, 16663 filesize_default, 16664 media_dimensions_default, 16665 mime_type_default 16666 ], 16667 [] 16668 ); 16669 const actions = (0, import_element54.useMemo)( 16670 () => [ 16671 { 16672 id: "select", 16673 label: multiple ? (0, import_i18n57.__)("Select") : (0, import_i18n57.__)("Select"), 16674 isPrimary: true, 16675 supportsBulk: multiple, 16676 async callback() { 16677 if (selection.length === 0) { 16678 return; 16679 } 16680 const selectedPostsQuery = { 16681 include: selection, 16682 per_page: -1 16683 }; 16684 const selectedPosts = await (0, import_data7.resolveSelect)( 16685 import_core_data2.store 16686 ).getEntityRecords( 16687 "postType", 16688 "attachment", 16689 selectedPostsQuery 16690 ); 16691 const transformedPosts = selectedPosts?.map(transformAttachment); 16692 const selectedItems = multiple ? transformedPosts : transformedPosts?.[0]; 16693 onSelect(selectedItems); 16694 } 16695 } 16696 ], 16697 [multiple, onSelect, selection] 16698 ); 16699 const handleModalClose = (0, import_element54.useCallback)(() => { 16700 onClose?.(); 16701 }, [onClose]); 16702 const handleUpload = onUpload || uploadMedia; 16703 const handleFileSelect = (0, import_element54.useCallback)( 16704 (event) => { 16705 const files = event.target.files; 16706 if (files && files.length > 0) { 16707 const filesArray = Array.from(files); 16708 handleUpload({ 16709 allowedTypes, 16710 filesList: filesArray 16711 }); 16712 } 16713 }, 16714 [allowedTypes, handleUpload] 16715 ); 16716 const paginationInfo = (0, import_element54.useMemo)( 16717 () => ({ 16718 totalItems, 16719 totalPages 16720 }), 16721 [totalItems, totalPages] 16722 ); 16723 const defaultLayouts = (0, import_element54.useMemo)( 16724 () => ({ 16725 [LAYOUT_PICKER_GRID2]: { 16726 fields: [], 16727 showTitle: false 16728 }, 16729 [LAYOUT_PICKER_TABLE2]: { 16730 fields: ["filename", "filesize", "media_dimensions"], 16731 showTitle: true 16732 } 16733 }), 16734 [] 16735 ); 16736 const acceptTypes = (0, import_element54.useMemo)(() => { 16737 if (allowedTypes.includes("*")) { 16738 return void 0; 16739 } 16740 return allowedTypes.join(","); 16741 }, [allowedTypes]); 16742 if (!isOpen) { 16743 return null; 16744 } 16745 return /* @__PURE__ */ (0, import_jsx_runtime101.jsxs)( 16746 import_components54.Modal, 16747 { 16748 title, 16749 onRequestClose: handleModalClose, 16750 isDismissible, 16751 className: modalClass, 16752 size: "fill", 16753 headerActions: /* @__PURE__ */ (0, import_jsx_runtime101.jsx)( 16754 import_components54.FormFileUpload, 16755 { 16756 accept: acceptTypes, 16757 multiple: true, 16758 onChange: handleFileSelect, 16759 __next40pxDefaultSize: true, 16760 render: ({ openFileDialog }) => /* @__PURE__ */ (0, import_jsx_runtime101.jsx)( 16761 import_components54.Button, 16762 { 16763 onClick: openFileDialog, 16764 icon: upload_default, 16765 __next40pxDefaultSize: true, 16766 children: (0, import_i18n57.__)("Upload media") 16767 } 16768 ) 16769 } 16770 ), 16771 children: [ 16772 /* @__PURE__ */ (0, import_jsx_runtime101.jsx)( 16773 import_components54.DropZone, 16774 { 16775 onFilesDrop: (files) => { 16776 let filteredFiles = files; 16777 if (allowedTypes && !allowedTypes.includes("*")) { 16778 filteredFiles = files.filter( 16779 (file) => allowedTypes.some((allowedType) => { 16780 return file.type === allowedType || file.type.startsWith( 16781 allowedType.replace("*", "") 16782 ); 16783 }) 16784 ); 16785 } 16786 if (filteredFiles.length > 0) { 16787 handleUpload({ 16788 allowedTypes, 16789 filesList: filteredFiles 16790 }); 16791 } 16792 }, 16793 label: (0, import_i18n57.__)("Drop files to upload") 16794 } 16795 ), 16796 /* @__PURE__ */ (0, import_jsx_runtime101.jsx)( 16797 dataviews_picker_default, 16798 { 16799 data: mediaRecords || [], 16800 fields, 16801 view, 16802 onChangeView: setView, 16803 actions, 16804 selection, 16805 onChangeSelection: setSelection, 16806 isLoading, 16807 paginationInfo, 16808 defaultLayouts, 16809 getItemId: (item) => String(item.id), 16810 search, 16811 searchLabel, 16812 itemListLabel: (0, import_i18n57.__)("Media items") 16813 } 16814 ) 16815 ] 16816 } 16817 ); 16818 } 16819 16820 // packages/media-utils/build-module/private-apis.js 16821 var privateApis11 = {}; 16822 lock2(privateApis11, { 16823 sideloadMedia, 16824 MediaUploadModal 16825 }); 16826 return __toCommonJS(index_exports); 16827 })(); 16828 /*! Bundled license information: 16829 16830 use-sync-external-store/cjs/use-sync-external-store-shim.development.js: 16831 (** 16832 * @license React 16833 * use-sync-external-store-shim.development.js 16834 * 16835 * Copyright (c) Meta Platforms, Inc. and affiliates. 16836 * 16837 * This source code is licensed under the MIT license found in the 16838 * LICENSE file in the root directory of this source tree. 16839 *) 16840 */
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated : Sun Apr 19 08:20:11 2026 | Cross-referenced by PHPXref |