@juv/codego-react-ui 3.3.8 → 3.4.0

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.
package/dist/index.cjs CHANGED
@@ -6405,6 +6405,16 @@ var import_react_dom2 = require("react-dom");
6405
6405
  var import_axios3 = __toESM(require("axios"), 1);
6406
6406
  var import_lucide_react17 = require("lucide-react");
6407
6407
  var import_jsx_runtime32 = require("react/jsx-runtime");
6408
+ var csrfAxios = import_axios3.default.create();
6409
+ csrfAxios.interceptors.request.use((config) => {
6410
+ const method = (config.method ?? "").toUpperCase();
6411
+ if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
6412
+ const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
6413
+ if (!token) throw new Error('[Table] CSRF token not found. Add <meta name="csrf-token" content="..."> to your HTML <head>.');
6414
+ config.headers.set("X-CSRF-Token", token);
6415
+ }
6416
+ return config;
6417
+ });
6408
6418
  function useServerTable({ url, params, encrypt, key, decryptPayloadLog, columnOverrides, debounce = 300, transform, manual = false, refresh: refreshEnabled = false, refreshInterval = 0, hardReload, onSuccess, onError }) {
6409
6419
  const [data, setData] = React28.useState([]);
6410
6420
  const [columns, setColumns] = React28.useState([]);
@@ -6743,10 +6753,7 @@ function EditModal({
6743
6753
  setLoading(true);
6744
6754
  setError(null);
6745
6755
  try {
6746
- const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
6747
- await import_axios3.default.put(`${baseUrl}/${itemId}/update`, form, {
6748
- headers: csrfToken ? { "X-CSRF-Token": csrfToken } : {}
6749
- });
6756
+ await csrfAxios.put(`${baseUrl}/${itemId}/update`, form);
6750
6757
  const updated = { ...item, ...form };
6751
6758
  if (notif && (notif.type ?? "toast") === "notification") {
6752
6759
  setBanner(true);
@@ -6837,10 +6844,7 @@ function DeleteModal({
6837
6844
  setLoading(true);
6838
6845
  setError(null);
6839
6846
  try {
6840
- const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
6841
- await import_axios3.default.delete(`${baseUrl}/${itemId}/delete`, {
6842
- headers: csrfToken ? { "X-CSRF-Token": csrfToken } : {}
6843
- });
6847
+ await csrfAxios.delete(`${baseUrl}/${itemId}/delete`);
6844
6848
  onSuccess?.(item);
6845
6849
  onClose();
6846
6850
  } catch (err) {
@@ -6943,6 +6947,7 @@ function Table({
6943
6947
  setTableData(data ?? []);
6944
6948
  }, [data]);
6945
6949
  const actionIdKey = defaultActions?.idKey ?? idKey;
6950
+ const safeBaseUrl = defaultActions?.baseUrl.replace(/\/+$/, "") ?? "";
6946
6951
  const autoFields = React28.useMemo(() => {
6947
6952
  if (!tableData.length) return [];
6948
6953
  return Object.keys(tableData[0]).map((k) => ({
@@ -7344,7 +7349,7 @@ function Table({
7344
7349
  {
7345
7350
  item: editItem,
7346
7351
  fields: editFields,
7347
- baseUrl: defaultActions.baseUrl,
7352
+ baseUrl: safeBaseUrl,
7348
7353
  itemId: String(editItem[actionIdKey] ?? ""),
7349
7354
  notif: defaultActions.onSuccessNotif,
7350
7355
  grid: defaultActions.editFormGrid,
@@ -7372,7 +7377,7 @@ function Table({
7372
7377
  DeleteModal,
7373
7378
  {
7374
7379
  item: deleteItem,
7375
- baseUrl: defaultActions.baseUrl,
7380
+ baseUrl: safeBaseUrl,
7376
7381
  itemId: String(deleteItem[actionIdKey] ?? ""),
7377
7382
  notif: defaultActions.onSuccessNotif,
7378
7383
  onClose: () => setDeleteItem(null),
@@ -69551,6 +69551,16 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
69551
69551
  var React28 = __toESM(require_react(), 1);
69552
69552
  var import_react_dom2 = __toESM(require_react_dom(), 1);
69553
69553
  var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
69554
+ var csrfAxios = axios_default.create();
69555
+ csrfAxios.interceptors.request.use((config) => {
69556
+ const method = (config.method ?? "").toUpperCase();
69557
+ if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
69558
+ const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
69559
+ if (!token) throw new Error('[Table] CSRF token not found. Add <meta name="csrf-token" content="..."> to your HTML <head>.');
69560
+ config.headers.set("X-CSRF-Token", token);
69561
+ }
69562
+ return config;
69563
+ });
69554
69564
  function useServerTable({ url: url2, params, encrypt, key, decryptPayloadLog, columnOverrides, debounce = 300, transform, manual = false, refresh: refreshEnabled = false, refreshInterval = 0, hardReload, onSuccess, onError }) {
69555
69565
  const [data, setData] = React28.useState([]);
69556
69566
  const [columns, setColumns] = React28.useState([]);
@@ -69889,10 +69899,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
69889
69899
  setLoading(true);
69890
69900
  setError(null);
69891
69901
  try {
69892
- const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
69893
- await axios_default.put(`${baseUrl}/${itemId}/update`, form, {
69894
- headers: csrfToken ? { "X-CSRF-Token": csrfToken } : {}
69895
- });
69902
+ await csrfAxios.put(`${baseUrl}/${itemId}/update`, form);
69896
69903
  const updated = { ...item, ...form };
69897
69904
  if (notif && (notif.type ?? "toast") === "notification") {
69898
69905
  setBanner(true);
@@ -69983,10 +69990,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
69983
69990
  setLoading(true);
69984
69991
  setError(null);
69985
69992
  try {
69986
- const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
69987
- await axios_default.delete(`${baseUrl}/${itemId}/delete`, {
69988
- headers: csrfToken ? { "X-CSRF-Token": csrfToken } : {}
69989
- });
69993
+ await csrfAxios.delete(`${baseUrl}/${itemId}/delete`);
69990
69994
  onSuccess?.(item);
69991
69995
  onClose();
69992
69996
  } catch (err) {
@@ -70089,6 +70093,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
70089
70093
  setTableData(data ?? []);
70090
70094
  }, [data]);
70091
70095
  const actionIdKey = defaultActions?.idKey ?? idKey;
70096
+ const safeBaseUrl = defaultActions?.baseUrl.replace(/\/+$/, "") ?? "";
70092
70097
  const autoFields = React28.useMemo(() => {
70093
70098
  if (!tableData.length) return [];
70094
70099
  return Object.keys(tableData[0]).map((k) => ({
@@ -70490,7 +70495,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
70490
70495
  {
70491
70496
  item: editItem,
70492
70497
  fields: editFields,
70493
- baseUrl: defaultActions.baseUrl,
70498
+ baseUrl: safeBaseUrl,
70494
70499
  itemId: String(editItem[actionIdKey] ?? ""),
70495
70500
  notif: defaultActions.onSuccessNotif,
70496
70501
  grid: defaultActions.editFormGrid,
@@ -70518,7 +70523,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
70518
70523
  DeleteModal,
70519
70524
  {
70520
70525
  item: deleteItem,
70521
- baseUrl: defaultActions.baseUrl,
70526
+ baseUrl: safeBaseUrl,
70522
70527
  itemId: String(deleteItem[actionIdKey] ?? ""),
70523
70528
  notif: defaultActions.onSuccessNotif,
70524
70529
  onClose: () => setDeleteItem(null),
package/dist/index.js CHANGED
@@ -6285,6 +6285,16 @@ import { createPortal as createPortal3 } from "react-dom";
6285
6285
  import axios3 from "axios";
6286
6286
  import { ChevronLeft as ChevronLeft6, ChevronRight as ChevronRight8, Search as Search5, Trash2 as Trash22, ChevronsUpDown, ChevronUp, ChevronDown as ChevronDown4, X as X9, Eye as Eye2, Pencil as Pencil2, Trash as Trash3, Loader2 as Loader22 } from "lucide-react";
6287
6287
  import { Fragment as Fragment11, jsx as jsx32, jsxs as jsxs30 } from "react/jsx-runtime";
6288
+ var csrfAxios = axios3.create();
6289
+ csrfAxios.interceptors.request.use((config) => {
6290
+ const method = (config.method ?? "").toUpperCase();
6291
+ if (["POST", "PUT", "PATCH", "DELETE"].includes(method)) {
6292
+ const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
6293
+ if (!token) throw new Error('[Table] CSRF token not found. Add <meta name="csrf-token" content="..."> to your HTML <head>.');
6294
+ config.headers.set("X-CSRF-Token", token);
6295
+ }
6296
+ return config;
6297
+ });
6288
6298
  function useServerTable({ url, params, encrypt, key, decryptPayloadLog, columnOverrides, debounce = 300, transform, manual = false, refresh: refreshEnabled = false, refreshInterval = 0, hardReload, onSuccess, onError }) {
6289
6299
  const [data, setData] = React28.useState([]);
6290
6300
  const [columns, setColumns] = React28.useState([]);
@@ -6623,10 +6633,7 @@ function EditModal({
6623
6633
  setLoading(true);
6624
6634
  setError(null);
6625
6635
  try {
6626
- const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
6627
- await axios3.put(`${baseUrl}/${itemId}/update`, form, {
6628
- headers: csrfToken ? { "X-CSRF-Token": csrfToken } : {}
6629
- });
6636
+ await csrfAxios.put(`${baseUrl}/${itemId}/update`, form);
6630
6637
  const updated = { ...item, ...form };
6631
6638
  if (notif && (notif.type ?? "toast") === "notification") {
6632
6639
  setBanner(true);
@@ -6717,10 +6724,7 @@ function DeleteModal({
6717
6724
  setLoading(true);
6718
6725
  setError(null);
6719
6726
  try {
6720
- const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute("content");
6721
- await axios3.delete(`${baseUrl}/${itemId}/delete`, {
6722
- headers: csrfToken ? { "X-CSRF-Token": csrfToken } : {}
6723
- });
6727
+ await csrfAxios.delete(`${baseUrl}/${itemId}/delete`);
6724
6728
  onSuccess?.(item);
6725
6729
  onClose();
6726
6730
  } catch (err) {
@@ -6823,6 +6827,7 @@ function Table({
6823
6827
  setTableData(data ?? []);
6824
6828
  }, [data]);
6825
6829
  const actionIdKey = defaultActions?.idKey ?? idKey;
6830
+ const safeBaseUrl = defaultActions?.baseUrl.replace(/\/+$/, "") ?? "";
6826
6831
  const autoFields = React28.useMemo(() => {
6827
6832
  if (!tableData.length) return [];
6828
6833
  return Object.keys(tableData[0]).map((k) => ({
@@ -7224,7 +7229,7 @@ function Table({
7224
7229
  {
7225
7230
  item: editItem,
7226
7231
  fields: editFields,
7227
- baseUrl: defaultActions.baseUrl,
7232
+ baseUrl: safeBaseUrl,
7228
7233
  itemId: String(editItem[actionIdKey] ?? ""),
7229
7234
  notif: defaultActions.onSuccessNotif,
7230
7235
  grid: defaultActions.editFormGrid,
@@ -7252,7 +7257,7 @@ function Table({
7252
7257
  DeleteModal,
7253
7258
  {
7254
7259
  item: deleteItem,
7255
- baseUrl: defaultActions.baseUrl,
7260
+ baseUrl: safeBaseUrl,
7256
7261
  itemId: String(deleteItem[actionIdKey] ?? ""),
7257
7262
  notif: defaultActions.onSuccessNotif,
7258
7263
  onClose: () => setDeleteItem(null),
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "registry": "https://registry.npmjs.org/",
5
5
  "access": "public"
6
6
  },
7
- "version": "3.3.8",
7
+ "version": "3.4.0",
8
8
  "description": "Reusable React UI components",
9
9
  "license": "MIT",
10
10
  "main": "dist/index.js",