@carlonicora/nextjs-jsonapi 1.9.0 → 1.9.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.
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkPVN4DI3Hjs = require('./chunk-PVN4DI3H.js');
6
+ var _chunkPFBYNJ2Rjs = require('./chunk-PFBYNJ2R.js');
7
7
  require('./chunk-I7OQ5WKX.js');
8
8
 
9
9
 
@@ -79,7 +79,7 @@ var createDiffActionsInlineContentSpec = /* @__PURE__ */ _chunk7QVYU63Ejs.__name
79
79
  const diffIds = props.inlineContent.props.diffIds;
80
80
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "diff-actions-container mx-2 inline-flex items-center gap-1 align-middle", children: [
81
81
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
82
- _chunkPVN4DI3Hjs.Button,
82
+ _chunkPFBYNJ2Rjs.Button,
83
83
  {
84
84
  title: "Accept change",
85
85
  onClick: (e) => {
@@ -91,7 +91,7 @@ var createDiffActionsInlineContentSpec = /* @__PURE__ */ _chunk7QVYU63Ejs.__name
91
91
  }
92
92
  ),
93
93
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
94
- _chunkPVN4DI3Hjs.Button,
94
+ _chunkPFBYNJ2Rjs.Button,
95
95
  {
96
96
  title: "Reject change",
97
97
  className: "mx-2 p-0",
@@ -121,7 +121,7 @@ function BlockNoteEditor({
121
121
  bordered
122
122
  }) {
123
123
  const t = _nextintl.useTranslations.call(void 0, );
124
- const { company } = _chunkPVN4DI3Hjs.useCurrentUserContext.call(void 0, );
124
+ const { company } = _chunkPFBYNJ2Rjs.useCurrentUserContext.call(void 0, );
125
125
  const [acceptedChanges, setAcceptedChanges] = _react3.useState.call(void 0, /* @__PURE__ */ new Set());
126
126
  const [rejectedChanges, setRejectedChanges] = _react3.useState.call(void 0, /* @__PURE__ */ new Set());
127
127
  const editorRef = _react3.useRef.call(void 0, null);
@@ -157,7 +157,7 @@ function BlockNoteEditor({
157
157
  const uploadImage = _react3.useCallback.call(void 0,
158
158
  async (file) => {
159
159
  if (!company) {
160
- _chunkPVN4DI3Hjs.errorToast.call(void 0, {
160
+ _chunkPFBYNJ2Rjs.errorToast.call(void 0, {
161
161
  title: t(`generic.errors.upload`),
162
162
  error: t(`generic.errors.upload_description`)
163
163
  });
@@ -380,4 +380,4 @@ _chunk7QVYU63Ejs.__name.call(void 0, BlockNoteEditor, "BlockNoteEditor");
380
380
 
381
381
 
382
382
  exports.default = BlockNoteEditor;
383
- //# sourceMappingURL=BlockNoteEditor-O32YPSNN.js.map
383
+ //# sourceMappingURL=BlockNoteEditor-PX5RPSZR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-O32YPSNN.js","../src/components/editors/BlockNoteEditor.tsx","../src/components/editors/BlockNoteEditorFormattingToolbar.tsx"],"names":["jsxs","jsx"],"mappings":"AAAA,ylBAAY;AACZ;AACE;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACF,sDAA4B;AAC5B;AACA;AClBA,uCAAyE;AACzE,yCAAiE;AACjE,2CAA8B;AAC9B,uCAAO;AACP,2CAAiC;AACjC,qCAAgC;AAChC,+BAAyE;ADoBzE;AACA;AE3BA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAOM,+CAAA;AAJD,SAAS,gCAAA,CAAA,EAAmC;AACjD,EAAA,uBACE,6BAAA;AAAA,IAAC,kCAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAmB,CAAA,EAAA,mBACjB,8BAAA,wBAAC,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,6BAAA,sBAAC,EAAA,CAAA,CAAA,EAAqB,iBAAmB,CAAA;AAAA,wBAEzC,6BAAA,wBAAC,EAAA,CAAA,CAAA,EAAuB,mBAAqB,CAAA;AAAA,wBAC7C,6BAAA,wBAAC,EAAA,CAAA,CAAA,EAAuB,mBAAqB,CAAA;AAAA,wBAE7C,6BAAA,2BAAC,EAAA,EAAqB,cAAA,EAAgB,OAAA,CAAA,EAAa,iBAAmB,CAAA;AAAA,wBACtE,6BAAA,2BAAC,EAAA,EAAqB,cAAA,EAAgB,SAAA,CAAA,EAAe,mBAAqB,CAAA;AAAA,wBAC1E,6BAAA,2BAAC,EAAA,EAAqB,cAAA,EAAgB,YAAA,CAAA,EAAkB,sBAAwB,CAAA;AAAA,wBAChF,6BAAA,2BAAC,EAAA,EAAqB,cAAA,EAAgB,SAAA,CAAA,EAAe,mBAAqB,CAAA;AAAA,wBAE1E,6BAAA,sBAAC,EAAA,EAAgB,aAAA,EAAe,OAAA,CAAA,EAAa,qBAAuB,CAAA;AAAA,wBACpE,6BAAA,sBAAC,EAAA,EAAgB,aAAA,EAAe,SAAA,CAAA,EAAe,uBAAyB,CAAA;AAAA,wBACxE,6BAAA,sBAAC,EAAA,EAAgB,aAAA,EAAe,QAAA,CAAA,EAAc,sBAAwB,CAAA;AAAA,wBAEtE,6BAAA,uBAAC,EAAA,CAAA,CAAA,EAAsB,kBAAoB;AAAA,MAAA,EAAA,CAC7C;AAAA,IAAA;AAAA,EAEJ,CAAA;AAEJ;AAxBgB,qCAAA,gCAAA,EAAA,kCAAA,CAAA;AFiDhB;AACA;ACbU;AAnBV,IAAM,mCAAA,kBAAqC,qCAAA,CACzC,kBAAA,EACA,kBAAA,EAAA,GACG;AACH,EAAA,OAAO,iDAAA;AAAA,IACL;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,OAAA,EAAS;AAAA,UACP,OAAA,EAAS;AAAA,QACX;AAAA,MACF,CAAA;AAAA,MACA,OAAA,EAAS;AAAA,IACX,CAAA;AAAA,IACA;AAAA,MACE,MAAA,kBAAQ,qCAAA,CAAC,KAAA,EAAA,GAAU;AACjB,QAAA,MAAM,QAAA,EAAU,KAAA,CAAM,aAAA,CAAc,KAAA,CAAM,OAAA;AAE1C,QAAA,uBACEA,8BAAAA,MAAC,EAAA,EAAK,SAAA,EAAU,yEAAA,EACd,QAAA,EAAA;AAAA,0BAAAC,6BAAAA;AAAA,YAAC,uBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,OAAA,EAAS,CAAC,CAAA,EAAA,GAAM;AACd,gBAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,gBAAA,CAAA,CAAE,eAAA,CAAgB,CAAA;AAClB,gBAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,EAAA,GAAe,kBAAA,CAAmB,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,cAC1E,CAAA;AAAA,cAEA,QAAA,kBAAAA,6BAAAA,sBAAC,EAAA,EAAU,SAAA,EAAU,yBAAA,CAAyB;AAAA,YAAA;AAAA,UAChD,CAAA;AAAA,0BACAA,6BAAAA;AAAA,YAAC,uBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,SAAA,EAAU,UAAA;AAAA,cACV,OAAA,EAAS,CAAC,CAAA,EAAA,GAAM;AACd,gBAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,gBAAA,CAAA,CAAE,eAAA,CAAgB,CAAA;AAClB,gBAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,EAAA,GAAe,kBAAA,CAAmB,EAAA,CAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,cAC1E,CAAA;AAAA,cAEA,QAAA,kBAAAA,6BAAAA,kBAAC,EAAA,EAAM,SAAA,EAAU,uBAAA,CAAuB;AAAA,YAAA;AAAA,UAC1C;AAAA,QAAA,EAAA,CACF,CAAA;AAAA,MAEJ,CAAA,EA5BQ,QAAA;AAAA,IA6BV;AAAA,EACF,CAAA;AACF,CAAA,EA9C2C,oCAAA,CAAA;AAgD5B,SAAR,eAAA,CAAiC;AAAA,EACtC,EAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,EAAA,EAAI,uCAAA,CAAgB;AAC1B,EAAA,MAAM,EAAE,QAAQ,EAAA,EAAI,oDAAA,CAAqC;AAEzD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,EAAA,EAAI,8BAAA,gBAAsB,IAAI,GAAA,CAAI,CAAC,CAAA;AAC7E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,EAAA,EAAI,8BAAA,gBAAsB,IAAI,GAAA,CAAI,CAAC,CAAA;AAE7E,EAAA,MAAM,UAAA,EAAY,4BAAA,IAA2B,CAAA;AAE7C,EAAA,MAAM,mBAAA,EAAqB,iCAAA,CAAa,MAAA,EAAA,GAAmB;AACzD,IAAA,kBAAA,CAAmB,CAAC,IAAA,EAAA,mBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,MAAM,CAAC,CAAC,CAAA;AACvD,IAAA,kBAAA,CAAmB,CAAC,IAAA,EAAA,GAAS;AAC3B,MAAA,MAAM,OAAA,EAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACpB,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,mBAAA,EAAqB,iCAAA,CAAa,MAAA,EAAA,GAAmB;AACzD,IAAA,kBAAA,CAAmB,CAAC,IAAA,EAAA,mBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,MAAM,CAAC,CAAC,CAAA;AACvD,IAAA,kBAAA,CAAmB,CAAC,IAAA,EAAA,GAAS;AAC3B,MAAA,MAAM,OAAA,EAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACpB,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,CAAC,CAAA;AAEL,EAAA,MAAM,yBAAA,EAA2B,6BAAA;AAAA,IAC/B,CAAA,EAAA,GAAM,kCAAA,CAAmC,kBAAA,EAAoB,kBAAkB,CAAA;AAAA,IAC/E,CAAC,kBAAA,EAAoB,kBAAkB;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,OAAA,EAAS,6BAAA;AAAA,IACb,CAAA,EAAA,GACE,qBAAA,CAAgB,MAAA,CAAO;AAAA,MACrB,kBAAA,EAAoB;AAAA,QAClB,GAAG,+BAAA;AAAA,QACH,WAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAQ,CAAA;AAAA,IACV,CAAC,wBAAwB;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,YAAA,EAAc,iCAAA;AAAA,IAClB,MAAA,CAAO,IAAA,EAAA,GAAgC;AACrC,MAAA,GAAA,CAAI,CAAC,OAAA,EAAS;AACZ,QAAA,yCAAA;AAAW,UACT,KAAA,EAAO,CAAA,CAAE,CAAA,qBAAA,CAAuB,CAAA;AAAA,UAChC,KAAA,EAAO,CAAA,CAAE,CAAA,iCAAA,CAAmC;AAAA,QAC9C,CAAC,CAAA;AACD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAE,CAAA,qBAAA,CAAuB,CAAC,CAAA;AAAA,MAC5C;AAEA,MAAA,MAAM,SAAA,EAAW,IAAA,CAAK,IAAA;AACtB,MAAA,MAAM,IAAA,EAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAEN,MAAA;AACtD,QAAA;AACa,QAAA;AACH,QAAA;AACX,MAAA;AAEmB,MAAA;AACV,QAAA;AACI,QAAA;AACN,QAAA;AACP,MAAA;AAE6D,MAAA;AAC5D,QAAA;AACU,QAAA;AACX,MAAA;AAEkB,MAAA;AACrB,IAAA;AACe,IAAA;AACjB,EAAA;AAGkC,EAAA;AACY,IAAA;AACC,MAAA;AAGR,MAAA;AAEV,MAAA;AAGC,MAAA;AACkB,QAAA;AAKtC,QAAA;AAIkB,QAAA;AACT,UAAA;AACN,QAAA;AACL,UAAA;AACF,QAAA;AACF,MAAA;AAEO,MAAA;AACT,IAAA;AACS,IAAA;AACX,EAAA;AAEuC,EAAA;AACF,IAAA;AAC7B,MAAA;AACwD,QAAA;AACP,QAAA;AACtC,UAAA;AACX,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACF,QAAA;AAC6C,QAAA;AAC/B,MAAA;AAC4C,QAAA;AAG5D,MAAA;AACF,IAAA;AAEqB,IAAA;AACX,MAAA;AACV,IAAA;AAEoC,IAAA;AAC1B,MAAA;AACV,IAAA;AAE6D,IAAA;AAC5D,EAAA;AACD,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACD,EAAA;AAE6C,EAAA;AACe,IAAA;AACG,MAAA;AACV,QAAA;AACf,QAAA;AAC1B,QAAA;AACR,MAAA;AAC2E,MAAA;AAC9E,IAAA;AACO,IAAA;AACY,EAAA;AAEN,EAAA;AACb,IAAA;AACS,MAAA;AACS,QAAA;AACoB,UAAA;AAClC,QAAA;AACA,QAAA;AACgB,QAAA;AACJ,QAAA;AACd,MAAA;AAC6D,MAAA;AAC/D,IAAA;AACF,EAAA;AAE6C,EAAA;AAC5B,IAAA;AACU,IAAA;AAEsC,IAAA;AAEL,IAAA;AACR,MAAA;AACnC,MAAA;AAC+C,MAAA;AACD,MAAA;AACI,MAAA;AACtD,QAAA;AACT,MAAA;AAEmB,MAAA;AACuC,QAAA;AACvB,QAAA;AACW,UAAA;AACa,YAAA;AAEN,cAAA;AACvB,cAAA;AACuB,gBAAA;AACM,gBAAA;AACxC,kBAAA;AACT,gBAAA;AACF,cAAA;AACF,YAAA;AACyC,YAAA;AACL,cAAA;AACmB,cAAA;AAC5C,gBAAA;AACT,cAAA;AACF,YAAA;AACuD,YAAA;AAChB,cAAA;AACY,gBAAA;AACjD,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACmC,MAAA;AACG,QAAA;AACa,UAAA;AACjD,QAAA;AACF,MAAA;AACO,MAAA;AACT,IAAA;AA3CS,IAAA;AA6Ce,IAAA;AACM,IAAA;AACuB,MAAA;AACrD,IAAA;AAEiE,IAAA;AACR,EAAA;AAGH,EAAA;AACT,IAAA;AADxB,EAAA;AAKsC,EAAA;AAC7C,EAAA;AACoC,IAAA;AACa,MAAA;AACf,MAAA;AACA,QAAA;AAC9C,MAAA;AAJoB,IAAA;AAOwC,IAAA;AACvB,MAAA;AACmB,MAAA;AAC1D,IAAA;AAC0B,EAAA;AAI6B,EAAA;AACzC,EAAA;AACoB,IAAA;AACU,IAAA;AACC,IAAA;AACK,IAAA;AACxB,IAAA;AACS,MAAA;AACjC,MAAA;AACF,IAAA;AACwE,IAAA;AACvC,IAAA;AACN,EAAA;AAGD,EAAA;AACL,IAAA;AACf,MAAA;AAEqD,QAAA;AACP,QAAA;AAC1B,UAAA;AACtB,QAAA;AAGkC,QAAA;AACpB,MAAA;AAC0C,QAAA;AAEpD,QAAA;AACoB,UAAA;AACC,UAAA;AACqB,YAAA;AACM,YAAA;AACd,YAAA;AACpC,UAAA;AACsB,QAAA;AAC2B,UAAA;AACnD,QAAA;AACF,MAAA;AACF,IAAA;AACO,IAAA;AACT,EAAA;AAGqC,EAAA;AAChC,IAAA;AAAA,IAAA;AACC,MAAA;AACU,MAAA;AACa,MAAA;AACJ,MAAA;AACb,MAAA;AACuD,MAAA;AAE5D,MAAA;AAAiC,IAAA;AAEtC,EAAA;AAEJ;AAtUwB;AD4S6C;AACA;AACA","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-O32YPSNN.js","sourcesContent":[null,"\"use client\";\n\nimport { BlockNoteSchema, defaultInlineContentSpecs, PartialBlock } from \"@blocknote/core\";\nimport { createReactInlineContentSpec, useCreateBlockNote } from \"@blocknote/react\";\nimport { BlockNoteView } from \"@blocknote/shadcn\";\nimport \"@blocknote/shadcn/style.css\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCurrentUserContext } from \"../../contexts\";\nimport { S3Interface } from \"../../features/s3/data\";\nimport { UserInterface } from \"../../features/user/data\";\nimport { S3Service } from \"../../features/s3/data/s3.service\";\nimport { Button } from \"../../shadcnui\";\nimport { BlockNoteDiffUtil, BlockNoteWordDiffRendererUtil, cn } from \"../../utils\";\nimport { errorToast } from \"../errors\";\nimport { BlockNoteEditorFormattingToolbar } from \"./BlockNoteEditorFormattingToolbar\";\n\nexport type BlockNoteEditorProps = {\n id: string;\n type: string;\n initialContent?: PartialBlock[];\n onChange?: (content: any, isEmpty: boolean, hasUnresolvedDiff: boolean) => void;\n size?: \"sm\" | \"md\";\n className?: string;\n markdownContent?: string;\n diffContent?: PartialBlock[];\n placeholder?: string;\n bordered?: boolean;\n};\n\nconst createDiffActionsInlineContentSpec = (\n handleAcceptChange: (diffId: string) => void,\n handleRejectChange: (diffId: string) => void,\n) => {\n return createReactInlineContentSpec(\n {\n type: \"diffActions\",\n propSchema: {\n diffIds: {\n default: \"\",\n },\n },\n content: \"none\",\n },\n {\n render: (props) => {\n const diffIds = props.inlineContent.props.diffIds;\n\n return (\n <span className=\"diff-actions-container mx-2 inline-flex items-center gap-1 align-middle\">\n <Button\n title=\"Accept change\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleAcceptChange(id.trim()));\n }}\n >\n <CheckIcon className=\"h-3 w-3 text-green-600\" />\n </Button>\n <Button\n title=\"Reject change\"\n className=\"mx-2 p-0\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleRejectChange(id.trim()));\n }}\n >\n <XIcon className=\"h-3 w-3 text-red-600\" />\n </Button>\n </span>\n );\n },\n },\n );\n};\n\nexport default function BlockNoteEditor({\n id,\n type,\n initialContent,\n onChange,\n size,\n className,\n markdownContent,\n diffContent,\n placeholder,\n bordered,\n}: BlockNoteEditorProps): React.JSX.Element {\n const t = useTranslations();\n const { company } = useCurrentUserContext<UserInterface>();\n\n const [acceptedChanges, setAcceptedChanges] = useState<Set<string>>(new Set());\n const [rejectedChanges, setRejectedChanges] = useState<Set<string>>(new Set());\n\n const editorRef = useRef<HTMLDivElement>(null);\n\n const handleAcceptChange = useCallback((diffId: string) => {\n setAcceptedChanges((prev) => new Set([...prev, diffId]));\n setRejectedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const handleRejectChange = useCallback((diffId: string) => {\n setRejectedChanges((prev) => new Set([...prev, diffId]));\n setAcceptedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const DiffActionsInlineContent = useMemo(\n () => createDiffActionsInlineContentSpec(handleAcceptChange, handleRejectChange),\n [handleAcceptChange, handleRejectChange],\n );\n\n const schema = useMemo(\n () =>\n BlockNoteSchema.create({\n inlineContentSpecs: {\n ...defaultInlineContentSpecs,\n diffActions: DiffActionsInlineContent,\n },\n } as any),\n [DiffActionsInlineContent],\n );\n\n const uploadImage = useCallback(\n async (file: File): Promise<string> => {\n if (!company) {\n errorToast({\n title: t(`generic.errors.upload`),\n error: t(`generic.errors.upload_description`),\n });\n throw new Error(t(`generic.errors.upload`));\n }\n\n const fileType = file.type;\n const key = `companies/${company.id}/${type}/${id}/${file.name}`;\n\n const s3: S3Interface = await S3Service.getPreSignedUrl({\n key: key,\n contentType: fileType,\n isPublic: true,\n });\n\n await fetch(s3.url, {\n method: \"PUT\",\n headers: s3.headers,\n body: file,\n });\n\n const signedImage: S3Interface = await S3Service.getSignedUrl({\n key: key,\n isPublic: true,\n });\n\n return signedImage.url;\n },\n [company, id, t],\n );\n\n // Utility: Remove trailing empty blocks for read-only display\n const removeTrailingEmptyBlocks = useCallback(\n (blocks: PartialBlock[]): PartialBlock[] => {\n if (!blocks || blocks.length === 0) return blocks;\n\n // Only remove trailing empty blocks in read-only mode\n if (onChange !== undefined) return blocks;\n\n const result = [...blocks];\n\n // Remove trailing empty paragraph blocks, but keep at least one block\n while (result.length > 1) {\n const lastBlock = result[result.length - 1];\n\n // Check if it's an empty paragraph\n const isEmptyParagraph =\n lastBlock.type === \"paragraph\" &&\n (!lastBlock.content ||\n lastBlock.content.length === 0 ||\n (Array.isArray(lastBlock.content) && lastBlock.content.every((c: any) => !c.text || c.text.trim() === \"\")));\n\n if (isEmptyParagraph) {\n result.pop();\n } else {\n break;\n }\n }\n\n return result;\n },\n [onChange],\n );\n\n const processedContent = useMemo(() => {\n if (diffContent && initialContent) {\n try {\n const diffResult = BlockNoteDiffUtil.diff(initialContent, diffContent);\n const renderedDiff = BlockNoteWordDiffRendererUtil.renderWordDiffs(\n diffResult.blocks,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n );\n return removeTrailingEmptyBlocks(renderedDiff);\n } catch (error) {\n return initialContent && Array.isArray(initialContent) && initialContent.length > 0\n ? removeTrailingEmptyBlocks(initialContent)\n : [];\n }\n }\n\n if (!initialContent) {\n return [];\n }\n\n if (!Array.isArray(initialContent)) {\n return [];\n }\n\n return initialContent.length > 0 ? removeTrailingEmptyBlocks(initialContent) : [];\n }, [\n initialContent,\n diffContent,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n removeTrailingEmptyBlocks,\n ]);\n\n const validatedInitialContent = useMemo(() => {\n if (processedContent && Array.isArray(processedContent) && processedContent.length > 0) {\n const validatedContent = processedContent.filter((block) => {\n if (!block || typeof block !== \"object\") return false;\n if (!(block as any).type) return false;\n return true;\n });\n return validatedContent.length > 0 ? (validatedContent as PartialBlock[]) : undefined;\n }\n return undefined;\n }, [processedContent]);\n\n const editor = useCreateBlockNote(\n useMemo(\n () => ({\n placeholders: {\n emptyDocument: placeholder || t(`generic.blocknote.placeholder`),\n },\n schema,\n initialContent: validatedInitialContent,\n uploadFile: uploadImage,\n }),\n [placeholder, t, schema, validatedInitialContent, uploadImage],\n ),\n );\n\n const handleChange = useCallback(async () => {\n if (!onChange) return;\n const newBlocks = editor.document;\n\n const markdownFromBlocks = (await editor.blocksToMarkdownLossy(editor.document)).trim();\n\n function hasUnresolvedDiffsRecursive(block: any): boolean {\n if (!block || typeof block !== \"object\") return false;\n let diffId = undefined;\n if (block.props && block.props.diffId) diffId = block.props.diffId;\n if (!diffId && block.attrs && block.attrs.diffId) diffId = block.attrs.diffId;\n if (diffId && !acceptedChanges.has(diffId) && !rejectedChanges.has(diffId)) {\n return true;\n }\n\n if (block.content) {\n const contentArr = Array.isArray(block.content) ? block.content : [block.content];\n for (const inline of contentArr) {\n if (inline && typeof inline === \"object\") {\n if (inline.type === \"diffActions\" && inline.props && inline.props.diffIds) {\n const ids =\n typeof inline.props.diffIds === \"string\" ? inline.props.diffIds.split(\",\") : inline.props.diffIds;\n for (const id of ids) {\n const trimmed = (id || \"\").toString().trim();\n if (trimmed && !acceptedChanges.has(trimmed) && !rejectedChanges.has(trimmed)) {\n return true;\n }\n }\n }\n if (inline.props && inline.props.diffId) {\n const diffIdInline = inline.props.diffId;\n if (diffIdInline && !acceptedChanges.has(diffIdInline) && !rejectedChanges.has(diffIdInline)) {\n return true;\n }\n }\n if (inline.children && Array.isArray(inline.children)) {\n for (const child of inline.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n }\n }\n }\n if (Array.isArray(block.children)) {\n for (const child of block.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n return false;\n }\n\n let hasUnresolvedDiff = false;\n if (Array.isArray(newBlocks)) {\n hasUnresolvedDiff = newBlocks.some((block: any) => hasUnresolvedDiffsRecursive(block));\n }\n\n onChange(newBlocks, !markdownFromBlocks.length, hasUnresolvedDiff);\n }, [editor, onChange, id, acceptedChanges, rejectedChanges]);\n\n // Utility: deep equality for arrays of blocks\n const areBlocksEqual = (a: any[], b: any[]): boolean => {\n return JSON.stringify(a) === JSON.stringify(b);\n };\n\n // Only initialize from markdownContent once per value, and only if different\n const hasInitializedFromMarkdown = useRef<string | null>(null);\n useEffect(() => {\n const updateContent = async (markdown: string) => {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n if (!areBlocksEqual(blocks, editor.document)) {\n editor.replaceBlocks(editor.document, blocks);\n }\n };\n\n if (markdownContent && hasInitializedFromMarkdown.current !== markdownContent) {\n hasInitializedFromMarkdown.current = markdownContent;\n updateContent(markdownContent).then(() => handleChange());\n }\n }, [markdownContent, editor]);\n\n // Update editor content when diff content changes, but only if different\n // Prevent unnecessary replaceBlocks calls that reset scroll/cursor.\n const previousContentHashRef = useRef<string | null>(null);\n useEffect(() => {\n if (!processedContent || !editor) return;\n const hash = JSON.stringify(processedContent);\n if (previousContentHashRef.current === hash) return; // no changes\n const currentHash = JSON.stringify(editor.document);\n if (currentHash === hash) {\n previousContentHashRef.current = hash;\n return; // already in sync\n }\n editor.replaceBlocks(editor.document, processedContent as PartialBlock[]);\n previousContentHashRef.current = hash;\n }, [processedContent, editor]);\n\n // Handle audio received from whisper transcription\n const handleAudioReceived = useCallback(\n (message: string) => {\n try {\n // Ensure the editor has focus\n const editorElement = editorRef.current?.querySelector('[contenteditable=\"true\"]') as HTMLElement;\n if (editorElement && document.activeElement !== editorElement) {\n editorElement.focus();\n }\n\n // Insert the transcribed text at the current cursor position\n editor.insertInlineContent(message);\n } catch (error) {\n console.error(\"Error inserting transcribed text:\", error);\n // Fallback: try to insert at the end of the document\n try {\n const blocks = editor.document;\n if (blocks.length > 0) {\n const lastBlock = blocks[blocks.length - 1];\n editor.setTextCursorPosition(lastBlock.id, \"end\");\n editor.insertInlineContent(message);\n }\n } catch (fallbackError) {\n console.error(\"Fallback insertion also failed:\", fallbackError);\n }\n }\n },\n [editor],\n );\n\n return (\n <div ref={editorRef} className={cn(bordered ? \"rounded-md border\" : \"\", \"w-full\")}>\n <BlockNoteView\n editor={editor}\n onChange={handleChange}\n editable={onChange !== undefined}\n formattingToolbar={false}\n theme=\"light\"\n className={cn(`BlockNoteView ${onChange ? \"min-h-96 p-4\" : \"\"}`, className, size === \"sm\" && \"small\")}\n >\n <BlockNoteEditorFormattingToolbar />\n </BlockNoteView>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n BasicTextStyleButton,\n BlockTypeSelect,\n CreateLinkButton,\n FileCaptionButton,\n FileReplaceButton,\n FormattingToolbar,\n FormattingToolbarController,\n TextAlignButton,\n} from \"@blocknote/react\";\n\nexport function BlockNoteEditorFormattingToolbar() {\n return (\n <FormattingToolbarController\n formattingToolbar={() => (\n <FormattingToolbar>\n <BlockTypeSelect key={\"blockTypeSelect\"} />\n\n <FileCaptionButton key={\"fileCaptionButton\"} />\n <FileReplaceButton key={\"replaceFileButton\"} />\n\n <BasicTextStyleButton basicTextStyle={\"bold\"} key={\"boldStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"italic\"} key={\"italicStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"underline\"} key={\"underlineStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"strike\"} key={\"strikeStyleButton\"} />\n\n <TextAlignButton textAlignment={\"left\"} key={\"textAlignLeftButton\"} />\n <TextAlignButton textAlignment={\"center\"} key={\"textAlignCenterButton\"} />\n <TextAlignButton textAlignment={\"right\"} key={\"textAlignRightButton\"} />\n\n <CreateLinkButton key={\"createLinkButton\"} />\n </FormattingToolbar>\n )}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-PX5RPSZR.js","../src/components/editors/BlockNoteEditor.tsx","../src/components/editors/BlockNoteEditorFormattingToolbar.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/nextjs-jsonapi/nextjs-jsonapi/dist/BlockNoteEditor-PX5RPSZR.js","sourcesContent":[null,"\"use client\";\n\nimport { BlockNoteSchema, defaultInlineContentSpecs, PartialBlock } from \"@blocknote/core\";\nimport { createReactInlineContentSpec, useCreateBlockNote } from \"@blocknote/react\";\nimport { BlockNoteView } from \"@blocknote/shadcn\";\nimport \"@blocknote/shadcn/style.css\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\nimport { useTranslations } from \"next-intl\";\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useCurrentUserContext } from \"../../contexts\";\nimport { S3Interface } from \"../../features/s3/data\";\nimport { UserInterface } from \"../../features/user/data\";\nimport { S3Service } from \"../../features/s3/data/s3.service\";\nimport { Button } from \"../../shadcnui\";\nimport { BlockNoteDiffUtil, BlockNoteWordDiffRendererUtil, cn } from \"../../utils\";\nimport { errorToast } from \"../errors\";\nimport { BlockNoteEditorFormattingToolbar } from \"./BlockNoteEditorFormattingToolbar\";\n\nexport type BlockNoteEditorProps = {\n id: string;\n type: string;\n initialContent?: PartialBlock[];\n onChange?: (content: any, isEmpty: boolean, hasUnresolvedDiff: boolean) => void;\n size?: \"sm\" | \"md\";\n className?: string;\n markdownContent?: string;\n diffContent?: PartialBlock[];\n placeholder?: string;\n bordered?: boolean;\n};\n\nconst createDiffActionsInlineContentSpec = (\n handleAcceptChange: (diffId: string) => void,\n handleRejectChange: (diffId: string) => void,\n) => {\n return createReactInlineContentSpec(\n {\n type: \"diffActions\",\n propSchema: {\n diffIds: {\n default: \"\",\n },\n },\n content: \"none\",\n },\n {\n render: (props) => {\n const diffIds = props.inlineContent.props.diffIds;\n\n return (\n <span className=\"diff-actions-container mx-2 inline-flex items-center gap-1 align-middle\">\n <Button\n title=\"Accept change\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleAcceptChange(id.trim()));\n }}\n >\n <CheckIcon className=\"h-3 w-3 text-green-600\" />\n </Button>\n <Button\n title=\"Reject change\"\n className=\"mx-2 p-0\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n diffIds.split(\",\").forEach((id: string) => handleRejectChange(id.trim()));\n }}\n >\n <XIcon className=\"h-3 w-3 text-red-600\" />\n </Button>\n </span>\n );\n },\n },\n );\n};\n\nexport default function BlockNoteEditor({\n id,\n type,\n initialContent,\n onChange,\n size,\n className,\n markdownContent,\n diffContent,\n placeholder,\n bordered,\n}: BlockNoteEditorProps): React.JSX.Element {\n const t = useTranslations();\n const { company } = useCurrentUserContext<UserInterface>();\n\n const [acceptedChanges, setAcceptedChanges] = useState<Set<string>>(new Set());\n const [rejectedChanges, setRejectedChanges] = useState<Set<string>>(new Set());\n\n const editorRef = useRef<HTMLDivElement>(null);\n\n const handleAcceptChange = useCallback((diffId: string) => {\n setAcceptedChanges((prev) => new Set([...prev, diffId]));\n setRejectedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const handleRejectChange = useCallback((diffId: string) => {\n setRejectedChanges((prev) => new Set([...prev, diffId]));\n setAcceptedChanges((prev) => {\n const newSet = new Set(prev);\n newSet.delete(diffId);\n return newSet;\n });\n }, []);\n\n const DiffActionsInlineContent = useMemo(\n () => createDiffActionsInlineContentSpec(handleAcceptChange, handleRejectChange),\n [handleAcceptChange, handleRejectChange],\n );\n\n const schema = useMemo(\n () =>\n BlockNoteSchema.create({\n inlineContentSpecs: {\n ...defaultInlineContentSpecs,\n diffActions: DiffActionsInlineContent,\n },\n } as any),\n [DiffActionsInlineContent],\n );\n\n const uploadImage = useCallback(\n async (file: File): Promise<string> => {\n if (!company) {\n errorToast({\n title: t(`generic.errors.upload`),\n error: t(`generic.errors.upload_description`),\n });\n throw new Error(t(`generic.errors.upload`));\n }\n\n const fileType = file.type;\n const key = `companies/${company.id}/${type}/${id}/${file.name}`;\n\n const s3: S3Interface = await S3Service.getPreSignedUrl({\n key: key,\n contentType: fileType,\n isPublic: true,\n });\n\n await fetch(s3.url, {\n method: \"PUT\",\n headers: s3.headers,\n body: file,\n });\n\n const signedImage: S3Interface = await S3Service.getSignedUrl({\n key: key,\n isPublic: true,\n });\n\n return signedImage.url;\n },\n [company, id, t],\n );\n\n // Utility: Remove trailing empty blocks for read-only display\n const removeTrailingEmptyBlocks = useCallback(\n (blocks: PartialBlock[]): PartialBlock[] => {\n if (!blocks || blocks.length === 0) return blocks;\n\n // Only remove trailing empty blocks in read-only mode\n if (onChange !== undefined) return blocks;\n\n const result = [...blocks];\n\n // Remove trailing empty paragraph blocks, but keep at least one block\n while (result.length > 1) {\n const lastBlock = result[result.length - 1];\n\n // Check if it's an empty paragraph\n const isEmptyParagraph =\n lastBlock.type === \"paragraph\" &&\n (!lastBlock.content ||\n lastBlock.content.length === 0 ||\n (Array.isArray(lastBlock.content) && lastBlock.content.every((c: any) => !c.text || c.text.trim() === \"\")));\n\n if (isEmptyParagraph) {\n result.pop();\n } else {\n break;\n }\n }\n\n return result;\n },\n [onChange],\n );\n\n const processedContent = useMemo(() => {\n if (diffContent && initialContent) {\n try {\n const diffResult = BlockNoteDiffUtil.diff(initialContent, diffContent);\n const renderedDiff = BlockNoteWordDiffRendererUtil.renderWordDiffs(\n diffResult.blocks,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n );\n return removeTrailingEmptyBlocks(renderedDiff);\n } catch (error) {\n return initialContent && Array.isArray(initialContent) && initialContent.length > 0\n ? removeTrailingEmptyBlocks(initialContent)\n : [];\n }\n }\n\n if (!initialContent) {\n return [];\n }\n\n if (!Array.isArray(initialContent)) {\n return [];\n }\n\n return initialContent.length > 0 ? removeTrailingEmptyBlocks(initialContent) : [];\n }, [\n initialContent,\n diffContent,\n handleAcceptChange,\n handleRejectChange,\n acceptedChanges,\n rejectedChanges,\n removeTrailingEmptyBlocks,\n ]);\n\n const validatedInitialContent = useMemo(() => {\n if (processedContent && Array.isArray(processedContent) && processedContent.length > 0) {\n const validatedContent = processedContent.filter((block) => {\n if (!block || typeof block !== \"object\") return false;\n if (!(block as any).type) return false;\n return true;\n });\n return validatedContent.length > 0 ? (validatedContent as PartialBlock[]) : undefined;\n }\n return undefined;\n }, [processedContent]);\n\n const editor = useCreateBlockNote(\n useMemo(\n () => ({\n placeholders: {\n emptyDocument: placeholder || t(`generic.blocknote.placeholder`),\n },\n schema,\n initialContent: validatedInitialContent,\n uploadFile: uploadImage,\n }),\n [placeholder, t, schema, validatedInitialContent, uploadImage],\n ),\n );\n\n const handleChange = useCallback(async () => {\n if (!onChange) return;\n const newBlocks = editor.document;\n\n const markdownFromBlocks = (await editor.blocksToMarkdownLossy(editor.document)).trim();\n\n function hasUnresolvedDiffsRecursive(block: any): boolean {\n if (!block || typeof block !== \"object\") return false;\n let diffId = undefined;\n if (block.props && block.props.diffId) diffId = block.props.diffId;\n if (!diffId && block.attrs && block.attrs.diffId) diffId = block.attrs.diffId;\n if (diffId && !acceptedChanges.has(diffId) && !rejectedChanges.has(diffId)) {\n return true;\n }\n\n if (block.content) {\n const contentArr = Array.isArray(block.content) ? block.content : [block.content];\n for (const inline of contentArr) {\n if (inline && typeof inline === \"object\") {\n if (inline.type === \"diffActions\" && inline.props && inline.props.diffIds) {\n const ids =\n typeof inline.props.diffIds === \"string\" ? inline.props.diffIds.split(\",\") : inline.props.diffIds;\n for (const id of ids) {\n const trimmed = (id || \"\").toString().trim();\n if (trimmed && !acceptedChanges.has(trimmed) && !rejectedChanges.has(trimmed)) {\n return true;\n }\n }\n }\n if (inline.props && inline.props.diffId) {\n const diffIdInline = inline.props.diffId;\n if (diffIdInline && !acceptedChanges.has(diffIdInline) && !rejectedChanges.has(diffIdInline)) {\n return true;\n }\n }\n if (inline.children && Array.isArray(inline.children)) {\n for (const child of inline.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n }\n }\n }\n if (Array.isArray(block.children)) {\n for (const child of block.children) {\n if (hasUnresolvedDiffsRecursive(child)) return true;\n }\n }\n return false;\n }\n\n let hasUnresolvedDiff = false;\n if (Array.isArray(newBlocks)) {\n hasUnresolvedDiff = newBlocks.some((block: any) => hasUnresolvedDiffsRecursive(block));\n }\n\n onChange(newBlocks, !markdownFromBlocks.length, hasUnresolvedDiff);\n }, [editor, onChange, id, acceptedChanges, rejectedChanges]);\n\n // Utility: deep equality for arrays of blocks\n const areBlocksEqual = (a: any[], b: any[]): boolean => {\n return JSON.stringify(a) === JSON.stringify(b);\n };\n\n // Only initialize from markdownContent once per value, and only if different\n const hasInitializedFromMarkdown = useRef<string | null>(null);\n useEffect(() => {\n const updateContent = async (markdown: string) => {\n const blocks = await editor.tryParseMarkdownToBlocks(markdown);\n if (!areBlocksEqual(blocks, editor.document)) {\n editor.replaceBlocks(editor.document, blocks);\n }\n };\n\n if (markdownContent && hasInitializedFromMarkdown.current !== markdownContent) {\n hasInitializedFromMarkdown.current = markdownContent;\n updateContent(markdownContent).then(() => handleChange());\n }\n }, [markdownContent, editor]);\n\n // Update editor content when diff content changes, but only if different\n // Prevent unnecessary replaceBlocks calls that reset scroll/cursor.\n const previousContentHashRef = useRef<string | null>(null);\n useEffect(() => {\n if (!processedContent || !editor) return;\n const hash = JSON.stringify(processedContent);\n if (previousContentHashRef.current === hash) return; // no changes\n const currentHash = JSON.stringify(editor.document);\n if (currentHash === hash) {\n previousContentHashRef.current = hash;\n return; // already in sync\n }\n editor.replaceBlocks(editor.document, processedContent as PartialBlock[]);\n previousContentHashRef.current = hash;\n }, [processedContent, editor]);\n\n // Handle audio received from whisper transcription\n const handleAudioReceived = useCallback(\n (message: string) => {\n try {\n // Ensure the editor has focus\n const editorElement = editorRef.current?.querySelector('[contenteditable=\"true\"]') as HTMLElement;\n if (editorElement && document.activeElement !== editorElement) {\n editorElement.focus();\n }\n\n // Insert the transcribed text at the current cursor position\n editor.insertInlineContent(message);\n } catch (error) {\n console.error(\"Error inserting transcribed text:\", error);\n // Fallback: try to insert at the end of the document\n try {\n const blocks = editor.document;\n if (blocks.length > 0) {\n const lastBlock = blocks[blocks.length - 1];\n editor.setTextCursorPosition(lastBlock.id, \"end\");\n editor.insertInlineContent(message);\n }\n } catch (fallbackError) {\n console.error(\"Fallback insertion also failed:\", fallbackError);\n }\n }\n },\n [editor],\n );\n\n return (\n <div ref={editorRef} className={cn(bordered ? \"rounded-md border\" : \"\", \"w-full\")}>\n <BlockNoteView\n editor={editor}\n onChange={handleChange}\n editable={onChange !== undefined}\n formattingToolbar={false}\n theme=\"light\"\n className={cn(`BlockNoteView ${onChange ? \"min-h-96 p-4\" : \"\"}`, className, size === \"sm\" && \"small\")}\n >\n <BlockNoteEditorFormattingToolbar />\n </BlockNoteView>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n BasicTextStyleButton,\n BlockTypeSelect,\n CreateLinkButton,\n FileCaptionButton,\n FileReplaceButton,\n FormattingToolbar,\n FormattingToolbarController,\n TextAlignButton,\n} from \"@blocknote/react\";\n\nexport function BlockNoteEditorFormattingToolbar() {\n return (\n <FormattingToolbarController\n formattingToolbar={() => (\n <FormattingToolbar>\n <BlockTypeSelect key={\"blockTypeSelect\"} />\n\n <FileCaptionButton key={\"fileCaptionButton\"} />\n <FileReplaceButton key={\"replaceFileButton\"} />\n\n <BasicTextStyleButton basicTextStyle={\"bold\"} key={\"boldStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"italic\"} key={\"italicStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"underline\"} key={\"underlineStyleButton\"} />\n <BasicTextStyleButton basicTextStyle={\"strike\"} key={\"strikeStyleButton\"} />\n\n <TextAlignButton textAlignment={\"left\"} key={\"textAlignLeftButton\"} />\n <TextAlignButton textAlignment={\"center\"} key={\"textAlignCenterButton\"} />\n <TextAlignButton textAlignment={\"right\"} key={\"textAlignRightButton\"} />\n\n <CreateLinkButton key={\"createLinkButton\"} />\n </FormattingToolbar>\n )}\n />\n );\n}\n"]}
@@ -3,7 +3,7 @@ import {
3
3
  Button,
4
4
  errorToast,
5
5
  useCurrentUserContext
6
- } from "./chunk-YHUK7PFT.mjs";
6
+ } from "./chunk-AEZWDB5X.mjs";
7
7
  import "./chunk-33UYFFIK.mjs";
8
8
  import {
9
9
  BlockNoteDiffUtil,
@@ -380,4 +380,4 @@ __name(BlockNoteEditor, "BlockNoteEditor");
380
380
  export {
381
381
  BlockNoteEditor as default
382
382
  };
383
- //# sourceMappingURL=BlockNoteEditor-MXNV2O43.mjs.map
383
+ //# sourceMappingURL=BlockNoteEditor-TF7MR7IP.mjs.map
@@ -7594,7 +7594,7 @@ __name(AllowedUsersDetails, "AllowedUsersDetails");
7594
7594
  import dynamic from "next/dynamic";
7595
7595
  import React37 from "react";
7596
7596
  import { jsx as jsx96 } from "react/jsx-runtime";
7597
- var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-MXNV2O43.mjs"), {
7597
+ var BlockNoteEditor = dynamic(() => import("./BlockNoteEditor-TF7MR7IP.mjs"), {
7598
7598
  ssr: false
7599
7599
  });
7600
7600
  var BlockNoteEditorContainer = React37.memo(/* @__PURE__ */ __name(function EditorContainer(props) {
@@ -9458,16 +9458,27 @@ function PageContainerContentDetails({ items, section, module, id }) {
9458
9458
  __name(PageContainerContentDetails, "PageContainerContentDetails");
9459
9459
 
9460
9460
  // src/components/pages/PageContentContainer.tsx
9461
+ import { useEffect as useEffect29, useState as useState37 } from "react";
9461
9462
  import { jsx as jsx121, jsxs as jsxs73 } from "react/jsx-runtime";
9462
9463
  function PageContentContainer({ details, footer, content }) {
9463
- return /* @__PURE__ */ jsx121("div", { className: "flex h-[calc(100vh-(--spacing(16)))] w-full", children: /* @__PURE__ */ jsxs73(ResizablePanelGroup, { direction: "horizontal", className: "items-stretch", autoSaveId: "page-content-layout", children: [
9464
- /* @__PURE__ */ jsx121(ResizablePanel, { id: "left-panel", defaultSize: 32, minSize: 20, maxSize: 40, children: /* @__PURE__ */ jsxs73("div", { className: "@container flex h-full flex-col pr-4", children: [
9465
- /* @__PURE__ */ jsx121("div", { className: "flex-1 overflow-y-auto", children: details }),
9466
- footer && /* @__PURE__ */ jsx121("div", { className: "flex flex-col gap-y-2 pt-2 pb-2", children: footer })
9467
- ] }) }),
9468
- /* @__PURE__ */ jsx121(ResizableHandle, { withHandle: true }),
9469
- /* @__PURE__ */ jsx121(ResizablePanel, { id: "right-panel", className: "pl-4", children: /* @__PURE__ */ jsx121("div", { className: "h-full overflow-y-auto", children: content }) })
9470
- ] }) });
9464
+ const [mounted, setMounted] = useState37(false);
9465
+ useEffect29(() => {
9466
+ setMounted(true);
9467
+ }, []);
9468
+ return /* @__PURE__ */ jsx121(
9469
+ "div",
9470
+ {
9471
+ className: `flex h-[calc(100vh-(--spacing(16)))] w-full transition-opacity duration-150 ${mounted ? "opacity-100" : "opacity-0"}`,
9472
+ children: /* @__PURE__ */ jsxs73(ResizablePanelGroup, { direction: "horizontal", className: "items-stretch", autoSaveId: "page-content-layout", children: [
9473
+ /* @__PURE__ */ jsx121(ResizablePanel, { id: "left-panel", defaultSize: 32, minSize: 20, maxSize: 40, children: /* @__PURE__ */ jsxs73("div", { className: "@container flex h-full flex-col pr-4", children: [
9474
+ /* @__PURE__ */ jsx121("div", { className: "flex-1 overflow-y-auto", children: details }),
9475
+ footer && /* @__PURE__ */ jsx121("div", { className: "flex flex-col gap-y-2 pt-2 pb-2", children: footer })
9476
+ ] }) }),
9477
+ /* @__PURE__ */ jsx121(ResizableHandle, { withHandle: true }),
9478
+ /* @__PURE__ */ jsx121(ResizablePanel, { id: "right-panel", className: "pl-4", children: /* @__PURE__ */ jsx121("div", { className: "h-full overflow-y-auto", children: content }) })
9479
+ ] })
9480
+ }
9481
+ );
9471
9482
  }
9472
9483
  __name(PageContentContainer, "PageContentContainer");
9473
9484
 
@@ -9562,10 +9573,10 @@ function useJsonApiConfigOptional() {
9562
9573
  __name(useJsonApiConfigOptional, "useJsonApiConfigOptional");
9563
9574
 
9564
9575
  // src/client/context/JsonApiProvider.tsx
9565
- import { useEffect as useEffect29, useMemo as useMemo10 } from "react";
9576
+ import { useEffect as useEffect30, useMemo as useMemo10 } from "react";
9566
9577
  import { jsx as jsx126 } from "react/jsx-runtime";
9567
9578
  function JsonApiProvider({ config, children }) {
9568
- useEffect29(() => {
9579
+ useEffect30(() => {
9569
9580
  if (config.bootstrapper) {
9570
9581
  config.bootstrapper();
9571
9582
  }
@@ -9576,12 +9587,12 @@ function JsonApiProvider({ config, children }) {
9576
9587
  __name(JsonApiProvider, "JsonApiProvider");
9577
9588
 
9578
9589
  // src/client/hooks/useJsonApiGet.ts
9579
- import { useState as useState37, useEffect as useEffect30, useCallback as useCallback13, useRef as useRef13 } from "react";
9590
+ import { useState as useState38, useEffect as useEffect31, useCallback as useCallback13, useRef as useRef13 } from "react";
9580
9591
  function useJsonApiGet(params) {
9581
- const [data, setData] = useState37(null);
9582
- const [loading, setLoading] = useState37(false);
9583
- const [error, setError] = useState37(null);
9584
- const [response, setResponse] = useState37(null);
9592
+ const [data, setData] = useState38(null);
9593
+ const [loading, setLoading] = useState38(false);
9594
+ const [error, setError] = useState38(null);
9595
+ const [response, setResponse] = useState38(null);
9585
9596
  const isMounted = useRef13(true);
9586
9597
  const fetchData = useCallback13(async () => {
9587
9598
  if (params.options?.enabled === false) return;
@@ -9654,7 +9665,7 @@ function useJsonApiGet(params) {
9654
9665
  }
9655
9666
  }
9656
9667
  }, [response]);
9657
- useEffect30(() => {
9668
+ useEffect31(() => {
9658
9669
  isMounted.current = true;
9659
9670
  fetchData();
9660
9671
  return () => {
@@ -9676,12 +9687,12 @@ function useJsonApiGet(params) {
9676
9687
  __name(useJsonApiGet, "useJsonApiGet");
9677
9688
 
9678
9689
  // src/client/hooks/useJsonApiMutation.ts
9679
- import { useState as useState38, useCallback as useCallback14 } from "react";
9690
+ import { useState as useState39, useCallback as useCallback14 } from "react";
9680
9691
  function useJsonApiMutation(config) {
9681
- const [data, setData] = useState38(null);
9682
- const [loading, setLoading] = useState38(false);
9683
- const [error, setError] = useState38(null);
9684
- const [response, setResponse] = useState38(null);
9692
+ const [data, setData] = useState39(null);
9693
+ const [loading, setLoading] = useState39(false);
9694
+ const [error, setError] = useState39(null);
9695
+ const [response, setResponse] = useState39(null);
9685
9696
  const reset = useCallback14(() => {
9686
9697
  setData(null);
9687
9698
  setLoading(false);
@@ -9906,11 +9917,11 @@ var useRoleTableStructure = /* @__PURE__ */ __name((params) => {
9906
9917
  }, "useRoleTableStructure");
9907
9918
 
9908
9919
  // src/features/user/hooks/useUserSearch.ts
9909
- import { useCallback as useCallback15, useEffect as useEffect31, useRef as useRef14, useState as useState39 } from "react";
9920
+ import { useCallback as useCallback15, useEffect as useEffect32, useRef as useRef14, useState as useState40 } from "react";
9910
9921
  var useUserSearch = /* @__PURE__ */ __name(() => {
9911
- const [users, setUsers] = useState39([]);
9912
- const [searchQuery, setSearchQuery] = useState39("");
9913
- const [isLoading, setIsLoading] = useState39(false);
9922
+ const [users, setUsers] = useState40([]);
9923
+ const [searchQuery, setSearchQuery] = useState40("");
9924
+ const [isLoading, setIsLoading] = useState40(false);
9914
9925
  const searchQueryRef = useRef14("");
9915
9926
  const loadUsers = useCallback15(
9916
9927
  async (search) => {
@@ -9929,7 +9940,7 @@ var useUserSearch = /* @__PURE__ */ __name(() => {
9929
9940
  [users.length]
9930
9941
  );
9931
9942
  const debouncedLoadUsers = useDebounce(loadUsers, 500);
9932
- useEffect31(() => {
9943
+ useEffect32(() => {
9933
9944
  if (searchQuery !== searchQueryRef.current) {
9934
9945
  setIsLoading(true);
9935
9946
  debouncedLoadUsers(searchQuery);
@@ -10165,15 +10176,15 @@ import { memo, useMemo as useMemo16 } from "react";
10165
10176
  // src/components/tables/ContentTableSearch.tsx
10166
10177
  import { RefreshCw, Search, X } from "lucide-react";
10167
10178
  import { useTranslations as useTranslations45 } from "next-intl";
10168
- import { useCallback as useCallback16, useEffect as useEffect32, useRef as useRef15, useState as useState40 } from "react";
10179
+ import { useCallback as useCallback16, useEffect as useEffect33, useRef as useRef15, useState as useState41 } from "react";
10169
10180
  import { jsx as jsx131, jsxs as jsxs76 } from "react/jsx-runtime";
10170
10181
  function ContentTableSearch({ data }) {
10171
10182
  const t = useTranslations45();
10172
10183
  const searchTermRef = useRef15("");
10173
10184
  const inputRef = useRef15(null);
10174
- const [searchTerm, setSearchTerm] = useState40("");
10175
- const [isFocused, setIsFocused] = useState40(false);
10176
- const [isSearching, setIsSearching] = useState40(false);
10185
+ const [searchTerm, setSearchTerm] = useState41("");
10186
+ const [isFocused, setIsFocused] = useState41(false);
10187
+ const [isSearching, setIsSearching] = useState41(false);
10177
10188
  const isExpanded = isFocused || searchTerm.length > 0;
10178
10189
  const search = useCallback16(
10179
10190
  async (searchedTerm) => {
@@ -10188,7 +10199,7 @@ function ContentTableSearch({ data }) {
10188
10199
  [searchTermRef, data]
10189
10200
  );
10190
10201
  const updateSearchTerm = useDebounce(search, 500);
10191
- useEffect32(() => {
10202
+ useEffect33(() => {
10192
10203
  setIsSearching(true);
10193
10204
  updateSearchTerm(searchTerm);
10194
10205
  }, [updateSearchTerm, searchTerm]);
@@ -10340,13 +10351,13 @@ var ContentListTable = memo(/* @__PURE__ */ __name(function ContentListTable2(pr
10340
10351
  import Image10 from "next/image";
10341
10352
 
10342
10353
  // src/features/auth/contexts/AuthContext.tsx
10343
- import { createContext as createContext16, useContext as useContext16, useMemo as useMemo17, useState as useState42 } from "react";
10354
+ import { createContext as createContext16, useContext as useContext16, useMemo as useMemo17, useState as useState43 } from "react";
10344
10355
 
10345
10356
  // src/features/auth/components/forms/Register.tsx
10346
10357
  import { zodResolver as zodResolver5 } from "@hookform/resolvers/zod";
10347
10358
  import { useTranslations as useTranslations46 } from "next-intl";
10348
10359
  import Image9 from "next/image";
10349
- import { useState as useState41 } from "react";
10360
+ import { useState as useState42 } from "react";
10350
10361
  import { useForm as useForm5 } from "react-hook-form";
10351
10362
  import { v4 as v44 } from "uuid";
10352
10363
  import { z as z5 } from "zod";
@@ -10354,7 +10365,7 @@ import { Fragment as Fragment20, jsx as jsx133, jsxs as jsxs78 } from "react/jsx
10354
10365
  function Register() {
10355
10366
  const t = useTranslations46();
10356
10367
  const { setComponentType } = useAuthContext();
10357
- const [showConfirmation, setShowConfirmation] = useState41(false);
10368
+ const [showConfirmation, setShowConfirmation] = useState42(false);
10358
10369
  const formSchema = z5.object({
10359
10370
  company: z5.string().min(1, {
10360
10371
  message: t(`generic.errors.missing_company_name`)
@@ -10478,8 +10489,8 @@ var AuthContextProvider = /* @__PURE__ */ __name(({
10478
10489
  initialComponentType,
10479
10490
  initialParams
10480
10491
  }) => {
10481
- const [componentType, setComponentType] = useState42(initialComponentType);
10482
- const [params, setParams] = useState42(initialParams);
10492
+ const [componentType, setComponentType] = useState43(initialComponentType);
10493
+ const [params, setParams] = useState43(initialParams);
10483
10494
  const activeComponent = useMemo17(() => {
10484
10495
  if (componentType === void 0) return null;
10485
10496
  switch (componentType) {
@@ -10572,17 +10583,17 @@ __name(LandingComponent, "LandingComponent");
10572
10583
  import { zodResolver as zodResolver6 } from "@hookform/resolvers/zod";
10573
10584
  import { useTranslations as useTranslations48 } from "next-intl";
10574
10585
  import Image12 from "next/image";
10575
- import { useEffect as useEffect33, useState as useState43 } from "react";
10586
+ import { useEffect as useEffect34, useState as useState44 } from "react";
10576
10587
  import { useForm as useForm6 } from "react-hook-form";
10577
10588
  import { toast as toast7 } from "sonner";
10578
10589
  import { z as z6 } from "zod";
10579
10590
  import { Fragment as Fragment22, jsx as jsx137, jsxs as jsxs80 } from "react/jsx-runtime";
10580
10591
  function AcceptInvitation() {
10581
10592
  const { setComponentType, params, setParams } = useAuthContext();
10582
- const [showConfirmation, setShowConfirmation] = useState43(false);
10583
- const [error, setError] = useState43(void 0);
10593
+ const [showConfirmation, setShowConfirmation] = useState44(false);
10594
+ const [error, setError] = useState44(void 0);
10584
10595
  const t = useTranslations48();
10585
- useEffect33(() => {
10596
+ useEffect34(() => {
10586
10597
  async function validateCode(code) {
10587
10598
  try {
10588
10599
  const payload = {
@@ -10675,15 +10686,15 @@ __name(AcceptInvitation, "AcceptInvitation");
10675
10686
  // src/features/auth/components/forms/ActivateAccount.tsx
10676
10687
  import { useTranslations as useTranslations49 } from "next-intl";
10677
10688
  import Image13 from "next/image";
10678
- import { useEffect as useEffect34, useState as useState44 } from "react";
10689
+ import { useEffect as useEffect35, useState as useState45 } from "react";
10679
10690
  import { toast as toast8 } from "sonner";
10680
10691
  import { Fragment as Fragment23, jsx as jsx138, jsxs as jsxs81 } from "react/jsx-runtime";
10681
10692
  function ActivateAccount() {
10682
10693
  const { setComponentType, params, setParams } = useAuthContext();
10683
- const [showConfirmation, setShowConfirmation] = useState44(false);
10684
- const [error, setError] = useState44(void 0);
10694
+ const [showConfirmation, setShowConfirmation] = useState45(false);
10695
+ const [error, setError] = useState45(void 0);
10685
10696
  const t = useTranslations49();
10686
- useEffect34(() => {
10697
+ useEffect35(() => {
10687
10698
  async function ActivateAccount2(code) {
10688
10699
  try {
10689
10700
  const payload = {
@@ -10724,12 +10735,12 @@ function ActivateAccount() {
10724
10735
  __name(ActivateAccount, "ActivateAccount");
10725
10736
 
10726
10737
  // src/features/auth/components/forms/Cookies.tsx
10727
- import { useEffect as useEffect35, useState as useState45 } from "react";
10738
+ import { useEffect as useEffect36, useState as useState46 } from "react";
10728
10739
  function Cookies({ dehydratedAuth, page }) {
10729
10740
  const { setUser } = useCurrentUserContext();
10730
10741
  const router = useI18nRouter();
10731
- const [hasSaved, setHasSaved] = useState45(false);
10732
- useEffect35(() => {
10742
+ const [hasSaved, setHasSaved] = useState46(false);
10743
+ useEffect36(() => {
10733
10744
  if (hasSaved) return;
10734
10745
  async function saveTokenOnServer() {
10735
10746
  await AuthService.saveToken({ dehydratedAuth });
@@ -10752,14 +10763,14 @@ __name(Cookies, "Cookies");
10752
10763
  import { zodResolver as zodResolver7 } from "@hookform/resolvers/zod";
10753
10764
  import { useTranslations as useTranslations50 } from "next-intl";
10754
10765
  import Image14 from "next/image";
10755
- import { useState as useState46 } from "react";
10766
+ import { useState as useState47 } from "react";
10756
10767
  import { useForm as useForm7 } from "react-hook-form";
10757
10768
  import { z as z7 } from "zod";
10758
10769
  import { Fragment as Fragment24, jsx as jsx139, jsxs as jsxs82 } from "react/jsx-runtime";
10759
10770
  function ForgotPassword() {
10760
10771
  const t = useTranslations50();
10761
10772
  const { setComponentType } = useAuthContext();
10762
- const [showConfirmation, setShowConfirmation] = useState46(false);
10773
+ const [showConfirmation, setShowConfirmation] = useState47(false);
10763
10774
  const formSchema = z7.object({
10764
10775
  email: z7.string().email({
10765
10776
  message: t(`generic.errors.invalid_email`)
@@ -10920,11 +10931,11 @@ function Login() {
10920
10931
  __name(Login, "Login");
10921
10932
 
10922
10933
  // src/features/auth/components/forms/Logout.tsx
10923
- import { useEffect as useEffect36 } from "react";
10934
+ import { useEffect as useEffect37 } from "react";
10924
10935
  import { Fragment as Fragment26, jsx as jsx141 } from "react/jsx-runtime";
10925
10936
  function Logout() {
10926
10937
  const generateUrl = usePageUrlGenerator();
10927
- useEffect36(() => {
10938
+ useEffect37(() => {
10928
10939
  const logOut = /* @__PURE__ */ __name(async () => {
10929
10940
  await AuthService.logout();
10930
10941
  window.location.href = generateUrl({ page: `/` });
@@ -10937,7 +10948,7 @@ __name(Logout, "Logout");
10937
10948
 
10938
10949
  // src/features/auth/components/forms/RefreshUser.tsx
10939
10950
  import { deleteCookie as deleteCookie2, getCookie as getCookie2 } from "cookies-next";
10940
- import { useEffect as useEffect37 } from "react";
10951
+ import { useEffect as useEffect38 } from "react";
10941
10952
  function RefreshUser() {
10942
10953
  const { setUser } = useCurrentUserContext();
10943
10954
  const loadFullUser = /* @__PURE__ */ __name(async () => {
@@ -10958,7 +10969,7 @@ function RefreshUser() {
10958
10969
  deleteCookie2("reloadData");
10959
10970
  }
10960
10971
  }, "loadFullUser");
10961
- useEffect37(() => {
10972
+ useEffect38(() => {
10962
10973
  const reloadData = getCookie2("reloadData");
10963
10974
  if (reloadData !== void 0) loadFullUser();
10964
10975
  }, []);
@@ -10970,17 +10981,17 @@ __name(RefreshUser, "RefreshUser");
10970
10981
  import { zodResolver as zodResolver9 } from "@hookform/resolvers/zod";
10971
10982
  import { useTranslations as useTranslations52 } from "next-intl";
10972
10983
  import Image16 from "next/image";
10973
- import { useEffect as useEffect38, useState as useState47 } from "react";
10984
+ import { useEffect as useEffect39, useState as useState48 } from "react";
10974
10985
  import { useForm as useForm9 } from "react-hook-form";
10975
10986
  import { toast as toast9 } from "sonner";
10976
10987
  import { z as z9 } from "zod";
10977
10988
  import { Fragment as Fragment27, jsx as jsx142, jsxs as jsxs84 } from "react/jsx-runtime";
10978
10989
  function ResetPassword() {
10979
10990
  const { setComponentType, params, setParams } = useAuthContext();
10980
- const [showConfirmation, setShowConfirmation] = useState47(false);
10981
- const [error, setError] = useState47(void 0);
10991
+ const [showConfirmation, setShowConfirmation] = useState48(false);
10992
+ const [error, setError] = useState48(void 0);
10982
10993
  const t = useTranslations52();
10983
- useEffect38(() => {
10994
+ useEffect39(() => {
10984
10995
  async function validateResetPasswordCode(code) {
10985
10996
  try {
10986
10997
  const payload = {
@@ -11262,7 +11273,7 @@ __name(NotificationsListContainer, "NotificationsListContainer");
11262
11273
  // src/features/notification/components/modals/NotificationModal.tsx
11263
11274
  import { BellIcon } from "lucide-react";
11264
11275
  import { useTranslations as useTranslations58 } from "next-intl";
11265
- import { Fragment as Fragment29, useCallback as useCallback17, useEffect as useEffect39, useMemo as useMemo18, useRef as useRef16, useState as useState48 } from "react";
11276
+ import { Fragment as Fragment29, useCallback as useCallback17, useEffect as useEffect40, useMemo as useMemo18, useRef as useRef16, useState as useState49 } from "react";
11266
11277
  import { toast as toast10 } from "sonner";
11267
11278
  import { jsx as jsx149, jsxs as jsxs89 } from "react/jsx-runtime";
11268
11279
  function NotificationModalContent({ isOpen, setIsOpen }) {
@@ -11279,7 +11290,7 @@ function NotificationModalContent({ isOpen, setIsOpen }) {
11279
11290
  const { socketNotifications, removeSocketNotification, clearSocketNotifications } = useSocketContext();
11280
11291
  const t = useTranslations58();
11281
11292
  const generateUrl = usePageUrlGenerator();
11282
- const [newNotifications, setNewNotifications] = useState48(false);
11293
+ const [newNotifications, setNewNotifications] = useState49(false);
11283
11294
  const preventAutoClose = useRef16(false);
11284
11295
  const circuitBreakerRef = useRef16({
11285
11296
  count: 0,
@@ -11308,7 +11319,7 @@ function NotificationModalContent({ isOpen, setIsOpen }) {
11308
11319
  unreadIds: unreadNotifications2.map((notif) => notif.id)
11309
11320
  };
11310
11321
  }, [notifications]);
11311
- useEffect39(() => {
11322
+ useEffect40(() => {
11312
11323
  setNewNotifications(unreadCount > 0);
11313
11324
  }, [unreadCount]);
11314
11325
  const processSocketNotificationsRef = useRef16(null);
@@ -11351,7 +11362,7 @@ function NotificationModalContent({ isOpen, setIsOpen }) {
11351
11362
  generateUrl,
11352
11363
  checkCircuitBreaker
11353
11364
  ]);
11354
- useEffect39(() => {
11365
+ useEffect40(() => {
11355
11366
  if (processSocketNotificationsRef.current) {
11356
11367
  clearTimeout(processSocketNotificationsRef.current);
11357
11368
  }
@@ -11495,13 +11506,13 @@ __name(FormRoles, "FormRoles");
11495
11506
 
11496
11507
  // src/features/role/components/forms/RemoveUserFromRole.tsx
11497
11508
  import { useTranslations as useTranslations61 } from "next-intl";
11498
- import { useEffect as useEffect40, useState as useState49 } from "react";
11509
+ import { useEffect as useEffect41, useState as useState50 } from "react";
11499
11510
  import { Fragment as Fragment32, jsx as jsx154, jsxs as jsxs92 } from "react/jsx-runtime";
11500
11511
  function RemoveUserFromRole({ role, user, refresh }) {
11501
- const [open, setOpen] = useState49(false);
11502
- const [canRemove, setCanRemove] = useState49(false);
11512
+ const [open, setOpen] = useState50(false);
11513
+ const [canRemove, setCanRemove] = useState50(false);
11503
11514
  const t = useTranslations61();
11504
- useEffect40(() => {
11515
+ useEffect41(() => {
11505
11516
  async function checkCompanyAdminDeletability() {
11506
11517
  const roleUsers = await UserService.findAllUsersByRole({
11507
11518
  roleId: role.id
@@ -11571,14 +11582,14 @@ __name(RemoveUserFromRole, "RemoveUserFromRole");
11571
11582
  // src/features/role/components/forms/UserRoleAdd.tsx
11572
11583
  import { PlusCircle } from "lucide-react";
11573
11584
  import { useTranslations as useTranslations62 } from "next-intl";
11574
- import { useCallback as useCallback18, useEffect as useEffect41, useRef as useRef17, useState as useState50 } from "react";
11585
+ import { useCallback as useCallback18, useEffect as useEffect42, useRef as useRef17, useState as useState51 } from "react";
11575
11586
  import { toast as toast11 } from "sonner";
11576
11587
  import { Fragment as Fragment33, jsx as jsx155, jsxs as jsxs93 } from "react/jsx-runtime";
11577
11588
  function UserRoleAdd({ user, refresh }) {
11578
- const [open, setOpen] = useState50(false);
11589
+ const [open, setOpen] = useState51(false);
11579
11590
  const inputRef = useRef17(null);
11580
- const [searchTerm, setSearchTerm] = useState50("");
11581
- const [roles, setRoles] = useState50([]);
11591
+ const [searchTerm, setSearchTerm] = useState51("");
11592
+ const [roles, setRoles] = useState51([]);
11582
11593
  const t = useTranslations62();
11583
11594
  const addUserToRole = /* @__PURE__ */ __name(async (role) => {
11584
11595
  await RoleService.addUserToRole({
@@ -11614,10 +11625,10 @@ function UserRoleAdd({ user, refresh }) {
11614
11625
  [searchTerm, user]
11615
11626
  );
11616
11627
  const updateSearchTerm = useDebounce(searchRoles, 500);
11617
- useEffect41(() => {
11628
+ useEffect42(() => {
11618
11629
  if (open) updateSearchTerm(searchTerm);
11619
11630
  }, [open, searchTerm]);
11620
- useEffect41(() => {
11631
+ useEffect42(() => {
11621
11632
  if (open) searchRoles("");
11622
11633
  }, [open]);
11623
11634
  return /* @__PURE__ */ jsxs93(Fragment33, { children: [
@@ -12088,4 +12099,4 @@ export {
12088
12099
  useUserTableStructure,
12089
12100
  useContentTableStructure
12090
12101
  };
12091
- //# sourceMappingURL=chunk-YHUK7PFT.mjs.map
12102
+ //# sourceMappingURL=chunk-AEZWDB5X.mjs.map