@questpie/admin 3.5.1 → 3.5.3
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/client/builder/types/collection-types.d.mts +9 -0
- package/dist/client/components/actions/action-dialog.mjs +5 -0
- package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +7 -0
- package/dist/client/components/fields/rich-text-editor/extensions.mjs +17 -1
- package/dist/client/components/fields/rich-text-editor/index.d.mts +2 -1
- package/dist/client/components/fields/rich-text-editor/index.mjs +35 -74
- package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +30 -7
- package/dist/client/components/fields/rich-text-editor/toolbar.mjs +1 -312
- package/dist/client/components/fields/rich-text-editor/types.d.mts +4 -0
- package/dist/client/components/fields/rich-text-editor/types.mjs +1 -1
- package/dist/client/components/fields/rich-text-editor/utils.mjs +6 -12
- package/dist/client/components/filter-builder/filter-builder-sheet.mjs +75 -22
- package/dist/client/components/ui/dropdown-menu.mjs +1 -34
- package/dist/client/hooks/query-access.d.mts +9 -0
- package/dist/client/hooks/query-access.mjs +20 -0
- package/dist/client/hooks/typed-hooks.d.mts +4 -2
- package/dist/client/hooks/typed-hooks.mjs +30 -29
- package/dist/client/hooks/use-reactive-fields.d.mts +1 -0
- package/dist/client/hooks/use-reactive-fields.mjs +16 -1
- package/dist/client/hooks/use-server-actions.mjs +12 -1
- package/dist/client/hooks/use-view-state.mjs +15 -7
- package/dist/client/lib/view-filter-utils.mjs +30 -0
- package/dist/client/preview/block-scope-context.d.mts +2 -2
- package/dist/client/preview/preview-banner.d.mts +2 -2
- package/dist/client/preview/preview-field.d.mts +4 -4
- package/dist/client/scope/picker.d.mts +2 -2
- package/dist/client/scope/provider.d.mts +2 -2
- package/dist/client/styles/base.css +69 -77
- package/dist/client/utils/build-field-definitions-from-schema.mjs +1 -0
- package/dist/client/views/collection/auto-form-fields.mjs +3 -2
- package/dist/client/views/collection/cells/primitive-cells.mjs +9 -6
- package/dist/client/views/collection/columns/build-columns.mjs +3 -1
- package/dist/client/views/collection/field-renderer.mjs +11 -3
- package/dist/client/views/collection/form-view.mjs +207 -202
- package/dist/client/views/collection/list-view.mjs +581 -183
- package/dist/client/views/collection/outline.mjs +44 -19
- package/dist/client/views/collection/quick-filter-bar.mjs +45 -0
- package/dist/client/views/collection/table-view.mjs +60 -16
- package/dist/client/views/globals/global-form-view.mjs +12 -9
- package/dist/client/views/layout/admin-layout.mjs +1 -1
- package/dist/client/views/layout/admin-sidebar.mjs +20 -14
- package/dist/client/views/layout/admin-theme.mjs +5 -4
- package/dist/client.mjs +1 -1
- package/dist/components/rich-text/rich-text-renderer.d.mts +5 -5
- package/dist/components/rich-text/rich-text-renderer.mjs +5 -2
- package/dist/index.mjs +1 -1
- package/dist/modules/admin.d.mts +1 -1
- package/dist/server/augmentation/actions.d.mts +4 -3
- package/dist/server/augmentation/dashboard.d.mts +11 -11
- package/dist/server/augmentation/form-layout.d.mts +11 -6
- package/dist/server/augmentation/index.d.mts +7 -0
- package/dist/server/augmentation/sidebar.d.mts +8 -8
- package/dist/server/codegen/admin-client-template.mjs +55 -38
- package/dist/server/fields/index.d.mts +1 -1
- package/dist/server/fields/rich-text.d.mts +16 -17
- package/dist/server/fields/rich-text.mjs +18 -7
- package/dist/server/i18n/messages/cs.mjs +2 -0
- package/dist/server/i18n/messages/de.mjs +2 -0
- package/dist/server/i18n/messages/en.mjs +4 -0
- package/dist/server/i18n/messages/es.mjs +2 -0
- package/dist/server/i18n/messages/fr.mjs +2 -0
- package/dist/server/i18n/messages/pl.mjs +2 -0
- package/dist/server/i18n/messages/pt.mjs +2 -0
- package/dist/server/i18n/messages/sk.mjs +2 -0
- package/dist/server/modules/admin/block/block-builder.d.mts +0 -8
- package/dist/server/modules/admin/block/introspection.d.mts +2 -2
- package/dist/server/modules/admin/collections/account.d.mts +53 -52
- package/dist/server/modules/admin/collections/admin-locks.d.mts +57 -56
- package/dist/server/modules/admin/collections/admin-preferences.d.mts +3 -2
- package/dist/server/modules/admin/collections/admin-saved-views.d.mts +50 -49
- package/dist/server/modules/admin/collections/apikey.d.mts +72 -71
- package/dist/server/modules/admin/collections/assets.d.mts +42 -41
- package/dist/server/modules/admin/collections/session.d.mts +46 -45
- package/dist/server/modules/admin/collections/user.d.mts +67 -66
- package/dist/server/modules/admin/collections/verification.d.mts +39 -38
- package/dist/server/modules/admin/index.d.mts +3 -3
- package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
- package/dist/server/modules/admin/routes/admin-config.mjs +39 -23
- package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
- package/dist/server/modules/admin/routes/execute-action.mjs +28 -8
- package/dist/server/modules/admin/routes/locales.d.mts +2 -2
- package/dist/server/modules/admin/routes/reactive.mjs +2 -2
- package/dist/server/modules/admin/routes/route-helpers.d.mts +11 -7
- package/dist/server/modules/admin/routes/translations.d.mts +4 -4
- package/dist/server/modules/admin/routes/widget-data.mjs +12 -4
- package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +27 -27
- package/dist/server/modules/audit/.generated/module.d.mts +6 -6
- package/dist/server/modules/audit/collections/audit-log.d.mts +40 -39
- package/dist/server/plugin.mjs +3 -3
- package/dist/server.d.mts +1 -1
- package/dist/shared/types/index.d.mts +1 -0
- package/dist/shared/types/saved-views.types.d.mts +14 -7
- package/dist/shared.d.mts +3 -2
- package/package.json +4 -3
|
@@ -3,7 +3,7 @@ import { introspectBlocks } from "../block/introspection.mjs";
|
|
|
3
3
|
import { adminConfigDTOSchema } from "../dto/admin-config.dto.mjs";
|
|
4
4
|
import { getAccessContext, getAdminConfig as getAdminConfig$1, getApp, getAppState, getCollectionState, getGlobalState } from "./route-helpers.mjs";
|
|
5
5
|
import { z } from "zod";
|
|
6
|
-
import { executeAccessRule, route } from "questpie";
|
|
6
|
+
import { executeAccessRule, route, shouldAutoAppendUnlistedSidebar } from "questpie";
|
|
7
7
|
|
|
8
8
|
//#region src/server/modules/admin/routes/admin-config.ts
|
|
9
9
|
/**
|
|
@@ -200,16 +200,28 @@ function buildAutoSidebar(collectionsMeta, globalsMeta) {
|
|
|
200
200
|
* Removes items referencing inaccessible collections/globals.
|
|
201
201
|
* Removes empty sections after filtering.
|
|
202
202
|
*/
|
|
203
|
-
function filterSidebarConfig(config, accessibleCollections, accessibleGlobals) {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
203
|
+
function filterSidebarConfig(config, accessibleCollections, accessibleGlobals, hiddenCollections, hiddenGlobals) {
|
|
204
|
+
function filterSection(s) {
|
|
205
|
+
return {
|
|
206
|
+
...s,
|
|
207
|
+
items: (s.items ?? []).filter((item) => {
|
|
208
|
+
const rec = item;
|
|
209
|
+
if (item.type === "collection") {
|
|
210
|
+
const collection$1 = rec.collection;
|
|
211
|
+
if (hiddenCollections.has(collection$1)) return false;
|
|
212
|
+
return accessibleCollections.has(collection$1);
|
|
213
|
+
}
|
|
214
|
+
if (item.type === "global") {
|
|
215
|
+
const global = rec.global;
|
|
216
|
+
if (hiddenGlobals.has(global)) return false;
|
|
217
|
+
return accessibleGlobals.has(global);
|
|
218
|
+
}
|
|
219
|
+
return true;
|
|
220
|
+
}),
|
|
221
|
+
sections: (s.sections ?? []).map(filterSection).filter((sub) => (sub.items?.length ?? 0) > 0 || (sub.sections?.length ?? 0) > 0)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return { sections: config.sections.map(filterSection).filter((s) => (s.items?.length ?? 0) > 0 || (s.sections?.length ?? 0) > 0) };
|
|
213
225
|
}
|
|
214
226
|
/**
|
|
215
227
|
* Collect all collection and global names referenced in a sidebar config.
|
|
@@ -523,7 +535,7 @@ const getAdminConfigOutputSchema = adminConfigDTOSchema;
|
|
|
523
535
|
* const config = await client.routes.getAdminConfig({});
|
|
524
536
|
* ```
|
|
525
537
|
*/
|
|
526
|
-
const getAdminConfig = route().post().schema(getAdminConfigSchema).outputSchema(getAdminConfigOutputSchema).handler(async (ctx) => {
|
|
538
|
+
const getAdminConfig = route().post().access((ctx) => !!ctx.session).schema(getAdminConfigSchema).outputSchema(getAdminConfigOutputSchema).handler(async (ctx) => {
|
|
527
539
|
const app = getApp(ctx);
|
|
528
540
|
const appState = getAppState(app);
|
|
529
541
|
const adminCfg = getAdminConfig$1(app);
|
|
@@ -557,18 +569,22 @@ const getAdminConfig = route().post().schema(getAdminConfigSchema).outputSchema(
|
|
|
557
569
|
let sidebarConfig;
|
|
558
570
|
if (isLegacySidebarConfig(adminCfg.sidebar)) sidebarConfig = adminCfg.sidebar;
|
|
559
571
|
else sidebarConfig = mergeSidebarContributions(normalizeSidebarContributions(adminCfg.sidebar));
|
|
560
|
-
const
|
|
561
|
-
const
|
|
562
|
-
const
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
const
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
572
|
+
const hiddenCollections = new Set(Object.entries(allCollectionsMeta).filter(([, meta]) => meta.hidden).map(([name]) => name));
|
|
573
|
+
const hiddenGlobals = new Set(Object.entries(allGlobalsMeta).filter(([, meta]) => meta.hidden).map(([name]) => name));
|
|
574
|
+
const filteredSidebar = filterSidebarConfig(sidebarConfig, accessibleCollections, accessibleGlobals, hiddenCollections, hiddenGlobals);
|
|
575
|
+
if (shouldAutoAppendUnlistedSidebar(adminCfg, sidebarConfig)) {
|
|
576
|
+
const referenced = collectSidebarReferences(sidebarConfig);
|
|
577
|
+
const unlistedSidebar = buildAutoSidebar(Object.fromEntries(Object.entries(filteredCollectionsMeta).filter(([name, meta]) => !referenced.collections.has(name) && !meta.hidden)), Object.fromEntries(Object.entries(filteredGlobalsMeta).filter(([name, meta]) => !referenced.globals.has(name) && !meta.hidden)));
|
|
578
|
+
const mergedSections = [...filteredSidebar.sections];
|
|
579
|
+
for (const unlistedSection of unlistedSidebar.sections) {
|
|
580
|
+
const existing = mergedSections.find((s) => s.id === unlistedSection.id);
|
|
581
|
+
if (existing) existing.items = [...existing.items ?? [], ...unlistedSection.items ?? []];
|
|
582
|
+
else mergedSections.push(unlistedSection);
|
|
583
|
+
}
|
|
584
|
+
response.sidebar = { sections: mergedSections };
|
|
585
|
+
} else response.sidebar = filteredSidebar;
|
|
570
586
|
} else response.sidebar = buildAutoSidebar(filteredCollectionsMeta, filteredGlobalsMeta);
|
|
571
|
-
if (appState.blocks && Object.keys(appState.blocks).length > 0) response.blocks = introspectBlocks(appState.blocks);
|
|
587
|
+
if (accessCtx.session && appState.blocks && Object.keys(appState.blocks).length > 0) response.blocks = introspectBlocks(appState.blocks);
|
|
572
588
|
response.collections = filteredCollectionsMeta;
|
|
573
589
|
response.globals = filteredGlobalsMeta;
|
|
574
590
|
return stripUndefinedDeep(response);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ServerActionDefinition, ServerActionResult } from "../../../augmentation/actions.mjs";
|
|
2
2
|
import "../../../augmentation.mjs";
|
|
3
3
|
import { App } from "./route-helpers.mjs";
|
|
4
|
-
import * as
|
|
4
|
+
import * as questpie69 from "questpie";
|
|
5
5
|
|
|
6
6
|
//#region src/server/modules/admin/routes/execute-action.d.ts
|
|
7
7
|
|
|
@@ -56,37 +56,37 @@ declare function executeAction(app: App, request: ExecuteActionRequest, session?
|
|
|
56
56
|
* });
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
|
-
declare const executeActionFn:
|
|
59
|
+
declare const executeActionFn: questpie69.JsonRouteDefinition<{
|
|
60
60
|
collection: string;
|
|
61
61
|
actionId: string;
|
|
62
62
|
itemId?: string | undefined;
|
|
63
63
|
itemIds?: string[] | undefined;
|
|
64
64
|
data?: Record<string, unknown> | undefined;
|
|
65
65
|
locale?: string | undefined;
|
|
66
|
-
}, any,
|
|
66
|
+
}, any, questpie69.JsonRouteParams>;
|
|
67
67
|
/**
|
|
68
68
|
* Get actions configuration for a collection.
|
|
69
69
|
* Returns action definitions without handlers for client rendering.
|
|
70
70
|
*/
|
|
71
|
-
declare const getActionsConfigFn:
|
|
71
|
+
declare const getActionsConfigFn: questpie69.JsonRouteDefinition<{
|
|
72
72
|
collection: string;
|
|
73
|
-
}, any,
|
|
73
|
+
}, any, questpie69.JsonRouteParams>;
|
|
74
74
|
/**
|
|
75
75
|
* QUESTPIE functions for action execution.
|
|
76
76
|
* These are registered on the `adminModule`.
|
|
77
77
|
*/
|
|
78
78
|
declare const actionFunctions: {
|
|
79
|
-
executeAction:
|
|
79
|
+
executeAction: questpie69.JsonRouteDefinition<{
|
|
80
80
|
collection: string;
|
|
81
81
|
actionId: string;
|
|
82
82
|
itemId?: string | undefined;
|
|
83
83
|
itemIds?: string[] | undefined;
|
|
84
84
|
data?: Record<string, unknown> | undefined;
|
|
85
85
|
locale?: string | undefined;
|
|
86
|
-
}, any,
|
|
87
|
-
getActionsConfig:
|
|
86
|
+
}, any, questpie69.JsonRouteParams>;
|
|
87
|
+
getActionsConfig: questpie69.JsonRouteDefinition<{
|
|
88
88
|
collection: string;
|
|
89
|
-
}, any,
|
|
89
|
+
}, any, questpie69.JsonRouteParams>;
|
|
90
90
|
};
|
|
91
91
|
//#endregion
|
|
92
92
|
export { ExecuteActionRequest, ExecuteActionResponse, actionFunctions, executeAction, executeActionFn, getActionsConfig, getActionsConfigFn };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getApp, getCollection, getCollectionCrud, getCollectionCruds, getGlobalCruds, getSession } from "./route-helpers.mjs";
|
|
2
2
|
import { translateAdminMessage } from "./i18n-helpers.mjs";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import { route } from "questpie";
|
|
4
|
+
import { route, runWithContext } from "questpie";
|
|
5
5
|
|
|
6
6
|
//#region src/server/modules/admin/routes/execute-action.ts
|
|
7
7
|
/**
|
|
@@ -137,7 +137,8 @@ async function executeAction(app, request, session) {
|
|
|
137
137
|
success: false,
|
|
138
138
|
result: {
|
|
139
139
|
type: "error",
|
|
140
|
-
toast: { message: validationError }
|
|
140
|
+
toast: { message: validationError.message },
|
|
141
|
+
errors: validationError.errors
|
|
141
142
|
}
|
|
142
143
|
};
|
|
143
144
|
}
|
|
@@ -155,7 +156,13 @@ async function executeAction(app, request, session) {
|
|
|
155
156
|
locale,
|
|
156
157
|
t
|
|
157
158
|
};
|
|
158
|
-
const result = await
|
|
159
|
+
const result = await runWithContext({
|
|
160
|
+
app,
|
|
161
|
+
db: appRec.db,
|
|
162
|
+
session,
|
|
163
|
+
locale,
|
|
164
|
+
accessMode: "user"
|
|
165
|
+
}, () => customAction.handler(context));
|
|
159
166
|
return {
|
|
160
167
|
success: result.type === "success" || result.type === "redirect",
|
|
161
168
|
result
|
|
@@ -182,7 +189,8 @@ async function executeBuiltinAction(app, params) {
|
|
|
182
189
|
const crudContext = {
|
|
183
190
|
db: appRec.db,
|
|
184
191
|
session: params.session,
|
|
185
|
-
locale: params.locale
|
|
192
|
+
locale: params.locale,
|
|
193
|
+
accessMode: "user"
|
|
186
194
|
};
|
|
187
195
|
try {
|
|
188
196
|
switch (actionId) {
|
|
@@ -420,8 +428,20 @@ function isFieldRequired(field$1) {
|
|
|
420
428
|
* Returns error message if validation fails, null if valid.
|
|
421
429
|
*/
|
|
422
430
|
function validateActionFormData(fields, data, t) {
|
|
423
|
-
|
|
424
|
-
|
|
431
|
+
const errors = {};
|
|
432
|
+
for (const [fieldName, fieldConfig] of Object.entries(fields)) {
|
|
433
|
+
if (isFieldDefinition(fieldConfig)) {
|
|
434
|
+
const result = fieldConfig.toZodSchema().safeParse(data[fieldName]);
|
|
435
|
+
if (!result.success) errors[fieldName] = result.error.issues[0]?.message || t("action.fieldRequired", { field: fieldName });
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
if (isFieldRequired(fieldConfig) && (data[fieldName] === void 0 || data[fieldName] === null)) errors[fieldName] = t("action.fieldRequired", { field: fieldName });
|
|
439
|
+
}
|
|
440
|
+
const firstError = Object.values(errors)[0];
|
|
441
|
+
return firstError ? {
|
|
442
|
+
message: firstError,
|
|
443
|
+
errors
|
|
444
|
+
} : null;
|
|
425
445
|
}
|
|
426
446
|
const executeActionRequestSchema = z.object({
|
|
427
447
|
collection: z.string(),
|
|
@@ -454,7 +474,7 @@ const getActionsConfigResponseSchema = z.object({
|
|
|
454
474
|
* });
|
|
455
475
|
* ```
|
|
456
476
|
*/
|
|
457
|
-
const executeActionFn = route().post().schema(executeActionRequestSchema).outputSchema(executeActionResponseSchema).handler(async (ctx) => {
|
|
477
|
+
const executeActionFn = route().post().access((ctx) => !!ctx.session).schema(executeActionRequestSchema).outputSchema(executeActionResponseSchema).handler(async (ctx) => {
|
|
458
478
|
const app = getApp(ctx);
|
|
459
479
|
const session = getSession(ctx);
|
|
460
480
|
return executeAction(app, ctx.input, session);
|
|
@@ -463,7 +483,7 @@ const executeActionFn = route().post().schema(executeActionRequestSchema).output
|
|
|
463
483
|
* Get actions configuration for a collection.
|
|
464
484
|
* Returns action definitions without handlers for client rendering.
|
|
465
485
|
*/
|
|
466
|
-
const getActionsConfigFn = route().post().schema(getActionsConfigRequestSchema).outputSchema(getActionsConfigResponseSchema).handler((ctx) => {
|
|
486
|
+
const getActionsConfigFn = route().post().access((ctx) => !!ctx.session).schema(getActionsConfigRequestSchema).outputSchema(getActionsConfigResponseSchema).handler((ctx) => {
|
|
467
487
|
return getActionsConfig(getApp(ctx), ctx.input.collection);
|
|
468
488
|
});
|
|
469
489
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as questpie344 from "questpie";
|
|
2
2
|
|
|
3
3
|
//#region src/server/modules/admin/routes/locales.d.ts
|
|
4
4
|
|
|
@@ -12,7 +12,7 @@ import * as questpie456 from "questpie";
|
|
|
12
12
|
* Bundle of locale-related functions.
|
|
13
13
|
*/
|
|
14
14
|
declare const localeFunctions: {
|
|
15
|
-
readonly getContentLocales:
|
|
15
|
+
readonly getContentLocales: questpie344.JsonRouteDefinition<Record<string, never> | undefined, any, questpie344.JsonRouteParams>;
|
|
16
16
|
};
|
|
17
17
|
//#endregion
|
|
18
18
|
export { localeFunctions };
|
|
@@ -306,7 +306,7 @@ const optionsOutputSchema = z.object({
|
|
|
306
306
|
* Batch reactive endpoint.
|
|
307
307
|
* Executes multiple reactive handlers in a single request.
|
|
308
308
|
*/
|
|
309
|
-
const batchReactive = route().post().schema(batchReactiveInputSchema).outputSchema(batchReactiveOutputSchema).handler(async (ctx) => {
|
|
309
|
+
const batchReactive = route().post().access((ctx) => !!ctx.session).schema(batchReactiveInputSchema).outputSchema(batchReactiveOutputSchema).handler(async (ctx) => {
|
|
310
310
|
const app = getApp(ctx);
|
|
311
311
|
const { collection: entityName, type: entityType, requests, formData: sharedFormData, prevData: sharedPrevData } = ctx.input;
|
|
312
312
|
const serverCtx = buildServerContext(ctx);
|
|
@@ -359,7 +359,7 @@ const batchReactive = route().post().schema(batchReactiveInputSchema).outputSche
|
|
|
359
359
|
* Dynamic options endpoint.
|
|
360
360
|
* Fetches options for select/relation fields with search and pagination.
|
|
361
361
|
*/
|
|
362
|
-
const fieldOptions = route().post().schema(optionsInputSchema).outputSchema(optionsOutputSchema).handler(async (ctx) => {
|
|
362
|
+
const fieldOptions = route().post().access((ctx) => !!ctx.session).schema(optionsInputSchema).outputSchema(optionsOutputSchema).handler(async (ctx) => {
|
|
363
363
|
const app = getApp(ctx);
|
|
364
364
|
const { collection: entityName, type: entityType, field: field$1, formData, siblingData, search, page, limit } = ctx.input;
|
|
365
365
|
const serverCtx = buildServerContext(ctx);
|
|
@@ -3,14 +3,18 @@ import { Questpie } from "questpie";
|
|
|
3
3
|
//#region src/server/modules/admin/routes/route-helpers.d.ts
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Minimal
|
|
7
|
-
*
|
|
8
|
-
* but AppContext is empty in the admin package (augmented by user's codegen).
|
|
9
|
-
*
|
|
10
|
-
* These helpers safely extract the known properties at runtime.
|
|
11
|
-
* Uses Record<string, any> base to accept JsonRouteHandlerArgs without index signature issues.
|
|
6
|
+
* Minimal route handler context for admin helpers.
|
|
7
|
+
* Accepts full `JsonRouteHandlerArgs` and narrower resolver contexts (e.g. preview).
|
|
12
8
|
*/
|
|
13
|
-
type RouteHandlerContext =
|
|
9
|
+
type RouteHandlerContext = {
|
|
10
|
+
app?: unknown;
|
|
11
|
+
db?: unknown;
|
|
12
|
+
session?: unknown;
|
|
13
|
+
locale?: unknown;
|
|
14
|
+
input?: unknown;
|
|
15
|
+
request?: Request;
|
|
16
|
+
params?: Record<string, string>;
|
|
17
|
+
};
|
|
14
18
|
/**
|
|
15
19
|
* Typed app instance type used throughout admin routes.
|
|
16
20
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as questpie346 from "questpie";
|
|
2
2
|
|
|
3
3
|
//#region src/server/modules/admin/routes/translations.d.ts
|
|
4
4
|
|
|
@@ -17,10 +17,10 @@ import * as questpie458 from "questpie";
|
|
|
17
17
|
* Bundle of translation-related functions.
|
|
18
18
|
*/
|
|
19
19
|
declare const translationFunctions: {
|
|
20
|
-
readonly getAdminTranslations:
|
|
20
|
+
readonly getAdminTranslations: questpie346.JsonRouteDefinition<{
|
|
21
21
|
locale: string;
|
|
22
|
-
}, any,
|
|
23
|
-
readonly getAdminLocales:
|
|
22
|
+
}, any, questpie346.JsonRouteParams>;
|
|
23
|
+
readonly getAdminLocales: questpie346.JsonRouteDefinition<Record<string, never> | undefined, any, questpie346.JsonRouteParams>;
|
|
24
24
|
};
|
|
25
25
|
//#endregion
|
|
26
26
|
export { translationFunctions };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { ApiError, route, tryGetContext } from "questpie";
|
|
2
|
+
import { ApiError, route, runWithContext, tryGetContext } from "questpie";
|
|
3
3
|
|
|
4
4
|
//#region src/server/modules/admin/routes/widget-data.ts
|
|
5
5
|
/**
|
|
@@ -39,8 +39,10 @@ const fetchWidgetDataSchema = z.object({ widgetId: z.string() });
|
|
|
39
39
|
* const data = await client.routes.fetchWidgetData({ widgetId: "my-widget" });
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
|
-
const fetchWidgetData = route().post().schema(fetchWidgetDataSchema).outputSchema(z.unknown()).handler(async (ctx) => {
|
|
43
|
-
const
|
|
42
|
+
const fetchWidgetData = route().post().access((ctx) => !!ctx.session).schema(fetchWidgetDataSchema).outputSchema(z.unknown()).handler(async (ctx) => {
|
|
43
|
+
const stored = tryGetContext();
|
|
44
|
+
const routeApp = ctx.app ?? stored?.app;
|
|
45
|
+
const appState = routeApp?.state || {};
|
|
44
46
|
const dashboard = appState.config?.admin?.dashboard ?? appState.dashboard;
|
|
45
47
|
if (!dashboard?.items) throw ApiError.internal("No dashboard configured");
|
|
46
48
|
const widget = findWidgetById(dashboard.items, ctx.input.widgetId);
|
|
@@ -54,7 +56,13 @@ const fetchWidgetData = route().post().schema(fetchWidgetDataSchema).outputSchem
|
|
|
54
56
|
reason: "Access denied"
|
|
55
57
|
});
|
|
56
58
|
}
|
|
57
|
-
return
|
|
59
|
+
return runWithContext({
|
|
60
|
+
app: routeApp,
|
|
61
|
+
db: ctx.db,
|
|
62
|
+
session: ctx.session,
|
|
63
|
+
locale: ctx.locale,
|
|
64
|
+
accessMode: "user"
|
|
65
|
+
}, () => widget.loader(widgetCtx));
|
|
58
66
|
});
|
|
59
67
|
const widgetDataFunctions = { fetchWidgetData };
|
|
60
68
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { FilterOperator, FilterRule, SortConfig, ViewConfiguration } from "../../../../shared/types/saved-views.types.mjs";
|
|
2
2
|
import * as questpie_shared16 from "questpie/shared";
|
|
3
|
-
import * as
|
|
4
|
-
import * as
|
|
5
|
-
import * as
|
|
3
|
+
import * as questpie77 from "questpie";
|
|
4
|
+
import * as questpie_src_server_modules_core_fields_email_js1 from "questpie/src/server/modules/core/fields/email.js";
|
|
5
|
+
import * as questpie_src_server_modules_core_fields_json_js1 from "questpie/src/server/modules/core/fields/json.js";
|
|
6
6
|
import * as drizzle_orm_pg_core22 from "drizzle-orm/pg-core";
|
|
7
7
|
import * as drizzle_orm5 from "drizzle-orm";
|
|
8
8
|
|
|
@@ -31,22 +31,22 @@ import * as drizzle_orm5 from "drizzle-orm";
|
|
|
31
31
|
* });
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
34
|
-
declare const savedViewsCollection:
|
|
35
|
-
readonly text: typeof
|
|
36
|
-
readonly textarea: typeof
|
|
37
|
-
readonly email: typeof
|
|
38
|
-
readonly url: typeof
|
|
39
|
-
readonly number: typeof
|
|
40
|
-
readonly boolean: typeof
|
|
41
|
-
readonly date: typeof
|
|
42
|
-
readonly datetime: typeof
|
|
43
|
-
readonly time: typeof
|
|
44
|
-
readonly select: typeof
|
|
45
|
-
readonly upload: typeof
|
|
46
|
-
readonly relation: typeof
|
|
47
|
-
readonly object: typeof
|
|
48
|
-
readonly json: typeof
|
|
49
|
-
readonly from: typeof
|
|
34
|
+
declare const savedViewsCollection: questpie77.CollectionBuilder<questpie_shared16.Override<questpie_shared16.Override<questpie77.EmptyCollectionState<"admin_saved_views", undefined, {
|
|
35
|
+
readonly text: typeof questpie77.text;
|
|
36
|
+
readonly textarea: typeof questpie77.textarea;
|
|
37
|
+
readonly email: typeof questpie_src_server_modules_core_fields_email_js1.email;
|
|
38
|
+
readonly url: typeof questpie77.url;
|
|
39
|
+
readonly number: typeof questpie77.number;
|
|
40
|
+
readonly boolean: typeof questpie77.boolean;
|
|
41
|
+
readonly date: typeof questpie77.date;
|
|
42
|
+
readonly datetime: typeof questpie77.datetime;
|
|
43
|
+
readonly time: typeof questpie77.time;
|
|
44
|
+
readonly select: typeof questpie77.select;
|
|
45
|
+
readonly upload: typeof questpie77.upload;
|
|
46
|
+
readonly relation: typeof questpie77.relation;
|
|
47
|
+
readonly object: typeof questpie77.object;
|
|
48
|
+
readonly json: typeof questpie_src_server_modules_core_fields_json_js1.json;
|
|
49
|
+
readonly from: typeof questpie77.from;
|
|
50
50
|
}>, {
|
|
51
51
|
fields: {
|
|
52
52
|
readonly userId: drizzle_orm5.NotNull<drizzle_orm_pg_core22.PgVarcharBuilder<[string, ...string[]]>>;
|
|
@@ -57,31 +57,31 @@ declare const savedViewsCollection: questpie93.CollectionBuilder<questpie_shared
|
|
|
57
57
|
};
|
|
58
58
|
localized: readonly string[];
|
|
59
59
|
fieldDefinitions: {
|
|
60
|
-
readonly userId:
|
|
60
|
+
readonly userId: questpie77.FieldWithMethods<Omit<questpie77.TextFieldState, "notNull" | "column"> & {
|
|
61
61
|
notNull: true;
|
|
62
62
|
column: drizzle_orm5.NotNull<drizzle_orm_pg_core22.PgVarcharBuilder<[string, ...string[]]>>;
|
|
63
63
|
} & {
|
|
64
64
|
label: questpie_shared16.I18nText;
|
|
65
|
-
},
|
|
66
|
-
readonly collectionName:
|
|
65
|
+
}, questpie77.TextFieldMethods>;
|
|
66
|
+
readonly collectionName: questpie77.FieldWithMethods<Omit<questpie77.TextFieldState, "notNull" | "column"> & {
|
|
67
67
|
notNull: true;
|
|
68
68
|
column: drizzle_orm5.NotNull<drizzle_orm_pg_core22.PgVarcharBuilder<[string, ...string[]]>>;
|
|
69
69
|
} & {
|
|
70
70
|
label: questpie_shared16.I18nText;
|
|
71
|
-
},
|
|
72
|
-
readonly name:
|
|
71
|
+
}, questpie77.TextFieldMethods>;
|
|
72
|
+
readonly name: questpie77.FieldWithMethods<Omit<questpie77.TextFieldState, "notNull" | "column"> & {
|
|
73
73
|
notNull: true;
|
|
74
74
|
column: drizzle_orm5.NotNull<drizzle_orm_pg_core22.PgVarcharBuilder<[string, ...string[]]>>;
|
|
75
75
|
} & {
|
|
76
76
|
label: questpie_shared16.I18nText;
|
|
77
|
-
},
|
|
78
|
-
readonly configuration:
|
|
77
|
+
}, questpie77.TextFieldMethods>;
|
|
78
|
+
readonly configuration: questpie77.Field<Omit<questpie77.JsonFieldState, "notNull" | "column"> & {
|
|
79
79
|
notNull: true;
|
|
80
80
|
column: drizzle_orm5.NotNull<drizzle_orm_pg_core22.PgJsonbBuilder>;
|
|
81
81
|
} & {
|
|
82
82
|
label: questpie_shared16.I18nText;
|
|
83
83
|
}>;
|
|
84
|
-
readonly isDefault:
|
|
84
|
+
readonly isDefault: questpie77.Field<Omit<questpie77.BooleanFieldState, "column" | "hasDefault"> & {
|
|
85
85
|
hasDefault: true;
|
|
86
86
|
column: drizzle_orm5.HasDefault<drizzle_orm_pg_core22.PgBooleanBuilder>;
|
|
87
87
|
} & {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { auditLogCollection } from "../collections/audit-log.mjs";
|
|
2
2
|
import { auditCleanupJob } from "../jobs/audit-cleanup.mjs";
|
|
3
|
-
import * as
|
|
3
|
+
import * as questpie16 from "questpie";
|
|
4
4
|
|
|
5
5
|
//#region src/server/modules/audit/.generated/module.d.ts
|
|
6
6
|
interface AuditCollections {
|
|
@@ -43,13 +43,13 @@ declare const _module: {
|
|
|
43
43
|
app: {
|
|
44
44
|
hooks: {
|
|
45
45
|
collections: {
|
|
46
|
-
afterChange: (ctx:
|
|
47
|
-
afterDelete: (ctx:
|
|
48
|
-
afterTransition: (ctx:
|
|
46
|
+
afterChange: (ctx: questpie16.GlobalCollectionHookContext) => Promise<void>;
|
|
47
|
+
afterDelete: (ctx: questpie16.GlobalCollectionHookContext) => Promise<void>;
|
|
48
|
+
afterTransition: (ctx: questpie16.GlobalCollectionTransitionHookContext) => Promise<void>;
|
|
49
49
|
};
|
|
50
50
|
globals: {
|
|
51
|
-
afterChange: (ctx:
|
|
52
|
-
afterTransition: (ctx:
|
|
51
|
+
afterChange: (ctx: questpie16.GlobalGlobalHookContext) => Promise<void>;
|
|
52
|
+
afterTransition: (ctx: questpie16.GlobalGlobalTransitionHookContext) => Promise<void>;
|
|
53
53
|
};
|
|
54
54
|
};
|
|
55
55
|
};
|