@nestledjs/data-browser 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,21 +1,22 @@
1
+ import React, { useCallback, useEffect, useMemo } from "react";
1
2
  import { useQuery } from "@apollo/client/react";
2
3
  import { DataTable, ErrorBoundary } from "@nestledjs/shared-components";
3
4
  import { getPluralName } from "@nestledjs/helpers";
4
5
  import { AdminLocalStorage } from "../utils/secure-storage.js";
5
6
  import { kebabCase, formatFieldName } from "../utils/string-utils.js";
6
- import { useCallback, useEffect, useMemo } from "react";
7
- import { useParams, Link } from "react-router";
7
+ import { useParams, useSearchParams, Link } from "react-router";
8
8
  import { DateRangeFilter } from "../components/filters/DateRangeFilter.js";
9
9
  import { NumberRangeFilter } from "../components/filters/NumberRangeFilter.js";
10
10
  import { RelationFilterField } from "../components/filters/RelationFilterField.js";
11
11
  import { useAdminList } from "../hooks/useAdminList.js";
12
12
  import { getAdminDocuments } from "../utils/graphql-utils.js";
13
13
  import { useAdminDataContext } from "../context/AdminDataContext.js";
14
- var _jsxFileName = "/Users/justinhandley/IdeaProjects/nestled_template/libs/admin-data/src/lib/pages/AdminDataListPage.tsx";
14
+ var _jsxFileName = "/Users/justinhandley/IdeaProjects/nestled_template/libs/data-browser/src/lib/pages/AdminDataListPage.tsx";
15
15
  function AdminDataListPage({
16
16
  modelName: propModelName
17
17
  } = {}) {
18
18
  const params = useParams();
19
+ const [searchParams] = useSearchParams();
19
20
  const {
20
21
  sdk,
21
22
  databaseModels,
@@ -106,6 +107,39 @@ function AdminDataListPage({
106
107
  return modelUrlName.toLowerCase() === pluralParam.toLowerCase();
107
108
  });
108
109
  }, [propModelName, pluralParam, databaseModels]);
110
+ const urlFilters = useMemo(() => {
111
+ if (!model) return {};
112
+ const filters2 = {};
113
+ for (const [key, value] of searchParams.entries()) {
114
+ if (key !== "page" && key !== "search" && key !== "sort") {
115
+ const relationField = model.fields.find((f) => {
116
+ var _a;
117
+ return f.relationName && !f.isList && ((_a = f.relationFromFields) == null ? void 0 : _a[0]) === key;
118
+ });
119
+ if (relationField) {
120
+ filters2[relationField.name] = {
121
+ id: value
122
+ };
123
+ } else {
124
+ filters2[key] = value;
125
+ }
126
+ }
127
+ }
128
+ return filters2;
129
+ }, [searchParams, model]);
130
+ useEffect(() => {
131
+ if (Object.keys(urlFilters).length > 0) {
132
+ dispatch({
133
+ type: "SET_FILTERS",
134
+ payload: urlFilters
135
+ });
136
+ if (!showFilters) {
137
+ dispatch({
138
+ type: "TOGGLE_FILTERS"
139
+ });
140
+ }
141
+ }
142
+ }, [urlFilters, showFilters]);
109
143
  const documents = useMemo(() => {
110
144
  if (!model) return {
111
145
  query: void 0,
@@ -327,129 +361,129 @@ function AdminDataListPage({
327
361
  if (!model) {
328
362
  return /* @__PURE__ */ React.createElement("div", { className: "min-h-screen bg-gray-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8", __self: this, __source: {
329
363
  fileName: _jsxFileName,
330
- lineNumber: 409,
364
+ lineNumber: 451,
331
365
  columnNumber: 7
332
366
  } }, /* @__PURE__ */ React.createElement("div", { className: "mt-8 sm:mx-auto sm:w-full sm:max-w-md", __self: this, __source: {
333
367
  fileName: _jsxFileName,
334
- lineNumber: 410,
368
+ lineNumber: 452,
335
369
  columnNumber: 9
336
370
  } }, /* @__PURE__ */ React.createElement("div", { className: "bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10", __self: this, __source: {
337
371
  fileName: _jsxFileName,
338
- lineNumber: 411,
372
+ lineNumber: 453,
339
373
  columnNumber: 11
340
374
  } }, /* @__PURE__ */ React.createElement("div", { className: "text-center", __self: this, __source: {
341
375
  fileName: _jsxFileName,
342
- lineNumber: 412,
376
+ lineNumber: 454,
343
377
  columnNumber: 13
344
378
  } }, /* @__PURE__ */ React.createElement("svg", { className: "mx-auto h-12 w-12 text-red-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
345
379
  fileName: _jsxFileName,
346
- lineNumber: 413,
380
+ lineNumber: 455,
347
381
  columnNumber: 15
348
382
  } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z", __self: this, __source: {
349
383
  fileName: _jsxFileName,
350
- lineNumber: 419,
384
+ lineNumber: 461,
351
385
  columnNumber: 17
352
386
  } })), /* @__PURE__ */ React.createElement("h2", { className: "mt-4 text-lg font-medium text-gray-900", __self: this, __source: {
353
387
  fileName: _jsxFileName,
354
- lineNumber: 426,
388
+ lineNumber: 468,
355
389
  columnNumber: 15
356
390
  } }, "Invalid Data Type"), /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-sm text-gray-600", __self: this, __source: {
357
391
  fileName: _jsxFileName,
358
- lineNumber: 427,
392
+ lineNumber: 469,
359
393
  columnNumber: 15
360
394
  } }, 'The data type "', pluralParam, '" is not recognized.'), /* @__PURE__ */ React.createElement("div", { className: "mt-6", __self: this, __source: {
361
395
  fileName: _jsxFileName,
362
- lineNumber: 430,
396
+ lineNumber: 472,
363
397
  columnNumber: 15
364
398
  } }, /* @__PURE__ */ React.createElement(Link, { to: basePath, className: "w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-green-web hover:bg-green-web-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-web", __self: this, __source: {
365
399
  fileName: _jsxFileName,
366
- lineNumber: 431,
400
+ lineNumber: 473,
367
401
  columnNumber: 17
368
402
  } }, "Return to Data Browser"))))));
369
403
  }
370
404
  if (!query) {
371
405
  return /* @__PURE__ */ React.createElement("div", { className: "min-h-screen bg-gray-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8", __self: this, __source: {
372
406
  fileName: _jsxFileName,
373
- lineNumber: 447,
407
+ lineNumber: 489,
374
408
  columnNumber: 7
375
409
  } }, /* @__PURE__ */ React.createElement("div", { className: "mt-8 sm:mx-auto sm:w-full sm:max-w-md", __self: this, __source: {
376
410
  fileName: _jsxFileName,
377
- lineNumber: 448,
411
+ lineNumber: 490,
378
412
  columnNumber: 9
379
413
  } }, /* @__PURE__ */ React.createElement("div", { className: "bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10", __self: this, __source: {
380
414
  fileName: _jsxFileName,
381
- lineNumber: 449,
415
+ lineNumber: 491,
382
416
  columnNumber: 11
383
417
  } }, /* @__PURE__ */ React.createElement("div", { className: "text-center", __self: this, __source: {
384
418
  fileName: _jsxFileName,
385
- lineNumber: 450,
419
+ lineNumber: 492,
386
420
  columnNumber: 13
387
421
  } }, /* @__PURE__ */ React.createElement("svg", { className: "mx-auto h-12 w-12 text-yellow-400", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
388
422
  fileName: _jsxFileName,
389
- lineNumber: 451,
423
+ lineNumber: 493,
390
424
  columnNumber: 15
391
425
  } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.728-.833-2.498 0L5.316 15c-.77.833.192 2.5 1.732 2.5z", __self: this, __source: {
392
426
  fileName: _jsxFileName,
393
- lineNumber: 457,
427
+ lineNumber: 499,
394
428
  columnNumber: 17
395
429
  } })), /* @__PURE__ */ React.createElement("h2", { className: "mt-4 text-lg font-medium text-gray-900", __self: this, __source: {
396
430
  fileName: _jsxFileName,
397
- lineNumber: 464,
431
+ lineNumber: 506,
398
432
  columnNumber: 15
399
433
  } }, "GraphQL Schema Not Available"), /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-sm text-gray-600", __self: this, __source: {
400
434
  fileName: _jsxFileName,
401
- lineNumber: 467,
435
+ lineNumber: 509,
402
436
  columnNumber: 15
403
437
  } }, 'No GraphQL query found for "', model.name, '". The admin schema may need to be regenerated.'), /* @__PURE__ */ React.createElement("div", { className: "mt-6 space-y-3", __self: this, __source: {
404
438
  fileName: _jsxFileName,
405
- lineNumber: 471,
439
+ lineNumber: 513,
406
440
  columnNumber: 15
407
441
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => window.location.reload(), className: "w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-green-web hover:bg-green-web-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-web", __self: this, __source: {
408
442
  fileName: _jsxFileName,
409
- lineNumber: 472,
443
+ lineNumber: 514,
410
444
  columnNumber: 17
411
445
  } }, "Reload Page"), /* @__PURE__ */ React.createElement(Link, { to: basePath, className: "w-full flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-web", __self: this, __source: {
412
446
  fileName: _jsxFileName,
413
- lineNumber: 478,
447
+ lineNumber: 520,
414
448
  columnNumber: 17
415
449
  } }, "Return to Data Browser"))))));
416
450
  }
417
451
  const createLink = `${basePath}/${kebabCase(model.name)}/create`;
418
452
  const columnSelector = /* @__PURE__ */ React.createElement("div", { className: "relative", "data-dropdown": "column-selector", __self: this, __source: {
419
453
  fileName: _jsxFileName,
420
- lineNumber: 497,
454
+ lineNumber: 539,
421
455
  columnNumber: 5
422
456
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => setShowColumnSelector(!showColumnSelector), className: "inline-flex items-center px-3 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-web", __self: this, __source: {
423
457
  fileName: _jsxFileName,
424
- lineNumber: 498,
458
+ lineNumber: 540,
425
459
  columnNumber: 7
426
460
  } }, "Columns", /* @__PURE__ */ React.createElement("svg", { className: "-mr-0.5 ml-2 h-4 w-4", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", __self: this, __source: {
427
461
  fileName: _jsxFileName,
428
- lineNumber: 503,
462
+ lineNumber: 545,
429
463
  columnNumber: 9
430
464
  } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z", clipRule: "evenodd", __self: this, __source: {
431
465
  fileName: _jsxFileName,
432
- lineNumber: 509,
466
+ lineNumber: 551,
433
467
  columnNumber: 11
434
468
  } }))), showColumnSelector && /* @__PURE__ */ React.createElement("div", { className: "absolute right-0 mt-2 w-80 bg-white rounded-md shadow-lg z-50 border border-gray-200", __self: this, __source: {
435
469
  fileName: _jsxFileName,
436
- lineNumber: 518,
470
+ lineNumber: 560,
437
471
  columnNumber: 9
438
472
  } }, /* @__PURE__ */ React.createElement("div", { className: "p-4", __self: this, __source: {
439
473
  fileName: _jsxFileName,
440
- lineNumber: 519,
474
+ lineNumber: 561,
441
475
  columnNumber: 11
442
476
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900 mb-3", __self: this, __source: {
443
477
  fileName: _jsxFileName,
444
- lineNumber: 520,
478
+ lineNumber: 562,
445
479
  columnNumber: 13
446
480
  } }, "Visible Columns"), /* @__PURE__ */ React.createElement("div", { className: "space-y-2 max-h-64 overflow-y-auto", __self: this, __source: {
447
481
  fileName: _jsxFileName,
448
- lineNumber: 521,
482
+ lineNumber: 563,
449
483
  columnNumber: 13
450
484
  } }, fieldNames.map((field) => /* @__PURE__ */ React.createElement("label", { key: field, className: "flex items-start gap-2 cursor-pointer", __self: this, __source: {
451
485
  fileName: _jsxFileName,
452
- lineNumber: 523,
486
+ lineNumber: 565,
453
487
  columnNumber: 17
454
488
  } }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", checked: visibleColumns.includes(field), onChange: (e) => {
455
489
  const newColumns = e.target.checked ? [...visibleColumns, field] : visibleColumns.filter((col) => col !== field);
@@ -457,22 +491,22 @@ function AdminDataListPage({
457
491
  AdminLocalStorage.setColumnVisibility(model.name, newColumns);
458
492
  }, className: "h-4 w-4 mt-0.5 flex-shrink-0 text-green-web focus:ring-green-web border-gray-300 rounded", __self: this, __source: {
459
493
  fileName: _jsxFileName,
460
- lineNumber: 524,
494
+ lineNumber: 566,
461
495
  columnNumber: 19
462
496
  } }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-gray-700 leading-5", __self: this, __source: {
463
497
  fileName: _jsxFileName,
464
- lineNumber: 536,
498
+ lineNumber: 578,
465
499
  columnNumber: 19
466
500
  } }, formatFieldName(field))))), /* @__PURE__ */ React.createElement("div", { className: "mt-3 pt-3 border-t border-gray-200 flex justify-between", __self: this, __source: {
467
501
  fileName: _jsxFileName,
468
- lineNumber: 540,
502
+ lineNumber: 582,
469
503
  columnNumber: 13
470
504
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
471
505
  setVisibleColumns(fieldNames);
472
506
  AdminLocalStorage.setColumnVisibility(model.name, fieldNames);
473
507
  }, className: "text-xs text-green-web hover:text-green-web-800", __self: this, __source: {
474
508
  fileName: _jsxFileName,
475
- lineNumber: 541,
509
+ lineNumber: 583,
476
510
  columnNumber: 15
477
511
  } }, "Select All"), /* @__PURE__ */ React.createElement("button", { onClick: () => {
478
512
  const defaults = fieldNames.slice(0, 8);
@@ -480,44 +514,44 @@ function AdminDataListPage({
480
514
  AdminLocalStorage.setColumnVisibility(model.name, defaults);
481
515
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
482
516
  fileName: _jsxFileName,
483
- lineNumber: 550,
517
+ lineNumber: 592,
484
518
  columnNumber: 15
485
519
  } }, "Reset to Defaults")))));
486
520
  const searchFieldSelector = /* @__PURE__ */ React.createElement("div", { className: "relative", "data-dropdown": "search-field-selector", __self: this, __source: {
487
521
  fileName: _jsxFileName,
488
- lineNumber: 569,
522
+ lineNumber: 611,
489
523
  columnNumber: 5
490
524
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => setShowSearchFieldSelector(!showSearchFieldSelector), className: "h-full px-3 border-l border-gray-300 text-gray-400 hover:text-gray-600 focus:outline-none focus:text-gray-600", "aria-label": "Configure search fields", __self: this, __source: {
491
525
  fileName: _jsxFileName,
492
- lineNumber: 570,
526
+ lineNumber: 612,
493
527
  columnNumber: 7
494
528
  } }, /* @__PURE__ */ React.createElement("svg", { className: "h-4 w-4", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", __self: this, __source: {
495
529
  fileName: _jsxFileName,
496
- lineNumber: 575,
530
+ lineNumber: 617,
497
531
  columnNumber: 9
498
532
  } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M3 3a1 1 0 000 2v8a2 2 0 002 2h2.586l-1.293 1.293a1 1 0 101.414 1.414L10 15.414l2.293 2.293a1 1 0 001.414-1.414L12.414 15H15a2 2 0 002-2V5a1 1 0 100-2H3zm11.707 4.707a1 1 0 00-1.414-1.414L10 9.586 8.707 8.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd", __self: this, __source: {
499
533
  fileName: _jsxFileName,
500
- lineNumber: 581,
534
+ lineNumber: 623,
501
535
  columnNumber: 11
502
536
  } }))), showSearchFieldSelector && /* @__PURE__ */ React.createElement("div", { className: "absolute right-0 mt-2 w-72 bg-white rounded-md shadow-lg z-50 border border-gray-200", __self: this, __source: {
503
537
  fileName: _jsxFileName,
504
- lineNumber: 590,
538
+ lineNumber: 632,
505
539
  columnNumber: 9
506
540
  } }, /* @__PURE__ */ React.createElement("div", { className: "p-4", __self: this, __source: {
507
541
  fileName: _jsxFileName,
508
- lineNumber: 591,
542
+ lineNumber: 633,
509
543
  columnNumber: 11
510
544
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900 mb-3", __self: this, __source: {
511
545
  fileName: _jsxFileName,
512
- lineNumber: 592,
546
+ lineNumber: 634,
513
547
  columnNumber: 13
514
548
  } }, "Search Fields"), searchableFieldNames.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: "space-y-2 max-h-48 overflow-y-auto", __self: this, __source: {
515
549
  fileName: _jsxFileName,
516
- lineNumber: 595,
550
+ lineNumber: 637,
517
551
  columnNumber: 17
518
552
  } }, searchableFieldNames.map((field) => /* @__PURE__ */ React.createElement("label", { key: field, className: "flex items-start gap-2 cursor-pointer", __self: this, __source: {
519
553
  fileName: _jsxFileName,
520
- lineNumber: 597,
554
+ lineNumber: 639,
521
555
  columnNumber: 21
522
556
  } }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", checked: searchFields.includes(field), onChange: (e) => {
523
557
  const newFields = e.target.checked ? [...searchFields, field] : searchFields.filter((f) => f !== field);
@@ -525,22 +559,22 @@ function AdminDataListPage({
525
559
  AdminLocalStorage.setSearchFields(model.name, newFields);
526
560
  }, className: "h-4 w-4 mt-0.5 flex-shrink-0 text-green-web focus:ring-green-web border-gray-300 rounded", __self: this, __source: {
527
561
  fileName: _jsxFileName,
528
- lineNumber: 598,
562
+ lineNumber: 640,
529
563
  columnNumber: 23
530
564
  } }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-gray-700 leading-5", __self: this, __source: {
531
565
  fileName: _jsxFileName,
532
- lineNumber: 610,
566
+ lineNumber: 652,
533
567
  columnNumber: 23
534
568
  } }, formatFieldName(field))))), /* @__PURE__ */ React.createElement("div", { className: "mt-3 pt-3 border-t border-gray-200 flex justify-between", __self: this, __source: {
535
569
  fileName: _jsxFileName,
536
- lineNumber: 616,
570
+ lineNumber: 658,
537
571
  columnNumber: 17
538
572
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
539
573
  setSearchFields(searchableFieldNames);
540
574
  AdminLocalStorage.setSearchFields(model.name, searchableFieldNames);
541
575
  }, className: "text-xs text-green-web hover:text-green-web-800 mr-3", __self: this, __source: {
542
576
  fileName: _jsxFileName,
543
- lineNumber: 617,
577
+ lineNumber: 659,
544
578
  columnNumber: 19
545
579
  } }, "Select All"), /* @__PURE__ */ React.createElement("button", { onClick: () => {
546
580
  const defaults = getDefaultSearchFields(searchableFieldNames);
@@ -548,28 +582,28 @@ function AdminDataListPage({
548
582
  AdminLocalStorage.setSearchFields(model.name, defaults);
549
583
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
550
584
  fileName: _jsxFileName,
551
- lineNumber: 626,
585
+ lineNumber: 668,
552
586
  columnNumber: 19
553
587
  } }, "Reset to Defaults"))) : /* @__PURE__ */ React.createElement("div", { className: "text-sm text-gray-500", __self: this, __source: {
554
588
  fileName: _jsxFileName,
555
- lineNumber: 639,
589
+ lineNumber: 681,
556
590
  columnNumber: 15
557
591
  } }, "No searchable text fields available"))));
558
592
  const filterPanel = showFilters && /* @__PURE__ */ React.createElement("div", { className: "mb-4 bg-gray-50 border border-gray-200 rounded-lg p-4", __self: this, __source: {
559
593
  fileName: _jsxFileName,
560
- lineNumber: 649,
594
+ lineNumber: 691,
561
595
  columnNumber: 5
562
596
  } }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-between mb-3", __self: this, __source: {
563
597
  fileName: _jsxFileName,
564
- lineNumber: 650,
598
+ lineNumber: 692,
565
599
  columnNumber: 7
566
600
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900", __self: this, __source: {
567
601
  fileName: _jsxFileName,
568
- lineNumber: 651,
602
+ lineNumber: 693,
569
603
  columnNumber: 9
570
604
  } }, "Filters"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center space-x-2", __self: this, __source: {
571
605
  fileName: _jsxFileName,
572
- lineNumber: 652,
606
+ lineNumber: 694,
573
607
  columnNumber: 9
574
608
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
575
609
  setFilters({});
@@ -578,23 +612,23 @@ function AdminDataListPage({
578
612
  });
579
613
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
580
614
  fileName: _jsxFileName,
581
- lineNumber: 653,
615
+ lineNumber: 695,
582
616
  columnNumber: 11
583
617
  } }, "Clear All"), /* @__PURE__ */ React.createElement("button", { onClick: () => setShowFilters(false), className: "text-gray-400 hover:text-gray-600", __self: this, __source: {
584
618
  fileName: _jsxFileName,
585
- lineNumber: 662,
619
+ lineNumber: 704,
586
620
  columnNumber: 11
587
621
  } }, /* @__PURE__ */ React.createElement("svg", { className: "h-5 w-5", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", __self: this, __source: {
588
622
  fileName: _jsxFileName,
589
- lineNumber: 666,
623
+ lineNumber: 708,
590
624
  columnNumber: 13
591
625
  } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z", clipRule: "evenodd", __self: this, __source: {
592
626
  fileName: _jsxFileName,
593
- lineNumber: 672,
627
+ lineNumber: 714,
594
628
  columnNumber: 15
595
629
  } }))))), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", __self: this, __source: {
596
630
  fileName: _jsxFileName,
597
- lineNumber: 682,
631
+ lineNumber: 724,
598
632
  columnNumber: 7
599
633
  } }, filterableFieldNames.map((fieldName) => {
600
634
  const field = model.fields.find((f) => f.name === fieldName);
@@ -617,21 +651,21 @@ function AdminDataListPage({
617
651
  if (field.relationName && !field.isList) {
618
652
  return /* @__PURE__ */ React.createElement(RelationFilterField, { key: fieldName, fieldName, relatedModelName: field.type, currentValue, onChange: handleChange, __self: this, __source: {
619
653
  fileName: _jsxFileName,
620
- lineNumber: 702,
654
+ lineNumber: 744,
621
655
  columnNumber: 15
622
656
  } });
623
657
  }
624
658
  if (field.type.toLowerCase() === "datetime" || field.type.toLowerCase() === "date") {
625
659
  return /* @__PURE__ */ React.createElement(DateRangeFilter, { key: fieldName, fieldName, currentValue, onChange: handleChange, __self: this, __source: {
626
660
  fileName: _jsxFileName,
627
- lineNumber: 715,
661
+ lineNumber: 757,
628
662
  columnNumber: 15
629
663
  } });
630
664
  }
631
665
  if (["int", "bigint", "float", "decimal"].includes(field.type.toLowerCase())) {
632
666
  return /* @__PURE__ */ React.createElement(NumberRangeFilter, { key: fieldName, fieldName, fieldType: field.type.toLowerCase(), currentValue, onChange: handleChange, __self: this, __source: {
633
667
  fileName: _jsxFileName,
634
- lineNumber: 727,
668
+ lineNumber: 769,
635
669
  columnNumber: 15
636
670
  } });
637
671
  }
@@ -640,23 +674,23 @@ function AdminDataListPage({
640
674
  if (enumValues) {
641
675
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
642
676
  fileName: _jsxFileName,
643
- lineNumber: 742,
677
+ lineNumber: 784,
644
678
  columnNumber: 17
645
679
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
646
680
  fileName: _jsxFileName,
647
- lineNumber: 743,
681
+ lineNumber: 785,
648
682
  columnNumber: 19
649
683
  } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("select", { value: typeof currentValue === "string" ? currentValue : "", onChange: (e) => handleChange(e.target.value || void 0), className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web text-sm", __self: this, __source: {
650
684
  fileName: _jsxFileName,
651
- lineNumber: 746,
685
+ lineNumber: 788,
652
686
  columnNumber: 19
653
687
  } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
654
688
  fileName: _jsxFileName,
655
- lineNumber: 751,
689
+ lineNumber: 793,
656
690
  columnNumber: 21
657
691
  } }, "All"), enumValues.map((val) => /* @__PURE__ */ React.createElement("option", { key: val, value: val, __self: this, __source: {
658
692
  fileName: _jsxFileName,
659
- lineNumber: 753,
693
+ lineNumber: 795,
660
694
  columnNumber: 23
661
695
  } }, val))));
662
696
  }
@@ -664,121 +698,121 @@ function AdminDataListPage({
664
698
  if (field.type.toLowerCase() === "boolean") {
665
699
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
666
700
  fileName: _jsxFileName,
667
- lineNumber: 766,
701
+ lineNumber: 808,
668
702
  columnNumber: 15
669
703
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
670
704
  fileName: _jsxFileName,
671
- lineNumber: 767,
705
+ lineNumber: 809,
672
706
  columnNumber: 17
673
707
  } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("select", { value: currentValue === void 0 || currentValue === null ? "" : currentValue.toString(), onChange: (e) => {
674
708
  const value = e.target.value;
675
709
  handleChange(value === "" ? void 0 : value === "true");
676
710
  }, className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web text-sm", __self: this, __source: {
677
711
  fileName: _jsxFileName,
678
- lineNumber: 770,
712
+ lineNumber: 812,
679
713
  columnNumber: 17
680
714
  } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
681
715
  fileName: _jsxFileName,
682
- lineNumber: 778,
716
+ lineNumber: 820,
683
717
  columnNumber: 19
684
718
  } }, "All"), /* @__PURE__ */ React.createElement("option", { value: "true", __self: this, __source: {
685
719
  fileName: _jsxFileName,
686
- lineNumber: 779,
720
+ lineNumber: 821,
687
721
  columnNumber: 19
688
722
  } }, "Yes"), /* @__PURE__ */ React.createElement("option", { value: "false", __self: this, __source: {
689
723
  fileName: _jsxFileName,
690
- lineNumber: 780,
724
+ lineNumber: 822,
691
725
  columnNumber: 19
692
726
  } }, "No")));
693
727
  }
694
728
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
695
729
  fileName: _jsxFileName,
696
- lineNumber: 788,
730
+ lineNumber: 830,
697
731
  columnNumber: 13
698
732
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
699
733
  fileName: _jsxFileName,
700
- lineNumber: 789,
734
+ lineNumber: 831,
701
735
  columnNumber: 15
702
736
  } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("input", { type: "text", value: typeof currentValue === "string" ? currentValue : "", onChange: (e) => handleChange(e.target.value || void 0), placeholder: `Filter by ${formatFieldName(fieldName).toLowerCase()}...`, className: "w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-green-web focus:border-green-web text-sm", __self: this, __source: {
703
737
  fileName: _jsxFileName,
704
- lineNumber: 792,
738
+ lineNumber: 834,
705
739
  columnNumber: 15
706
740
  } }));
707
741
  })));
708
742
  const searchFilter = /* @__PURE__ */ React.createElement("div", { className: "mb-4 flex items-center justify-between", __self: this, __source: {
709
743
  fileName: _jsxFileName,
710
- lineNumber: 807,
744
+ lineNumber: 849,
711
745
  columnNumber: 5
712
746
  } }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 max-w-lg", __self: this, __source: {
713
747
  fileName: _jsxFileName,
714
- lineNumber: 808,
748
+ lineNumber: 850,
715
749
  columnNumber: 7
716
750
  } }, /* @__PURE__ */ React.createElement("label", { htmlFor: "search", className: "sr-only", __self: this, __source: {
717
751
  fileName: _jsxFileName,
718
- lineNumber: 809,
752
+ lineNumber: 851,
719
753
  columnNumber: 9
720
754
  } }, "Search"), /* @__PURE__ */ React.createElement("div", { className: "relative", __self: this, __source: {
721
755
  fileName: _jsxFileName,
722
- lineNumber: 812,
756
+ lineNumber: 854,
723
757
  columnNumber: 9
724
758
  } }, /* @__PURE__ */ React.createElement("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", __self: this, __source: {
725
759
  fileName: _jsxFileName,
726
- lineNumber: 813,
760
+ lineNumber: 855,
727
761
  columnNumber: 11
728
762
  } }, loading && search !== debouncedSearch ? /* @__PURE__ */ React.createElement("svg", { className: "animate-spin h-5 w-5 text-gray-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", __self: this, __source: {
729
763
  fileName: _jsxFileName,
730
- lineNumber: 815,
764
+ lineNumber: 857,
731
765
  columnNumber: 15
732
766
  } }, /* @__PURE__ */ React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4", __self: this, __source: {
733
767
  fileName: _jsxFileName,
734
- lineNumber: 821,
768
+ lineNumber: 863,
735
769
  columnNumber: 17
736
770
  } }), /* @__PURE__ */ React.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z", __self: this, __source: {
737
771
  fileName: _jsxFileName,
738
- lineNumber: 829,
772
+ lineNumber: 871,
739
773
  columnNumber: 17
740
774
  } })) : /* @__PURE__ */ React.createElement("svg", { className: "h-5 w-5 text-gray-400", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": "true", __self: this, __source: {
741
775
  fileName: _jsxFileName,
742
- lineNumber: 836,
776
+ lineNumber: 878,
743
777
  columnNumber: 15
744
778
  } }, /* @__PURE__ */ React.createElement("path", { fillRule: "evenodd", d: "M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z", clipRule: "evenodd", __self: this, __source: {
745
779
  fileName: _jsxFileName,
746
- lineNumber: 843,
780
+ lineNumber: 885,
747
781
  columnNumber: 17
748
782
  } }))), /* @__PURE__ */ React.createElement("input", { id: "search", name: "search", className: "block w-full pl-10 pr-12 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-green-web focus:border-green-web sm:text-sm", placeholder: `Search ${searchFields.length > 0 ? searchFields.map((field) => field.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/^./, (str) => str.toUpperCase())).join(", ") : getPluralName(model.name).toLowerCase()}...`, type: "search", value: state.search || "", onChange: (e) => dispatch({
749
783
  type: "SET_SEARCH",
750
784
  payload: e.target.value
751
785
  }), __self: this, __source: {
752
786
  fileName: _jsxFileName,
753
- lineNumber: 851,
787
+ lineNumber: 893,
754
788
  columnNumber: 11
755
789
  } }), searchableFieldNames.length > 0 && /* @__PURE__ */ React.createElement("div", { className: "absolute inset-y-0 right-0 flex items-center", __self: this, __source: {
756
790
  fileName: _jsxFileName,
757
- lineNumber: 861,
791
+ lineNumber: 903,
758
792
  columnNumber: 13
759
793
  } }, searchFieldSelector))), /* @__PURE__ */ React.createElement("div", { className: "ml-4 flex space-x-2", __self: this, __source: {
760
794
  fileName: _jsxFileName,
761
- lineNumber: 867,
795
+ lineNumber: 909,
762
796
  columnNumber: 7
763
797
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => setShowFilters(!showFilters), className: `inline-flex items-center px-3 py-2 border text-sm font-medium rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-web ${showFilters || Object.keys(filters).length > 0 ? "border-green-web text-green-web bg-green-50 hover:bg-green-100" : "border-gray-300 text-gray-700 bg-white hover:bg-gray-50"}`, __self: this, __source: {
764
798
  fileName: _jsxFileName,
765
- lineNumber: 868,
799
+ lineNumber: 910,
766
800
  columnNumber: 9
767
801
  } }, /* @__PURE__ */ React.createElement("svg", { className: "w-4 h-4 mr-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
768
802
  fileName: _jsxFileName,
769
- lineNumber: 876,
803
+ lineNumber: 918,
770
804
  columnNumber: 11
771
805
  } }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z", __self: this, __source: {
772
806
  fileName: _jsxFileName,
773
- lineNumber: 877,
807
+ lineNumber: 919,
774
808
  columnNumber: 13
775
809
  } })), "Filters", Object.keys(filters).length > 0 && /* @__PURE__ */ React.createElement("span", { className: "ml-1 inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-white bg-green-web rounded-full", __self: this, __source: {
776
810
  fileName: _jsxFileName,
777
- lineNumber: 886,
811
+ lineNumber: 928,
778
812
  columnNumber: 13
779
813
  } }, Object.keys(filters).length)), columnSelector, /* @__PURE__ */ React.createElement(Link, { to: createLink, className: "inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-600", __self: this, __source: {
780
814
  fileName: _jsxFileName,
781
- lineNumber: 892,
815
+ lineNumber: 934,
782
816
  columnNumber: 9
783
817
  } }, "Create New")));
784
818
  return /* @__PURE__ */ React.createElement(React.Fragment, null, filterPanel, searchFilter, /* @__PURE__ */ React.createElement(DataTable, { data: items, path: createLink.replace("/create", ""), fields: visibleColumns.length > 0 ? visibleColumns : fieldNames, pagination, setSkip: (skip2) => dispatch({
@@ -786,7 +820,7 @@ function AdminDataListPage({
786
820
  payload: skip2
787
821
  }), sort: state.sort, setSort: setSortSafely, __self: this, __source: {
788
822
  fileName: _jsxFileName,
789
- lineNumber: 906,
823
+ lineNumber: 948,
790
824
  columnNumber: 7
791
825
  } }));
792
826
  }
@@ -795,7 +829,7 @@ function AdminDataErrorBoundary({
795
829
  }) {
796
830
  return /* @__PURE__ */ React.createElement(ErrorBoundary, { error, __self: this, __source: {
797
831
  fileName: _jsxFileName,
798
- lineNumber: 920,
832
+ lineNumber: 962,
799
833
  columnNumber: 10
800
834
  } });
801
835
  }
@@ -17,7 +17,7 @@ export declare function getMutationName(model: DatabaseModel, operation: 'create
17
17
  /**
18
18
  * Build form fields for a model and operation
19
19
  */
20
- export declare function buildFormFields(sdk: any, model: DatabaseModel, operation: 'create' | 'update', currentItem?: any, isSubmitting?: boolean): FormField[];
20
+ export declare function buildFormFields(sdk: any, model: DatabaseModel, operation: 'create' | 'update', currentItem?: any, isSubmitting?: boolean, basePath?: string): FormField[];
21
21
  /**
22
22
  * Clean form input data for GraphQL mutations
23
23
  * Removes Apollo metadata and system fields