@btst/stack 2.3.0 → 2.5.0
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/packages/stack/src/client/components/compose.cjs +1 -2
- package/dist/packages/stack/src/client/components/compose.mjs +1 -2
- package/dist/packages/stack/src/plugins/ai-chat/api/page-tools.cjs +71 -0
- package/dist/packages/stack/src/plugins/ai-chat/api/page-tools.mjs +68 -0
- package/dist/packages/stack/src/plugins/ai-chat/api/plugin.cjs +87 -54
- package/dist/packages/stack/src/plugins/ai-chat/api/plugin.mjs +87 -54
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-input.cjs +2 -2
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-input.mjs +2 -2
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-interface.cjs +89 -22
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-interface.mjs +90 -23
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-layout.cjs +110 -33
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-layout.mjs +112 -35
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-sidebar.cjs +1 -1
- package/dist/packages/stack/src/plugins/ai-chat/client/components/chat-sidebar.mjs +1 -1
- package/dist/packages/stack/src/plugins/ai-chat/client/plugin.cjs +14 -21
- package/dist/packages/stack/src/plugins/ai-chat/client/plugin.mjs +15 -22
- package/dist/packages/stack/src/plugins/ai-chat/schemas.cjs +17 -1
- package/dist/packages/stack/src/plugins/ai-chat/schemas.mjs +17 -1
- package/dist/packages/stack/src/plugins/blog/api/plugin.cjs +28 -45
- package/dist/packages/stack/src/plugins/blog/api/plugin.mjs +22 -39
- package/dist/packages/stack/src/plugins/blog/client/components/forms/post-forms.cjs +15 -2
- package/dist/packages/stack/src/plugins/blog/client/components/forms/post-forms.mjs +16 -3
- package/dist/packages/stack/src/plugins/blog/client/components/pages/edit-post-page.internal.cjs +24 -1
- package/dist/packages/stack/src/plugins/blog/client/components/pages/edit-post-page.internal.mjs +24 -1
- package/dist/packages/stack/src/plugins/blog/client/components/pages/fill-blog-form-handler.cjs +26 -0
- package/dist/packages/stack/src/plugins/blog/client/components/pages/fill-blog-form-handler.mjs +24 -0
- package/dist/packages/stack/src/plugins/blog/client/components/pages/new-post-page.internal.cjs +30 -1
- package/dist/packages/stack/src/plugins/blog/client/components/pages/new-post-page.internal.mjs +30 -1
- package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.cjs +18 -0
- package/dist/packages/stack/src/plugins/blog/client/components/pages/post-page.internal.mjs +18 -0
- package/dist/packages/stack/src/plugins/blog/client/plugin.cjs +23 -27
- package/dist/packages/stack/src/plugins/blog/client/plugin.mjs +24 -28
- package/dist/packages/stack/src/plugins/cms/api/mutations.cjs +48 -0
- package/dist/packages/stack/src/plugins/cms/api/mutations.mjs +46 -0
- package/dist/packages/stack/src/plugins/cms/api/plugin.cjs +21 -18
- package/dist/packages/stack/src/plugins/cms/api/plugin.mjs +21 -18
- package/dist/packages/stack/src/plugins/cms/client/plugin.cjs +11 -15
- package/dist/packages/stack/src/plugins/cms/client/plugin.mjs +12 -16
- package/dist/packages/stack/src/plugins/form-builder/api/plugin.cjs +58 -62
- package/dist/packages/stack/src/plugins/form-builder/api/plugin.mjs +58 -62
- package/dist/packages/stack/src/plugins/form-builder/client/plugin.cjs +12 -12
- package/dist/packages/stack/src/plugins/form-builder/client/plugin.mjs +13 -13
- package/dist/packages/stack/src/plugins/kanban/api/mutations.cjs +91 -0
- package/dist/packages/stack/src/plugins/kanban/api/mutations.mjs +87 -0
- package/dist/packages/stack/src/plugins/kanban/api/plugin.cjs +92 -118
- package/dist/packages/stack/src/plugins/kanban/api/plugin.mjs +89 -115
- package/dist/packages/stack/src/plugins/kanban/client/hooks/kanban-hooks.cjs +7 -3
- package/dist/packages/stack/src/plugins/kanban/client/hooks/kanban-hooks.mjs +7 -3
- package/dist/packages/stack/src/plugins/kanban/client/plugin.cjs +22 -29
- package/dist/packages/stack/src/plugins/kanban/client/plugin.mjs +23 -30
- package/dist/packages/stack/src/plugins/ui-builder/client/components/pages/page-builder-page.internal.cjs +89 -0
- package/dist/packages/stack/src/plugins/ui-builder/client/components/pages/page-builder-page.internal.mjs +89 -0
- package/dist/packages/stack/src/plugins/ui-builder/client/plugin.cjs +8 -8
- package/dist/packages/stack/src/plugins/ui-builder/client/plugin.mjs +9 -9
- package/dist/packages/stack/src/plugins/utils.cjs +42 -0
- package/dist/packages/stack/src/plugins/utils.mjs +41 -1
- package/dist/plugins/ai-chat/api/index.d.cts +1 -1
- package/dist/plugins/ai-chat/api/index.d.mts +1 -1
- package/dist/plugins/ai-chat/api/index.d.ts +1 -1
- package/dist/plugins/ai-chat/client/components/index.d.cts +1 -1
- package/dist/plugins/ai-chat/client/components/index.d.mts +1 -1
- package/dist/plugins/ai-chat/client/components/index.d.ts +1 -1
- package/dist/plugins/ai-chat/client/context/page-ai-context.cjs +92 -0
- package/dist/plugins/ai-chat/client/context/page-ai-context.d.cts +84 -0
- package/dist/plugins/ai-chat/client/context/page-ai-context.d.mts +84 -0
- package/dist/plugins/ai-chat/client/context/page-ai-context.d.ts +84 -0
- package/dist/plugins/ai-chat/client/context/page-ai-context.mjs +88 -0
- package/dist/plugins/ai-chat/client/hooks/index.d.cts +1 -1
- package/dist/plugins/ai-chat/client/hooks/index.d.mts +1 -1
- package/dist/plugins/ai-chat/client/hooks/index.d.ts +1 -1
- package/dist/plugins/ai-chat/client/index.d.cts +10 -10
- package/dist/plugins/ai-chat/client/index.d.mts +10 -10
- package/dist/plugins/ai-chat/client/index.d.ts +10 -10
- package/dist/plugins/ai-chat/query-keys.d.cts +1 -1
- package/dist/plugins/ai-chat/query-keys.d.mts +1 -1
- package/dist/plugins/ai-chat/query-keys.d.ts +1 -1
- package/dist/plugins/blog/api/index.d.cts +2 -2
- package/dist/plugins/blog/api/index.d.mts +2 -2
- package/dist/plugins/blog/api/index.d.ts +2 -2
- package/dist/plugins/blog/client/hooks/index.d.cts +2 -2
- package/dist/plugins/blog/client/hooks/index.d.mts +2 -2
- package/dist/plugins/blog/client/hooks/index.d.ts +2 -2
- package/dist/plugins/blog/client/index.d.cts +13 -13
- package/dist/plugins/blog/client/index.d.mts +13 -13
- package/dist/plugins/blog/client/index.d.ts +13 -13
- package/dist/plugins/blog/query-keys.d.cts +2 -2
- package/dist/plugins/blog/query-keys.d.mts +2 -2
- package/dist/plugins/blog/query-keys.d.ts +2 -2
- package/dist/plugins/client/index.cjs +1 -0
- package/dist/plugins/client/index.d.cts +8 -1
- package/dist/plugins/client/index.d.mts +8 -1
- package/dist/plugins/client/index.d.ts +8 -1
- package/dist/plugins/client/index.mjs +1 -1
- package/dist/plugins/cms/api/index.cjs +2 -0
- package/dist/plugins/cms/api/index.d.cts +2 -2
- package/dist/plugins/cms/api/index.d.mts +2 -2
- package/dist/plugins/cms/api/index.d.ts +2 -2
- package/dist/plugins/cms/api/index.mjs +1 -0
- package/dist/plugins/cms/client/hooks/index.d.cts +1 -1
- package/dist/plugins/cms/client/hooks/index.d.mts +1 -1
- package/dist/plugins/cms/client/hooks/index.d.ts +1 -1
- package/dist/plugins/cms/client/index.d.cts +6 -6
- package/dist/plugins/cms/client/index.d.mts +6 -6
- package/dist/plugins/cms/client/index.d.ts +6 -6
- package/dist/plugins/cms/query-keys.d.cts +2 -2
- package/dist/plugins/cms/query-keys.d.mts +2 -2
- package/dist/plugins/cms/query-keys.d.ts +2 -2
- package/dist/plugins/form-builder/api/index.d.cts +2 -2
- package/dist/plugins/form-builder/api/index.d.mts +2 -2
- package/dist/plugins/form-builder/api/index.d.ts +2 -2
- package/dist/plugins/form-builder/client/components/index.d.cts +1 -1
- package/dist/plugins/form-builder/client/components/index.d.mts +1 -1
- package/dist/plugins/form-builder/client/components/index.d.ts +1 -1
- package/dist/plugins/form-builder/client/hooks/index.d.cts +1 -1
- package/dist/plugins/form-builder/client/hooks/index.d.mts +1 -1
- package/dist/plugins/form-builder/client/hooks/index.d.ts +1 -1
- package/dist/plugins/form-builder/client/index.d.cts +6 -6
- package/dist/plugins/form-builder/client/index.d.mts +6 -6
- package/dist/plugins/form-builder/client/index.d.ts +6 -6
- package/dist/plugins/form-builder/query-keys.d.cts +2 -2
- package/dist/plugins/form-builder/query-keys.d.mts +2 -2
- package/dist/plugins/form-builder/query-keys.d.ts +2 -2
- package/dist/plugins/kanban/api/index.cjs +4 -0
- package/dist/plugins/kanban/api/index.d.cts +1 -1
- package/dist/plugins/kanban/api/index.d.mts +1 -1
- package/dist/plugins/kanban/api/index.d.ts +1 -1
- package/dist/plugins/kanban/api/index.mjs +1 -0
- package/dist/plugins/kanban/client/index.d.cts +12 -12
- package/dist/plugins/kanban/client/index.d.mts +12 -12
- package/dist/plugins/kanban/client/index.d.ts +12 -12
- package/dist/plugins/kanban/query-keys.d.cts +1 -1
- package/dist/plugins/kanban/query-keys.d.mts +1 -1
- package/dist/plugins/kanban/query-keys.d.ts +1 -1
- package/dist/plugins/ui-builder/client/hooks/index.d.cts +1 -1
- package/dist/plugins/ui-builder/client/hooks/index.d.mts +1 -1
- package/dist/plugins/ui-builder/client/hooks/index.d.ts +1 -1
- package/dist/plugins/ui-builder/client/index.d.cts +3 -3
- package/dist/plugins/ui-builder/client/index.d.mts +3 -3
- package/dist/plugins/ui-builder/client/index.d.ts +3 -3
- package/dist/plugins/ui-builder/index.d.cts +2 -2
- package/dist/plugins/ui-builder/index.d.mts +2 -2
- package/dist/plugins/ui-builder/index.d.ts +2 -2
- package/dist/shared/{stack.C-WUPMT6.d.cts → stack.B2xZTSiO.d.cts} +4 -4
- package/dist/shared/{stack.B1EeBt1b.d.ts → stack.B58oHdqm.d.mts} +33 -3
- package/dist/shared/{stack.CVDTkMoO.d.mts → stack.B8QD11QU.d.cts} +7 -7
- package/dist/shared/{stack.CVDTkMoO.d.cts → stack.B8QD11QU.d.mts} +7 -7
- package/dist/shared/{stack.CVDTkMoO.d.ts → stack.B8QD11QU.d.ts} +7 -7
- package/dist/shared/{stack.CIP6QS9l.d.ts → stack.BDVEpue1.d.ts} +1 -1
- package/dist/shared/{stack.C5dtIncc.d.mts → stack.BTvbxZvw.d.cts} +1 -1
- package/dist/shared/{stack.DaOcgmrM.d.ts → stack.BV9hnvu4.d.cts} +31 -7
- package/dist/shared/{stack.DaOcgmrM.d.cts → stack.BV9hnvu4.d.mts} +31 -7
- package/dist/shared/{stack.DaOcgmrM.d.mts → stack.BV9hnvu4.d.ts} +31 -7
- package/dist/shared/{stack.DdI5W6MB.d.mts → stack.BozPgbrZ.d.cts} +19 -19
- package/dist/shared/{stack.DdI5W6MB.d.ts → stack.BozPgbrZ.d.mts} +19 -19
- package/dist/shared/{stack.DdI5W6MB.d.cts → stack.BozPgbrZ.d.ts} +19 -19
- package/dist/shared/{stack.CP68pFEH.d.mts → stack.C9Mg2Q46.d.cts} +33 -3
- package/dist/shared/{stack.BeSm90va.d.ts → stack.CTDVxbrA.d.ts} +72 -14
- package/dist/shared/{stack.C-Ptrz8s.d.ts → stack.Cj_zKww4.d.ts} +4 -4
- package/dist/shared/{stack.TIBF2AOx.d.ts → stack.CxaFNQCV.d.mts} +89 -34
- package/dist/shared/{stack.CMh_EdxW.d.cts → stack.D-b5zbPm.d.cts} +72 -14
- package/dist/shared/{stack.Dw0Ly2TM.d.cts → stack.DTtmJPQO.d.mts} +1 -1
- package/dist/shared/{stack.BKfolAyK.d.ts → stack.DXnclTG7.d.ts} +11 -11
- package/dist/shared/{stack.snB1EDP7.d.cts → stack.DaZM10cp.d.cts} +11 -11
- package/dist/shared/{stack.Dg09R0oB.d.mts → stack.FVWf2JhZ.d.mts} +72 -14
- package/dist/shared/{stack.BIXEI6v_.d.mts → stack.cfCkioTe.d.mts} +11 -11
- package/dist/shared/{stack.6fUOjLs9.d.mts → stack.dH7u-TJH.d.mts} +4 -4
- package/dist/shared/{stack.BpolpQpf.d.cts → stack.j75TpKh2.d.ts} +89 -34
- package/dist/shared/{stack.rTy7-wQU.d.mts → stack.n1_i1p2B.d.cts} +89 -34
- package/dist/shared/{stack.IdtKDRka.d.cts → stack.sO33ZDhK.d.ts} +33 -3
- package/package.json +14 -1
- package/src/client/components/compose.tsx +7 -4
- package/src/plugins/ai-chat/api/page-tools.ts +111 -0
- package/src/plugins/ai-chat/api/plugin.ts +228 -72
- package/src/plugins/ai-chat/client/components/chat-input.tsx +2 -2
- package/src/plugins/ai-chat/client/components/chat-interface.tsx +154 -58
- package/src/plugins/ai-chat/client/components/chat-layout.tsx +166 -32
- package/src/plugins/ai-chat/client/components/chat-sidebar.tsx +1 -1
- package/src/plugins/ai-chat/client/context/page-ai-context.tsx +240 -0
- package/src/plugins/ai-chat/client/plugin.tsx +23 -31
- package/src/plugins/ai-chat/schemas.ts +16 -0
- package/src/plugins/blog/api/plugin.ts +31 -47
- package/src/plugins/blog/client/components/forms/post-forms.tsx +29 -2
- package/src/plugins/blog/client/components/pages/edit-post-page.internal.tsx +28 -0
- package/src/plugins/blog/client/components/pages/fill-blog-form-handler.ts +38 -0
- package/src/plugins/blog/client/components/pages/new-post-page.internal.tsx +33 -1
- package/src/plugins/blog/client/components/pages/post-page.internal.tsx +20 -0
- package/src/plugins/blog/client/plugin.tsx +36 -39
- package/src/plugins/client/index.ts +5 -1
- package/src/plugins/cms/api/index.ts +4 -0
- package/src/plugins/cms/api/mutations.ts +84 -0
- package/src/plugins/cms/api/plugin.ts +23 -17
- package/src/plugins/cms/client/plugin.tsx +18 -21
- package/src/plugins/cms/types.ts +7 -7
- package/src/plugins/form-builder/api/plugin.ts +64 -64
- package/src/plugins/form-builder/client/plugin.tsx +19 -18
- package/src/plugins/form-builder/types.ts +19 -24
- package/src/plugins/kanban/api/index.ts +6 -0
- package/src/plugins/kanban/api/mutations.ts +169 -0
- package/src/plugins/kanban/api/plugin.ts +123 -136
- package/src/plugins/kanban/client/hooks/kanban-hooks.tsx +4 -0
- package/src/plugins/kanban/client/plugin.tsx +35 -41
- package/src/plugins/ui-builder/client/components/pages/page-builder-page.internal.tsx +132 -0
- package/src/plugins/ui-builder/client/plugin.tsx +11 -10
- package/src/plugins/ui-builder/types.ts +4 -4
- package/src/plugins/utils.ts +92 -1
- package/dist/shared/{stack.CBON0dWL.d.mts → stack.BQmuNl5p.d.cts} +2 -2
- package/dist/shared/{stack.CBON0dWL.d.ts → stack.BQmuNl5p.d.mts} +2 -2
- package/dist/shared/{stack.CBON0dWL.d.cts → stack.BQmuNl5p.d.ts} +2 -2
|
@@ -6,6 +6,7 @@ import { listFormsQuerySchema, createFormSchema, updateFormSchema, listSubmissio
|
|
|
6
6
|
import { extractUserAgent, extractIpAddress, slugify } from '../utils.mjs';
|
|
7
7
|
import { getFormSubmissions, getFormBySlug, getFormById, getAllForms, serializeForm, serializeFormSubmission, serializeFormSubmissionWithData } from './getters.mjs';
|
|
8
8
|
import { FORM_QUERY_KEYS } from './query-key-defs.mjs';
|
|
9
|
+
import { runHookWithShim } from '../../utils.mjs';
|
|
9
10
|
|
|
10
11
|
function createFormBuilderPrefetchForRoute(adapter) {
|
|
11
12
|
return async function prefetchForRoute(key, qc, params) {
|
|
@@ -96,10 +97,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
96
97
|
const { status, limit, offset } = ctx.query;
|
|
97
98
|
const context = createContext(ctx.headers);
|
|
98
99
|
if (config.hooks?.onBeforeListForms) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
await runHookWithShim(
|
|
101
|
+
() => config.hooks.onBeforeListForms(context),
|
|
102
|
+
ctx.error,
|
|
103
|
+
"Access denied"
|
|
104
|
+
);
|
|
103
105
|
}
|
|
104
106
|
return getAllForms(adapter, { status, limit, offset });
|
|
105
107
|
}
|
|
@@ -114,10 +116,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
114
116
|
const { slug } = ctx.params;
|
|
115
117
|
const context = createContext(ctx.headers);
|
|
116
118
|
if (config.hooks?.onBeforeGetForm) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
await runHookWithShim(
|
|
120
|
+
() => config.hooks.onBeforeGetForm(slug, context),
|
|
121
|
+
ctx.error,
|
|
122
|
+
"Access denied"
|
|
123
|
+
);
|
|
121
124
|
}
|
|
122
125
|
const form = await getFormBySlug(adapter, slug);
|
|
123
126
|
if (!form) {
|
|
@@ -136,10 +139,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
136
139
|
const { id } = ctx.params;
|
|
137
140
|
const context = createContext(ctx.headers);
|
|
138
141
|
if (config.hooks?.onBeforeGetForm) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
await runHookWithShim(
|
|
143
|
+
() => config.hooks.onBeforeGetForm(id, context),
|
|
144
|
+
ctx.error,
|
|
145
|
+
"Access denied"
|
|
146
|
+
);
|
|
143
147
|
}
|
|
144
148
|
const form = await adapter.findOne({
|
|
145
149
|
model: "form",
|
|
@@ -190,15 +194,13 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
190
194
|
status: body.status
|
|
191
195
|
};
|
|
192
196
|
if (config.hooks?.onBeforeFormCreated) {
|
|
193
|
-
const
|
|
194
|
-
formInput,
|
|
195
|
-
|
|
197
|
+
const hookResult = await runHookWithShim(
|
|
198
|
+
() => config.hooks.onBeforeFormCreated(formInput, context),
|
|
199
|
+
ctx.error,
|
|
200
|
+
"Create operation denied"
|
|
196
201
|
);
|
|
197
|
-
if (
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
if (result && typeof result === "object") {
|
|
201
|
-
formInput = result;
|
|
202
|
+
if (hookResult && typeof hookResult === "object") {
|
|
203
|
+
formInput = hookResult;
|
|
202
204
|
}
|
|
203
205
|
}
|
|
204
206
|
const form = await adapter.create({
|
|
@@ -280,16 +282,13 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
280
282
|
status: body.status
|
|
281
283
|
};
|
|
282
284
|
if (config.hooks?.onBeforeFormUpdated) {
|
|
283
|
-
const
|
|
284
|
-
id,
|
|
285
|
-
|
|
286
|
-
|
|
285
|
+
const hookResult = await runHookWithShim(
|
|
286
|
+
() => config.hooks.onBeforeFormUpdated(id, updateInput, context),
|
|
287
|
+
ctx.error,
|
|
288
|
+
"Update operation denied"
|
|
287
289
|
);
|
|
288
|
-
if (
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
if (result && typeof result === "object") {
|
|
292
|
-
updateInput = result;
|
|
290
|
+
if (hookResult && typeof hookResult === "object") {
|
|
291
|
+
updateInput = hookResult;
|
|
293
292
|
}
|
|
294
293
|
}
|
|
295
294
|
const updateData = {
|
|
@@ -341,13 +340,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
341
340
|
throw ctx.error(404, { message: "Form not found" });
|
|
342
341
|
}
|
|
343
342
|
if (config.hooks?.onBeforeFormDeleted) {
|
|
344
|
-
|
|
345
|
-
id,
|
|
346
|
-
|
|
343
|
+
await runHookWithShim(
|
|
344
|
+
() => config.hooks.onBeforeFormDeleted(id, context),
|
|
345
|
+
ctx.error,
|
|
346
|
+
"Delete operation denied"
|
|
347
347
|
);
|
|
348
|
-
if (!canDelete) {
|
|
349
|
-
throw ctx.error(403, { message: "Delete operation denied" });
|
|
350
|
-
}
|
|
351
348
|
}
|
|
352
349
|
await adapter.delete({
|
|
353
350
|
model: "formSubmission",
|
|
@@ -412,28 +409,33 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
412
409
|
}
|
|
413
410
|
let finalData = data;
|
|
414
411
|
if (config.hooks?.onBeforeSubmission) {
|
|
412
|
+
let hookResult;
|
|
413
|
+
let originalError;
|
|
415
414
|
try {
|
|
416
|
-
|
|
415
|
+
hookResult = await config.hooks.onBeforeSubmission(
|
|
417
416
|
slug,
|
|
418
417
|
data,
|
|
419
418
|
submissionContext
|
|
420
419
|
);
|
|
421
|
-
if (
|
|
422
|
-
|
|
423
|
-
}
|
|
424
|
-
if (result && typeof result === "object") {
|
|
425
|
-
finalData = result;
|
|
420
|
+
if (hookResult === false) {
|
|
421
|
+
originalError = new Error("Submission rejected");
|
|
426
422
|
}
|
|
427
|
-
} catch (
|
|
423
|
+
} catch (e) {
|
|
424
|
+
originalError = e instanceof Error ? e : new Error("Submission rejected");
|
|
425
|
+
}
|
|
426
|
+
if (originalError) {
|
|
428
427
|
if (config.hooks?.onSubmissionError) {
|
|
429
428
|
await config.hooks.onSubmissionError(
|
|
430
|
-
|
|
429
|
+
originalError,
|
|
431
430
|
slug,
|
|
432
431
|
data,
|
|
433
432
|
submissionContext
|
|
434
433
|
);
|
|
435
434
|
}
|
|
436
|
-
throw error;
|
|
435
|
+
throw ctx.error(400, { message: originalError.message });
|
|
436
|
+
}
|
|
437
|
+
if (hookResult && typeof hookResult === "object") {
|
|
438
|
+
finalData = hookResult;
|
|
437
439
|
}
|
|
438
440
|
}
|
|
439
441
|
const submission = await adapter.create({
|
|
@@ -482,13 +484,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
482
484
|
throw ctx.error(404, { message: "Form not found" });
|
|
483
485
|
}
|
|
484
486
|
if (config.hooks?.onBeforeListSubmissions) {
|
|
485
|
-
|
|
486
|
-
formId,
|
|
487
|
-
|
|
487
|
+
await runHookWithShim(
|
|
488
|
+
() => config.hooks.onBeforeListSubmissions(formId, context),
|
|
489
|
+
ctx.error,
|
|
490
|
+
"Access denied"
|
|
488
491
|
);
|
|
489
|
-
if (!canList) {
|
|
490
|
-
throw ctx.error(403, { message: "Access denied" });
|
|
491
|
-
}
|
|
492
492
|
}
|
|
493
493
|
return getFormSubmissions(adapter, formId, { limit, offset });
|
|
494
494
|
}
|
|
@@ -503,13 +503,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
503
503
|
const { formId, subId } = ctx.params;
|
|
504
504
|
const context = createContext(ctx.headers);
|
|
505
505
|
if (config.hooks?.onBeforeGetSubmission) {
|
|
506
|
-
|
|
507
|
-
subId,
|
|
508
|
-
|
|
506
|
+
await runHookWithShim(
|
|
507
|
+
() => config.hooks.onBeforeGetSubmission(subId, context),
|
|
508
|
+
ctx.error,
|
|
509
|
+
"Access denied"
|
|
509
510
|
);
|
|
510
|
-
if (!canGet) {
|
|
511
|
-
throw ctx.error(403, { message: "Access denied" });
|
|
512
|
-
}
|
|
513
511
|
}
|
|
514
512
|
const submission = await adapter.findOne({
|
|
515
513
|
model: "formSubmission",
|
|
@@ -539,13 +537,11 @@ const formBuilderBackendPlugin = (config = {}) => defineBackendPlugin({
|
|
|
539
537
|
throw ctx.error(404, { message: "Submission not found" });
|
|
540
538
|
}
|
|
541
539
|
if (config.hooks?.onBeforeSubmissionDeleted) {
|
|
542
|
-
|
|
543
|
-
subId,
|
|
544
|
-
|
|
540
|
+
await runHookWithShim(
|
|
541
|
+
() => config.hooks.onBeforeSubmissionDeleted(subId, context),
|
|
542
|
+
ctx.error,
|
|
543
|
+
"Delete operation denied"
|
|
545
544
|
);
|
|
546
|
-
if (!canDelete) {
|
|
547
|
-
throw ctx.error(403, { message: "Delete operation denied" });
|
|
548
|
-
}
|
|
549
545
|
}
|
|
550
546
|
await adapter.delete({
|
|
551
547
|
model: "formSubmission",
|
|
@@ -34,10 +34,10 @@ function createFormListLoader(config) {
|
|
|
34
34
|
};
|
|
35
35
|
try {
|
|
36
36
|
if (hooks?.beforeLoadFormList) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
await client.runClientHookWithShim(
|
|
38
|
+
() => hooks.beforeLoadFormList(context),
|
|
39
|
+
"Load prevented by beforeLoadFormList hook"
|
|
40
|
+
);
|
|
41
41
|
}
|
|
42
42
|
const client$1 = client.createApiClient({
|
|
43
43
|
baseURL: apiBaseURL,
|
|
@@ -96,10 +96,10 @@ function createFormBuilderLoader(id, config) {
|
|
|
96
96
|
};
|
|
97
97
|
try {
|
|
98
98
|
if (hooks?.beforeLoadFormBuilder) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
await client.runClientHookWithShim(
|
|
100
|
+
() => hooks.beforeLoadFormBuilder(id, context),
|
|
101
|
+
"Load prevented by beforeLoadFormBuilder hook"
|
|
102
|
+
);
|
|
103
103
|
}
|
|
104
104
|
const client$1 = client.createApiClient({
|
|
105
105
|
baseURL: apiBaseURL,
|
|
@@ -148,10 +148,10 @@ function createSubmissionsLoader(formId, config) {
|
|
|
148
148
|
};
|
|
149
149
|
try {
|
|
150
150
|
if (hooks?.beforeLoadSubmissions) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
await client.runClientHookWithShim(
|
|
152
|
+
() => hooks.beforeLoadSubmissions(formId, context),
|
|
153
|
+
"Load prevented by beforeLoadSubmissions hook"
|
|
154
|
+
);
|
|
155
155
|
}
|
|
156
156
|
const client$1 = client.createApiClient({
|
|
157
157
|
baseURL: apiBaseURL,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { lazy } from 'react';
|
|
3
|
-
import { defineClientPlugin, createApiClient, isConnectionError } from '@btst/stack/plugins/client';
|
|
3
|
+
import { defineClientPlugin, createApiClient, runClientHookWithShim, isConnectionError } from '@btst/stack/plugins/client';
|
|
4
4
|
import { createRoute } from '@btst/yar';
|
|
5
5
|
import { createFormBuilderQueryKeys } from '../../../../../../plugins/form-builder/query-keys.mjs';
|
|
6
6
|
|
|
@@ -32,10 +32,10 @@ function createFormListLoader(config) {
|
|
|
32
32
|
};
|
|
33
33
|
try {
|
|
34
34
|
if (hooks?.beforeLoadFormList) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
await runClientHookWithShim(
|
|
36
|
+
() => hooks.beforeLoadFormList(context),
|
|
37
|
+
"Load prevented by beforeLoadFormList hook"
|
|
38
|
+
);
|
|
39
39
|
}
|
|
40
40
|
const client = createApiClient({
|
|
41
41
|
baseURL: apiBaseURL,
|
|
@@ -94,10 +94,10 @@ function createFormBuilderLoader(id, config) {
|
|
|
94
94
|
};
|
|
95
95
|
try {
|
|
96
96
|
if (hooks?.beforeLoadFormBuilder) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
97
|
+
await runClientHookWithShim(
|
|
98
|
+
() => hooks.beforeLoadFormBuilder(id, context),
|
|
99
|
+
"Load prevented by beforeLoadFormBuilder hook"
|
|
100
|
+
);
|
|
101
101
|
}
|
|
102
102
|
const client = createApiClient({
|
|
103
103
|
baseURL: apiBaseURL,
|
|
@@ -146,10 +146,10 @@ function createSubmissionsLoader(formId, config) {
|
|
|
146
146
|
};
|
|
147
147
|
try {
|
|
148
148
|
if (hooks?.beforeLoadSubmissions) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
await runClientHookWithShim(
|
|
150
|
+
() => hooks.beforeLoadSubmissions(formId, context),
|
|
151
|
+
"Load prevented by beforeLoadSubmissions hook"
|
|
152
|
+
);
|
|
153
153
|
}
|
|
154
154
|
const client = createApiClient({
|
|
155
155
|
baseURL: apiBaseURL,
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
async function createKanbanTask(adapter, input) {
|
|
4
|
+
const existingTasks = await adapter.findMany({
|
|
5
|
+
model: "kanbanTask",
|
|
6
|
+
where: [
|
|
7
|
+
{
|
|
8
|
+
field: "columnId",
|
|
9
|
+
value: input.columnId,
|
|
10
|
+
operator: "eq"
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
});
|
|
14
|
+
const nextOrder = existingTasks.length > 0 ? Math.max(...existingTasks.map((t) => t.order)) + 1 : 0;
|
|
15
|
+
return adapter.create({
|
|
16
|
+
model: "kanbanTask",
|
|
17
|
+
data: {
|
|
18
|
+
title: input.title,
|
|
19
|
+
columnId: input.columnId,
|
|
20
|
+
description: input.description,
|
|
21
|
+
priority: input.priority ?? "MEDIUM",
|
|
22
|
+
order: nextOrder,
|
|
23
|
+
assigneeId: input.assigneeId,
|
|
24
|
+
isArchived: false,
|
|
25
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
26
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const _pendingBoardCreations = /* @__PURE__ */ new Map();
|
|
31
|
+
async function findOrCreateKanbanBoard(adapter, slug, name, columnTitles) {
|
|
32
|
+
const existing = await adapter.findOne({
|
|
33
|
+
model: "kanbanBoard",
|
|
34
|
+
where: [{ field: "slug", value: slug, operator: "eq" }]
|
|
35
|
+
});
|
|
36
|
+
if (existing) return existing;
|
|
37
|
+
const inflight = _pendingBoardCreations.get(slug);
|
|
38
|
+
if (inflight) return inflight;
|
|
39
|
+
const creation = (async () => {
|
|
40
|
+
try {
|
|
41
|
+
const board = await adapter.create({
|
|
42
|
+
model: "kanbanBoard",
|
|
43
|
+
data: {
|
|
44
|
+
name,
|
|
45
|
+
slug,
|
|
46
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
47
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
await Promise.all(
|
|
51
|
+
columnTitles.map(
|
|
52
|
+
(title, index) => adapter.create({
|
|
53
|
+
model: "kanbanColumn",
|
|
54
|
+
data: {
|
|
55
|
+
title,
|
|
56
|
+
boardId: board.id,
|
|
57
|
+
order: index,
|
|
58
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
59
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
)
|
|
63
|
+
);
|
|
64
|
+
return board;
|
|
65
|
+
} catch (err) {
|
|
66
|
+
const winner = await adapter.findOne({
|
|
67
|
+
model: "kanbanBoard",
|
|
68
|
+
where: [{ field: "slug", value: slug, operator: "eq" }]
|
|
69
|
+
});
|
|
70
|
+
if (winner) return winner;
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
})();
|
|
74
|
+
_pendingBoardCreations.set(slug, creation);
|
|
75
|
+
try {
|
|
76
|
+
return await creation;
|
|
77
|
+
} finally {
|
|
78
|
+
_pendingBoardCreations.delete(slug);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function getKanbanColumnsByBoardId(adapter, boardId) {
|
|
82
|
+
return adapter.findMany({
|
|
83
|
+
model: "kanbanColumn",
|
|
84
|
+
where: [{ field: "boardId", value: boardId, operator: "eq" }],
|
|
85
|
+
sortBy: { field: "order", direction: "asc" }
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
exports.createKanbanTask = createKanbanTask;
|
|
90
|
+
exports.findOrCreateKanbanBoard = findOrCreateKanbanBoard;
|
|
91
|
+
exports.getKanbanColumnsByBoardId = getKanbanColumnsByBoardId;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
async function createKanbanTask(adapter, input) {
|
|
2
|
+
const existingTasks = await adapter.findMany({
|
|
3
|
+
model: "kanbanTask",
|
|
4
|
+
where: [
|
|
5
|
+
{
|
|
6
|
+
field: "columnId",
|
|
7
|
+
value: input.columnId,
|
|
8
|
+
operator: "eq"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
11
|
+
});
|
|
12
|
+
const nextOrder = existingTasks.length > 0 ? Math.max(...existingTasks.map((t) => t.order)) + 1 : 0;
|
|
13
|
+
return adapter.create({
|
|
14
|
+
model: "kanbanTask",
|
|
15
|
+
data: {
|
|
16
|
+
title: input.title,
|
|
17
|
+
columnId: input.columnId,
|
|
18
|
+
description: input.description,
|
|
19
|
+
priority: input.priority ?? "MEDIUM",
|
|
20
|
+
order: nextOrder,
|
|
21
|
+
assigneeId: input.assigneeId,
|
|
22
|
+
isArchived: false,
|
|
23
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
24
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const _pendingBoardCreations = /* @__PURE__ */ new Map();
|
|
29
|
+
async function findOrCreateKanbanBoard(adapter, slug, name, columnTitles) {
|
|
30
|
+
const existing = await adapter.findOne({
|
|
31
|
+
model: "kanbanBoard",
|
|
32
|
+
where: [{ field: "slug", value: slug, operator: "eq" }]
|
|
33
|
+
});
|
|
34
|
+
if (existing) return existing;
|
|
35
|
+
const inflight = _pendingBoardCreations.get(slug);
|
|
36
|
+
if (inflight) return inflight;
|
|
37
|
+
const creation = (async () => {
|
|
38
|
+
try {
|
|
39
|
+
const board = await adapter.create({
|
|
40
|
+
model: "kanbanBoard",
|
|
41
|
+
data: {
|
|
42
|
+
name,
|
|
43
|
+
slug,
|
|
44
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
45
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
await Promise.all(
|
|
49
|
+
columnTitles.map(
|
|
50
|
+
(title, index) => adapter.create({
|
|
51
|
+
model: "kanbanColumn",
|
|
52
|
+
data: {
|
|
53
|
+
title,
|
|
54
|
+
boardId: board.id,
|
|
55
|
+
order: index,
|
|
56
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
57
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
)
|
|
61
|
+
);
|
|
62
|
+
return board;
|
|
63
|
+
} catch (err) {
|
|
64
|
+
const winner = await adapter.findOne({
|
|
65
|
+
model: "kanbanBoard",
|
|
66
|
+
where: [{ field: "slug", value: slug, operator: "eq" }]
|
|
67
|
+
});
|
|
68
|
+
if (winner) return winner;
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
})();
|
|
72
|
+
_pendingBoardCreations.set(slug, creation);
|
|
73
|
+
try {
|
|
74
|
+
return await creation;
|
|
75
|
+
} finally {
|
|
76
|
+
_pendingBoardCreations.delete(slug);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function getKanbanColumnsByBoardId(adapter, boardId) {
|
|
80
|
+
return adapter.findMany({
|
|
81
|
+
model: "kanbanColumn",
|
|
82
|
+
where: [{ field: "boardId", value: boardId, operator: "eq" }],
|
|
83
|
+
sortBy: { field: "order", direction: "asc" }
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { createKanbanTask, findOrCreateKanbanBoard, getKanbanColumnsByBoardId };
|