@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.
- package/dist/{BlockNoteEditor-O32YPSNN.js → BlockNoteEditor-PX5RPSZR.js} +6 -6
- package/dist/{BlockNoteEditor-O32YPSNN.js.map → BlockNoteEditor-PX5RPSZR.js.map} +1 -1
- package/dist/{BlockNoteEditor-MXNV2O43.mjs → BlockNoteEditor-TF7MR7IP.mjs} +2 -2
- package/dist/{chunk-YHUK7PFT.mjs → chunk-AEZWDB5X.mjs} +84 -73
- package/dist/{chunk-YHUK7PFT.mjs.map → chunk-AEZWDB5X.mjs.map} +1 -1
- package/dist/{chunk-PVN4DI3H.js → chunk-PFBYNJ2R.js} +21 -10
- package/dist/chunk-PFBYNJ2R.js.map +1 -0
- package/dist/client/index.js +2 -2
- package/dist/client/index.mjs +1 -1
- package/dist/components/index.js +2 -2
- package/dist/components/index.mjs +1 -1
- package/dist/contexts/index.js +2 -2
- package/dist/contexts/index.mjs +1 -1
- package/dist/scripts/generate-web-module/templates/data/model.template.js +2 -1
- package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +2 -2
- package/dist/server/index.mjs.map +1 -1
- package/package.json +8 -6
- package/scripts/generate-web-module/templates/data/model.template.ts +2 -1
- package/src/components/pages/PageContentContainer.tsx +12 -2
- package/src/features/auth/utils/AuthCookies.ts +2 -2
- package/src/server/ServerSession.ts +2 -2
- package/dist/chunk-PVN4DI3H.js.map +0 -1
- /package/dist/{BlockNoteEditor-MXNV2O43.mjs.map → BlockNoteEditor-TF7MR7IP.mjs.map} +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
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
|
-
|
|
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
|
-
|
|
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 } =
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
9464
|
-
|
|
9465
|
-
|
|
9466
|
-
|
|
9467
|
-
|
|
9468
|
-
|
|
9469
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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] =
|
|
9582
|
-
const [loading, setLoading] =
|
|
9583
|
-
const [error, setError] =
|
|
9584
|
-
const [response, setResponse] =
|
|
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
|
-
|
|
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
|
|
9690
|
+
import { useState as useState39, useCallback as useCallback14 } from "react";
|
|
9680
9691
|
function useJsonApiMutation(config) {
|
|
9681
|
-
const [data, setData] =
|
|
9682
|
-
const [loading, setLoading] =
|
|
9683
|
-
const [error, setError] =
|
|
9684
|
-
const [response, setResponse] =
|
|
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
|
|
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] =
|
|
9912
|
-
const [searchQuery, setSearchQuery] =
|
|
9913
|
-
const [isLoading, setIsLoading] =
|
|
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
|
-
|
|
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
|
|
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] =
|
|
10175
|
-
const [isFocused, setIsFocused] =
|
|
10176
|
-
const [isSearching, setIsSearching] =
|
|
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
|
-
|
|
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
|
|
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
|
|
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] =
|
|
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] =
|
|
10482
|
-
const [params, setParams] =
|
|
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
|
|
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] =
|
|
10583
|
-
const [error, setError] =
|
|
10593
|
+
const [showConfirmation, setShowConfirmation] = useState44(false);
|
|
10594
|
+
const [error, setError] = useState44(void 0);
|
|
10584
10595
|
const t = useTranslations48();
|
|
10585
|
-
|
|
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
|
|
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] =
|
|
10684
|
-
const [error, setError] =
|
|
10694
|
+
const [showConfirmation, setShowConfirmation] = useState45(false);
|
|
10695
|
+
const [error, setError] = useState45(void 0);
|
|
10685
10696
|
const t = useTranslations49();
|
|
10686
|
-
|
|
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
|
|
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] =
|
|
10732
|
-
|
|
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
|
|
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] =
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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] =
|
|
10981
|
-
const [error, setError] =
|
|
10991
|
+
const [showConfirmation, setShowConfirmation] = useState48(false);
|
|
10992
|
+
const [error, setError] = useState48(void 0);
|
|
10982
10993
|
const t = useTranslations52();
|
|
10983
|
-
|
|
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
|
|
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] =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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] =
|
|
11502
|
-
const [canRemove, setCanRemove] =
|
|
11512
|
+
const [open, setOpen] = useState50(false);
|
|
11513
|
+
const [canRemove, setCanRemove] = useState50(false);
|
|
11503
11514
|
const t = useTranslations61();
|
|
11504
|
-
|
|
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
|
|
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] =
|
|
11589
|
+
const [open, setOpen] = useState51(false);
|
|
11579
11590
|
const inputRef = useRef17(null);
|
|
11580
|
-
const [searchTerm, setSearchTerm] =
|
|
11581
|
-
const [roles, setRoles] =
|
|
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
|
-
|
|
11628
|
+
useEffect42(() => {
|
|
11618
11629
|
if (open) updateSearchTerm(searchTerm);
|
|
11619
11630
|
}, [open, searchTerm]);
|
|
11620
|
-
|
|
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-
|
|
12102
|
+
//# sourceMappingURL=chunk-AEZWDB5X.mjs.map
|