@serhii.olishevskyi/docs 1.2.24 → 1.2.26

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
@@ -2968,13 +2968,16 @@ __export(index_exports, {
2968
2968
  NumberInputComponent: () => NumberInputComponent,
2969
2969
  PageComponent: () => PageComponent,
2970
2970
  PageLinkComponent: () => PageLinkComponent,
2971
+ ProtectedLanguageSelector: () => LanguageSelector,
2971
2972
  Providers: () => Providers,
2973
+ PublicLanguageSelector: () => PublicLanguageSelector,
2972
2974
  RefreshButtonComponent: () => RefreshButtonComponent,
2973
2975
  SearchComponent: () => SearchComponent,
2974
2976
  SelectComponent: () => SelectComponent,
2975
2977
  Services: () => Services,
2976
2978
  SupabaseProvider: () => SupabaseProvider,
2977
2979
  SwitchComponent: () => SwitchComponent,
2980
+ TablePaginationComponent: () => TablePaginationComponent,
2978
2981
  TextFieldComponent: () => TextFieldComponent,
2979
2982
  ThemeProvider: () => ThemeProvider,
2980
2983
  ToastProvider: () => ToastProvider,
@@ -2982,6 +2985,7 @@ __export(index_exports, {
2982
2985
  TranslateProvider: () => TranslateProvider,
2983
2986
  TranslateText: () => TranslateText,
2984
2987
  TranslationEditProvider: () => TranslationEditProvider,
2988
+ TruncatedTypography: () => TruncatedTypography,
2985
2989
  UrlComponent: () => UrlComponent,
2986
2990
  UserAvatarComponent: () => UserAvatarComponent,
2987
2991
  UserPopoverComponent: () => UserPopoverComponent,
@@ -4681,15 +4685,79 @@ var ErrorAlertComponent = ({
4681
4685
  );
4682
4686
  };
4683
4687
 
4684
- // src/UI/components/layout/PageComponent.tsx
4685
- var import_react29 = __toESM(require("react"));
4688
+ // src/UI/components/data.display/TruncatedTypography.tsx
4689
+ var import_react29 = require("react");
4686
4690
  var import_material25 = require("@mui/material");
4691
+ init_TranslatableTooltipComponent();
4692
+ var import_jsx_runtime35 = require("react/jsx-runtime");
4693
+ var TruncatedTypography = ({
4694
+ children,
4695
+ lines = 1,
4696
+ tooltipProps,
4697
+ alwaysShowTooltip = false,
4698
+ sx,
4699
+ ...typographyProps
4700
+ }) => {
4701
+ const textRef = (0, import_react29.useRef)(null);
4702
+ const [isTruncated, setIsTruncated] = (0, import_react29.useState)(false);
4703
+ const checkOverflow = () => {
4704
+ const element = textRef.current;
4705
+ if (!element) return;
4706
+ if (lines === 1) {
4707
+ setIsTruncated(element.scrollWidth > element.clientWidth);
4708
+ } else {
4709
+ setIsTruncated(element.scrollHeight > element.clientHeight);
4710
+ }
4711
+ };
4712
+ (0, import_react29.useEffect)(() => {
4713
+ checkOverflow();
4714
+ window.addEventListener("resize", checkOverflow);
4715
+ return () => window.removeEventListener("resize", checkOverflow);
4716
+ }, [children, lines]);
4717
+ const truncationStyles = lines > 1 ? {
4718
+ display: "-webkit-box",
4719
+ WebkitLineClamp: lines,
4720
+ WebkitBoxOrient: "vertical",
4721
+ overflow: "hidden",
4722
+ textOverflow: "ellipsis",
4723
+ wordBreak: "break-word"
4724
+ } : {
4725
+ overflow: "hidden",
4726
+ textOverflow: "ellipsis",
4727
+ whiteSpace: "nowrap"
4728
+ };
4729
+ const textContent = typeof children === "string" ? children : void 0;
4730
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4731
+ TranslatableTooltipComponent,
4732
+ {
4733
+ title: alwaysShowTooltip || isTruncated ? textContent || children : "",
4734
+ disableHoverListener: !alwaysShowTooltip && !isTruncated,
4735
+ ...tooltipProps,
4736
+ children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4737
+ import_material25.Typography,
4738
+ {
4739
+ ref: textRef,
4740
+ sx: {
4741
+ ...truncationStyles,
4742
+ ...sx
4743
+ },
4744
+ ...typographyProps,
4745
+ children
4746
+ }
4747
+ )
4748
+ }
4749
+ );
4750
+ };
4751
+
4752
+ // src/UI/components/layout/PageComponent.tsx
4753
+ var import_react30 = __toESM(require("react"));
4754
+ var import_material26 = require("@mui/material");
4687
4755
  var import_MoreVert = __toESM(require("@mui/icons-material/MoreVert"));
4688
4756
  var import_KeyboardArrowDown = __toESM(require("@mui/icons-material/KeyboardArrowDown"));
4689
4757
  var import_icons_material3 = require("@mui/icons-material");
4690
4758
  init_context();
4691
4759
  init_TranslatableTooltipComponent();
4692
- var import_jsx_runtime35 = require("react/jsx-runtime");
4760
+ var import_jsx_runtime36 = require("react/jsx-runtime");
4693
4761
  var getTruncateStyles = (mode = "truncate") => {
4694
4762
  switch (mode) {
4695
4763
  case "truncate":
@@ -4717,10 +4785,10 @@ var PageHeader = ({
4717
4785
  forceMobileView,
4718
4786
  sx = []
4719
4787
  }) => {
4720
- const theme = (0, import_material25.useTheme)();
4721
- const mediaIsMobile = (0, import_material25.useMediaQuery)(theme.breakpoints.down(mobileBreakpoint));
4788
+ const theme = (0, import_material26.useTheme)();
4789
+ const mediaIsMobile = (0, import_material26.useMediaQuery)(theme.breakpoints.down(mobileBreakpoint));
4722
4790
  const isMobile = forceMobileView ?? mediaIsMobile;
4723
- const [anchorEl, setAnchorEl] = (0, import_react29.useState)(null);
4791
+ const [anchorEl, setAnchorEl] = (0, import_react30.useState)(null);
4724
4792
  const isMenuOpen = Boolean(anchorEl);
4725
4793
  const handleOpenMenu = (e) => setAnchorEl(e.currentTarget);
4726
4794
  const handleCloseMenu = () => setAnchorEl(null);
@@ -4730,8 +4798,8 @@ var PageHeader = ({
4730
4798
  };
4731
4799
  const hasSecondaryActions = secondaryActions.length > 0;
4732
4800
  const hasActions = Boolean(primaryAction || hasSecondaryActions || refreshAction);
4733
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4734
- import_material25.Box,
4801
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4802
+ import_material26.Box,
4735
4803
  {
4736
4804
  sx: [
4737
4805
  {
@@ -4749,9 +4817,9 @@ var PageHeader = ({
4749
4817
  ...Array.isArray(sx) ? sx : [sx]
4750
4818
  ],
4751
4819
  children: [
4752
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_material25.Box, { sx: { display: "flex", alignItems: "center", gap: { xs: 1.5, sm: 2 }, minWidth: 0, flex: 1 }, children: [
4753
- icon && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4754
- import_material25.Box,
4820
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_material26.Box, { sx: { display: "flex", alignItems: "center", gap: { xs: 1.5, sm: 2 }, minWidth: 0, flex: 1 }, children: [
4821
+ icon && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4822
+ import_material26.Box,
4755
4823
  {
4756
4824
  sx: {
4757
4825
  display: "flex",
@@ -4770,10 +4838,10 @@ var PageHeader = ({
4770
4838
  children: icon
4771
4839
  }
4772
4840
  ),
4773
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_material25.Box, { sx: { minWidth: 0, flex: 1 }, children: [
4774
- tag && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Box, { sx: { mb: 0.5, display: "flex", alignItems: "center" }, children: tag }),
4775
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Tooltip, { title: titleTruncateMode === "truncate" ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { children: title }) : void 0, arrow: true, placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4776
- import_material25.Typography,
4841
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_material26.Box, { sx: { minWidth: 0, flex: 1 }, children: [
4842
+ tag && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Box, { sx: { mb: 0.5, display: "flex", alignItems: "center" }, children: tag }),
4843
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Tooltip, { title: titleTruncateMode === "truncate" ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { children: title }) : void 0, arrow: true, placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4844
+ import_material26.Typography,
4777
4845
  {
4778
4846
  variant: "h5",
4779
4847
  component: "h1",
@@ -4784,11 +4852,11 @@ var PageHeader = ({
4784
4852
  lineHeight: 1.3,
4785
4853
  ...getTruncateStyles(titleTruncateMode)
4786
4854
  },
4787
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { children: title })
4855
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { children: title })
4788
4856
  }
4789
4857
  ) }),
4790
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Tooltip, { title: subtitleTruncateMode === "truncate" ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { children: subtitle }) : void 0, arrow: true, placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4791
- import_material25.Typography,
4858
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Tooltip, { title: subtitleTruncateMode === "truncate" ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { children: subtitle }) : void 0, arrow: true, placement: "top", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4859
+ import_material26.Typography,
4792
4860
  {
4793
4861
  variant: "body2",
4794
4862
  sx: {
@@ -4798,24 +4866,24 @@ var PageHeader = ({
4798
4866
  lineHeight: 1.4,
4799
4867
  ...getTruncateStyles(subtitleTruncateMode)
4800
4868
  },
4801
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { children: subtitle })
4869
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { children: subtitle })
4802
4870
  }
4803
4871
  ) })
4804
4872
  ] })
4805
4873
  ] }),
4806
- hasActions && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Box, { sx: { flexShrink: 0, display: "flex", alignItems: "center", gap: 1 }, children: isMobile ? (
4874
+ hasActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Box, { sx: { flexShrink: 0, display: "flex", alignItems: "center", gap: 1 }, children: isMobile ? (
4807
4875
  /* MOBILE: IconButton with MoreVertIcon showing ALL actions inside Menu */
4808
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
4809
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Actions" }), children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4810
- import_material25.IconButton,
4876
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
4877
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Actions" }), children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4878
+ import_material26.IconButton,
4811
4879
  {
4812
4880
  onClick: handleOpenMenu,
4813
4881
  sx: { border: "1px solid", borderColor: "divider", borderRadius: 2, p: 1 },
4814
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_MoreVert.default, {})
4882
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_MoreVert.default, {})
4815
4883
  }
4816
4884
  ) }),
4817
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4818
- import_material25.Menu,
4885
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4886
+ import_material26.Menu,
4819
4887
  {
4820
4888
  anchorEl,
4821
4889
  open: isMenuOpen,
@@ -4824,9 +4892,9 @@ var PageHeader = ({
4824
4892
  anchorOrigin: { horizontal: "right", vertical: "bottom" },
4825
4893
  slotProps: { paper: { elevation: 4, sx: { minWidth: 200, borderRadius: 2, mt: 1, p: 0.5 } } },
4826
4894
  children: [
4827
- primaryAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
4828
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4829
- import_material25.MenuItem,
4895
+ primaryAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
4896
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4897
+ import_material26.MenuItem,
4830
4898
  {
4831
4899
  onClick: () => handleMenuAction(primaryAction.onClick),
4832
4900
  disabled: primaryAction.disabled,
@@ -4839,32 +4907,32 @@ var PageHeader = ({
4839
4907
  px: 1.5
4840
4908
  },
4841
4909
  children: [
4842
- primaryAction.icon && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemIcon, { sx: { color: "inherit", minWidth: 32 }, children: primaryAction.icon }),
4843
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemText, { primary: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { children: primaryAction.label }), slotProps: { primary: { sx: { fontWeight: 700, fontSize: "0.9rem" } } } })
4910
+ primaryAction.icon && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemIcon, { sx: { color: "inherit", minWidth: 32 }, children: primaryAction.icon }),
4911
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemText, { primary: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { children: primaryAction.label }), slotProps: { primary: { sx: { fontWeight: 700, fontSize: "0.9rem" } } } })
4844
4912
  ]
4845
4913
  }
4846
4914
  ),
4847
- hasSecondaryActions && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Divider, { sx: { my: 0.75 } })
4915
+ hasSecondaryActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Divider, { sx: { my: 0.75 } })
4848
4916
  ] }),
4849
- secondaryActions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_react29.default.Fragment, { children: [
4850
- action.divider && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Divider, { sx: { my: 0.5 } }),
4851
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4852
- import_material25.MenuItem,
4917
+ secondaryActions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_react30.default.Fragment, { children: [
4918
+ action.divider && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Divider, { sx: { my: 0.5 } }),
4919
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4920
+ import_material26.MenuItem,
4853
4921
  {
4854
4922
  onClick: () => handleMenuAction(action.onClick),
4855
4923
  disabled: action.disabled,
4856
4924
  sx: { borderRadius: 1, py: 1, px: 1.5, color: action.color ? `${action.color}.main` : "text.primary" },
4857
4925
  children: [
4858
- action.icon && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemIcon, { sx: { color: action.color ? `${action.color}.main` : "text.secondary", minWidth: 32 }, children: action.icon }),
4859
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemText, { primary: action.label, slotProps: { primary: { sx: { fontSize: "0.875rem" } } } })
4926
+ action.icon && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemIcon, { sx: { color: action.color ? `${action.color}.main` : "text.secondary", minWidth: 32 }, children: action.icon }),
4927
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemText, { primary: action.label, slotProps: { primary: { sx: { fontSize: "0.875rem" } } } })
4860
4928
  ]
4861
4929
  }
4862
4930
  )
4863
4931
  ] }, action.id)),
4864
- refreshAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
4865
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Divider, { sx: { my: 0.5 } }),
4866
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4867
- import_material25.MenuItem,
4932
+ refreshAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
4933
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Divider, { sx: { my: 0.5 } }),
4934
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
4935
+ import_material26.MenuItem,
4868
4936
  {
4869
4937
  onClick: () => handleMenuAction(refreshAction.onClick),
4870
4938
  disabled: refreshAction.disabled,
@@ -4876,8 +4944,8 @@ var PageHeader = ({
4876
4944
  px: 1.5
4877
4945
  },
4878
4946
  children: [
4879
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemIcon, { sx: { color: "inherit", minWidth: 32 }, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_icons_material3.Refresh, {}) }),
4880
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemText, { primary: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), slotProps: { primary: { sx: { fontWeight: 700, fontSize: "0.9rem" } } } })
4947
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemIcon, { sx: { color: "inherit", minWidth: 32 }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_icons_material3.Refresh, {}) }),
4948
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemText, { primary: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), slotProps: { primary: { sx: { fontWeight: 700, fontSize: "0.9rem" } } } })
4881
4949
  ]
4882
4950
  }
4883
4951
  )
@@ -4888,10 +4956,10 @@ var PageHeader = ({
4888
4956
  ] })
4889
4957
  ) : (
4890
4958
  /* DESKTOP: Primary Action Button + Secondary Actions Dropdown Button */
4891
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_material25.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
4892
- (primaryAction || refreshAction) && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_material25.Stack, { direction: "row", spacing: 2, children: [
4893
- primaryAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4894
- import_material25.Button,
4959
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_material26.Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
4960
+ (primaryAction || refreshAction) && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_material26.Stack, { direction: "row", spacing: 2, children: [
4961
+ primaryAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4962
+ import_material26.Button,
4895
4963
  {
4896
4964
  variant: primaryAction.variant || "contained",
4897
4965
  color: primaryAction.color || "primary",
@@ -4899,32 +4967,32 @@ var PageHeader = ({
4899
4967
  disabled: primaryAction.disabled,
4900
4968
  startIcon: primaryAction.icon,
4901
4969
  sx: { borderRadius: 2, textTransform: "none", fontWeight: 600, px: 2, py: 0.85 },
4902
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { children: primaryAction.label })
4970
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { children: primaryAction.label })
4903
4971
  }
4904
4972
  ),
4905
- refreshAction && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4906
- import_material25.Fab,
4973
+ refreshAction && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(TranslateText, { overrideNamespace: overrideNamespace || "form_components", children: "Refresh" }), children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4974
+ import_material26.Fab,
4907
4975
  {
4908
4976
  color: "default",
4909
4977
  onClick: refreshAction.onClick,
4910
4978
  disabled: refreshAction.disabled,
4911
4979
  "aria-label": "refresh",
4912
4980
  size: "small",
4913
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_icons_material3.Refresh, {})
4981
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_icons_material3.Refresh, {})
4914
4982
  }
4915
4983
  ) })
4916
4984
  ] }),
4917
- hasSecondaryActions && /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
4918
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4919
- import_material25.IconButton,
4985
+ hasSecondaryActions && /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
4986
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4987
+ import_material26.IconButton,
4920
4988
  {
4921
4989
  onClick: handleOpenMenu,
4922
4990
  sx: { border: "1px solid", borderColor: "divider", borderRadius: 2, p: 1 },
4923
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_KeyboardArrowDown.default, {})
4991
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_KeyboardArrowDown.default, {})
4924
4992
  }
4925
4993
  ),
4926
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4927
- import_material25.Menu,
4994
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
4995
+ import_material26.Menu,
4928
4996
  {
4929
4997
  anchorEl,
4930
4998
  open: isMenuOpen,
@@ -4932,17 +5000,17 @@ var PageHeader = ({
4932
5000
  transformOrigin: { horizontal: "right", vertical: "top" },
4933
5001
  anchorOrigin: { horizontal: "right", vertical: "bottom" },
4934
5002
  slotProps: { paper: { elevation: 4, sx: { minWidth: 180, borderRadius: 2, mt: 1, p: 0.5 } } },
4935
- children: secondaryActions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_react29.default.Fragment, { children: [
4936
- action.divider && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.Divider, { sx: { my: 0.5 } }),
4937
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
4938
- import_material25.MenuItem,
5003
+ children: secondaryActions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_react30.default.Fragment, { children: [
5004
+ action.divider && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Divider, { sx: { my: 0.5 } }),
5005
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
5006
+ import_material26.MenuItem,
4939
5007
  {
4940
5008
  onClick: () => handleMenuAction(action.onClick),
4941
5009
  disabled: action.disabled,
4942
5010
  sx: { borderRadius: 1, py: 0.85, color: action.color ? `${action.color}.main` : "text.primary" },
4943
5011
  children: [
4944
- action.icon && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemIcon, { sx: { color: action.color ? `${action.color}.main` : "text.secondary", minWidth: 32 }, children: action.icon }),
4945
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_material25.ListItemText, { primary: action.label, slotProps: { primary: { sx: { fontSize: "0.875rem" } } } })
5012
+ action.icon && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemIcon, { sx: { color: action.color ? `${action.color}.main` : "text.secondary", minWidth: 32 }, children: action.icon }),
5013
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.ListItemText, { primary: action.label, slotProps: { primary: { sx: { fontSize: "0.875rem" } } } })
4946
5014
  ]
4947
5015
  }
4948
5016
  )
@@ -4952,14 +5020,14 @@ var PageHeader = ({
4952
5020
  ] })
4953
5021
  ] })
4954
5022
  ) }),
4955
- customFragment && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_jsx_runtime35.Fragment, { children: customFragment })
5023
+ customFragment && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_jsx_runtime36.Fragment, { children: customFragment })
4956
5024
  ]
4957
5025
  }
4958
5026
  );
4959
5027
  };
4960
5028
  var PageContainer = ({ children }) => {
4961
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4962
- import_material25.Box,
5029
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
5030
+ import_material26.Box,
4963
5031
  {
4964
5032
  sx: {
4965
5033
  width: "100%",
@@ -4975,8 +5043,8 @@ var PageComponent = ({
4975
5043
  header,
4976
5044
  children
4977
5045
  }) => {
4978
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
4979
- import_material25.Box,
5046
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
5047
+ import_material26.Box,
4980
5048
  {
4981
5049
  sx: {
4982
5050
  //pt: 2,
@@ -4985,8 +5053,8 @@ var PageComponent = ({
4985
5053
  overflowY: "auto",
4986
5054
  boxSizing: "border-box"
4987
5055
  },
4988
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(PageContainer, { children: [
4989
- header && /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(PageHeader, { ...header }),
5056
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(PageContainer, { children: [
5057
+ header && /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(PageHeader, { ...header }),
4990
5058
  children
4991
5059
  ] })
4992
5060
  }
@@ -4994,9 +5062,9 @@ var PageComponent = ({
4994
5062
  };
4995
5063
 
4996
5064
  // src/UI/components/layout/FilterContainerComponent.tsx
4997
- var import_react30 = __toESM(require("react"));
4998
- var import_material26 = require("@mui/material");
4999
- var import_jsx_runtime36 = (
5065
+ var import_react31 = __toESM(require("react"));
5066
+ var import_material27 = require("@mui/material");
5067
+ var import_jsx_runtime37 = (
5000
5068
  /* Автоматическая обертка каждого дочернего элемента в Grid size */
5001
5069
  require("react/jsx-runtime")
5002
5070
  );
@@ -5005,26 +5073,26 @@ var FilterContainerComponent = ({
5005
5073
  children,
5006
5074
  sx
5007
5075
  }) => {
5008
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
5009
- import_material26.Paper,
5076
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
5077
+ import_material27.Paper,
5010
5078
  {
5011
5079
  variant: "outlined",
5012
5080
  sx: [
5013
5081
  { p: 2, mb: 3 },
5014
5082
  ...Array.isArray(sx) ? sx : [sx]
5015
5083
  ],
5016
- children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_material26.Grid, { container: true, spacing: 2, sx: { alignItems: "center" }, children: sections ? sections.map((sec, idx) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_react30.default.Fragment, { children: sec }, idx)) : children })
5084
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Grid, { container: true, spacing: 2, sx: { alignItems: "center" }, children: sections ? sections.map((sec, idx) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react31.default.Fragment, { children: sec }, idx)) : children })
5017
5085
  }
5018
5086
  );
5019
5087
  };
5020
5088
 
5021
5089
  // src/UI/components/layout/PageLinkComponent.tsx
5022
5090
  var import_icons_material4 = require("@mui/icons-material");
5023
- var import_material27 = require("@mui/material");
5024
- var import_react31 = __toESM(require("react"));
5091
+ var import_material28 = require("@mui/material");
5092
+ var import_react32 = __toESM(require("react"));
5025
5093
  var import_react_router_dom = require("react-router-dom");
5026
5094
  init_context();
5027
- var import_jsx_runtime37 = require("react/jsx-runtime");
5095
+ var import_jsx_runtime38 = require("react/jsx-runtime");
5028
5096
  var PageLinkComponent = ({
5029
5097
  overrideNamespace,
5030
5098
  title,
@@ -5037,8 +5105,8 @@ var PageLinkComponent = ({
5037
5105
  bgcolor
5038
5106
  }) => {
5039
5107
  const navigate = (0, import_react_router_dom.useNavigate)();
5040
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
5041
- import_material27.Card,
5108
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
5109
+ import_material28.Card,
5042
5110
  {
5043
5111
  sx: (theme) => ({
5044
5112
  height: "100%",
@@ -5051,21 +5119,21 @@ var PageLinkComponent = ({
5051
5119
  ) : typeof bgcolor === "function" ? theme.palette.getContrastText(bgcolor(theme)) : theme.palette.getContrastText(bgcolor) : "text.primary"
5052
5120
  }),
5053
5121
  children: [
5054
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
5055
- import_material27.CardHeader,
5122
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5123
+ import_material28.CardHeader,
5056
5124
  {
5057
- avatar: icon ? import_react31.default.cloneElement(icon, {
5125
+ avatar: icon ? import_react32.default.cloneElement(icon, {
5058
5126
  sx: { color: bgcolor ? "inherit" : "primary", ...icon.props.sx }
5059
- }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_icons_material4.Settings, { color: bgcolor ? "inherit" : "primary" }),
5060
- title: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Typography, { variant: "h6", component: "div", color: "inherit", children: typeof title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: title }) : title }),
5061
- subheader: subheader && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Typography, { variant: "body2", sx: { opacity: 0.8, color: "inherit" }, children: typeof subheader === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: subheader }) : subheader })
5127
+ }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_icons_material4.Settings, { color: bgcolor ? "inherit" : "primary" }),
5128
+ title: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Typography, { variant: "h6", component: "div", color: "inherit", children: typeof title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: title }) : title }),
5129
+ subheader: subheader && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Typography, { variant: "body2", sx: { opacity: 0.8, color: "inherit" }, children: typeof subheader === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: subheader }) : subheader })
5062
5130
  }
5063
5131
  ),
5064
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Divider, { sx: { borderColor: "inherit", opacity: 0.2 } }),
5065
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_material27.CardContent, { sx: { flexGrow: 1 }, children: [
5066
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Typography, { variant: "body2", sx: { opacity: 0.85, color: "inherit" }, children: typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: description }) : description }),
5067
- links && links.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.List, { dense: true, disablePadding: true, children: links.filter((f) => !f.hidden).map((link, index) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
5068
- import_material27.ListItem,
5132
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Divider, { sx: { borderColor: "inherit", opacity: 0.2 } }),
5133
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_material28.CardContent, { sx: { flexGrow: 1 }, children: [
5134
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Typography, { variant: "body2", sx: { opacity: 0.85, color: "inherit" }, children: typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: description }) : description }),
5135
+ links && links.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.List, { dense: true, disablePadding: true, children: links.filter((f) => !f.hidden).map((link, index) => /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
5136
+ import_material28.ListItem,
5069
5137
  {
5070
5138
  disablePadding: true,
5071
5139
  sx: {
@@ -5076,18 +5144,18 @@ var PageLinkComponent = ({
5076
5144
  }
5077
5145
  },
5078
5146
  children: [
5079
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
5080
- import_material27.ListItemIcon,
5147
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5148
+ import_material28.ListItemIcon,
5081
5149
  {
5082
5150
  sx: { minWidth: 30, cursor: "pointer", color: "inherit" },
5083
5151
  onClick: () => {
5084
5152
  if (link?.href) navigate(link.href);
5085
5153
  },
5086
- children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_icons_material4.ArrowRight, { fontSize: "small", color: "inherit" })
5154
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_icons_material4.ArrowRight, { fontSize: "small", color: "inherit" })
5087
5155
  }
5088
5156
  ),
5089
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.ListItemText, { children: link.onClick ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
5090
- import_material27.Button,
5157
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.ListItemText, { children: link.onClick ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5158
+ import_material28.Button,
5091
5159
  {
5092
5160
  size: "small",
5093
5161
  variant: "text",
@@ -5110,10 +5178,10 @@ var PageLinkComponent = ({
5110
5178
  // Эффект подчеркивания, как у ссылки
5111
5179
  }
5112
5180
  },
5113
- children: typeof link.text === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: link.text }) : link.text
5181
+ children: typeof link.text === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: link.text }) : link.text
5114
5182
  }
5115
- ) : link.href ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
5116
- import_material27.Link,
5183
+ ) : link.href ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5184
+ import_material28.Link,
5117
5185
  {
5118
5186
  component: import_react_router_dom.Link,
5119
5187
  to: link.href,
@@ -5130,15 +5198,15 @@ var PageLinkComponent = ({
5130
5198
  backgroundColor: "transparent"
5131
5199
  }
5132
5200
  },
5133
- children: typeof link.text === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: link.text }) : link.text
5201
+ children: typeof link.text === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: link.text }) : link.text
5134
5202
  }
5135
- ) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Typography, { variant: "body2", sx: { fontWeight: 500, color: "inherit" }, children: typeof link.text === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: link.text }) : link.text }) })
5203
+ ) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Typography, { variant: "body2", sx: { fontWeight: 500, color: "inherit" }, children: typeof link.text === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: link.text }) : link.text }) })
5136
5204
  ]
5137
5205
  },
5138
5206
  index
5139
5207
  )) })
5140
5208
  ] }),
5141
- actionButtonText && onActionButtonClick && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.CardActions, { sx: { justifyContent: "flex-end", padding: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_material27.Button, { size: "small", variant: "contained", onClick: onActionButtonClick, children: typeof actionButtonText === "string" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(TranslateText, { overrideNamespace, children: actionButtonText }) : actionButtonText }) })
5209
+ actionButtonText && onActionButtonClick && /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.CardActions, { sx: { justifyContent: "flex-end", padding: 2 }, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Button, { size: "small", variant: "contained", onClick: onActionButtonClick, children: typeof actionButtonText === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace, children: actionButtonText }) : actionButtonText }) })
5142
5210
  ]
5143
5211
  }
5144
5212
  );
@@ -5146,13 +5214,13 @@ var PageLinkComponent = ({
5146
5214
 
5147
5215
  // src/UI/components/layout/CollapsedContainerComponent.tsx
5148
5216
  var import_icons_material5 = require("@mui/icons-material");
5149
- var import_material28 = require("@mui/material");
5150
- var import_react32 = require("react");
5217
+ var import_material29 = require("@mui/material");
5218
+ var import_react33 = require("react");
5151
5219
  init_context();
5152
- var import_jsx_runtime38 = require("react/jsx-runtime");
5153
- var ExpandMore = (0, import_material28.styled)((props) => {
5220
+ var import_jsx_runtime39 = require("react/jsx-runtime");
5221
+ var ExpandMore = (0, import_material29.styled)((props) => {
5154
5222
  const { expand, ...other } = props;
5155
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.IconButton, { size: "small", ...other, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_icons_material5.ExpandMore, {}) });
5223
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.IconButton, { size: "small", ...other, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_icons_material5.ExpandMore, {}) });
5156
5224
  })(({ theme, expand }) => ({
5157
5225
  transform: !expand ? "rotate(0deg)" : "rotate(180deg)",
5158
5226
  transition: theme.transitions.create("transform", {
@@ -5167,14 +5235,14 @@ var ExpandMore = (0, import_material28.styled)((props) => {
5167
5235
  }));
5168
5236
  var CollapsedContainerComponent = (props) => {
5169
5237
  const { displayState } = useAppTheme();
5170
- const [expanded, setExpanded] = (0, import_react32.useState)(props.expanded === void 0 ? false : props.expanded);
5238
+ const [expanded, setExpanded] = (0, import_react33.useState)(props.expanded === void 0 ? false : props.expanded);
5171
5239
  const handleExpandClick = () => {
5172
5240
  setExpanded(!expanded);
5173
5241
  props.onExpanded && props.onExpanded(!expanded);
5174
5242
  };
5175
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_material28.Card, { sx: { width: "100%", overflow: "hidden", mb: 2, boxShadow: displayState.isMobile ? "none" : props.disableShadow ? "none" : "0 20px 25px -5px rgb(0 0 0 / 0.1)", borderRadius: displayState.isMobile ? 0 : 1 }, children: [
5176
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
5177
- import_material28.Box,
5243
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_material29.Card, { sx: { width: "100%", overflow: "hidden", mb: 2, boxShadow: displayState.isMobile ? "none" : props.disableShadow ? "none" : "0 20px 25px -5px rgb(0 0 0 / 0.1)", borderRadius: displayState.isMobile ? 0 : 1 }, children: [
5244
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
5245
+ import_material29.Box,
5178
5246
  {
5179
5247
  onClick: () => handleExpandClick(),
5180
5248
  sx: {
@@ -5185,16 +5253,16 @@ var CollapsedContainerComponent = (props) => {
5185
5253
  pr: 2
5186
5254
  },
5187
5255
  children: [
5188
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5189
- import_material28.CardHeader,
5256
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
5257
+ import_material29.CardHeader,
5190
5258
  {
5191
5259
  sx: { flexGrow: 1 },
5192
- avatar: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Avatar, { sx: { bgcolor: "primary.main" }, children: props.icon }),
5193
- title: typeof props.title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Typography, { variant: "subtitle1", sx: { fontWeight: "700" }, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.title }) }) : props.title,
5194
- subheader: typeof props.subtitle === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.subtitle }) : props.subtitle
5260
+ avatar: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.Avatar, { sx: { bgcolor: "primary.main" }, children: props.icon }),
5261
+ title: typeof props.title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.Typography, { variant: "subtitle1", sx: { fontWeight: "700" }, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.title }) }) : props.title,
5262
+ subheader: typeof props.subtitle === "string" ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(TranslateText, { overrideNamespace: props.overrideNamespace, children: props.subtitle }) : props.subtitle
5195
5263
  }
5196
5264
  ),
5197
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Tooltip, { title: expanded ? "Show Less" : "Show More", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Box, { sx: { ml: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
5265
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.Tooltip, { title: expanded ? "Show Less" : "Show More", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.Box, { sx: { ml: 1 }, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
5198
5266
  ExpandMore,
5199
5267
  {
5200
5268
  expand: expanded,
@@ -5205,13 +5273,363 @@ var CollapsedContainerComponent = (props) => {
5205
5273
  ]
5206
5274
  }
5207
5275
  ),
5208
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_material28.Collapse, { in: expanded, timeout: "auto", children: [
5209
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.Divider, { variant: "middle" }),
5210
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_material28.CardContent, { children: props.children })
5276
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_material29.Collapse, { in: expanded, timeout: "auto", children: [
5277
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.Divider, { variant: "middle" }),
5278
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_material29.CardContent, { children: props.children })
5211
5279
  ] })
5212
5280
  ] });
5213
5281
  };
5214
5282
 
5283
+ // src/i18n/LanguageSelector.tsx
5284
+ var import_react34 = require("react");
5285
+ var import_react_i18next6 = require("react-i18next");
5286
+ var import_material30 = require("@mui/material");
5287
+ init_LocalizationProvider();
5288
+ init_UserSettingsProvider();
5289
+ init_SupabaseProvider();
5290
+ var import_jsx_runtime40 = require("react/jsx-runtime");
5291
+ var LanguageSelector = () => {
5292
+ const supabase = useSupabase();
5293
+ const { i18n: i18n2 } = (0, import_react_i18next6.useTranslation)();
5294
+ const [languages, setLanguages] = (0, import_react34.useState)([]);
5295
+ const [loading, setLoading] = (0, import_react34.useState)(true);
5296
+ const { changeLanguage } = useLocalization();
5297
+ const { settings: userSettings, setLanguage } = useUserSettings();
5298
+ const [anchorEl, setAnchorEl] = (0, import_react34.useState)(null);
5299
+ const open = Boolean(anchorEl);
5300
+ (0, import_react34.useEffect)(() => {
5301
+ const fetchLanguages = async () => {
5302
+ try {
5303
+ const { data, error } = await supabase.from("languages").select("code, name, svg_flag").eq("enabled", true);
5304
+ if (error) throw error;
5305
+ setLanguages(data || []);
5306
+ if (userSettings.language) changeLanguage(userSettings.language);
5307
+ } catch (err) {
5308
+ console.error("\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u043C\u043E\u0432:", err);
5309
+ } finally {
5310
+ setLoading(false);
5311
+ }
5312
+ };
5313
+ fetchLanguages();
5314
+ }, []);
5315
+ const handleClick = (event) => {
5316
+ setAnchorEl(event.currentTarget);
5317
+ };
5318
+ const handleClose = () => {
5319
+ setAnchorEl(null);
5320
+ };
5321
+ const handleSelectLanguage = (langCode) => {
5322
+ changeLanguage(langCode);
5323
+ setLanguage(langCode);
5324
+ handleClose();
5325
+ };
5326
+ if (loading) {
5327
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material30.CircularProgress, { size: 20, color: "inherit", sx: { mx: 1 } });
5328
+ }
5329
+ const rawCurrentLang = i18n2.language || "uk";
5330
+ const currentLangCode = rawCurrentLang.split("-")[0];
5331
+ const currentLang = languages.find((l) => l.code === currentLangCode) || languages[0];
5332
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
5333
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material30.Tooltip, { title: currentLang ? currentLang.name : "\u041C\u043E\u0432\u0430", arrow: true, placement: "bottom", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5334
+ import_material30.IconButton,
5335
+ {
5336
+ onClick: handleClick,
5337
+ size: "small",
5338
+ "aria-controls": open ? "language-menu" : void 0,
5339
+ "aria-haspopup": "true",
5340
+ "aria-expanded": open ? "true" : void 0,
5341
+ sx: {
5342
+ p: 1,
5343
+ borderRadius: 2,
5344
+ transition: "background-color 0.2s",
5345
+ "&:hover": {
5346
+ backgroundColor: "action.hover"
5347
+ }
5348
+ },
5349
+ children: currentLang?.svg_flag && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5350
+ import_material30.Box,
5351
+ {
5352
+ sx: {
5353
+ width: 24,
5354
+ height: 16,
5355
+ borderRadius: "3px",
5356
+ overflow: "hidden",
5357
+ flexShrink: 0,
5358
+ boxShadow: "0 0 2px rgba(0,0,0,0.3)",
5359
+ display: "flex",
5360
+ alignItems: "center",
5361
+ justifyContent: "center",
5362
+ "& svg": { width: "100%", height: "100%", display: "block", objectFit: "cover" }
5363
+ },
5364
+ dangerouslySetInnerHTML: { __html: currentLang.svg_flag }
5365
+ }
5366
+ )
5367
+ }
5368
+ ) }),
5369
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5370
+ import_material30.Menu,
5371
+ {
5372
+ id: "language-menu",
5373
+ anchorEl,
5374
+ open,
5375
+ onClose: handleClose,
5376
+ slotProps: {
5377
+ paper: {
5378
+ elevation: 3,
5379
+ sx: {
5380
+ mt: 1,
5381
+ minWidth: 150,
5382
+ borderRadius: 2
5383
+ }
5384
+ }
5385
+ },
5386
+ transformOrigin: { horizontal: "right", vertical: "top" },
5387
+ anchorOrigin: { horizontal: "right", vertical: "bottom" },
5388
+ children: languages.map((lang) => {
5389
+ const isSelected = lang.code === currentLangCode;
5390
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
5391
+ import_material30.MenuItem,
5392
+ {
5393
+ selected: isSelected,
5394
+ onClick: () => handleSelectLanguage(lang.code),
5395
+ sx: {
5396
+ display: "flex",
5397
+ alignItems: "center",
5398
+ gap: 1.5,
5399
+ py: 1,
5400
+ px: 2
5401
+ },
5402
+ children: [
5403
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5404
+ import_material30.Box,
5405
+ {
5406
+ sx: {
5407
+ width: 22,
5408
+ height: 15,
5409
+ borderRadius: "2px",
5410
+ overflow: "hidden",
5411
+ flexShrink: 0,
5412
+ boxShadow: "0 0 1px rgba(0,0,0,0.4)",
5413
+ "& svg": { width: "100%", height: "100%", display: "block" }
5414
+ },
5415
+ dangerouslySetInnerHTML: { __html: lang.svg_flag }
5416
+ }
5417
+ ),
5418
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material30.Typography, { variant: "body2", sx: { fontWeight: isSelected ? 600 : 400 }, children: lang.name })
5419
+ ]
5420
+ },
5421
+ lang.code
5422
+ );
5423
+ })
5424
+ }
5425
+ )
5426
+ ] });
5427
+ };
5428
+ var PublicLanguageSelector = () => {
5429
+ const supabase = useSupabase();
5430
+ const { i18n: i18n2 } = (0, import_react_i18next6.useTranslation)();
5431
+ const { changeLanguage } = useLocalization();
5432
+ const [languages, setLanguages] = (0, import_react34.useState)([]);
5433
+ const [loading, setLoading] = (0, import_react34.useState)(true);
5434
+ const [anchorEl, setAnchorEl] = (0, import_react34.useState)(null);
5435
+ const open = Boolean(anchorEl);
5436
+ (0, import_react34.useEffect)(() => {
5437
+ const fetchLanguages = async () => {
5438
+ try {
5439
+ const { data, error } = await supabase.from("languages").select("code, name, svg_flag").eq("enabled", true);
5440
+ if (error) throw error;
5441
+ setLanguages(data || []);
5442
+ } catch (err) {
5443
+ console.error("\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u043C\u043E\u0432:", err);
5444
+ } finally {
5445
+ setLoading(false);
5446
+ }
5447
+ };
5448
+ fetchLanguages();
5449
+ }, []);
5450
+ const handleClick = (event) => {
5451
+ setAnchorEl(event.currentTarget);
5452
+ };
5453
+ const handleClose = () => {
5454
+ setAnchorEl(null);
5455
+ };
5456
+ const handleSelectLanguage = (langCode) => {
5457
+ changeLanguage(langCode);
5458
+ handleClose();
5459
+ };
5460
+ if (loading) {
5461
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material30.CircularProgress, { size: 20, color: "inherit", sx: { mx: 1 } });
5462
+ }
5463
+ const rawCurrentLang = i18n2.language || "uk";
5464
+ const currentLangCode = rawCurrentLang.split("-")[0];
5465
+ const currentLang = languages.find((l) => l.code === currentLangCode) || languages[0];
5466
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
5467
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material30.Tooltip, { title: currentLang ? currentLang.name : "\u041C\u043E\u0432\u0430", arrow: true, placement: "bottom", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5468
+ import_material30.IconButton,
5469
+ {
5470
+ onClick: handleClick,
5471
+ size: "small",
5472
+ "aria-controls": open ? "language-menu" : void 0,
5473
+ "aria-haspopup": "true",
5474
+ "aria-expanded": open ? "true" : void 0,
5475
+ sx: {
5476
+ p: 1,
5477
+ borderRadius: 2,
5478
+ transition: "background-color 0.2s",
5479
+ "&:hover": {
5480
+ backgroundColor: "action.hover"
5481
+ }
5482
+ },
5483
+ children: currentLang?.svg_flag && /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5484
+ import_material30.Box,
5485
+ {
5486
+ sx: {
5487
+ width: 24,
5488
+ height: 16,
5489
+ borderRadius: "3px",
5490
+ overflow: "hidden",
5491
+ flexShrink: 0,
5492
+ boxShadow: "0 0 2px rgba(0,0,0,0.3)",
5493
+ display: "flex",
5494
+ alignItems: "center",
5495
+ justifyContent: "center",
5496
+ "& svg": { width: "100%", height: "100%", display: "block", objectFit: "cover" }
5497
+ },
5498
+ dangerouslySetInnerHTML: { __html: currentLang.svg_flag }
5499
+ }
5500
+ )
5501
+ }
5502
+ ) }),
5503
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5504
+ import_material30.Menu,
5505
+ {
5506
+ id: "language-menu",
5507
+ anchorEl,
5508
+ open,
5509
+ onClose: handleClose,
5510
+ slotProps: {
5511
+ paper: {
5512
+ elevation: 3,
5513
+ sx: {
5514
+ mt: 1,
5515
+ minWidth: 150,
5516
+ borderRadius: 2
5517
+ }
5518
+ }
5519
+ },
5520
+ transformOrigin: { horizontal: "right", vertical: "top" },
5521
+ anchorOrigin: { horizontal: "right", vertical: "bottom" },
5522
+ children: languages.map((lang) => {
5523
+ const isSelected = lang.code === currentLangCode;
5524
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
5525
+ import_material30.MenuItem,
5526
+ {
5527
+ selected: isSelected,
5528
+ onClick: () => handleSelectLanguage(lang.code),
5529
+ sx: {
5530
+ display: "flex",
5531
+ alignItems: "center",
5532
+ gap: 1.5,
5533
+ py: 1,
5534
+ px: 2
5535
+ },
5536
+ children: [
5537
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
5538
+ import_material30.Box,
5539
+ {
5540
+ sx: {
5541
+ width: 22,
5542
+ height: 15,
5543
+ borderRadius: "2px",
5544
+ overflow: "hidden",
5545
+ flexShrink: 0,
5546
+ boxShadow: "0 0 1px rgba(0,0,0,0.4)",
5547
+ "& svg": { width: "100%", height: "100%", display: "block" }
5548
+ },
5549
+ dangerouslySetInnerHTML: { __html: lang.svg_flag }
5550
+ }
5551
+ ),
5552
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_material30.Typography, { variant: "body2", sx: { fontWeight: isSelected ? 600 : 400 }, children: lang.name })
5553
+ ]
5554
+ },
5555
+ lang.code
5556
+ );
5557
+ })
5558
+ }
5559
+ )
5560
+ ] });
5561
+ };
5562
+
5563
+ // src/UI/components/tables/TablePaginationComponent.tsx
5564
+ var import_material31 = require("@mui/material");
5565
+ var import_FirstPage = __toESM(require("@mui/icons-material/FirstPage"));
5566
+ var import_KeyboardArrowLeft = __toESM(require("@mui/icons-material/KeyboardArrowLeft"));
5567
+ var import_KeyboardArrowRight = __toESM(require("@mui/icons-material/KeyboardArrowRight"));
5568
+ var import_LastPage = __toESM(require("@mui/icons-material/LastPage"));
5569
+ init_TranslatableTooltipComponent();
5570
+ init_context();
5571
+ var import_jsx_runtime41 = require("react/jsx-runtime");
5572
+ var CustomPaginationActions = (props) => {
5573
+ const {
5574
+ count,
5575
+ page,
5576
+ rowsPerPage,
5577
+ onPageChange,
5578
+ showFirstButton,
5579
+ showLastButton,
5580
+ overrideNamespace
5581
+ } = props;
5582
+ const ns = overrideNamespace || "form_components";
5583
+ const handleFirstPage = (e) => onPageChange(e, 0);
5584
+ const handleBack = (e) => onPageChange(e, page - 1);
5585
+ const handleNext = (e) => onPageChange(e, page + 1);
5586
+ const handleLast = (e) => onPageChange(e, Math.max(0, Math.ceil(count / rowsPerPage) - 1));
5587
+ const isFirstDisabled = page === 0;
5588
+ const isLastDisabled = page >= Math.ceil(count / rowsPerPage) - 1;
5589
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_material31.Box, { sx: { flexShrink: 0, ml: 2, display: "flex", alignItems: "center" }, children: [
5590
+ showFirstButton && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslateText, { overrideNamespace: ns, children: "First page" }), children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_material31.IconButton, { onClick: handleFirstPage, disabled: isFirstDisabled, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_FirstPage.default, {}) }) }) }),
5591
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslateText, { overrideNamespace: ns, children: "Previous page" }), children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_material31.IconButton, { onClick: handleBack, disabled: isFirstDisabled, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_KeyboardArrowLeft.default, {}) }) }) }),
5592
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslateText, { overrideNamespace: ns, children: "Next page" }), children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_material31.IconButton, { onClick: handleNext, disabled: isLastDisabled, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_KeyboardArrowRight.default, {}) }) }) }),
5593
+ showLastButton && /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslatableTooltipComponent, { title: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslateText, { overrideNamespace: ns, children: "Last page" }), children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_material31.IconButton, { onClick: handleLast, disabled: isLastDisabled, size: "small", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_LastPage.default, {}) }) }) })
5594
+ ] });
5595
+ };
5596
+ var TablePaginationComponent = ({
5597
+ overrideNamespace,
5598
+ rowsPerPageOptions = [5, 10, 25, 50],
5599
+ count,
5600
+ rowsPerPage,
5601
+ page,
5602
+ onPageChange,
5603
+ onRowsPerPageChange
5604
+ }) => {
5605
+ const { displayState } = useAppTheme();
5606
+ const activeNamespace = overrideNamespace || "form_components";
5607
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
5608
+ import_material31.TablePagination,
5609
+ {
5610
+ rowsPerPageOptions,
5611
+ component: "div",
5612
+ count,
5613
+ rowsPerPage,
5614
+ page,
5615
+ onPageChange,
5616
+ onRowsPerPageChange,
5617
+ showFirstButton: true,
5618
+ showLastButton: true,
5619
+ labelRowsPerPage: displayState.isMobile ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_jsx_runtime41.Fragment, {}) : /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_jsx_runtime41.Fragment, { children: [
5620
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(TranslateText, { overrideNamespace: activeNamespace, children: "Rows per page" }),
5621
+ ":"
5622
+ ] }),
5623
+ ActionsComponent: CustomPaginationActions,
5624
+ slotProps: {
5625
+ actions: {
5626
+ overrideNamespace: activeNamespace
5627
+ }
5628
+ }
5629
+ }
5630
+ );
5631
+ };
5632
+
5215
5633
  // src/types/index.ts
5216
5634
  init_user_types();
5217
5635
 
@@ -5235,16 +5653,16 @@ var Services = {
5235
5653
  };
5236
5654
 
5237
5655
  // src/hooks/useUserStatus.ts
5238
- var import_react33 = require("react");
5656
+ var import_react35 = require("react");
5239
5657
  init_deviceId();
5240
5658
  init_context();
5241
5659
  var ONLINE_THRESHOLD_MINUTES = 2;
5242
5660
  var AWAY_THRESHOLD_MINUTES = 15;
5243
5661
  var useUserStatus2 = (userId, initialLastSeenAt, currentAuthUserId) => {
5244
5662
  const supabase = useSupabase();
5245
- const [status, setStatus] = (0, import_react33.useState)("offline");
5246
- const [lastSeen, setLastSeen] = (0, import_react33.useState)(initialLastSeenAt ?? null);
5247
- const lastSeenRef = (0, import_react33.useRef)(initialLastSeenAt ?? null);
5663
+ const [status, setStatus] = (0, import_react35.useState)("offline");
5664
+ const [lastSeen, setLastSeen] = (0, import_react35.useState)(initialLastSeenAt ?? null);
5665
+ const lastSeenRef = (0, import_react35.useRef)(initialLastSeenAt ?? null);
5248
5666
  lastSeenRef.current = lastSeen;
5249
5667
  const calculateStatus = (isOnline, lastSeenIso) => {
5250
5668
  if (isOnline) return "online";
@@ -5260,7 +5678,7 @@ var useUserStatus2 = (userId, initialLastSeenAt, currentAuthUserId) => {
5260
5678
  }
5261
5679
  return "offline";
5262
5680
  };
5263
- (0, import_react33.useEffect)(() => {
5681
+ (0, import_react35.useEffect)(() => {
5264
5682
  if (!userId) return;
5265
5683
  let isMounted = true;
5266
5684
  const isSelf = currentAuthUserId && userId === currentAuthUserId;
@@ -5380,13 +5798,16 @@ var Utils = {
5380
5798
  NumberInputComponent,
5381
5799
  PageComponent,
5382
5800
  PageLinkComponent,
5801
+ ProtectedLanguageSelector,
5383
5802
  Providers,
5803
+ PublicLanguageSelector,
5384
5804
  RefreshButtonComponent,
5385
5805
  SearchComponent,
5386
5806
  SelectComponent,
5387
5807
  Services,
5388
5808
  SupabaseProvider,
5389
5809
  SwitchComponent,
5810
+ TablePaginationComponent,
5390
5811
  TextFieldComponent,
5391
5812
  ThemeProvider,
5392
5813
  ToastProvider,
@@ -5394,6 +5815,7 @@ var Utils = {
5394
5815
  TranslateProvider,
5395
5816
  TranslateText,
5396
5817
  TranslationEditProvider,
5818
+ TruncatedTypography,
5397
5819
  UrlComponent,
5398
5820
  UserAvatarComponent,
5399
5821
  UserPopoverComponent,