@nestledjs/data-browser 0.1.13 → 0.1.16

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,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useMemo } from "react";
2
2
  import { useQuery } from "@apollo/client/react";
3
3
  import { DataTable, ErrorBoundary } from "@nestledjs/shared-components";
4
- import { getPluralName } from "@nestledjs/helpers";
4
+ import { getPluralName } from "../utils/get-plural-names.js";
5
5
  import { AdminLocalStorage } from "../utils/secure-storage.js";
6
6
  import { kebabCase, formatFieldName } from "../utils/string-utils.js";
7
7
  import { useParams, useSearchParams, Link } from "react-router";
@@ -35,7 +35,6 @@ function AdminDataListPage({
35
35
  }
36
36
  return values;
37
37
  } catch (error2) {
38
- console.warn(`Failed to get enum values for type ${enumType}:`, error2);
39
38
  return null;
40
39
  }
41
40
  }, [sdk]);
@@ -121,25 +120,16 @@ function AdminDataListPage({
121
120
  id: value
122
121
  };
123
122
  } else {
124
- filters2[key] = value;
123
+ const scalarField = model.fields.find((f) => f.name === key && !f.relationName);
124
+ if (scalarField) {
125
+ filters2[key] = value;
126
+ }
125
127
  }
126
128
  }
127
129
  }
128
130
  return filters2;
129
131
  }, [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]);
132
+ const hasUrlFilters = Object.keys(urlFilters).length > 0;
143
133
  const documents = useMemo(() => {
144
134
  if (!model) return {
145
135
  query: void 0,
@@ -222,7 +212,17 @@ function AdminDataListPage({
222
212
  dispatch({
223
213
  type: "RESET_PAGINATION"
224
214
  });
225
- }, [model == null ? void 0 : model.name, fieldNames, searchableFieldNames, getDefaultSearchFields, setVisibleColumns, setSearchFields, dispatch]);
215
+ if (hasUrlFilters) {
216
+ dispatch({
217
+ type: "SET_FILTERS",
218
+ payload: urlFilters
219
+ });
220
+ dispatch({
221
+ type: "SET_SHOW_FILTERS",
222
+ payload: true
223
+ });
224
+ }
225
+ }, [model == null ? void 0 : model.name, fieldNames, searchableFieldNames, getDefaultSearchFields, setVisibleColumns, setSearchFields, dispatch, urlFilters]);
226
226
  const setSortSafely = useCallback((newSort) => {
227
227
  const resolvedSort = typeof newSort === "function" ? newSort(sort) : newSort;
228
228
  if (resolvedSort.orderBy !== sort.orderBy || resolvedSort.orderDirection !== sort.orderDirection) {
@@ -293,14 +293,9 @@ function AdminDataListPage({
293
293
  } = useMemo(() => {
294
294
  var _a, _b;
295
295
  if (error) {
296
- console.warn("[AdminList] GraphQL error:", error.message);
297
296
  const apolloError = error;
298
- if (apolloError.networkError) {
299
- console.error("[AdminList] Network error:", apolloError.networkError);
300
- }
301
- if (((_a = apolloError.graphQLErrors) == null ? void 0 : _a.length) > 0) {
302
- console.error("[AdminList] GraphQL errors:", apolloError.graphQLErrors);
303
- }
297
+ if (apolloError.networkError) ;
298
+ if (((_a = apolloError.graphQLErrors) == null ? void 0 : _a.length) > 0) ;
304
299
  }
305
300
  if (!data) {
306
301
  return {
@@ -324,7 +319,6 @@ function AdminDataListPage({
324
319
  }
325
320
  }
326
321
  if (!Array.isArray(processedItems)) {
327
- console.warn("[AdminList] Expected array but got:", typeof processedItems);
328
322
  return {
329
323
  validatedItems: [],
330
324
  validatedPagination: processedPagination,
@@ -333,11 +327,9 @@ function AdminDataListPage({
333
327
  }
334
328
  const filteredItems = processedItems.filter((item, index) => {
335
329
  if (!item || typeof item !== "object") {
336
- console.warn(`[AdminList] Invalid item at index ${index}:`, item);
337
330
  return false;
338
331
  }
339
332
  if (!item.id) {
340
- console.warn(`[AdminList] Item missing ID at index ${index}:`, item);
341
333
  return false;
342
334
  }
343
335
  return true;
@@ -348,7 +340,6 @@ function AdminDataListPage({
348
340
  dataError: null
349
341
  };
350
342
  } catch (err) {
351
- console.error("[AdminList] Error processing data:", err);
352
343
  return {
353
344
  validatedItems: [],
354
345
  validatedPagination: void 0,
@@ -361,129 +352,129 @@ function AdminDataListPage({
361
352
  if (!model) {
362
353
  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: {
363
354
  fileName: _jsxFileName,
364
- lineNumber: 451,
355
+ lineNumber: 448,
365
356
  columnNumber: 7
366
357
  } }, /* @__PURE__ */ React.createElement("div", { className: "mt-8 sm:mx-auto sm:w-full sm:max-w-md", __self: this, __source: {
367
358
  fileName: _jsxFileName,
368
- lineNumber: 452,
359
+ lineNumber: 449,
369
360
  columnNumber: 9
370
361
  } }, /* @__PURE__ */ React.createElement("div", { className: "bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10", __self: this, __source: {
371
362
  fileName: _jsxFileName,
372
- lineNumber: 453,
363
+ lineNumber: 450,
373
364
  columnNumber: 11
374
365
  } }, /* @__PURE__ */ React.createElement("div", { className: "text-center", __self: this, __source: {
375
366
  fileName: _jsxFileName,
376
- lineNumber: 454,
367
+ lineNumber: 451,
377
368
  columnNumber: 13
378
369
  } }, /* @__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: {
379
370
  fileName: _jsxFileName,
380
- lineNumber: 455,
371
+ lineNumber: 452,
381
372
  columnNumber: 15
382
373
  } }, /* @__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: {
383
374
  fileName: _jsxFileName,
384
- lineNumber: 461,
375
+ lineNumber: 458,
385
376
  columnNumber: 17
386
377
  } })), /* @__PURE__ */ React.createElement("h2", { className: "mt-4 text-lg font-medium text-gray-900", __self: this, __source: {
387
378
  fileName: _jsxFileName,
388
- lineNumber: 468,
379
+ lineNumber: 465,
389
380
  columnNumber: 15
390
381
  } }, "Invalid Data Type"), /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-sm text-gray-600", __self: this, __source: {
391
382
  fileName: _jsxFileName,
392
- lineNumber: 469,
383
+ lineNumber: 466,
393
384
  columnNumber: 15
394
385
  } }, 'The data type "', pluralParam, '" is not recognized.'), /* @__PURE__ */ React.createElement("div", { className: "mt-6", __self: this, __source: {
395
386
  fileName: _jsxFileName,
396
- lineNumber: 472,
387
+ lineNumber: 469,
397
388
  columnNumber: 15
398
389
  } }, /* @__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: {
399
390
  fileName: _jsxFileName,
400
- lineNumber: 473,
391
+ lineNumber: 470,
401
392
  columnNumber: 17
402
393
  } }, "Return to Data Browser"))))));
403
394
  }
404
395
  if (!query) {
405
396
  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: {
406
397
  fileName: _jsxFileName,
407
- lineNumber: 489,
398
+ lineNumber: 486,
408
399
  columnNumber: 7
409
400
  } }, /* @__PURE__ */ React.createElement("div", { className: "mt-8 sm:mx-auto sm:w-full sm:max-w-md", __self: this, __source: {
410
401
  fileName: _jsxFileName,
411
- lineNumber: 490,
402
+ lineNumber: 487,
412
403
  columnNumber: 9
413
404
  } }, /* @__PURE__ */ React.createElement("div", { className: "bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10", __self: this, __source: {
414
405
  fileName: _jsxFileName,
415
- lineNumber: 491,
406
+ lineNumber: 488,
416
407
  columnNumber: 11
417
408
  } }, /* @__PURE__ */ React.createElement("div", { className: "text-center", __self: this, __source: {
418
409
  fileName: _jsxFileName,
419
- lineNumber: 492,
410
+ lineNumber: 489,
420
411
  columnNumber: 13
421
412
  } }, /* @__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: {
422
413
  fileName: _jsxFileName,
423
- lineNumber: 493,
414
+ lineNumber: 490,
424
415
  columnNumber: 15
425
416
  } }, /* @__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: {
426
417
  fileName: _jsxFileName,
427
- lineNumber: 499,
418
+ lineNumber: 496,
428
419
  columnNumber: 17
429
420
  } })), /* @__PURE__ */ React.createElement("h2", { className: "mt-4 text-lg font-medium text-gray-900", __self: this, __source: {
430
421
  fileName: _jsxFileName,
431
- lineNumber: 506,
422
+ lineNumber: 503,
432
423
  columnNumber: 15
433
424
  } }, "GraphQL Schema Not Available"), /* @__PURE__ */ React.createElement("p", { className: "mt-2 text-sm text-gray-600", __self: this, __source: {
434
425
  fileName: _jsxFileName,
435
- lineNumber: 509,
426
+ lineNumber: 506,
436
427
  columnNumber: 15
437
428
  } }, '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: {
438
429
  fileName: _jsxFileName,
439
- lineNumber: 513,
430
+ lineNumber: 510,
440
431
  columnNumber: 15
441
432
  } }, /* @__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: {
442
433
  fileName: _jsxFileName,
443
- lineNumber: 514,
434
+ lineNumber: 511,
444
435
  columnNumber: 17
445
436
  } }, "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: {
446
437
  fileName: _jsxFileName,
447
- lineNumber: 520,
438
+ lineNumber: 517,
448
439
  columnNumber: 17
449
440
  } }, "Return to Data Browser"))))));
450
441
  }
451
442
  const createLink = `${basePath}/${kebabCase(model.name)}/create`;
452
443
  const columnSelector = /* @__PURE__ */ React.createElement("div", { className: "relative", "data-dropdown": "column-selector", __self: this, __source: {
453
444
  fileName: _jsxFileName,
454
- lineNumber: 539,
445
+ lineNumber: 536,
455
446
  columnNumber: 5
456
447
  } }, /* @__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: {
457
448
  fileName: _jsxFileName,
458
- lineNumber: 540,
449
+ lineNumber: 537,
459
450
  columnNumber: 7
460
451
  } }, "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: {
461
452
  fileName: _jsxFileName,
462
- lineNumber: 545,
453
+ lineNumber: 542,
463
454
  columnNumber: 9
464
455
  } }, /* @__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: {
465
456
  fileName: _jsxFileName,
466
- lineNumber: 551,
457
+ lineNumber: 548,
467
458
  columnNumber: 11
468
459
  } }))), 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: {
469
460
  fileName: _jsxFileName,
470
- lineNumber: 560,
461
+ lineNumber: 557,
471
462
  columnNumber: 9
472
463
  } }, /* @__PURE__ */ React.createElement("div", { className: "p-4", __self: this, __source: {
473
464
  fileName: _jsxFileName,
474
- lineNumber: 561,
465
+ lineNumber: 558,
475
466
  columnNumber: 11
476
467
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900 mb-3", __self: this, __source: {
477
468
  fileName: _jsxFileName,
478
- lineNumber: 562,
469
+ lineNumber: 559,
479
470
  columnNumber: 13
480
471
  } }, "Visible Columns"), /* @__PURE__ */ React.createElement("div", { className: "space-y-2 max-h-64 overflow-y-auto", __self: this, __source: {
481
472
  fileName: _jsxFileName,
482
- lineNumber: 563,
473
+ lineNumber: 560,
483
474
  columnNumber: 13
484
475
  } }, fieldNames.map((field) => /* @__PURE__ */ React.createElement("label", { key: field, className: "flex items-start gap-2 cursor-pointer", __self: this, __source: {
485
476
  fileName: _jsxFileName,
486
- lineNumber: 565,
477
+ lineNumber: 562,
487
478
  columnNumber: 17
488
479
  } }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", checked: visibleColumns.includes(field), onChange: (e) => {
489
480
  const newColumns = e.target.checked ? [...visibleColumns, field] : visibleColumns.filter((col) => col !== field);
@@ -491,22 +482,22 @@ function AdminDataListPage({
491
482
  AdminLocalStorage.setColumnVisibility(model.name, newColumns);
492
483
  }, 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: {
493
484
  fileName: _jsxFileName,
494
- lineNumber: 566,
485
+ lineNumber: 563,
495
486
  columnNumber: 19
496
487
  } }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-gray-700 leading-5", __self: this, __source: {
497
488
  fileName: _jsxFileName,
498
- lineNumber: 578,
489
+ lineNumber: 575,
499
490
  columnNumber: 19
500
491
  } }, formatFieldName(field))))), /* @__PURE__ */ React.createElement("div", { className: "mt-3 pt-3 border-t border-gray-200 flex justify-between", __self: this, __source: {
501
492
  fileName: _jsxFileName,
502
- lineNumber: 582,
493
+ lineNumber: 579,
503
494
  columnNumber: 13
504
495
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
505
496
  setVisibleColumns(fieldNames);
506
497
  AdminLocalStorage.setColumnVisibility(model.name, fieldNames);
507
498
  }, className: "text-xs text-green-web hover:text-green-web-800", __self: this, __source: {
508
499
  fileName: _jsxFileName,
509
- lineNumber: 583,
500
+ lineNumber: 580,
510
501
  columnNumber: 15
511
502
  } }, "Select All"), /* @__PURE__ */ React.createElement("button", { onClick: () => {
512
503
  const defaults = fieldNames.slice(0, 8);
@@ -514,44 +505,44 @@ function AdminDataListPage({
514
505
  AdminLocalStorage.setColumnVisibility(model.name, defaults);
515
506
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
516
507
  fileName: _jsxFileName,
517
- lineNumber: 592,
508
+ lineNumber: 589,
518
509
  columnNumber: 15
519
510
  } }, "Reset to Defaults")))));
520
511
  const searchFieldSelector = /* @__PURE__ */ React.createElement("div", { className: "relative", "data-dropdown": "search-field-selector", __self: this, __source: {
521
512
  fileName: _jsxFileName,
522
- lineNumber: 611,
513
+ lineNumber: 608,
523
514
  columnNumber: 5
524
515
  } }, /* @__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: {
525
516
  fileName: _jsxFileName,
526
- lineNumber: 612,
517
+ lineNumber: 609,
527
518
  columnNumber: 7
528
519
  } }, /* @__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: {
529
520
  fileName: _jsxFileName,
530
- lineNumber: 617,
521
+ lineNumber: 614,
531
522
  columnNumber: 9
532
523
  } }, /* @__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: {
533
524
  fileName: _jsxFileName,
534
- lineNumber: 623,
525
+ lineNumber: 620,
535
526
  columnNumber: 11
536
527
  } }))), 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: {
537
528
  fileName: _jsxFileName,
538
- lineNumber: 632,
529
+ lineNumber: 629,
539
530
  columnNumber: 9
540
531
  } }, /* @__PURE__ */ React.createElement("div", { className: "p-4", __self: this, __source: {
541
532
  fileName: _jsxFileName,
542
- lineNumber: 633,
533
+ lineNumber: 630,
543
534
  columnNumber: 11
544
535
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900 mb-3", __self: this, __source: {
545
536
  fileName: _jsxFileName,
546
- lineNumber: 634,
537
+ lineNumber: 631,
547
538
  columnNumber: 13
548
539
  } }, "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: {
549
540
  fileName: _jsxFileName,
550
- lineNumber: 637,
541
+ lineNumber: 634,
551
542
  columnNumber: 17
552
543
  } }, searchableFieldNames.map((field) => /* @__PURE__ */ React.createElement("label", { key: field, className: "flex items-start gap-2 cursor-pointer", __self: this, __source: {
553
544
  fileName: _jsxFileName,
554
- lineNumber: 639,
545
+ lineNumber: 636,
555
546
  columnNumber: 21
556
547
  } }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", checked: searchFields.includes(field), onChange: (e) => {
557
548
  const newFields = e.target.checked ? [...searchFields, field] : searchFields.filter((f) => f !== field);
@@ -559,22 +550,22 @@ function AdminDataListPage({
559
550
  AdminLocalStorage.setSearchFields(model.name, newFields);
560
551
  }, 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: {
561
552
  fileName: _jsxFileName,
562
- lineNumber: 640,
553
+ lineNumber: 637,
563
554
  columnNumber: 23
564
555
  } }), /* @__PURE__ */ React.createElement("span", { className: "text-sm text-gray-700 leading-5", __self: this, __source: {
565
556
  fileName: _jsxFileName,
566
- lineNumber: 652,
557
+ lineNumber: 649,
567
558
  columnNumber: 23
568
559
  } }, formatFieldName(field))))), /* @__PURE__ */ React.createElement("div", { className: "mt-3 pt-3 border-t border-gray-200 flex justify-between", __self: this, __source: {
569
560
  fileName: _jsxFileName,
570
- lineNumber: 658,
561
+ lineNumber: 655,
571
562
  columnNumber: 17
572
563
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
573
564
  setSearchFields(searchableFieldNames);
574
565
  AdminLocalStorage.setSearchFields(model.name, searchableFieldNames);
575
566
  }, className: "text-xs text-green-web hover:text-green-web-800 mr-3", __self: this, __source: {
576
567
  fileName: _jsxFileName,
577
- lineNumber: 659,
568
+ lineNumber: 656,
578
569
  columnNumber: 19
579
570
  } }, "Select All"), /* @__PURE__ */ React.createElement("button", { onClick: () => {
580
571
  const defaults = getDefaultSearchFields(searchableFieldNames);
@@ -582,28 +573,28 @@ function AdminDataListPage({
582
573
  AdminLocalStorage.setSearchFields(model.name, defaults);
583
574
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
584
575
  fileName: _jsxFileName,
585
- lineNumber: 668,
576
+ lineNumber: 665,
586
577
  columnNumber: 19
587
578
  } }, "Reset to Defaults"))) : /* @__PURE__ */ React.createElement("div", { className: "text-sm text-gray-500", __self: this, __source: {
588
579
  fileName: _jsxFileName,
589
- lineNumber: 681,
580
+ lineNumber: 678,
590
581
  columnNumber: 15
591
582
  } }, "No searchable text fields available"))));
592
583
  const filterPanel = showFilters && /* @__PURE__ */ React.createElement("div", { className: "mb-4 bg-gray-50 border border-gray-200 rounded-lg p-4", __self: this, __source: {
593
584
  fileName: _jsxFileName,
594
- lineNumber: 691,
585
+ lineNumber: 688,
595
586
  columnNumber: 5
596
587
  } }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center justify-between mb-3", __self: this, __source: {
597
588
  fileName: _jsxFileName,
598
- lineNumber: 692,
589
+ lineNumber: 689,
599
590
  columnNumber: 7
600
591
  } }, /* @__PURE__ */ React.createElement("h3", { className: "text-sm font-medium text-gray-900", __self: this, __source: {
601
592
  fileName: _jsxFileName,
602
- lineNumber: 693,
593
+ lineNumber: 690,
603
594
  columnNumber: 9
604
595
  } }, "Filters"), /* @__PURE__ */ React.createElement("div", { className: "flex items-center space-x-2", __self: this, __source: {
605
596
  fileName: _jsxFileName,
606
- lineNumber: 694,
597
+ lineNumber: 691,
607
598
  columnNumber: 9
608
599
  } }, /* @__PURE__ */ React.createElement("button", { onClick: () => {
609
600
  setFilters({});
@@ -612,23 +603,23 @@ function AdminDataListPage({
612
603
  });
613
604
  }, className: "text-xs text-gray-600 hover:text-gray-800", __self: this, __source: {
614
605
  fileName: _jsxFileName,
615
- lineNumber: 695,
606
+ lineNumber: 692,
616
607
  columnNumber: 11
617
608
  } }, "Clear All"), /* @__PURE__ */ React.createElement("button", { onClick: () => setShowFilters(false), className: "text-gray-400 hover:text-gray-600", __self: this, __source: {
618
609
  fileName: _jsxFileName,
619
- lineNumber: 704,
610
+ lineNumber: 701,
620
611
  columnNumber: 11
621
612
  } }, /* @__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: {
622
613
  fileName: _jsxFileName,
623
- lineNumber: 708,
614
+ lineNumber: 705,
624
615
  columnNumber: 13
625
616
  } }, /* @__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: {
626
617
  fileName: _jsxFileName,
627
- lineNumber: 714,
618
+ lineNumber: 711,
628
619
  columnNumber: 15
629
620
  } }))))), /* @__PURE__ */ React.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", __self: this, __source: {
630
621
  fileName: _jsxFileName,
631
- lineNumber: 724,
622
+ lineNumber: 721,
632
623
  columnNumber: 7
633
624
  } }, filterableFieldNames.map((fieldName) => {
634
625
  const field = model.fields.find((f) => f.name === fieldName);
@@ -651,21 +642,21 @@ function AdminDataListPage({
651
642
  if (field.relationName && !field.isList) {
652
643
  return /* @__PURE__ */ React.createElement(RelationFilterField, { key: fieldName, fieldName, relatedModelName: field.type, currentValue, onChange: handleChange, __self: this, __source: {
653
644
  fileName: _jsxFileName,
654
- lineNumber: 744,
645
+ lineNumber: 741,
655
646
  columnNumber: 15
656
647
  } });
657
648
  }
658
649
  if (field.type.toLowerCase() === "datetime" || field.type.toLowerCase() === "date") {
659
650
  return /* @__PURE__ */ React.createElement(DateRangeFilter, { key: fieldName, fieldName, currentValue, onChange: handleChange, __self: this, __source: {
660
651
  fileName: _jsxFileName,
661
- lineNumber: 757,
652
+ lineNumber: 754,
662
653
  columnNumber: 15
663
654
  } });
664
655
  }
665
656
  if (["int", "bigint", "float", "decimal"].includes(field.type.toLowerCase())) {
666
657
  return /* @__PURE__ */ React.createElement(NumberRangeFilter, { key: fieldName, fieldName, fieldType: field.type.toLowerCase(), currentValue, onChange: handleChange, __self: this, __source: {
667
658
  fileName: _jsxFileName,
668
- lineNumber: 769,
659
+ lineNumber: 766,
669
660
  columnNumber: 15
670
661
  } });
671
662
  }
@@ -674,23 +665,23 @@ function AdminDataListPage({
674
665
  if (enumValues) {
675
666
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
676
667
  fileName: _jsxFileName,
677
- lineNumber: 784,
668
+ lineNumber: 781,
678
669
  columnNumber: 17
679
670
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
680
671
  fileName: _jsxFileName,
681
- lineNumber: 785,
672
+ lineNumber: 782,
682
673
  columnNumber: 19
683
674
  } }, 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: {
684
675
  fileName: _jsxFileName,
685
- lineNumber: 788,
676
+ lineNumber: 785,
686
677
  columnNumber: 19
687
678
  } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
688
679
  fileName: _jsxFileName,
689
- lineNumber: 793,
680
+ lineNumber: 790,
690
681
  columnNumber: 21
691
682
  } }, "All"), enumValues.map((val) => /* @__PURE__ */ React.createElement("option", { key: val, value: val, __self: this, __source: {
692
683
  fileName: _jsxFileName,
693
- lineNumber: 795,
684
+ lineNumber: 792,
694
685
  columnNumber: 23
695
686
  } }, val))));
696
687
  }
@@ -698,121 +689,121 @@ function AdminDataListPage({
698
689
  if (field.type.toLowerCase() === "boolean") {
699
690
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
700
691
  fileName: _jsxFileName,
701
- lineNumber: 808,
692
+ lineNumber: 805,
702
693
  columnNumber: 15
703
694
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
704
695
  fileName: _jsxFileName,
705
- lineNumber: 809,
696
+ lineNumber: 806,
706
697
  columnNumber: 17
707
698
  } }, formatFieldName(fieldName)), /* @__PURE__ */ React.createElement("select", { value: currentValue === void 0 || currentValue === null ? "" : currentValue.toString(), onChange: (e) => {
708
699
  const value = e.target.value;
709
700
  handleChange(value === "" ? void 0 : value === "true");
710
701
  }, 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: {
711
702
  fileName: _jsxFileName,
712
- lineNumber: 812,
703
+ lineNumber: 809,
713
704
  columnNumber: 17
714
705
  } }, /* @__PURE__ */ React.createElement("option", { value: "", __self: this, __source: {
715
706
  fileName: _jsxFileName,
716
- lineNumber: 820,
707
+ lineNumber: 817,
717
708
  columnNumber: 19
718
709
  } }, "All"), /* @__PURE__ */ React.createElement("option", { value: "true", __self: this, __source: {
719
710
  fileName: _jsxFileName,
720
- lineNumber: 821,
711
+ lineNumber: 818,
721
712
  columnNumber: 19
722
713
  } }, "Yes"), /* @__PURE__ */ React.createElement("option", { value: "false", __self: this, __source: {
723
714
  fileName: _jsxFileName,
724
- lineNumber: 822,
715
+ lineNumber: 819,
725
716
  columnNumber: 19
726
717
  } }, "No")));
727
718
  }
728
719
  return /* @__PURE__ */ React.createElement("div", { key: fieldName, className: "space-y-1", __self: this, __source: {
729
720
  fileName: _jsxFileName,
730
- lineNumber: 830,
721
+ lineNumber: 827,
731
722
  columnNumber: 13
732
723
  } }, /* @__PURE__ */ React.createElement("label", { className: "block text-sm font-medium text-gray-700", __self: this, __source: {
733
724
  fileName: _jsxFileName,
734
- lineNumber: 831,
725
+ lineNumber: 828,
735
726
  columnNumber: 15
736
727
  } }, 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: {
737
728
  fileName: _jsxFileName,
738
- lineNumber: 834,
729
+ lineNumber: 831,
739
730
  columnNumber: 15
740
731
  } }));
741
732
  })));
742
733
  const searchFilter = /* @__PURE__ */ React.createElement("div", { className: "mb-4 flex items-center justify-between", __self: this, __source: {
743
734
  fileName: _jsxFileName,
744
- lineNumber: 849,
735
+ lineNumber: 846,
745
736
  columnNumber: 5
746
737
  } }, /* @__PURE__ */ React.createElement("div", { className: "flex-1 max-w-lg", __self: this, __source: {
747
738
  fileName: _jsxFileName,
748
- lineNumber: 850,
739
+ lineNumber: 847,
749
740
  columnNumber: 7
750
741
  } }, /* @__PURE__ */ React.createElement("label", { htmlFor: "search", className: "sr-only", __self: this, __source: {
751
742
  fileName: _jsxFileName,
752
- lineNumber: 851,
743
+ lineNumber: 848,
753
744
  columnNumber: 9
754
745
  } }, "Search"), /* @__PURE__ */ React.createElement("div", { className: "relative", __self: this, __source: {
755
746
  fileName: _jsxFileName,
756
- lineNumber: 854,
747
+ lineNumber: 851,
757
748
  columnNumber: 9
758
749
  } }, /* @__PURE__ */ React.createElement("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", __self: this, __source: {
759
750
  fileName: _jsxFileName,
760
- lineNumber: 855,
751
+ lineNumber: 852,
761
752
  columnNumber: 11
762
753
  } }, 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: {
763
754
  fileName: _jsxFileName,
764
- lineNumber: 857,
755
+ lineNumber: 854,
765
756
  columnNumber: 15
766
757
  } }, /* @__PURE__ */ React.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4", __self: this, __source: {
767
758
  fileName: _jsxFileName,
768
- lineNumber: 863,
759
+ lineNumber: 860,
769
760
  columnNumber: 17
770
761
  } }), /* @__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: {
771
762
  fileName: _jsxFileName,
772
- lineNumber: 871,
763
+ lineNumber: 868,
773
764
  columnNumber: 17
774
765
  } })) : /* @__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: {
775
766
  fileName: _jsxFileName,
776
- lineNumber: 878,
767
+ lineNumber: 875,
777
768
  columnNumber: 15
778
769
  } }, /* @__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: {
779
770
  fileName: _jsxFileName,
780
- lineNumber: 885,
771
+ lineNumber: 882,
781
772
  columnNumber: 17
782
773
  } }))), /* @__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({
783
774
  type: "SET_SEARCH",
784
775
  payload: e.target.value
785
776
  }), __self: this, __source: {
786
777
  fileName: _jsxFileName,
787
- lineNumber: 893,
778
+ lineNumber: 890,
788
779
  columnNumber: 11
789
780
  } }), searchableFieldNames.length > 0 && /* @__PURE__ */ React.createElement("div", { className: "absolute inset-y-0 right-0 flex items-center", __self: this, __source: {
790
781
  fileName: _jsxFileName,
791
- lineNumber: 903,
782
+ lineNumber: 900,
792
783
  columnNumber: 13
793
784
  } }, searchFieldSelector))), /* @__PURE__ */ React.createElement("div", { className: "ml-4 flex space-x-2", __self: this, __source: {
794
785
  fileName: _jsxFileName,
795
- lineNumber: 909,
786
+ lineNumber: 906,
796
787
  columnNumber: 7
797
788
  } }, /* @__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: {
798
789
  fileName: _jsxFileName,
799
- lineNumber: 910,
790
+ lineNumber: 907,
800
791
  columnNumber: 9
801
792
  } }, /* @__PURE__ */ React.createElement("svg", { className: "w-4 h-4 mr-2", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", __self: this, __source: {
802
793
  fileName: _jsxFileName,
803
- lineNumber: 918,
794
+ lineNumber: 915,
804
795
  columnNumber: 11
805
796
  } }, /* @__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: {
806
797
  fileName: _jsxFileName,
807
- lineNumber: 919,
798
+ lineNumber: 916,
808
799
  columnNumber: 13
809
800
  } })), "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: {
810
801
  fileName: _jsxFileName,
811
- lineNumber: 928,
802
+ lineNumber: 925,
812
803
  columnNumber: 13
813
804
  } }, 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: {
814
805
  fileName: _jsxFileName,
815
- lineNumber: 934,
806
+ lineNumber: 931,
816
807
  columnNumber: 9
817
808
  } }, "Create New")));
818
809
  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({
@@ -820,7 +811,7 @@ function AdminDataListPage({
820
811
  payload: skip2
821
812
  }), sort: state.sort, setSort: setSortSafely, __self: this, __source: {
822
813
  fileName: _jsxFileName,
823
- lineNumber: 948,
814
+ lineNumber: 945,
824
815
  columnNumber: 7
825
816
  } }));
826
817
  }
@@ -829,7 +820,7 @@ function AdminDataErrorBoundary({
829
820
  }) {
830
821
  return /* @__PURE__ */ React.createElement(ErrorBoundary, { error, __self: this, __source: {
831
822
  fileName: _jsxFileName,
832
- lineNumber: 962,
823
+ lineNumber: 959,
833
824
  columnNumber: 10
834
825
  } });
835
826
  }