@nestledjs/data-browser 0.1.12 → 0.1.15

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,44 @@ 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
+ const scalarField = model.fields.find((f) => f.name === key && !f.relationName);
125
+ if (scalarField) {
126
+ filters2[key] = value;
127
+ } else {
128
+ console.warn(`[AdminList] URL parameter "${key}" does not exist on model "${model.name}" - ignoring`);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ return filters2;
134
+ }, [searchParams, model]);
135
+ useEffect(() => {
136
+ if (Object.keys(urlFilters).length > 0) {
137
+ dispatch({
138
+ type: "SET_FILTERS",
139
+ payload: urlFilters
140
+ });
141
+ if (!showFilters) {
142
+ dispatch({
143
+ type: "TOGGLE_FILTERS"
144
+ });
145
+ }
146
+ }
147
+ }, [urlFilters, showFilters]);
109
148
  const documents = useMemo(() => {
110
149
  if (!model) return {
111
150
  query: void 0,
@@ -327,129 +366,129 @@ function AdminDataListPage({
327
366
  if (!model) {
328
367
  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
368
  fileName: _jsxFileName,
330
- lineNumber: 409,
369
+ lineNumber: 458,
331
370
  columnNumber: 7
332
371
  } }, /* @__PURE__ */ React.createElement("div", { className: "mt-8 sm:mx-auto sm:w-full sm:max-w-md", __self: this, __source: {
333
372
  fileName: _jsxFileName,
334
- lineNumber: 410,
373
+ lineNumber: 459,
335
374
  columnNumber: 9
336
375
  } }, /* @__PURE__ */ React.createElement("div", { className: "bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10", __self: this, __source: {
337
376
  fileName: _jsxFileName,
338
- lineNumber: 411,
377
+ lineNumber: 460,
339
378
  columnNumber: 11
340
379
  } }, /* @__PURE__ */ React.createElement("div", { className: "text-center", __self: this, __source: {
341
380
  fileName: _jsxFileName,
342
- lineNumber: 412,
381
+ lineNumber: 461,
343
382
  columnNumber: 13
344
383
  } }, /* @__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
384
  fileName: _jsxFileName,
346
- lineNumber: 413,
385
+ lineNumber: 462,
347
386
  columnNumber: 15
348
387
  } }, /* @__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
388
  fileName: _jsxFileName,
350
- lineNumber: 419,
389
+ lineNumber: 468,
351
390
  columnNumber: 17
352
391
  } })), /* @__PURE__ */ React.createElement("h2", { className: "mt-4 text-lg font-medium text-gray-900", __self: this, __source: {
353
392
  fileName: _jsxFileName,
354
- lineNumber: 426,
393
+ lineNumber: 475,
355
394
  columnNumber: 15
356
395
  } }, "Invalid Data Type"), /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-sm text-gray-600", __self: this, __source: {
357
396
  fileName: _jsxFileName,
358
- lineNumber: 427,
397
+ lineNumber: 476,
359
398
  columnNumber: 15
360
399
  } }, 'The data type "', pluralParam, '" is not recognized.'), /* @__PURE__ */ React.createElement("div", { className: "mt-6", __self: this, __source: {
361
400
  fileName: _jsxFileName,
362
- lineNumber: 430,
401
+ lineNumber: 479,
363
402
  columnNumber: 15
364
403
  } }, /* @__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
404
  fileName: _jsxFileName,
366
- lineNumber: 431,
405
+ lineNumber: 480,
367
406
  columnNumber: 17
368
407
  } }, "Return to Data Browser"))))));
369
408
  }
370
409
  if (!query) {
371
410
  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
411
  fileName: _jsxFileName,
373
- lineNumber: 447,
412
+ lineNumber: 496,
374
413
  columnNumber: 7
375
414
  } }, /* @__PURE__ */ React.createElement("div", { className: "mt-8 sm:mx-auto sm:w-full sm:max-w-md", __self: this, __source: {
376
415
  fileName: _jsxFileName,
377
- lineNumber: 448,
416
+ lineNumber: 497,
378
417
  columnNumber: 9
379
418
  } }, /* @__PURE__ */ React.createElement("div", { className: "bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10", __self: this, __source: {
380
419
  fileName: _jsxFileName,
381
- lineNumber: 449,
420
+ lineNumber: 498,
382
421
  columnNumber: 11
383
422
  } }, /* @__PURE__ */ React.createElement("div", { className: "text-center", __self: this, __source: {
384
423
  fileName: _jsxFileName,
385
- lineNumber: 450,
424
+ lineNumber: 499,
386
425
  columnNumber: 13
387
426
  } }, /* @__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
427
  fileName: _jsxFileName,
389
- lineNumber: 451,
428
+ lineNumber: 500,
390
429
  columnNumber: 15
391
430
  } }, /* @__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
431
  fileName: _jsxFileName,
393
- lineNumber: 457,
432
+ lineNumber: 506,
394
433
  columnNumber: 17
395
434
  } })), /* @__PURE__ */ React.createElement("h2", { className: "mt-4 text-lg font-medium text-gray-900", __self: this, __source: {
396
435
  fileName: _jsxFileName,
397
- lineNumber: 464,
436
+ lineNumber: 513,
398
437
  columnNumber: 15
399
438
  } }, "GraphQL Schema Not Available"), /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-sm text-gray-600", __self: this, __source: {
400
439
  fileName: _jsxFileName,
401
- lineNumber: 467,
440
+ lineNumber: 516,
402
441
  columnNumber: 15
403
442
  } }, '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
443
  fileName: _jsxFileName,
405
- lineNumber: 471,
444
+ lineNumber: 520,
406
445
  columnNumber: 15
407
446
  } }, /* @__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
447
  fileName: _jsxFileName,
409
- lineNumber: 472,
448
+ lineNumber: 521,
410
449
  columnNumber: 17
411
450
  } }, "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
451
  fileName: _jsxFileName,
413
- lineNumber: 478,
452
+ lineNumber: 527,
414
453
  columnNumber: 17
415
454
  } }, "Return to Data Browser"))))));
416
455
  }
417
456
  const createLink = `${basePath}/${kebabCase(model.name)}/create`;
418
457
  const columnSelector = /* @__PURE__ */ React.createElement("div", { className: "relative", "data-dropdown": "column-selector", __self: this, __source: {
419
458
  fileName: _jsxFileName,
420
- lineNumber: 497,
459
+ lineNumber: 546,
421
460
  columnNumber: 5
422
461
  } }, /* @__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
462
  fileName: _jsxFileName,
424
- lineNumber: 498,
463
+ lineNumber: 547,
425
464
  columnNumber: 7
426
465
  } }, "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
466
  fileName: _jsxFileName,
428
- lineNumber: 503,
467
+ lineNumber: 552,
429
468
  columnNumber: 9
430
469
  } }, /* @__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
470
  fileName: _jsxFileName,
432
- lineNumber: 509,
471
+ lineNumber: 558,
433
472
  columnNumber: 11
434
473
  } }))), 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
474
  fileName: _jsxFileName,
436
- lineNumber: 518,
475
+ lineNumber: 567,
437
476
  columnNumber: 9
438
477
  } }, /* @__PURE__ */ React.createElement("div", { className: "p-4", __self: this, __source: {
439
478
  fileName: _jsxFileName,
440
- lineNumber: 519,
479
+ lineNumber: 568,
441
480
  columnNumber: 11
442
481
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900 mb-3", __self: this, __source: {
443
482
  fileName: _jsxFileName,
444
- lineNumber: 520,
483
+ lineNumber: 569,
445
484
  columnNumber: 13
446
485
  } }, "Visible Columns"), /* @__PURE__ */ React.createElement("div", { className: "space-y-2 max-h-64 overflow-y-auto", __self: this, __source: {
447
486
  fileName: _jsxFileName,
448
- lineNumber: 521,
487
+ lineNumber: 570,
449
488
  columnNumber: 13
450
489
  } }, fieldNames.map((field) => /* @__PURE__ */ React.createElement("label", { key: field, className: "flex items-start gap-2 cursor-pointer", __self: this, __source: {
451
490
  fileName: _jsxFileName,
452
- lineNumber: 523,
491
+ lineNumber: 572,
453
492
  columnNumber: 17
454
493
  } }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", checked: visibleColumns.includes(field), onChange: (e) => {
455
494
  const newColumns = e.target.checked ? [...visibleColumns, field] : visibleColumns.filter((col) => col !== field);
@@ -457,22 +496,22 @@ function AdminDataListPage({
457
496
  AdminLocalStorage.setColumnVisibility(model.name, newColumns);
458
497
  }, 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
498
  fileName: _jsxFileName,
460
- lineNumber: 524,
499
+ lineNumber: 573,
461
500
  columnNumber: 19
462
501
  } }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-gray-700 leading-5", __self: this, __source: {
463
502
  fileName: _jsxFileName,
464
- lineNumber: 536,
503
+ lineNumber: 585,
465
504
  columnNumber: 19
466
505
  } }, formatFieldName(field))))), /* @__PURE__ */ React.createElement("div", { className: "mt-3 pt-3 border-t border-gray-200 flex justify-between", __self: this, __source: {
467
506
  fileName: _jsxFileName,
468
- lineNumber: 540,
507
+ lineNumber: 589,
469
508
  columnNumber: 13
470
509
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
471
510
  setVisibleColumns(fieldNames);
472
511
  AdminLocalStorage.setColumnVisibility(model.name, fieldNames);
473
512
  }, className: "text-xs text-green-web hover:text-green-web-800", __self: this, __source: {
474
513
  fileName: _jsxFileName,
475
- lineNumber: 541,
514
+ lineNumber: 590,
476
515
  columnNumber: 15
477
516
  } }, "Select All"), /* @__PURE__ */ React.createElement("button", { onClick: () => {
478
517
  const defaults = fieldNames.slice(0, 8);
@@ -480,44 +519,44 @@ function AdminDataListPage({
480
519
  AdminLocalStorage.setColumnVisibility(model.name, defaults);
481
520
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
482
521
  fileName: _jsxFileName,
483
- lineNumber: 550,
522
+ lineNumber: 599,
484
523
  columnNumber: 15
485
524
  } }, "Reset to Defaults")))));
486
525
  const searchFieldSelector = /* @__PURE__ */ React.createElement("div", { className: "relative", "data-dropdown": "search-field-selector", __self: this, __source: {
487
526
  fileName: _jsxFileName,
488
- lineNumber: 569,
527
+ lineNumber: 618,
489
528
  columnNumber: 5
490
529
  } }, /* @__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
530
  fileName: _jsxFileName,
492
- lineNumber: 570,
531
+ lineNumber: 619,
493
532
  columnNumber: 7
494
533
  } }, /* @__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
534
  fileName: _jsxFileName,
496
- lineNumber: 575,
535
+ lineNumber: 624,
497
536
  columnNumber: 9
498
537
  } }, /* @__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
538
  fileName: _jsxFileName,
500
- lineNumber: 581,
539
+ lineNumber: 630,
501
540
  columnNumber: 11
502
541
  } }))), 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
542
  fileName: _jsxFileName,
504
- lineNumber: 590,
543
+ lineNumber: 639,
505
544
  columnNumber: 9
506
545
  } }, /* @__PURE__ */ React.createElement("div", { className: "p-4", __self: this, __source: {
507
546
  fileName: _jsxFileName,
508
- lineNumber: 591,
547
+ lineNumber: 640,
509
548
  columnNumber: 11
510
549
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900 mb-3", __self: this, __source: {
511
550
  fileName: _jsxFileName,
512
- lineNumber: 592,
551
+ lineNumber: 641,
513
552
  columnNumber: 13
514
553
  } }, "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
554
  fileName: _jsxFileName,
516
- lineNumber: 595,
555
+ lineNumber: 644,
517
556
  columnNumber: 17
518
557
  } }, searchableFieldNames.map((field) => /* @__PURE__ */ React.createElement("label", { key: field, className: "flex items-start gap-2 cursor-pointer", __self: this, __source: {
519
558
  fileName: _jsxFileName,
520
- lineNumber: 597,
559
+ lineNumber: 646,
521
560
  columnNumber: 21
522
561
  } }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", checked: searchFields.includes(field), onChange: (e) => {
523
562
  const newFields = e.target.checked ? [...searchFields, field] : searchFields.filter((f) => f !== field);
@@ -525,22 +564,22 @@ function AdminDataListPage({
525
564
  AdminLocalStorage.setSearchFields(model.name, newFields);
526
565
  }, 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
566
  fileName: _jsxFileName,
528
- lineNumber: 598,
567
+ lineNumber: 647,
529
568
  columnNumber: 23
530
569
  } }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-gray-700 leading-5", __self: this, __source: {
531
570
  fileName: _jsxFileName,
532
- lineNumber: 610,
571
+ lineNumber: 659,
533
572
  columnNumber: 23
534
573
  } }, formatFieldName(field))))), /* @__PURE__ */ React.createElement("div", { className: "mt-3 pt-3 border-t border-gray-200 flex justify-between", __self: this, __source: {
535
574
  fileName: _jsxFileName,
536
- lineNumber: 616,
575
+ lineNumber: 665,
537
576
  columnNumber: 17
538
577
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
539
578
  setSearchFields(searchableFieldNames);
540
579
  AdminLocalStorage.setSearchFields(model.name, searchableFieldNames);
541
580
  }, className: "text-xs text-green-web hover:text-green-web-800 mr-3", __self: this, __source: {
542
581
  fileName: _jsxFileName,
543
- lineNumber: 617,
582
+ lineNumber: 666,
544
583
  columnNumber: 19
545
584
  } }, "Select All"), /* @__PURE__ */ React.createElement("button", { onClick: () => {
546
585
  const defaults = getDefaultSearchFields(searchableFieldNames);
@@ -548,28 +587,28 @@ function AdminDataListPage({
548
587
  AdminLocalStorage.setSearchFields(model.name, defaults);
549
588
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
550
589
  fileName: _jsxFileName,
551
- lineNumber: 626,
590
+ lineNumber: 675,
552
591
  columnNumber: 19
553
592
  } }, "Reset to Defaults"))) : /* @__PURE__ */ React.createElement("div", { className: "text-sm text-gray-500", __self: this, __source: {
554
593
  fileName: _jsxFileName,
555
- lineNumber: 639,
594
+ lineNumber: 688,
556
595
  columnNumber: 15
557
596
  } }, "No searchable text fields available"))));
558
597
  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
598
  fileName: _jsxFileName,
560
- lineNumber: 649,
599
+ lineNumber: 698,
561
600
  columnNumber: 5
562
601
  } }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-between mb-3", __self: this, __source: {
563
602
  fileName: _jsxFileName,
564
- lineNumber: 650,
603
+ lineNumber: 699,
565
604
  columnNumber: 7
566
605
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900", __self: this, __source: {
567
606
  fileName: _jsxFileName,
568
- lineNumber: 651,
607
+ lineNumber: 700,
569
608
  columnNumber: 9
570
609
  } }, "Filters"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center space-x-2", __self: this, __source: {
571
610
  fileName: _jsxFileName,
572
- lineNumber: 652,
611
+ lineNumber: 701,
573
612
  columnNumber: 9
574
613
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
575
614
  setFilters({});
@@ -578,23 +617,23 @@ function AdminDataListPage({
578
617
  });
579
618
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
580
619
  fileName: _jsxFileName,
581
- lineNumber: 653,
620
+ lineNumber: 702,
582
621
  columnNumber: 11
583
622
  } }, "Clear All"), /* @__PURE__ */ React.createElement("button", { onClick: () => setShowFilters(false), className: "text-gray-400 hover:text-gray-600", __self: this, __source: {
584
623
  fileName: _jsxFileName,
585
- lineNumber: 662,
624
+ lineNumber: 711,
586
625
  columnNumber: 11
587
626
  } }, /* @__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
627
  fileName: _jsxFileName,
589
- lineNumber: 666,
628
+ lineNumber: 715,
590
629
  columnNumber: 13
591
630
  } }, /* @__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
631
  fileName: _jsxFileName,
593
- lineNumber: 672,
632
+ lineNumber: 721,
594
633
  columnNumber: 15
595
634
  } }))))), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", __self: this, __source: {
596
635
  fileName: _jsxFileName,
597
- lineNumber: 682,
636
+ lineNumber: 731,
598
637
  columnNumber: 7
599
638
  } }, filterableFieldNames.map((fieldName) => {
600
639
  const field = model.fields.find((f) => f.name === fieldName);
@@ -617,21 +656,21 @@ function AdminDataListPage({
617
656
  if (field.relationName && !field.isList) {
618
657
  return /* @__PURE__ */ React.createElement(RelationFilterField, { key: fieldName, fieldName, relatedModelName: field.type, currentValue, onChange: handleChange, __self: this, __source: {
619
658
  fileName: _jsxFileName,
620
- lineNumber: 702,
659
+ lineNumber: 751,
621
660
  columnNumber: 15
622
661
  } });
623
662
  }
624
663
  if (field.type.toLowerCase() === "datetime" || field.type.toLowerCase() === "date") {
625
664
  return /* @__PURE__ */ React.createElement(DateRangeFilter, { key: fieldName, fieldName, currentValue, onChange: handleChange, __self: this, __source: {
626
665
  fileName: _jsxFileName,
627
- lineNumber: 715,
666
+ lineNumber: 764,
628
667
  columnNumber: 15
629
668
  } });
630
669
  }
631
670
  if (["int", "bigint", "float", "decimal"].includes(field.type.toLowerCase())) {
632
671
  return /* @__PURE__ */ React.createElement(NumberRangeFilter, { key: fieldName, fieldName, fieldType: field.type.toLowerCase(), currentValue, onChange: handleChange, __self: this, __source: {
633
672
  fileName: _jsxFileName,
634
- lineNumber: 727,
673
+ lineNumber: 776,
635
674
  columnNumber: 15
636
675
  } });
637
676
  }
@@ -640,23 +679,23 @@ function AdminDataListPage({
640
679
  if (enumValues) {
641
680
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
642
681
  fileName: _jsxFileName,
643
- lineNumber: 742,
682
+ lineNumber: 791,
644
683
  columnNumber: 17
645
684
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
646
685
  fileName: _jsxFileName,
647
- lineNumber: 743,
686
+ lineNumber: 792,
648
687
  columnNumber: 19
649
688
  } }, 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
689
  fileName: _jsxFileName,
651
- lineNumber: 746,
690
+ lineNumber: 795,
652
691
  columnNumber: 19
653
692
  } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
654
693
  fileName: _jsxFileName,
655
- lineNumber: 751,
694
+ lineNumber: 800,
656
695
  columnNumber: 21
657
696
  } }, "All"), enumValues.map((val) => /* @__PURE__ */ React.createElement("option", { key: val, value: val, __self: this, __source: {
658
697
  fileName: _jsxFileName,
659
- lineNumber: 753,
698
+ lineNumber: 802,
660
699
  columnNumber: 23
661
700
  } }, val))));
662
701
  }
@@ -664,121 +703,121 @@ function AdminDataListPage({
664
703
  if (field.type.toLowerCase() === "boolean") {
665
704
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
666
705
  fileName: _jsxFileName,
667
- lineNumber: 766,
706
+ lineNumber: 815,
668
707
  columnNumber: 15
669
708
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
670
709
  fileName: _jsxFileName,
671
- lineNumber: 767,
710
+ lineNumber: 816,
672
711
  columnNumber: 17
673
712
  } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("select", { value: currentValue === void 0 || currentValue === null ? "" : currentValue.toString(), onChange: (e) => {
674
713
  const value = e.target.value;
675
714
  handleChange(value === "" ? void 0 : value === "true");
676
715
  }, 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
716
  fileName: _jsxFileName,
678
- lineNumber: 770,
717
+ lineNumber: 819,
679
718
  columnNumber: 17
680
719
  } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
681
720
  fileName: _jsxFileName,
682
- lineNumber: 778,
721
+ lineNumber: 827,
683
722
  columnNumber: 19
684
723
  } }, "All"), /* @__PURE__ */ React.createElement("option", { value: "true", __self: this, __source: {
685
724
  fileName: _jsxFileName,
686
- lineNumber: 779,
725
+ lineNumber: 828,
687
726
  columnNumber: 19
688
727
  } }, "Yes"), /* @__PURE__ */ React.createElement("option", { value: "false", __self: this, __source: {
689
728
  fileName: _jsxFileName,
690
- lineNumber: 780,
729
+ lineNumber: 829,
691
730
  columnNumber: 19
692
731
  } }, "No")));
693
732
  }
694
733
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
695
734
  fileName: _jsxFileName,
696
- lineNumber: 788,
735
+ lineNumber: 837,
697
736
  columnNumber: 13
698
737
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
699
738
  fileName: _jsxFileName,
700
- lineNumber: 789,
739
+ lineNumber: 838,
701
740
  columnNumber: 15
702
741
  } }, 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
742
  fileName: _jsxFileName,
704
- lineNumber: 792,
743
+ lineNumber: 841,
705
744
  columnNumber: 15
706
745
  } }));
707
746
  })));
708
747
  const searchFilter = /* @__PURE__ */ React.createElement("div", { className: "mb-4 flex items-center justify-between", __self: this, __source: {
709
748
  fileName: _jsxFileName,
710
- lineNumber: 807,
749
+ lineNumber: 856,
711
750
  columnNumber: 5
712
751
  } }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 max-w-lg", __self: this, __source: {
713
752
  fileName: _jsxFileName,
714
- lineNumber: 808,
753
+ lineNumber: 857,
715
754
  columnNumber: 7
716
755
  } }, /* @__PURE__ */ React.createElement("label", { htmlFor: "search", className: "sr-only", __self: this, __source: {
717
756
  fileName: _jsxFileName,
718
- lineNumber: 809,
757
+ lineNumber: 858,
719
758
  columnNumber: 9
720
759
  } }, "Search"), /* @__PURE__ */ React.createElement("div", { className: "relative", __self: this, __source: {
721
760
  fileName: _jsxFileName,
722
- lineNumber: 812,
761
+ lineNumber: 861,
723
762
  columnNumber: 9
724
763
  } }, /* @__PURE__ */ React.createElement("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", __self: this, __source: {
725
764
  fileName: _jsxFileName,
726
- lineNumber: 813,
765
+ lineNumber: 862,
727
766
  columnNumber: 11
728
767
  } }, 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
768
  fileName: _jsxFileName,
730
- lineNumber: 815,
769
+ lineNumber: 864,
731
770
  columnNumber: 15
732
771
  } }, /* @__PURE__ */ React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4", __self: this, __source: {
733
772
  fileName: _jsxFileName,
734
- lineNumber: 821,
773
+ lineNumber: 870,
735
774
  columnNumber: 17
736
775
  } }), /* @__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
776
  fileName: _jsxFileName,
738
- lineNumber: 829,
777
+ lineNumber: 878,
739
778
  columnNumber: 17
740
779
  } })) : /* @__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
780
  fileName: _jsxFileName,
742
- lineNumber: 836,
781
+ lineNumber: 885,
743
782
  columnNumber: 15
744
783
  } }, /* @__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
784
  fileName: _jsxFileName,
746
- lineNumber: 843,
785
+ lineNumber: 892,
747
786
  columnNumber: 17
748
787
  } }))), /* @__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
788
  type: "SET_SEARCH",
750
789
  payload: e.target.value
751
790
  }), __self: this, __source: {
752
791
  fileName: _jsxFileName,
753
- lineNumber: 851,
792
+ lineNumber: 900,
754
793
  columnNumber: 11
755
794
  } }), searchableFieldNames.length > 0 && /* @__PURE__ */ React.createElement("div", { className: "absolute inset-y-0 right-0 flex items-center", __self: this, __source: {
756
795
  fileName: _jsxFileName,
757
- lineNumber: 861,
796
+ lineNumber: 910,
758
797
  columnNumber: 13
759
798
  } }, searchFieldSelector))), /* @__PURE__ */ React.createElement("div", { className: "ml-4 flex space-x-2", __self: this, __source: {
760
799
  fileName: _jsxFileName,
761
- lineNumber: 867,
800
+ lineNumber: 916,
762
801
  columnNumber: 7
763
802
  } }, /* @__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
803
  fileName: _jsxFileName,
765
- lineNumber: 868,
804
+ lineNumber: 917,
766
805
  columnNumber: 9
767
806
  } }, /* @__PURE__ */ React.createElement("svg", { className: "w-4 h-4 mr-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
768
807
  fileName: _jsxFileName,
769
- lineNumber: 876,
808
+ lineNumber: 925,
770
809
  columnNumber: 11
771
810
  } }, /* @__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
811
  fileName: _jsxFileName,
773
- lineNumber: 877,
812
+ lineNumber: 926,
774
813
  columnNumber: 13
775
814
  } })), "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
815
  fileName: _jsxFileName,
777
- lineNumber: 886,
816
+ lineNumber: 935,
778
817
  columnNumber: 13
779
818
  } }, 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
819
  fileName: _jsxFileName,
781
- lineNumber: 892,
820
+ lineNumber: 941,
782
821
  columnNumber: 9
783
822
  } }, "Create New")));
784
823
  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 +825,7 @@ function AdminDataListPage({
786
825
  payload: skip2
787
826
  }), sort: state.sort, setSort: setSortSafely, __self: this, __source: {
788
827
  fileName: _jsxFileName,
789
- lineNumber: 906,
828
+ lineNumber: 955,
790
829
  columnNumber: 7
791
830
  } }));
792
831
  }
@@ -795,7 +834,7 @@ function AdminDataErrorBoundary({
795
834
  }) {
796
835
  return /* @__PURE__ */ React.createElement(ErrorBoundary, { error, __self: this, __source: {
797
836
  fileName: _jsxFileName,
798
- lineNumber: 920,
837
+ lineNumber: 969,
799
838
  columnNumber: 10
800
839
  } });
801
840
  }
@@ -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, databaseModels?: DatabaseModel[]): FormField[];
21
21
  /**
22
22
  * Clean form input data for GraphQL mutations
23
23
  * Removes Apollo metadata and system fields