analytica-frontend-lib 1.1.93 → 1.1.94

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.
Files changed (35) hide show
  1. package/dist/BreadcrumbMenu/breadcrumbStore/index.d.mts +77 -0
  2. package/dist/BreadcrumbMenu/breadcrumbStore/index.d.ts +77 -0
  3. package/dist/BreadcrumbMenu/breadcrumbStore/index.js +146 -0
  4. package/dist/BreadcrumbMenu/breadcrumbStore/index.js.map +1 -0
  5. package/dist/BreadcrumbMenu/breadcrumbStore/index.mjs +120 -0
  6. package/dist/BreadcrumbMenu/breadcrumbStore/index.mjs.map +1 -0
  7. package/dist/BreadcrumbMenu/index.d.mts +31 -0
  8. package/dist/BreadcrumbMenu/index.d.ts +31 -0
  9. package/dist/BreadcrumbMenu/index.js +308 -0
  10. package/dist/BreadcrumbMenu/index.js.map +1 -0
  11. package/dist/BreadcrumbMenu/index.mjs +289 -0
  12. package/dist/BreadcrumbMenu/index.mjs.map +1 -0
  13. package/dist/BreadcrumbMenu/useBreadcrumbBuilder/index.d.mts +48 -0
  14. package/dist/BreadcrumbMenu/useBreadcrumbBuilder/index.d.ts +48 -0
  15. package/dist/BreadcrumbMenu/useBreadcrumbBuilder/index.js +189 -0
  16. package/dist/BreadcrumbMenu/useBreadcrumbBuilder/index.js.map +1 -0
  17. package/dist/BreadcrumbMenu/useBreadcrumbBuilder/index.mjs +164 -0
  18. package/dist/BreadcrumbMenu/useBreadcrumbBuilder/index.mjs.map +1 -0
  19. package/dist/BreadcrumbMenu/useUrlParams/index.d.mts +28 -0
  20. package/dist/BreadcrumbMenu/useUrlParams/index.d.ts +28 -0
  21. package/dist/BreadcrumbMenu/useUrlParams/index.js +43 -0
  22. package/dist/BreadcrumbMenu/useUrlParams/index.js.map +1 -0
  23. package/dist/BreadcrumbMenu/useUrlParams/index.mjs +18 -0
  24. package/dist/BreadcrumbMenu/useUrlParams/index.mjs.map +1 -0
  25. package/dist/index.css +3 -0
  26. package/dist/index.css.map +1 -1
  27. package/dist/index.d.mts +4 -0
  28. package/dist/index.d.ts +4 -0
  29. package/dist/index.js +244 -18
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +236 -14
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/styles.css +3 -0
  34. package/dist/styles.css.map +1 -1
  35. package/package.json +2 -1
package/dist/index.d.mts CHANGED
@@ -56,6 +56,10 @@ export { MultipleChoiceList } from './MultipleChoice/index.mjs';
56
56
  export { default as IconRender } from './IconRender/index.mjs';
57
57
  export { DeviceType, getDeviceType, useMobile } from './hooks/useMobile/index.mjs';
58
58
  export { useTheme } from './hooks/useTheme/index.mjs';
59
+ export { BreadcrumbMenu, BreadcrumbMenuProps } from './BreadcrumbMenu/index.mjs';
60
+ export { BreadcrumbBuilderConfig, BreadcrumbLevel, BreadcrumbLevelStatic, BreadcrumbLevelWithData, useBreadcrumbBuilder } from './BreadcrumbMenu/useBreadcrumbBuilder/index.mjs';
61
+ export { UrlParamsConfig, useUrlParams } from './BreadcrumbMenu/useUrlParams/index.mjs';
62
+ export { BreadcrumbItem, useBreadcrumb } from './BreadcrumbMenu/breadcrumbStore/index.mjs';
59
63
  import * as zustand_middleware from 'zustand/middleware';
60
64
  export { cn, getSubjectColorWithOpacity, syncDropdownState } from './utils/index.mjs';
61
65
  import 'clsx';
package/dist/index.d.ts CHANGED
@@ -56,6 +56,10 @@ export { MultipleChoiceList } from './MultipleChoice/index.js';
56
56
  export { default as IconRender } from './IconRender/index.js';
57
57
  export { DeviceType, getDeviceType, useMobile } from './hooks/useMobile/index.js';
58
58
  export { useTheme } from './hooks/useTheme/index.js';
59
+ export { BreadcrumbMenu, BreadcrumbMenuProps } from './BreadcrumbMenu/index.js';
60
+ export { BreadcrumbBuilderConfig, BreadcrumbLevel, BreadcrumbLevelStatic, BreadcrumbLevelWithData, useBreadcrumbBuilder } from './BreadcrumbMenu/useBreadcrumbBuilder/index.js';
61
+ export { UrlParamsConfig, useUrlParams } from './BreadcrumbMenu/useUrlParams/index.js';
62
+ export { BreadcrumbItem, useBreadcrumb } from './BreadcrumbMenu/breadcrumbStore/index.js';
59
63
  import * as zustand_middleware from 'zustand/middleware';
60
64
  export { cn, getSubjectColorWithOpacity, syncDropdownState } from './utils/index.js';
61
65
  import 'clsx';
package/dist/index.js CHANGED
@@ -36,6 +36,7 @@ __export(src_exports, {
36
36
  AlternativesList: () => AlternativesList,
37
37
  AuthProvider: () => AuthProvider,
38
38
  Badge: () => Badge_default,
39
+ BreadcrumbMenu: () => BreadcrumbMenu,
39
40
  Button: () => Button_default,
40
41
  Calendar: () => Calendar_default,
41
42
  CardAccordation: () => CardAccordation,
@@ -161,6 +162,8 @@ __export(src_exports, {
161
162
  useAuth: () => useAuth,
162
163
  useAuthGuard: () => useAuthGuard,
163
164
  useAuthStore: () => useAuthStore,
165
+ useBreadcrumb: () => useBreadcrumb,
166
+ useBreadcrumbBuilder: () => useBreadcrumbBuilder,
164
167
  useInstitutionId: () => useInstitutionId,
165
168
  useMobile: () => useMobile,
166
169
  useQuizStore: () => useQuizStore,
@@ -169,6 +172,7 @@ __export(src_exports, {
169
172
  useThemeStore: () => useThemeStore,
170
173
  useToastStore: () => ToastStore_default,
171
174
  useUrlAuthentication: () => useUrlAuthentication,
175
+ useUrlParams: () => useUrlParams,
172
176
  withAuth: () => withAuth
173
177
  });
174
178
  module.exports = __toCommonJS(src_exports);
@@ -12520,16 +12524,234 @@ var QuizListResultByMateria = ({
12520
12524
  ] });
12521
12525
  };
12522
12526
 
12523
- // src/hooks/useAppInitialization.ts
12527
+ // src/components/BreadcrumbMenu/BreadcrumbMenu.tsx
12528
+ var import_react_router_dom3 = require("react-router-dom");
12529
+ var import_jsx_runtime53 = require("react/jsx-runtime");
12530
+ var BreadcrumbMenu = ({
12531
+ breadcrumbs,
12532
+ onBreadcrumbClick,
12533
+ className = "!px-0 py-4 flex-wrap w-full"
12534
+ }) => {
12535
+ const navigate = (0, import_react_router_dom3.useNavigate)();
12536
+ const handleClick = (breadcrumb, index) => {
12537
+ if (onBreadcrumbClick) {
12538
+ onBreadcrumbClick(breadcrumb, index);
12539
+ }
12540
+ navigate(breadcrumb.url);
12541
+ };
12542
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
12543
+ Menu,
12544
+ {
12545
+ value: `breadcrumb-${breadcrumbs.length - 1}`,
12546
+ defaultValue: "breadcrumb-0",
12547
+ variant: "breadcrumb",
12548
+ className,
12549
+ children: /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(MenuContent, { className: "w-full flex flex-row flex-wrap gap-2 !px-0", children: breadcrumbs.map((breadcrumb, index) => {
12550
+ const isLast = index === breadcrumbs.length - 1;
12551
+ const hasSeparator = !isLast;
12552
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
12553
+ MenuItem,
12554
+ {
12555
+ variant: "breadcrumb",
12556
+ value: `breadcrumb-${index}`,
12557
+ className: "!p-0 whitespace-nowrap",
12558
+ onClick: () => handleClick(breadcrumb, index),
12559
+ separator: hasSeparator,
12560
+ children: breadcrumb.name
12561
+ },
12562
+ breadcrumb.id
12563
+ );
12564
+ }) })
12565
+ }
12566
+ );
12567
+ };
12568
+
12569
+ // src/components/BreadcrumbMenu/useBreadcrumbBuilder.ts
12570
+ var import_react38 = require("react");
12571
+
12572
+ // src/components/BreadcrumbMenu/breadcrumbStore.ts
12573
+ var import_zustand10 = require("zustand");
12574
+ var useBreadcrumbStore = (0, import_zustand10.create)((set, get) => ({
12575
+ breadcrumbs: {},
12576
+ setBreadcrumbs: (namespace, items) => {
12577
+ set((state) => ({
12578
+ breadcrumbs: {
12579
+ ...state.breadcrumbs,
12580
+ [namespace]: items
12581
+ }
12582
+ }));
12583
+ },
12584
+ addBreadcrumb: (namespace, item) => {
12585
+ set((state) => {
12586
+ const current = state.breadcrumbs[namespace] || [];
12587
+ return {
12588
+ breadcrumbs: {
12589
+ ...state.breadcrumbs,
12590
+ [namespace]: [...current, item]
12591
+ }
12592
+ };
12593
+ });
12594
+ },
12595
+ updateBreadcrumb: (namespace, itemId, updates) => {
12596
+ set((state) => {
12597
+ const current = state.breadcrumbs[namespace] || [];
12598
+ return {
12599
+ breadcrumbs: {
12600
+ ...state.breadcrumbs,
12601
+ [namespace]: current.map(
12602
+ (item) => item.id === itemId ? { ...item, ...updates } : item
12603
+ )
12604
+ }
12605
+ };
12606
+ });
12607
+ },
12608
+ removeBreadcrumbFrom: (namespace, itemId) => {
12609
+ set((state) => {
12610
+ const current = state.breadcrumbs[namespace] || [];
12611
+ const index = current.findIndex((item) => item.id === itemId);
12612
+ if (index === -1) return state;
12613
+ return {
12614
+ breadcrumbs: {
12615
+ ...state.breadcrumbs,
12616
+ [namespace]: current.slice(0, index)
12617
+ }
12618
+ };
12619
+ });
12620
+ },
12621
+ sliceBreadcrumbs: (namespace, index) => {
12622
+ set((state) => {
12623
+ const current = state.breadcrumbs[namespace] || [];
12624
+ return {
12625
+ breadcrumbs: {
12626
+ ...state.breadcrumbs,
12627
+ [namespace]: current.slice(0, index + 1)
12628
+ }
12629
+ };
12630
+ });
12631
+ },
12632
+ clearBreadcrumbs: (namespace) => {
12633
+ set((state) => {
12634
+ const { [namespace]: _, ...rest } = state.breadcrumbs;
12635
+ return {
12636
+ breadcrumbs: rest
12637
+ };
12638
+ });
12639
+ },
12640
+ getBreadcrumbs: (namespace) => {
12641
+ return get().breadcrumbs[namespace] || [];
12642
+ }
12643
+ }));
12644
+ var useBreadcrumb = (namespace) => {
12645
+ const store = useBreadcrumbStore();
12646
+ const breadcrumbs = store.breadcrumbs[namespace] || [];
12647
+ return {
12648
+ breadcrumbs,
12649
+ /**
12650
+ * Define todos os breadcrumbs de uma vez
12651
+ */
12652
+ setBreadcrumbs: (items) => {
12653
+ store.setBreadcrumbs(namespace, items);
12654
+ },
12655
+ /**
12656
+ * Adiciona um novo breadcrumb ao final
12657
+ */
12658
+ addBreadcrumb: (item) => {
12659
+ store.addBreadcrumb(namespace, item);
12660
+ },
12661
+ /**
12662
+ * Atualiza um breadcrumb existente
12663
+ */
12664
+ updateBreadcrumb: (itemId, updates) => {
12665
+ store.updateBreadcrumb(namespace, itemId, updates);
12666
+ },
12667
+ /**
12668
+ * Remove um breadcrumb e todos os seguintes
12669
+ */
12670
+ removeBreadcrumbFrom: (itemId) => {
12671
+ store.removeBreadcrumbFrom(namespace, itemId);
12672
+ },
12673
+ /**
12674
+ * Mantém apenas os breadcrumbs até o índice especificado (inclusivo)
12675
+ */
12676
+ sliceBreadcrumbs: (index) => {
12677
+ store.sliceBreadcrumbs(namespace, index);
12678
+ },
12679
+ /**
12680
+ * Limpa todos os breadcrumbs
12681
+ */
12682
+ clearBreadcrumbs: () => {
12683
+ store.clearBreadcrumbs(namespace);
12684
+ }
12685
+ };
12686
+ };
12687
+
12688
+ // src/components/BreadcrumbMenu/useBreadcrumbBuilder.ts
12689
+ var isBreadcrumbWithData = (level) => {
12690
+ return "data" in level;
12691
+ };
12692
+ var useBreadcrumbBuilder = (config) => {
12693
+ const { namespace, root, levels } = config;
12694
+ const { breadcrumbs, setBreadcrumbs, sliceBreadcrumbs } = useBreadcrumb(namespace);
12695
+ const levelDependencies = levels.map(
12696
+ (level) => isBreadcrumbWithData(level) ? level.data : null
12697
+ );
12698
+ const levelUrlIds = levels.map((level) => level.urlId);
12699
+ (0, import_react38.useEffect)(() => {
12700
+ const newBreadcrumbs = [root];
12701
+ const previousIds = [];
12702
+ for (const level of levels) {
12703
+ const { urlId } = level;
12704
+ if (isBreadcrumbWithData(level)) {
12705
+ const { data, getId, getName, getUrl } = level;
12706
+ if (!data) break;
12707
+ const dataId = getId(data);
12708
+ if (urlId === void 0 || dataId !== urlId) break;
12709
+ newBreadcrumbs.push({
12710
+ id: dataId,
12711
+ name: getName(data),
12712
+ url: getUrl(data, previousIds)
12713
+ });
12714
+ previousIds.push(dataId);
12715
+ } else {
12716
+ const { breadcrumb } = level;
12717
+ if (urlId === void 0) break;
12718
+ newBreadcrumbs.push(breadcrumb);
12719
+ previousIds.push(breadcrumb.id);
12720
+ }
12721
+ }
12722
+ setBreadcrumbs(newBreadcrumbs);
12723
+ }, [namespace, ...levelDependencies, ...levelUrlIds, root.id]);
12724
+ return {
12725
+ breadcrumbs,
12726
+ sliceBreadcrumbs
12727
+ };
12728
+ };
12729
+
12730
+ // src/components/BreadcrumbMenu/useUrlParams.ts
12524
12731
  var import_react39 = require("react");
12732
+ var import_react_router_dom4 = require("react-router-dom");
12733
+ var useUrlParams = (config) => {
12734
+ const location = (0, import_react_router_dom4.useLocation)();
12735
+ return (0, import_react39.useMemo)(() => {
12736
+ const segments = location.pathname.split("/").filter(Boolean);
12737
+ const params = {};
12738
+ for (const [key, index] of Object.entries(config)) {
12739
+ params[key] = segments[index];
12740
+ }
12741
+ return params;
12742
+ }, [location.pathname, config]);
12743
+ };
12744
+
12745
+ // src/hooks/useAppInitialization.ts
12746
+ var import_react41 = require("react");
12525
12747
 
12526
12748
  // src/hooks/useInstitution.ts
12527
- var import_react38 = require("react");
12749
+ var import_react40 = require("react");
12528
12750
  function useInstitutionId() {
12529
- const [institutionId, setInstitutionId] = (0, import_react38.useState)(() => {
12751
+ const [institutionId, setInstitutionId] = (0, import_react40.useState)(() => {
12530
12752
  return document.querySelector('meta[name="institution-id"]')?.getAttribute("content") ?? null;
12531
12753
  });
12532
- (0, import_react38.useEffect)(() => {
12754
+ (0, import_react40.useEffect)(() => {
12533
12755
  const metaTag = document.querySelector('meta[name="institution-id"]');
12534
12756
  if (!metaTag) return;
12535
12757
  const observer = new MutationObserver(() => {
@@ -12546,9 +12768,9 @@ function useInstitutionId() {
12546
12768
  }
12547
12769
 
12548
12770
  // src/store/appStore.ts
12549
- var import_zustand10 = require("zustand");
12771
+ var import_zustand11 = require("zustand");
12550
12772
  var import_middleware4 = require("zustand/middleware");
12551
- var useAppStore = (0, import_zustand10.create)()(
12773
+ var useAppStore = (0, import_zustand11.create)()(
12552
12774
  (0, import_middleware4.persist)(
12553
12775
  (set, get) => ({
12554
12776
  institutionId: null,
@@ -12592,9 +12814,9 @@ var useAppStore = (0, import_zustand10.create)()(
12592
12814
  );
12593
12815
 
12594
12816
  // src/store/authStore.ts
12595
- var import_zustand11 = require("zustand");
12817
+ var import_zustand12 = require("zustand");
12596
12818
  var import_middleware5 = require("zustand/middleware");
12597
- var useAuthStore = (0, import_zustand11.create)()(
12819
+ var useAuthStore = (0, import_zustand12.create)()(
12598
12820
  (0, import_middleware5.persist)(
12599
12821
  (set, get) => ({
12600
12822
  user: null,
@@ -12696,7 +12918,7 @@ var useAuthStore = (0, import_zustand11.create)()(
12696
12918
  function useAppInitialization() {
12697
12919
  const getInstitutionId = useInstitutionId();
12698
12920
  const { initialize, initialized, institutionId } = useAppStore();
12699
- const authFunctions = (0, import_react39.useMemo)(
12921
+ const authFunctions = (0, import_react41.useMemo)(
12700
12922
  () => ({
12701
12923
  checkAuth: async () => {
12702
12924
  const { sessionInfo, tokens } = useAuthStore.getState();
@@ -12733,10 +12955,10 @@ function useAppInitialization() {
12733
12955
  }
12734
12956
 
12735
12957
  // src/hooks/useAppContent.ts
12736
- var import_react40 = require("react");
12737
- var import_react_router_dom3 = require("react-router-dom");
12958
+ var import_react42 = require("react");
12959
+ var import_react_router_dom5 = require("react-router-dom");
12738
12960
  function useAppContent(config) {
12739
- const navigate = (0, import_react_router_dom3.useNavigate)();
12961
+ const navigate = (0, import_react_router_dom5.useNavigate)();
12740
12962
  const { setTokens, setSessionInfo, setSelectedProfile } = useAuthStore();
12741
12963
  const {
12742
12964
  api,
@@ -12759,20 +12981,20 @@ function useAppContent(config) {
12759
12981
  navigate("/painel");
12760
12982
  }
12761
12983
  };
12762
- const handleSetSelectedProfile = (0, import_react40.useCallback)(
12984
+ const handleSetSelectedProfile = (0, import_react42.useCallback)(
12763
12985
  (profile) => {
12764
12986
  setSelectedProfile(profile);
12765
12987
  },
12766
12988
  [setSelectedProfile]
12767
12989
  );
12768
- const handleClearParamsFromURL = (0, import_react40.useCallback)(() => {
12990
+ const handleClearParamsFromURL = (0, import_react42.useCallback)(() => {
12769
12991
  if (onClearParamsFromURL) {
12770
12992
  onClearParamsFromURL();
12771
12993
  } else {
12772
12994
  globalThis.location.replace("/painel");
12773
12995
  }
12774
12996
  }, [onClearParamsFromURL]);
12775
- const handleError = (0, import_react40.useCallback)(
12997
+ const handleError = (0, import_react42.useCallback)(
12776
12998
  (error) => {
12777
12999
  if (onError) {
12778
13000
  onError(error);
@@ -12783,7 +13005,7 @@ function useAppContent(config) {
12783
13005
  },
12784
13006
  [navigate, onError]
12785
13007
  );
12786
- const urlAuthConfig = (0, import_react40.useMemo)(
13008
+ const urlAuthConfig = (0, import_react42.useMemo)(
12787
13009
  () => ({
12788
13010
  setTokens,
12789
13011
  setSessionInfo,
@@ -12809,10 +13031,10 @@ function useAppContent(config) {
12809
13031
  );
12810
13032
  useUrlAuthentication(urlAuthConfig);
12811
13033
  const { sessionInfo } = useAuth();
12812
- const institutionIdToUse = (0, import_react40.useMemo)(() => {
13034
+ const institutionIdToUse = (0, import_react42.useMemo)(() => {
12813
13035
  return sessionInfo?.institutionId || getInstitutionId;
12814
13036
  }, [sessionInfo?.institutionId, getInstitutionId]);
12815
- (0, import_react40.useEffect)(() => {
13037
+ (0, import_react42.useEffect)(() => {
12816
13038
  if (institutionIdToUse && !initialized) {
12817
13039
  initialize(institutionIdToUse);
12818
13040
  }
@@ -12831,6 +13053,7 @@ function useAppContent(config) {
12831
13053
  AlternativesList,
12832
13054
  AuthProvider,
12833
13055
  Badge,
13056
+ BreadcrumbMenu,
12834
13057
  Button,
12835
13058
  Calendar,
12836
13059
  CardAccordation,
@@ -12956,6 +13179,8 @@ function useAppContent(config) {
12956
13179
  useAuth,
12957
13180
  useAuthGuard,
12958
13181
  useAuthStore,
13182
+ useBreadcrumb,
13183
+ useBreadcrumbBuilder,
12959
13184
  useInstitutionId,
12960
13185
  useMobile,
12961
13186
  useQuizStore,
@@ -12964,6 +13189,7 @@ function useAppContent(config) {
12964
13189
  useThemeStore,
12965
13190
  useToastStore,
12966
13191
  useUrlAuthentication,
13192
+ useUrlParams,
12967
13193
  withAuth
12968
13194
  });
12969
13195
  //# sourceMappingURL=index.js.map