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