@carlonicora/nextjs-jsonapi 1.35.0 → 1.36.1

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 (44) hide show
  1. package/dist/{BlockNoteEditor-3NFHRHR5.js → BlockNoteEditor-4MDHRUS2.js} +13 -13
  2. package/dist/{BlockNoteEditor-3NFHRHR5.js.map → BlockNoteEditor-4MDHRUS2.js.map} +1 -1
  3. package/dist/{BlockNoteEditor-O2GEMLA5.mjs → BlockNoteEditor-SZWO3MDO.mjs} +3 -3
  4. package/dist/billing/index.js +333 -333
  5. package/dist/billing/index.mjs +2 -2
  6. package/dist/{chunk-IZKIM7U5.js → chunk-53IPQJVH.js} +12 -1
  7. package/dist/chunk-53IPQJVH.js.map +1 -0
  8. package/dist/{chunk-T4UAULVP.js → chunk-E6PQQTWF.js} +702 -651
  9. package/dist/chunk-E6PQQTWF.js.map +1 -0
  10. package/dist/{chunk-NJXGCB7Q.mjs → chunk-I7DFEJFF.mjs} +113 -62
  11. package/dist/chunk-I7DFEJFF.mjs.map +1 -0
  12. package/dist/{chunk-FJUMCH77.mjs → chunk-P7R2DPD6.mjs} +12 -1
  13. package/dist/{chunk-FJUMCH77.mjs.map → chunk-P7R2DPD6.mjs.map} +1 -1
  14. package/dist/client/index.js +3 -3
  15. package/dist/client/index.mjs +2 -2
  16. package/dist/components/index.js +3 -3
  17. package/dist/components/index.mjs +2 -2
  18. package/dist/contexts/index.d.mts +3 -1
  19. package/dist/contexts/index.d.ts +3 -1
  20. package/dist/contexts/index.js +3 -3
  21. package/dist/contexts/index.mjs +2 -2
  22. package/dist/core/index.d.mts +2 -2
  23. package/dist/core/index.d.ts +2 -2
  24. package/dist/core/index.js +2 -2
  25. package/dist/core/index.mjs +1 -1
  26. package/dist/index.d.mts +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +2 -2
  29. package/dist/index.mjs +1 -1
  30. package/dist/{s3.service-DcqkGrKD.d.ts → s3.service-DXkDoMf1.d.ts} +3 -0
  31. package/dist/{s3.service-ag6M_7GO.d.mts → s3.service-hnTPVTm2.d.mts} +3 -0
  32. package/dist/server/index.d.mts +1 -1
  33. package/dist/server/index.d.ts +1 -1
  34. package/dist/server/index.js +3 -3
  35. package/dist/server/index.mjs +1 -1
  36. package/package.json +1 -1
  37. package/src/features/company/components/forms/CompanyDeleter.tsx +134 -70
  38. package/src/features/company/contexts/CompanyContext.tsx +1 -1
  39. package/src/features/company/data/company.service.ts +12 -0
  40. package/src/features/user/contexts/CurrentUserContext.tsx +19 -13
  41. package/dist/chunk-IZKIM7U5.js.map +0 -1
  42. package/dist/chunk-NJXGCB7Q.mjs.map +0 -1
  43. package/dist/chunk-T4UAULVP.js.map +0 -1
  44. /package/dist/{BlockNoteEditor-O2GEMLA5.mjs.map → BlockNoteEditor-SZWO3MDO.mjs.map} +0 -0
@@ -41,7 +41,7 @@ import {
41
41
  showToast,
42
42
  useComposedRefs,
43
43
  useIsMobile
44
- } from "./chunk-FJUMCH77.mjs";
44
+ } from "./chunk-P7R2DPD6.mjs";
45
45
  import {
46
46
  JsonApiContext
47
47
  } from "./chunk-VOXD3ZLY.mjs";
@@ -1004,7 +1004,7 @@ var CurrentUserProvider = /* @__PURE__ */ __name(({ children }) => {
1004
1004
  }
1005
1005
  __name(hasPermissionToPath, "hasPermissionToPath");
1006
1006
  const [isRefreshing, setIsRefreshing] = useState2(false);
1007
- const refreshUser = useCallback5(async () => {
1007
+ const refreshUser = useCallback5(async (options) => {
1008
1008
  if (isRefreshing) {
1009
1009
  return;
1010
1010
  }
@@ -1015,16 +1015,18 @@ var CurrentUserProvider = /* @__PURE__ */ __name(({ children }) => {
1015
1015
  const dehydrated = fullUser.dehydrate();
1016
1016
  setDehydratedUser(dehydrated);
1017
1017
  setUser(fullUser);
1018
- await getTokenHandler()?.updateToken({
1019
- userId: fullUser.id,
1020
- companyId: fullUser.company?.id,
1021
- roles: fullUser.roles.map((role) => role.id),
1022
- features: fullUser.company?.features?.map((feature) => feature.id) ?? [],
1023
- modules: fullUser.modules.map((module) => ({
1024
- id: module.id,
1025
- permissions: module.permissions
1026
- }))
1027
- });
1018
+ if (!options?.skipCookieUpdate) {
1019
+ await getTokenHandler()?.updateToken({
1020
+ userId: fullUser.id,
1021
+ companyId: fullUser.company?.id,
1022
+ roles: fullUser.roles.map((role) => role.id),
1023
+ features: fullUser.company?.features?.map((feature) => feature.id) ?? [],
1024
+ modules: fullUser.modules.map((module) => ({
1025
+ id: module.id,
1026
+ permissions: module.permissions
1027
+ }))
1028
+ });
1029
+ }
1028
1030
  }
1029
1031
  } catch (error) {
1030
1032
  console.error("Failed to refresh user data:", error);
@@ -1043,7 +1045,7 @@ var CurrentUserProvider = /* @__PURE__ */ __name(({ children }) => {
1043
1045
  const handleCompanyUpdate = /* @__PURE__ */ __name((data) => {
1044
1046
  if (data.companyId === currentUser.company?.id && !isRefreshingRef.current) {
1045
1047
  isRefreshingRef.current = true;
1046
- refreshUserRef.current().finally(() => {
1048
+ refreshUserRef.current({ skipCookieUpdate: true }).finally(() => {
1047
1049
  isRefreshingRef.current = false;
1048
1050
  });
1049
1051
  }
@@ -9903,88 +9905,137 @@ import { LoaderCircleIcon as LoaderCircleIcon2, Trash2Icon as Trash2Icon2 } from
9903
9905
  import { useTranslations as useTranslations29 } from "next-intl";
9904
9906
  import { useState as useState26 } from "react";
9905
9907
  import { Fragment as Fragment10, jsx as jsx103, jsxs as jsxs60 } from "react/jsx-runtime";
9906
- function CompanyDeleterInternal({ company }) {
9908
+ function CompanyDeleterInternal({ company, isAdministrator: isAdministrator2 }) {
9907
9909
  const t = useTranslations29();
9908
- const router = useI18nRouter();
9910
+ const generateUrl = usePageUrlGenerator();
9909
9911
  const [open, setOpen] = useState26(false);
9912
+ const [finalWarningOpen, setFinalWarningOpen] = useState26(false);
9910
9913
  const [isDeleting, setIsDeleting] = useState26(false);
9911
9914
  const [companyName, setCompanyName] = useState26("");
9912
- const handleDelete = /* @__PURE__ */ __name(async () => {
9915
+ const handleProceedToFinalWarning = /* @__PURE__ */ __name(() => {
9916
+ setOpen(false);
9917
+ setFinalWarningOpen(true);
9918
+ }, "handleProceedToFinalWarning");
9919
+ const handleFinalDelete = /* @__PURE__ */ __name(async () => {
9913
9920
  setIsDeleting(true);
9914
9921
  try {
9915
- await CompanyService.delete({ companyId: company.id });
9916
- router.push("/");
9922
+ if (isAdministrator2) {
9923
+ await CompanyService.delete({ companyId: company.id });
9924
+ } else {
9925
+ await CompanyService.selfDelete({ companyId: company.id });
9926
+ }
9927
+ await AuthService.logout();
9928
+ window.location.href = generateUrl({ page: `/` });
9917
9929
  } catch (error) {
9918
9930
  errorToast({ title: t(`common.errors.delete`), error });
9931
+ setIsDeleting(false);
9919
9932
  }
9920
- setIsDeleting(false);
9921
- }, "handleDelete");
9922
- return /* @__PURE__ */ jsxs60(AlertDialog, { open, onOpenChange: setOpen, children: [
9923
- /* @__PURE__ */ jsx103(AlertDialogTrigger, { children: /* @__PURE__ */ jsxs60(Button, { size: "sm", variant: "destructive", children: [
9924
- /* @__PURE__ */ jsx103(Trash2Icon2, { className: "mr-3 h-3.5 w-3.5" }),
9925
- t(`ui.buttons.delete`)
9926
- ] }) }),
9927
- /* @__PURE__ */ jsxs60(AlertDialogContent, { className: `flex max-h-[70vh] max-w-3xl flex-col overflow-y-auto`, children: [
9928
- /* @__PURE__ */ jsxs60(AlertDialogHeader, { children: [
9929
- /* @__PURE__ */ jsx103(AlertDialogTitle, { children: t(`common.delete.title`, { type: t(`entities.companies`, { count: 1 }) }) }),
9930
- /* @__PURE__ */ jsx103(AlertDialogDescription, { children: t(`common.delete.subtitle`, { type: t(`entities.companies`, { count: 1 }) }) })
9931
- ] }),
9932
- /* @__PURE__ */ jsx103("div", { className: "text-destructive p-4 text-sm", children: t(`common.delete.description`, { type: t(`entities.companies`, { count: 1 }) }) }),
9933
- /* @__PURE__ */ jsxs60("div", { className: "flex w-full flex-col gap-y-2", children: [
9934
- /* @__PURE__ */ jsx103("div", { children: t(`common.delete.confirmation`, { type: t(`entities.companies`, { count: 1 }) }) }),
9935
- /* @__PURE__ */ jsxs60("div", { className: "flex w-full flex-col", children: [
9936
- /* @__PURE__ */ jsxs60(Label, { className: "flex items-center", children: [
9937
- t(`company.fields.name.label`),
9938
- /* @__PURE__ */ jsx103("span", { className: "text-destructive ml-2 font-semibold", children: "*" })
9939
- ] }),
9933
+ }, "handleFinalDelete");
9934
+ const handleGoBack = /* @__PURE__ */ __name(() => {
9935
+ setFinalWarningOpen(false);
9936
+ setCompanyName("");
9937
+ }, "handleGoBack");
9938
+ return /* @__PURE__ */ jsxs60(Fragment10, { children: [
9939
+ /* @__PURE__ */ jsxs60(AlertDialog, { open, onOpenChange: setOpen, children: [
9940
+ /* @__PURE__ */ jsx103(AlertDialogTrigger, { children: /* @__PURE__ */ jsx103(
9941
+ Button,
9942
+ {
9943
+ render: /* @__PURE__ */ jsx103("div", {}),
9944
+ nativeButton: false,
9945
+ size: "sm",
9946
+ variant: "ghost",
9947
+ className: "text-muted-foreground hover:text-destructive",
9948
+ children: /* @__PURE__ */ jsx103(Trash2Icon2, {})
9949
+ }
9950
+ ) }),
9951
+ /* @__PURE__ */ jsxs60(AlertDialogContent, { className: `flex max-h-[70vh] max-w-3xl flex-col overflow-y-auto`, children: [
9952
+ /* @__PURE__ */ jsxs60(AlertDialogHeader, { children: [
9953
+ /* @__PURE__ */ jsx103(AlertDialogTitle, { children: t(`common.delete.title`, { type: t(`entities.companies`, { count: 1 }) }) }),
9954
+ /* @__PURE__ */ jsx103(AlertDialogDescription, { children: t(`common.delete.subtitle`, { type: t(`entities.companies`, { count: 1 }) }) })
9955
+ ] }),
9956
+ /* @__PURE__ */ jsx103("div", { className: "text-destructive p-4 text-sm", children: t(`common.delete.description`, { type: t(`entities.companies`, { count: 1 }) }) }),
9957
+ /* @__PURE__ */ jsxs60("div", { className: "flex w-full flex-col gap-y-2", children: [
9958
+ /* @__PURE__ */ jsx103("div", { children: t(`common.delete.confirmation`, { type: t(`entities.companies`, { count: 1 }) }) }),
9959
+ /* @__PURE__ */ jsxs60("div", { className: "flex w-full flex-col", children: [
9960
+ /* @__PURE__ */ jsxs60(Label, { className: "flex items-center", children: [
9961
+ t(`company.fields.name.label`),
9962
+ /* @__PURE__ */ jsx103("span", { className: "text-destructive ml-2 font-semibold", children: "*" })
9963
+ ] }),
9964
+ /* @__PURE__ */ jsx103(
9965
+ Input,
9966
+ {
9967
+ className: `w-full`,
9968
+ placeholder: t(`company.fields.name.placeholder`),
9969
+ onChange: (e) => setCompanyName(e.target.value)
9970
+ }
9971
+ )
9972
+ ] })
9973
+ ] }),
9974
+ /* @__PURE__ */ jsxs60("div", { className: "flex justify-end", children: [
9975
+ /* @__PURE__ */ jsx103(Button, { className: "mr-2", variant: "outline", type: `button`, onClick: () => setOpen(false), children: t(`ui.buttons.cancel`) }),
9940
9976
  /* @__PURE__ */ jsx103(
9941
- Input,
9977
+ Button,
9942
9978
  {
9943
- className: `w-full`,
9944
- placeholder: t(`company.fields.name.placeholder`),
9945
- onChange: (e) => setCompanyName(e.target.value)
9979
+ type: "submit",
9980
+ onClick: (e) => {
9981
+ e.preventDefault();
9982
+ handleProceedToFinalWarning();
9983
+ },
9984
+ variant: "destructive",
9985
+ disabled: company.name !== companyName,
9986
+ children: t(`ui.buttons.delete`)
9946
9987
  }
9947
9988
  )
9948
9989
  ] })
9990
+ ] })
9991
+ ] }),
9992
+ /* @__PURE__ */ jsx103(AlertDialog, { open: finalWarningOpen, onOpenChange: setFinalWarningOpen, children: /* @__PURE__ */ jsxs60(AlertDialogContent, { className: `flex max-h-[70vh] max-w-3xl flex-col overflow-y-auto`, children: [
9993
+ /* @__PURE__ */ jsxs60(AlertDialogHeader, { children: [
9994
+ /* @__PURE__ */ jsx103(AlertDialogTitle, { children: t(`common.delete.finalWarning.title`) }),
9995
+ /* @__PURE__ */ jsx103(AlertDialogDescription, { children: t(`common.delete.finalWarning.subtitle`) })
9996
+ ] }),
9997
+ /* @__PURE__ */ jsxs60("div", { className: "bg-destructive/10 border-destructive text-destructive rounded-md border p-4 text-sm", children: [
9998
+ /* @__PURE__ */ jsx103("p", { className: "mb-3 font-semibold", children: t(`common.delete.finalWarning.description`) }),
9999
+ /* @__PURE__ */ jsxs60("ul", { className: "list-disc space-y-1 pl-5", children: [
10000
+ /* @__PURE__ */ jsx103("li", { children: t(`common.delete.finalWarning.bullet1`) }),
10001
+ /* @__PURE__ */ jsx103("li", { children: t(`common.delete.finalWarning.bullet2`) }),
10002
+ /* @__PURE__ */ jsx103("li", { children: t(`common.delete.finalWarning.bullet3`) }),
10003
+ /* @__PURE__ */ jsx103("li", { children: t(`common.delete.finalWarning.bullet4`) }),
10004
+ /* @__PURE__ */ jsx103("li", { children: t(`common.delete.finalWarning.bullet5`) })
10005
+ ] })
9949
10006
  ] }),
9950
10007
  /* @__PURE__ */ jsxs60("div", { className: "flex justify-end", children: [
9951
- /* @__PURE__ */ jsx103(
9952
- Button,
9953
- {
9954
- className: "mr-2",
9955
- variant: "outline",
9956
- type: `button`,
9957
- onClick: () => setOpen(false),
9958
- disabled: isDeleting,
9959
- children: t(`ui.buttons.cancel`)
9960
- }
9961
- ),
10008
+ /* @__PURE__ */ jsx103(Button, { className: "mr-2", variant: "outline", type: `button`, onClick: handleGoBack, disabled: isDeleting, children: t(`ui.buttons.go_back`) }),
9962
10009
  /* @__PURE__ */ jsx103(
9963
10010
  Button,
9964
10011
  {
9965
10012
  type: "submit",
9966
10013
  onClick: (e) => {
9967
10014
  e.preventDefault();
9968
- handleDelete();
10015
+ handleFinalDelete();
9969
10016
  },
9970
10017
  variant: "destructive",
9971
- disabled: company.name !== companyName || isDeleting,
10018
+ disabled: isDeleting,
9972
10019
  children: isDeleting ? /* @__PURE__ */ jsxs60(Fragment10, { children: [
9973
10020
  t(`ui.buttons.deleting`),
9974
10021
  /* @__PURE__ */ jsx103(LoaderCircleIcon2, { className: "animate-spin-slow h-5 w-5" })
9975
- ] }) : t(`ui.buttons.delete`)
10022
+ ] }) : t(`ui.buttons.delete_forever`)
9976
10023
  }
9977
10024
  )
9978
10025
  ] })
9979
- ] })
10026
+ ] }) })
9980
10027
  ] });
9981
10028
  }
9982
10029
  __name(CompanyDeleterInternal, "CompanyDeleterInternal");
9983
10030
  function CompanyDeleter({ company }) {
9984
10031
  const { hasPermissionToModule, hasRole } = useCurrentUserContext();
9985
- if (!hasRole(getRoleId().Administrator) && !hasPermissionToModule({ module: Modules.Company, action: "delete" /* Delete */ }))
10032
+ const isAdministrator2 = hasRole(getRoleId().Administrator);
10033
+ const isCompanyAdministrator = hasRole(getRoleId().CompanyAdministrator);
10034
+ const hasDeletePermission = hasPermissionToModule({ module: Modules.Company, action: "delete" /* Delete */ });
10035
+ if (!isAdministrator2 && !isCompanyAdministrator && !hasDeletePermission) {
9986
10036
  return null;
9987
- return /* @__PURE__ */ jsx103(CompanyDeleterInternal, { company });
10037
+ }
10038
+ return /* @__PURE__ */ jsx103(CompanyDeleterInternal, { company, isAdministrator: isAdministrator2 });
9988
10039
  }
9989
10040
  __name(CompanyDeleter, "CompanyDeleter");
9990
10041
 
@@ -10213,7 +10264,7 @@ var CompanyProvider = /* @__PURE__ */ __name(({ children, dehydratedCompany }) =
10213
10264
  };
10214
10265
  if (company) response.element = company.name;
10215
10266
  const functions = [];
10216
- if (company && hasRole(getRoleId().Administrator) && hasPermissionToModule({ module: Modules.Company, action: "delete" /* Delete */ }))
10267
+ if (company && (hasRole(getRoleId().Administrator) || hasRole(getRoleId().CompanyAdministrator)) && hasPermissionToModule({ module: Modules.Company, action: "delete" /* Delete */ }))
10217
10268
  functions.push(/* @__PURE__ */ jsx106(CompanyDeleter, { company }, "companyDeleter"));
10218
10269
  if (hasRole(getRoleId().Administrator) || hasPermissionToModule({ module: Modules.Company, action: "update" /* Update */ })) {
10219
10270
  functions.push(/* @__PURE__ */ jsx106(CompanyEditor, { company, propagateChanges: setCompany }, "companyEditor"));
@@ -11350,7 +11401,7 @@ __name(AllowedUsersDetails, "AllowedUsersDetails");
11350
11401
  import dynamic from "next/dynamic";
11351
11402
  import React15 from "react";
11352
11403
  import { jsx as jsx125 } from "react/jsx-runtime";
11353
- var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-O2GEMLA5.mjs"), {
11404
+ var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-SZWO3MDO.mjs"), {
11354
11405
  ssr: false
11355
11406
  });
11356
11407
  var BlockNoteEditorContainer = React15.memo(/* @__PURE__ */ __name(function EditorContainer(props) {
@@ -15423,4 +15474,4 @@ export {
15423
15474
  useOAuthClients,
15424
15475
  useOAuthClient
15425
15476
  };
15426
- //# sourceMappingURL=chunk-NJXGCB7Q.mjs.map
15477
+ //# sourceMappingURL=chunk-I7DFEJFF.mjs.map