@juv/codego-react-ui 3.5.0 → 3.5.2

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
@@ -1599,7 +1599,7 @@ function decryptLaravelPayload(payload, secretKey) {
1599
1599
  throw new Error("Unsupported Laravel cipher (AEAD tag present). Expected AES-*-CBC payload.");
1600
1600
  }
1601
1601
  const key = parseLaravelKey(resolvedKey);
1602
- const expectedMac = import_crypto_js.default.HmacSHA256(parsed.iv + parsed.value, key).toString();
1602
+ const expectedMac = import_crypto_js.default.HmacSHA256(parsed.iv + parsed.value, key).toString(import_crypto_js.default.enc.Hex);
1603
1603
  if (expectedMac !== parsed.mac) {
1604
1604
  throw new Error("Invalid payload MAC (wrong key or tampered payload).");
1605
1605
  }
@@ -1670,23 +1670,25 @@ function useServerBulletin({
1670
1670
  if (cancelled) return;
1671
1671
  const payload = encrypt ? decryptLaravelPayload(res, key) : res;
1672
1672
  if (encrypt && decryptPayloadLog) console.log("[useServerBulletin] decrypted:", payload);
1673
- const rows = payload.data;
1673
+ const rows = Array.isArray(payload) ? payload : payload.data ?? [];
1674
1674
  setItems(transform ? rows.map(transform) : rows);
1675
- const rawTotal = payload.total;
1676
- const rawPerPage = payload.per_page;
1677
- const rawLastPage = payload.last_page;
1678
- const lastPage = rawLastPage ?? Math.ceil(rawTotal / rawPerPage);
1679
- const pg = payload.pagination ?? {
1680
- first_page_url: payload.first_page_url ?? `${url}?page=1`,
1681
- last_page_url: payload.last_page_url ?? `${url}?page=${lastPage}`,
1682
- last_page: lastPage,
1683
- next_page_url: payload.next_page_url !== void 0 ? payload.next_page_url : currentPage < lastPage ? `${url}?page=${currentPage + 1}` : null,
1684
- prev_page_url: payload.prev_page_url !== void 0 ? payload.prev_page_url : currentPage > 1 ? `${url}?page=${currentPage - 1}` : null,
1685
- per_page: rawPerPage,
1686
- total: rawTotal,
1687
- links: payload.links ?? []
1688
- };
1689
- setPagination(pg);
1675
+ if (!Array.isArray(payload)) {
1676
+ const rawTotal = payload.total;
1677
+ const rawPerPage = payload.per_page;
1678
+ const rawLastPage = payload.last_page;
1679
+ const lastPage = rawLastPage ?? Math.ceil(rawTotal / rawPerPage);
1680
+ const pg = payload.pagination ?? {
1681
+ first_page_url: payload.first_page_url ?? `${url}?page=1`,
1682
+ last_page_url: payload.last_page_url ?? `${url}?page=${lastPage}`,
1683
+ last_page: lastPage,
1684
+ next_page_url: payload.next_page_url !== void 0 ? payload.next_page_url : currentPage < lastPage ? `${url}?page=${currentPage + 1}` : null,
1685
+ prev_page_url: payload.prev_page_url !== void 0 ? payload.prev_page_url : currentPage > 1 ? `${url}?page=${currentPage - 1}` : null,
1686
+ per_page: rawPerPage,
1687
+ total: rawTotal,
1688
+ links: payload.links ?? []
1689
+ };
1690
+ setPagination(pg);
1691
+ }
1690
1692
  }).catch((err) => {
1691
1693
  if (cancelled) return;
1692
1694
  setError(err?.response?.data?.message ?? err.message ?? "Request failed");
@@ -2237,13 +2239,13 @@ function BulletinBoard({
2237
2239
  const categories = React8.useMemo(() => {
2238
2240
  if (categoriesProp) return categoriesProp;
2239
2241
  const set = /* @__PURE__ */ new Set();
2240
- items.forEach((i) => {
2242
+ (items ?? []).forEach((i) => {
2241
2243
  if (i.category) set.add(i.category);
2242
2244
  });
2243
2245
  return Array.from(set);
2244
2246
  }, [items, categoriesProp]);
2245
2247
  const filtered = React8.useMemo(() => {
2246
- let list = items;
2248
+ let list = items ?? [];
2247
2249
  if (search.trim()) {
2248
2250
  const q = search.toLowerCase();
2249
2251
  list = list.filter(
@@ -2252,7 +2254,7 @@ function BulletinBoard({
2252
2254
  }
2253
2255
  if (category) list = list.filter((i) => i.category === category);
2254
2256
  return [...list].sort((a, b) => (b.pinned ? 1 : 0) - (a.pinned ? 1 : 0));
2255
- }, [items, search, category]);
2257
+ }, [items ?? [], search, category]);
2256
2258
  const showToolbar = searchable || filterable && categories.length > 0;
2257
2259
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("flex flex-col gap-4", className), children: [
2258
2260
  showHeader && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
@@ -7651,8 +7653,10 @@ function Table({
7651
7653
  onBulkDelete?.(selectedIds);
7652
7654
  setSelectedIds([]);
7653
7655
  defaultActions?.onReload?.();
7656
+ toast({ variant: "success", title: "Deleted", description: `${selectedIds.length} record${selectedIds.length !== 1 ? "s" : ""} deleted successfully.` });
7654
7657
  } catch (err) {
7655
- console.error("[Table] Bulk delete selected failed:", err?.response?.data?.message ?? err.message);
7658
+ const msg = err?.response?.data?.message ?? err.message ?? "Bulk delete failed";
7659
+ toast({ variant: "error", title: "Delete failed", description: msg });
7656
7660
  } finally {
7657
7661
  setBulkLoading(false);
7658
7662
  }
@@ -7668,8 +7672,10 @@ function Table({
7668
7672
  setTableData([]);
7669
7673
  setSelectedIds([]);
7670
7674
  defaultActions?.onReload?.();
7675
+ toast({ variant: "success", title: "Deleted", description: "All records deleted successfully." });
7671
7676
  } catch (err) {
7672
- console.error("[Table] Delete all failed:", err?.response?.data?.message ?? err.message);
7677
+ const msg = err?.response?.data?.message ?? err.message ?? "Delete all failed";
7678
+ toast({ variant: "error", title: "Delete failed", description: msg });
7673
7679
  } finally {
7674
7680
  setBulkLoading(false);
7675
7681
  }
@@ -64773,7 +64773,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
64773
64773
  throw new Error("Unsupported Laravel cipher (AEAD tag present). Expected AES-*-CBC payload.");
64774
64774
  }
64775
64775
  const key = parseLaravelKey(resolvedKey);
64776
- const expectedMac = import_crypto_js.default.HmacSHA256(parsed.iv + parsed.value, key).toString();
64776
+ const expectedMac = import_crypto_js.default.HmacSHA256(parsed.iv + parsed.value, key).toString(import_crypto_js.default.enc.Hex);
64777
64777
  if (expectedMac !== parsed.mac) {
64778
64778
  throw new Error("Invalid payload MAC (wrong key or tampered payload).");
64779
64779
  }
@@ -64844,23 +64844,25 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
64844
64844
  if (cancelled) return;
64845
64845
  const payload = encrypt ? decryptLaravelPayload(res, key) : res;
64846
64846
  if (encrypt && decryptPayloadLog) console.log("[useServerBulletin] decrypted:", payload);
64847
- const rows = payload.data;
64847
+ const rows = Array.isArray(payload) ? payload : payload.data ?? [];
64848
64848
  setItems(transform ? rows.map(transform) : rows);
64849
- const rawTotal = payload.total;
64850
- const rawPerPage = payload.per_page;
64851
- const rawLastPage = payload.last_page;
64852
- const lastPage = rawLastPage ?? Math.ceil(rawTotal / rawPerPage);
64853
- const pg = payload.pagination ?? {
64854
- first_page_url: payload.first_page_url ?? `${url2}?page=1`,
64855
- last_page_url: payload.last_page_url ?? `${url2}?page=${lastPage}`,
64856
- last_page: lastPage,
64857
- next_page_url: payload.next_page_url !== void 0 ? payload.next_page_url : currentPage < lastPage ? `${url2}?page=${currentPage + 1}` : null,
64858
- prev_page_url: payload.prev_page_url !== void 0 ? payload.prev_page_url : currentPage > 1 ? `${url2}?page=${currentPage - 1}` : null,
64859
- per_page: rawPerPage,
64860
- total: rawTotal,
64861
- links: payload.links ?? []
64862
- };
64863
- setPagination(pg);
64849
+ if (!Array.isArray(payload)) {
64850
+ const rawTotal = payload.total;
64851
+ const rawPerPage = payload.per_page;
64852
+ const rawLastPage = payload.last_page;
64853
+ const lastPage = rawLastPage ?? Math.ceil(rawTotal / rawPerPage);
64854
+ const pg = payload.pagination ?? {
64855
+ first_page_url: payload.first_page_url ?? `${url2}?page=1`,
64856
+ last_page_url: payload.last_page_url ?? `${url2}?page=${lastPage}`,
64857
+ last_page: lastPage,
64858
+ next_page_url: payload.next_page_url !== void 0 ? payload.next_page_url : currentPage < lastPage ? `${url2}?page=${currentPage + 1}` : null,
64859
+ prev_page_url: payload.prev_page_url !== void 0 ? payload.prev_page_url : currentPage > 1 ? `${url2}?page=${currentPage - 1}` : null,
64860
+ per_page: rawPerPage,
64861
+ total: rawTotal,
64862
+ links: payload.links ?? []
64863
+ };
64864
+ setPagination(pg);
64865
+ }
64864
64866
  }).catch((err) => {
64865
64867
  if (cancelled) return;
64866
64868
  setError(err?.response?.data?.message ?? err.message ?? "Request failed");
@@ -65411,13 +65413,13 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
65411
65413
  const categories = React8.useMemo(() => {
65412
65414
  if (categoriesProp) return categoriesProp;
65413
65415
  const set = /* @__PURE__ */ new Set();
65414
- items.forEach((i) => {
65416
+ (items ?? []).forEach((i) => {
65415
65417
  if (i.category) set.add(i.category);
65416
65418
  });
65417
65419
  return Array.from(set);
65418
65420
  }, [items, categoriesProp]);
65419
65421
  const filtered = React8.useMemo(() => {
65420
- let list = items;
65422
+ let list = items ?? [];
65421
65423
  if (search.trim()) {
65422
65424
  const q = search.toLowerCase();
65423
65425
  list = list.filter(
@@ -65426,7 +65428,7 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
65426
65428
  }
65427
65429
  if (category) list = list.filter((i) => i.category === category);
65428
65430
  return [...list].sort((a, b) => (b.pinned ? 1 : 0) - (a.pinned ? 1 : 0));
65429
- }, [items, search, category]);
65431
+ }, [items ?? [], search, category]);
65430
65432
  const showToolbar = searchable || filterable && categories.length > 0;
65431
65433
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cn("flex flex-col gap-4", className), children: [
65432
65434
  showHeader && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center justify-between gap-2", children: [
@@ -70809,8 +70811,10 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
70809
70811
  onBulkDelete?.(selectedIds);
70810
70812
  setSelectedIds([]);
70811
70813
  defaultActions?.onReload?.();
70814
+ toast({ variant: "success", title: "Deleted", description: `${selectedIds.length} record${selectedIds.length !== 1 ? "s" : ""} deleted successfully.` });
70812
70815
  } catch (err) {
70813
- console.error("[Table] Bulk delete selected failed:", err?.response?.data?.message ?? err.message);
70816
+ const msg = err?.response?.data?.message ?? err.message ?? "Bulk delete failed";
70817
+ toast({ variant: "error", title: "Delete failed", description: msg });
70814
70818
  } finally {
70815
70819
  setBulkLoading(false);
70816
70820
  }
@@ -70826,8 +70830,10 @@ ${n2.shaderPreludeCode.vertexSource}`, define: n2.shaderDefine }, defaultProject
70826
70830
  setTableData([]);
70827
70831
  setSelectedIds([]);
70828
70832
  defaultActions?.onReload?.();
70833
+ toast({ variant: "success", title: "Deleted", description: "All records deleted successfully." });
70829
70834
  } catch (err) {
70830
- console.error("[Table] Delete all failed:", err?.response?.data?.message ?? err.message);
70835
+ const msg = err?.response?.data?.message ?? err.message ?? "Delete all failed";
70836
+ toast({ variant: "error", title: "Delete failed", description: msg });
70831
70837
  } finally {
70832
70838
  setBulkLoading(false);
70833
70839
  }
package/dist/index.js CHANGED
@@ -1478,7 +1478,7 @@ function decryptLaravelPayload(payload, secretKey) {
1478
1478
  throw new Error("Unsupported Laravel cipher (AEAD tag present). Expected AES-*-CBC payload.");
1479
1479
  }
1480
1480
  const key = parseLaravelKey(resolvedKey);
1481
- const expectedMac = CryptoJS.HmacSHA256(parsed.iv + parsed.value, key).toString();
1481
+ const expectedMac = CryptoJS.HmacSHA256(parsed.iv + parsed.value, key).toString(CryptoJS.enc.Hex);
1482
1482
  if (expectedMac !== parsed.mac) {
1483
1483
  throw new Error("Invalid payload MAC (wrong key or tampered payload).");
1484
1484
  }
@@ -1549,23 +1549,25 @@ function useServerBulletin({
1549
1549
  if (cancelled) return;
1550
1550
  const payload = encrypt ? decryptLaravelPayload(res, key) : res;
1551
1551
  if (encrypt && decryptPayloadLog) console.log("[useServerBulletin] decrypted:", payload);
1552
- const rows = payload.data;
1552
+ const rows = Array.isArray(payload) ? payload : payload.data ?? [];
1553
1553
  setItems(transform ? rows.map(transform) : rows);
1554
- const rawTotal = payload.total;
1555
- const rawPerPage = payload.per_page;
1556
- const rawLastPage = payload.last_page;
1557
- const lastPage = rawLastPage ?? Math.ceil(rawTotal / rawPerPage);
1558
- const pg = payload.pagination ?? {
1559
- first_page_url: payload.first_page_url ?? `${url}?page=1`,
1560
- last_page_url: payload.last_page_url ?? `${url}?page=${lastPage}`,
1561
- last_page: lastPage,
1562
- next_page_url: payload.next_page_url !== void 0 ? payload.next_page_url : currentPage < lastPage ? `${url}?page=${currentPage + 1}` : null,
1563
- prev_page_url: payload.prev_page_url !== void 0 ? payload.prev_page_url : currentPage > 1 ? `${url}?page=${currentPage - 1}` : null,
1564
- per_page: rawPerPage,
1565
- total: rawTotal,
1566
- links: payload.links ?? []
1567
- };
1568
- setPagination(pg);
1554
+ if (!Array.isArray(payload)) {
1555
+ const rawTotal = payload.total;
1556
+ const rawPerPage = payload.per_page;
1557
+ const rawLastPage = payload.last_page;
1558
+ const lastPage = rawLastPage ?? Math.ceil(rawTotal / rawPerPage);
1559
+ const pg = payload.pagination ?? {
1560
+ first_page_url: payload.first_page_url ?? `${url}?page=1`,
1561
+ last_page_url: payload.last_page_url ?? `${url}?page=${lastPage}`,
1562
+ last_page: lastPage,
1563
+ next_page_url: payload.next_page_url !== void 0 ? payload.next_page_url : currentPage < lastPage ? `${url}?page=${currentPage + 1}` : null,
1564
+ prev_page_url: payload.prev_page_url !== void 0 ? payload.prev_page_url : currentPage > 1 ? `${url}?page=${currentPage - 1}` : null,
1565
+ per_page: rawPerPage,
1566
+ total: rawTotal,
1567
+ links: payload.links ?? []
1568
+ };
1569
+ setPagination(pg);
1570
+ }
1569
1571
  }).catch((err) => {
1570
1572
  if (cancelled) return;
1571
1573
  setError(err?.response?.data?.message ?? err.message ?? "Request failed");
@@ -2116,13 +2118,13 @@ function BulletinBoard({
2116
2118
  const categories = React8.useMemo(() => {
2117
2119
  if (categoriesProp) return categoriesProp;
2118
2120
  const set = /* @__PURE__ */ new Set();
2119
- items.forEach((i) => {
2121
+ (items ?? []).forEach((i) => {
2120
2122
  if (i.category) set.add(i.category);
2121
2123
  });
2122
2124
  return Array.from(set);
2123
2125
  }, [items, categoriesProp]);
2124
2126
  const filtered = React8.useMemo(() => {
2125
- let list = items;
2127
+ let list = items ?? [];
2126
2128
  if (search.trim()) {
2127
2129
  const q = search.toLowerCase();
2128
2130
  list = list.filter(
@@ -2131,7 +2133,7 @@ function BulletinBoard({
2131
2133
  }
2132
2134
  if (category) list = list.filter((i) => i.category === category);
2133
2135
  return [...list].sort((a, b) => (b.pinned ? 1 : 0) - (a.pinned ? 1 : 0));
2134
- }, [items, search, category]);
2136
+ }, [items ?? [], search, category]);
2135
2137
  const showToolbar = searchable || filterable && categories.length > 0;
2136
2138
  return /* @__PURE__ */ jsxs9("div", { className: cn("flex flex-col gap-4", className), children: [
2137
2139
  showHeader && /* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-between gap-2", children: [
@@ -7530,8 +7532,10 @@ function Table({
7530
7532
  onBulkDelete?.(selectedIds);
7531
7533
  setSelectedIds([]);
7532
7534
  defaultActions?.onReload?.();
7535
+ toast({ variant: "success", title: "Deleted", description: `${selectedIds.length} record${selectedIds.length !== 1 ? "s" : ""} deleted successfully.` });
7533
7536
  } catch (err) {
7534
- console.error("[Table] Bulk delete selected failed:", err?.response?.data?.message ?? err.message);
7537
+ const msg = err?.response?.data?.message ?? err.message ?? "Bulk delete failed";
7538
+ toast({ variant: "error", title: "Delete failed", description: msg });
7535
7539
  } finally {
7536
7540
  setBulkLoading(false);
7537
7541
  }
@@ -7547,8 +7551,10 @@ function Table({
7547
7551
  setTableData([]);
7548
7552
  setSelectedIds([]);
7549
7553
  defaultActions?.onReload?.();
7554
+ toast({ variant: "success", title: "Deleted", description: "All records deleted successfully." });
7550
7555
  } catch (err) {
7551
- console.error("[Table] Delete all failed:", err?.response?.data?.message ?? err.message);
7556
+ const msg = err?.response?.data?.message ?? err.message ?? "Delete all failed";
7557
+ toast({ variant: "error", title: "Delete failed", description: msg });
7552
7558
  } finally {
7553
7559
  setBulkLoading(false);
7554
7560
  }
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "registry": "https://registry.npmjs.org/",
5
5
  "access": "public"
6
6
  },
7
- "version": "3.5.0",
7
+ "version": "3.5.2",
8
8
  "description": "Reusable React UI components",
9
9
  "license": "MIT",
10
10
  "main": "dist/index.js",