@acoustte-digital-services/digitalstore-controls-dev 0.8.1-dev.20260616111809 → 0.8.1-dev.20260620051742

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.js CHANGED
@@ -5566,6 +5566,76 @@ var ImageGalleryNode_default = ImageGalleryNode;
5566
5566
 
5567
5567
  // src/components/pageRenderingEngine/nodes/DivContainer.tsx
5568
5568
  var import_link2 = __toESM(require("next/link"));
5569
+
5570
+ // src/utilities/RoleUtility.tsx
5571
+ var decodeJWT = (token) => {
5572
+ if (!token) return null;
5573
+ try {
5574
+ const cleanToken = token.replace(/^Bearer\s+/i, "");
5575
+ const parts = cleanToken.split(".");
5576
+ if (parts.length !== 3) {
5577
+ console.warn("Invalid JWT token format");
5578
+ return null;
5579
+ }
5580
+ const payload = parts[1];
5581
+ const decoded = JSON.parse(atob(payload));
5582
+ return decoded;
5583
+ } catch (error) {
5584
+ console.warn("Failed to decode JWT token:", error);
5585
+ return null;
5586
+ }
5587
+ };
5588
+ var extractRolesFromToken = (decodedPayload) => {
5589
+ if (!decodedPayload) return [];
5590
+ const roles = [];
5591
+ if (decodedPayload.role && typeof decodedPayload.role === "string") {
5592
+ roles.push(decodedPayload.role);
5593
+ }
5594
+ if (decodedPayload.rolecode && typeof decodedPayload.rolecode === "string") {
5595
+ roles.push(decodedPayload.rolecode);
5596
+ }
5597
+ if (decodedPayload.roles && Array.isArray(decodedPayload.roles)) {
5598
+ roles.push(...decodedPayload.roles);
5599
+ }
5600
+ if (decodedPayload.realm_access?.roles && Array.isArray(decodedPayload.realm_access.roles)) {
5601
+ roles.push(...decodedPayload.realm_access.roles);
5602
+ }
5603
+ if (decodedPayload.resource_access && typeof decodedPayload.resource_access === "object") {
5604
+ Object.values(decodedPayload.resource_access).forEach((resource) => {
5605
+ if (resource?.roles && Array.isArray(resource.roles)) {
5606
+ roles.push(...resource.roles);
5607
+ }
5608
+ });
5609
+ }
5610
+ return [...new Set(roles)];
5611
+ };
5612
+ var getUserRoles = (oAuthToken) => {
5613
+ const decodedPayload = decodeJWT(oAuthToken);
5614
+ return extractRolesFromToken(decodedPayload);
5615
+ };
5616
+ var hasRole = (userRoles, requiredRole) => {
5617
+ if (!requiredRole || !userRoles) return false;
5618
+ return userRoles.some(
5619
+ (role) => role.toLowerCase() === requiredRole.toLowerCase()
5620
+ );
5621
+ };
5622
+ var shouldRenderByRole = (roleCode, userRoles) => {
5623
+ if (!roleCode || roleCode.trim() === "") {
5624
+ return true;
5625
+ }
5626
+ const trimmedRoleCode = roleCode.trim();
5627
+ if (trimmedRoleCode.startsWith("!")) {
5628
+ const requiredRole = trimmedRoleCode.substring(1);
5629
+ return !hasRole(userRoles, requiredRole);
5630
+ }
5631
+ return hasRole(userRoles, trimmedRoleCode);
5632
+ };
5633
+ var validateRoleVisibility = (roleCode, oAuthToken) => {
5634
+ const userRoles = getUserRoles(oAuthToken);
5635
+ return shouldRenderByRole(roleCode, userRoles);
5636
+ };
5637
+
5638
+ // src/components/pageRenderingEngine/nodes/DivContainer.tsx
5569
5639
  var import_jsx_runtime70 = require("react/jsx-runtime");
5570
5640
  function toCamelCase(str) {
5571
5641
  return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
@@ -5792,7 +5862,16 @@ var DivContainer = async (props) => {
5792
5862
  }
5793
5863
  return isNegated ? fieldValue === true : fieldValue === false;
5794
5864
  };
5795
- const isHidden = shouldHideContainer();
5865
+ const shouldHideByRole = () => {
5866
+ if (!props.node.roleCode) return false;
5867
+ const roleCode = props.node.roleCode;
5868
+ const oAuthToken = props.session?.oAuthToken;
5869
+ if (!roleCode || roleCode.trim() === "") {
5870
+ return false;
5871
+ }
5872
+ return !validateRoleVisibility(roleCode, oAuthToken);
5873
+ };
5874
+ const isHidden = shouldHideContainer() || shouldHideByRole();
5796
5875
  let odataString = void 0;
5797
5876
  let endpoint = void 0;
5798
5877
  let result = null;
@@ -6002,10 +6081,21 @@ var PageBodyRenderer = (props) => {
6002
6081
  if (pageBodyTree && pageBodyTree.root) {
6003
6082
  rootNode = pageBodyTree.root;
6004
6083
  }
6084
+ const shouldRenderNode = (node) => {
6085
+ {
6086
+ }
6087
+ if (node.type === "div-container" && node.roleCode) {
6088
+ return validateRoleVisibility(node.roleCode, props.session?.oAuthToken);
6089
+ }
6090
+ return true;
6091
+ };
6005
6092
  return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react51.default.Fragment, { children: rootNode && rootNode?.children?.map((node, index) => {
6006
6093
  {
6007
6094
  }
6008
6095
  const SelectedNode = NodeTypes[node.type];
6096
+ if (!shouldRenderNode(node)) {
6097
+ return null;
6098
+ }
6009
6099
  return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react51.default.Fragment, { children: SelectedNode && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react51.default.Fragment, { children: node.type == "layout-container" ? /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(import_react51.default.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
6010
6100
  SelectedNode,
6011
6101
  {
package/dist/index.mjs CHANGED
@@ -3960,6 +3960,76 @@ var ImageGalleryNode_default = ImageGalleryNode;
3960
3960
 
3961
3961
  // src/components/pageRenderingEngine/nodes/DivContainer.tsx
3962
3962
  import Link2 from "next/link";
3963
+
3964
+ // src/utilities/RoleUtility.tsx
3965
+ var decodeJWT = (token) => {
3966
+ if (!token) return null;
3967
+ try {
3968
+ const cleanToken = token.replace(/^Bearer\s+/i, "");
3969
+ const parts = cleanToken.split(".");
3970
+ if (parts.length !== 3) {
3971
+ console.warn("Invalid JWT token format");
3972
+ return null;
3973
+ }
3974
+ const payload = parts[1];
3975
+ const decoded = JSON.parse(atob(payload));
3976
+ return decoded;
3977
+ } catch (error) {
3978
+ console.warn("Failed to decode JWT token:", error);
3979
+ return null;
3980
+ }
3981
+ };
3982
+ var extractRolesFromToken = (decodedPayload) => {
3983
+ if (!decodedPayload) return [];
3984
+ const roles = [];
3985
+ if (decodedPayload.role && typeof decodedPayload.role === "string") {
3986
+ roles.push(decodedPayload.role);
3987
+ }
3988
+ if (decodedPayload.rolecode && typeof decodedPayload.rolecode === "string") {
3989
+ roles.push(decodedPayload.rolecode);
3990
+ }
3991
+ if (decodedPayload.roles && Array.isArray(decodedPayload.roles)) {
3992
+ roles.push(...decodedPayload.roles);
3993
+ }
3994
+ if (decodedPayload.realm_access?.roles && Array.isArray(decodedPayload.realm_access.roles)) {
3995
+ roles.push(...decodedPayload.realm_access.roles);
3996
+ }
3997
+ if (decodedPayload.resource_access && typeof decodedPayload.resource_access === "object") {
3998
+ Object.values(decodedPayload.resource_access).forEach((resource) => {
3999
+ if (resource?.roles && Array.isArray(resource.roles)) {
4000
+ roles.push(...resource.roles);
4001
+ }
4002
+ });
4003
+ }
4004
+ return [...new Set(roles)];
4005
+ };
4006
+ var getUserRoles = (oAuthToken) => {
4007
+ const decodedPayload = decodeJWT(oAuthToken);
4008
+ return extractRolesFromToken(decodedPayload);
4009
+ };
4010
+ var hasRole = (userRoles, requiredRole) => {
4011
+ if (!requiredRole || !userRoles) return false;
4012
+ return userRoles.some(
4013
+ (role) => role.toLowerCase() === requiredRole.toLowerCase()
4014
+ );
4015
+ };
4016
+ var shouldRenderByRole = (roleCode, userRoles) => {
4017
+ if (!roleCode || roleCode.trim() === "") {
4018
+ return true;
4019
+ }
4020
+ const trimmedRoleCode = roleCode.trim();
4021
+ if (trimmedRoleCode.startsWith("!")) {
4022
+ const requiredRole = trimmedRoleCode.substring(1);
4023
+ return !hasRole(userRoles, requiredRole);
4024
+ }
4025
+ return hasRole(userRoles, trimmedRoleCode);
4026
+ };
4027
+ var validateRoleVisibility = (roleCode, oAuthToken) => {
4028
+ const userRoles = getUserRoles(oAuthToken);
4029
+ return shouldRenderByRole(roleCode, userRoles);
4030
+ };
4031
+
4032
+ // src/components/pageRenderingEngine/nodes/DivContainer.tsx
3963
4033
  import { jsx as jsx59, jsxs as jsxs32 } from "react/jsx-runtime";
3964
4034
  function toCamelCase(str) {
3965
4035
  return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
@@ -4186,7 +4256,16 @@ var DivContainer = async (props) => {
4186
4256
  }
4187
4257
  return isNegated ? fieldValue === true : fieldValue === false;
4188
4258
  };
4189
- const isHidden = shouldHideContainer();
4259
+ const shouldHideByRole = () => {
4260
+ if (!props.node.roleCode) return false;
4261
+ const roleCode = props.node.roleCode;
4262
+ const oAuthToken = props.session?.oAuthToken;
4263
+ if (!roleCode || roleCode.trim() === "") {
4264
+ return false;
4265
+ }
4266
+ return !validateRoleVisibility(roleCode, oAuthToken);
4267
+ };
4268
+ const isHidden = shouldHideContainer() || shouldHideByRole();
4190
4269
  let odataString = void 0;
4191
4270
  let endpoint = void 0;
4192
4271
  let result = null;
@@ -4396,10 +4475,21 @@ var PageBodyRenderer = (props) => {
4396
4475
  if (pageBodyTree && pageBodyTree.root) {
4397
4476
  rootNode = pageBodyTree.root;
4398
4477
  }
4478
+ const shouldRenderNode = (node) => {
4479
+ {
4480
+ }
4481
+ if (node.type === "div-container" && node.roleCode) {
4482
+ return validateRoleVisibility(node.roleCode, props.session?.oAuthToken);
4483
+ }
4484
+ return true;
4485
+ };
4399
4486
  return /* @__PURE__ */ jsx60(React42.Fragment, { children: rootNode && rootNode?.children?.map((node, index) => {
4400
4487
  {
4401
4488
  }
4402
4489
  const SelectedNode = NodeTypes[node.type];
4490
+ if (!shouldRenderNode(node)) {
4491
+ return null;
4492
+ }
4403
4493
  return /* @__PURE__ */ jsx60(React42.Fragment, { children: SelectedNode && /* @__PURE__ */ jsx60(React42.Fragment, { children: node.type == "layout-container" ? /* @__PURE__ */ jsx60(React42.Fragment, { children: /* @__PURE__ */ jsx60(
4404
4494
  SelectedNode,
4405
4495
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acoustte-digital-services/digitalstore-controls-dev",
3
- "version": "0.8.1-dev.20260616111809",
3
+ "version": "0.8.1-dev.20260620051742",
4
4
  "description": "Reusable React components",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -22,7 +22,7 @@
22
22
  }
23
23
  },
24
24
  "devDependencies": {
25
- "@types/node": "^25.9.3",
25
+ "@types/node": "^26.0.0",
26
26
  "@types/react": "^19",
27
27
  "@types/react-dom": "^19",
28
28
  "tsup": "^8.5.1",