@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.
Files changed (94) hide show
  1. package/dist/client/builder/types/collection-types.d.mts +9 -0
  2. package/dist/client/components/actions/action-dialog.mjs +5 -0
  3. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +7 -0
  4. package/dist/client/components/fields/rich-text-editor/extensions.mjs +17 -1
  5. package/dist/client/components/fields/rich-text-editor/index.d.mts +2 -1
  6. package/dist/client/components/fields/rich-text-editor/index.mjs +35 -74
  7. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +30 -7
  8. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +1 -312
  9. package/dist/client/components/fields/rich-text-editor/types.d.mts +4 -0
  10. package/dist/client/components/fields/rich-text-editor/types.mjs +1 -1
  11. package/dist/client/components/fields/rich-text-editor/utils.mjs +6 -12
  12. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +75 -22
  13. package/dist/client/components/ui/dropdown-menu.mjs +1 -34
  14. package/dist/client/hooks/query-access.d.mts +9 -0
  15. package/dist/client/hooks/query-access.mjs +20 -0
  16. package/dist/client/hooks/typed-hooks.d.mts +4 -2
  17. package/dist/client/hooks/typed-hooks.mjs +30 -29
  18. package/dist/client/hooks/use-reactive-fields.d.mts +1 -0
  19. package/dist/client/hooks/use-reactive-fields.mjs +16 -1
  20. package/dist/client/hooks/use-server-actions.mjs +12 -1
  21. package/dist/client/hooks/use-view-state.mjs +15 -7
  22. package/dist/client/lib/view-filter-utils.mjs +30 -0
  23. package/dist/client/preview/block-scope-context.d.mts +2 -2
  24. package/dist/client/preview/preview-banner.d.mts +2 -2
  25. package/dist/client/preview/preview-field.d.mts +4 -4
  26. package/dist/client/scope/picker.d.mts +2 -2
  27. package/dist/client/scope/provider.d.mts +2 -2
  28. package/dist/client/styles/base.css +69 -77
  29. package/dist/client/utils/build-field-definitions-from-schema.mjs +1 -0
  30. package/dist/client/views/collection/auto-form-fields.mjs +3 -2
  31. package/dist/client/views/collection/cells/primitive-cells.mjs +9 -6
  32. package/dist/client/views/collection/columns/build-columns.mjs +3 -1
  33. package/dist/client/views/collection/field-renderer.mjs +11 -3
  34. package/dist/client/views/collection/form-view.mjs +207 -202
  35. package/dist/client/views/collection/list-view.mjs +581 -183
  36. package/dist/client/views/collection/outline.mjs +44 -19
  37. package/dist/client/views/collection/quick-filter-bar.mjs +45 -0
  38. package/dist/client/views/collection/table-view.mjs +60 -16
  39. package/dist/client/views/globals/global-form-view.mjs +12 -9
  40. package/dist/client/views/layout/admin-layout.mjs +1 -1
  41. package/dist/client/views/layout/admin-sidebar.mjs +20 -14
  42. package/dist/client/views/layout/admin-theme.mjs +5 -4
  43. package/dist/client.mjs +1 -1
  44. package/dist/components/rich-text/rich-text-renderer.d.mts +5 -5
  45. package/dist/components/rich-text/rich-text-renderer.mjs +5 -2
  46. package/dist/index.mjs +1 -1
  47. package/dist/modules/admin.d.mts +1 -1
  48. package/dist/server/augmentation/actions.d.mts +4 -3
  49. package/dist/server/augmentation/dashboard.d.mts +11 -11
  50. package/dist/server/augmentation/form-layout.d.mts +11 -6
  51. package/dist/server/augmentation/index.d.mts +7 -0
  52. package/dist/server/augmentation/sidebar.d.mts +8 -8
  53. package/dist/server/codegen/admin-client-template.mjs +55 -38
  54. package/dist/server/fields/index.d.mts +1 -1
  55. package/dist/server/fields/rich-text.d.mts +16 -17
  56. package/dist/server/fields/rich-text.mjs +18 -7
  57. package/dist/server/i18n/messages/cs.mjs +2 -0
  58. package/dist/server/i18n/messages/de.mjs +2 -0
  59. package/dist/server/i18n/messages/en.mjs +4 -0
  60. package/dist/server/i18n/messages/es.mjs +2 -0
  61. package/dist/server/i18n/messages/fr.mjs +2 -0
  62. package/dist/server/i18n/messages/pl.mjs +2 -0
  63. package/dist/server/i18n/messages/pt.mjs +2 -0
  64. package/dist/server/i18n/messages/sk.mjs +2 -0
  65. package/dist/server/modules/admin/block/block-builder.d.mts +0 -8
  66. package/dist/server/modules/admin/block/introspection.d.mts +2 -2
  67. package/dist/server/modules/admin/collections/account.d.mts +53 -52
  68. package/dist/server/modules/admin/collections/admin-locks.d.mts +57 -56
  69. package/dist/server/modules/admin/collections/admin-preferences.d.mts +3 -2
  70. package/dist/server/modules/admin/collections/admin-saved-views.d.mts +50 -49
  71. package/dist/server/modules/admin/collections/apikey.d.mts +72 -71
  72. package/dist/server/modules/admin/collections/assets.d.mts +42 -41
  73. package/dist/server/modules/admin/collections/session.d.mts +46 -45
  74. package/dist/server/modules/admin/collections/user.d.mts +67 -66
  75. package/dist/server/modules/admin/collections/verification.d.mts +39 -38
  76. package/dist/server/modules/admin/index.d.mts +3 -3
  77. package/dist/server/modules/admin/routes/admin-config.d.mts +2 -2
  78. package/dist/server/modules/admin/routes/admin-config.mjs +39 -23
  79. package/dist/server/modules/admin/routes/execute-action.d.mts +9 -9
  80. package/dist/server/modules/admin/routes/execute-action.mjs +28 -8
  81. package/dist/server/modules/admin/routes/locales.d.mts +2 -2
  82. package/dist/server/modules/admin/routes/reactive.mjs +2 -2
  83. package/dist/server/modules/admin/routes/route-helpers.d.mts +11 -7
  84. package/dist/server/modules/admin/routes/translations.d.mts +4 -4
  85. package/dist/server/modules/admin/routes/widget-data.mjs +12 -4
  86. package/dist/server/modules/admin-preferences/collections/saved-views.d.mts +27 -27
  87. package/dist/server/modules/audit/.generated/module.d.mts +6 -6
  88. package/dist/server/modules/audit/collections/audit-log.d.mts +40 -39
  89. package/dist/server/plugin.mjs +3 -3
  90. package/dist/server.d.mts +1 -1
  91. package/dist/shared/types/index.d.mts +1 -0
  92. package/dist/shared/types/saved-views.types.d.mts +14 -7
  93. package/dist/shared.d.mts +3 -2
  94. 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
- return { sections: config.sections.map((s) => ({
205
- ...s,
206
- items: (s.items ?? []).filter((item) => {
207
- const rec = item;
208
- if (item.type === "collection") return accessibleCollections.has(rec.collection);
209
- if (item.type === "global") return accessibleGlobals.has(rec.global);
210
- return true;
211
- })
212
- })).filter((s) => (s.items?.length ?? 0) > 0 || (s.sections?.length ?? 0) > 0) };
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 filteredSidebar = filterSidebarConfig(sidebarConfig, accessibleCollections, accessibleGlobals);
561
- const referenced = collectSidebarReferences(sidebarConfig);
562
- 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)));
563
- const mergedSections = [...filteredSidebar.sections];
564
- for (const unlistedSection of unlistedSidebar.sections) {
565
- const existing = mergedSections.find((s) => s.id === unlistedSection.id);
566
- if (existing) existing.items = [...existing.items ?? [], ...unlistedSection.items ?? []];
567
- else mergedSections.push(unlistedSection);
568
- }
569
- response.sidebar = { sections: mergedSections };
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 questpie85 from "questpie";
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: questpie85.JsonRouteDefinition<{
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, questpie85.JsonRouteParams>;
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: questpie85.JsonRouteDefinition<{
71
+ declare const getActionsConfigFn: questpie69.JsonRouteDefinition<{
72
72
  collection: string;
73
- }, any, questpie85.JsonRouteParams>;
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: questpie85.JsonRouteDefinition<{
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, questpie85.JsonRouteParams>;
87
- getActionsConfig: questpie85.JsonRouteDefinition<{
86
+ }, any, questpie69.JsonRouteParams>;
87
+ getActionsConfig: questpie69.JsonRouteDefinition<{
88
88
  collection: string;
89
- }, any, questpie85.JsonRouteParams>;
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 customAction.handler(context);
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
- for (const [fieldName, fieldConfig] of Object.entries(fields)) if (isFieldRequired(fieldConfig) && !data[fieldName]) return t("action.fieldRequired", { field: fieldName });
424
- return null;
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 questpie456 from "questpie";
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: questpie456.JsonRouteDefinition<Record<string, never> | undefined, any, questpie456.JsonRouteParams>;
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 typed shape for route handler context.
7
- * The actual context is `JsonRouteHandlerArgs<T>` which extends `AppContext`,
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 = Record<string, any>;
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 questpie458 from "questpie";
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: questpie458.JsonRouteDefinition<{
20
+ readonly getAdminTranslations: questpie346.JsonRouteDefinition<{
21
21
  locale: string;
22
- }, any, questpie458.JsonRouteParams>;
23
- readonly getAdminLocales: questpie458.JsonRouteDefinition<Record<string, never> | undefined, any, questpie458.JsonRouteParams>;
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 appState = (tryGetContext()?.app)?.state || {};
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 widget.loader(widgetCtx);
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 questpie93 from "questpie";
4
- import * as questpie_src_server_modules_core_fields_email_js2 from "questpie/src/server/modules/core/fields/email.js";
5
- import * as questpie_src_server_modules_core_fields_json_js2 from "questpie/src/server/modules/core/fields/json.js";
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: questpie93.CollectionBuilder<questpie_shared16.Override<questpie_shared16.Override<questpie93.EmptyCollectionState<"admin_saved_views", undefined, {
35
- readonly text: typeof questpie93.text;
36
- readonly textarea: typeof questpie93.textarea;
37
- readonly email: typeof questpie_src_server_modules_core_fields_email_js2.email;
38
- readonly url: typeof questpie93.url;
39
- readonly number: typeof questpie93.number;
40
- readonly boolean: typeof questpie93.boolean;
41
- readonly date: typeof questpie93.date;
42
- readonly datetime: typeof questpie93.datetime;
43
- readonly time: typeof questpie93.time;
44
- readonly select: typeof questpie93.select;
45
- readonly upload: typeof questpie93.upload;
46
- readonly relation: typeof questpie93.relation;
47
- readonly object: typeof questpie93.object;
48
- readonly json: typeof questpie_src_server_modules_core_fields_json_js2.json;
49
- readonly from: typeof questpie93.from;
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: questpie93.FieldWithMethods<Omit<questpie93.TextFieldState, "notNull" | "column"> & {
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
- }, questpie93.TextFieldMethods>;
66
- readonly collectionName: questpie93.FieldWithMethods<Omit<questpie93.TextFieldState, "notNull" | "column"> & {
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
- }, questpie93.TextFieldMethods>;
72
- readonly name: questpie93.FieldWithMethods<Omit<questpie93.TextFieldState, "notNull" | "column"> & {
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
- }, questpie93.TextFieldMethods>;
78
- readonly configuration: questpie93.Field<Omit<questpie93.JsonFieldState, "notNull" | "column"> & {
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: questpie93.Field<Omit<questpie93.BooleanFieldState, "column" | "hasDefault"> & {
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 questpie64 from "questpie";
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: questpie64.GlobalCollectionHookContext) => Promise<void>;
47
- afterDelete: (ctx: questpie64.GlobalCollectionHookContext) => Promise<void>;
48
- afterTransition: (ctx: questpie64.GlobalCollectionTransitionHookContext) => Promise<void>;
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: questpie64.GlobalGlobalHookContext) => Promise<void>;
52
- afterTransition: (ctx: questpie64.GlobalGlobalTransitionHookContext) => Promise<void>;
51
+ afterChange: (ctx: questpie16.GlobalGlobalHookContext) => Promise<void>;
52
+ afterTransition: (ctx: questpie16.GlobalGlobalTransitionHookContext) => Promise<void>;
53
53
  };
54
54
  };
55
55
  };