@primocaredentgroup/prescriptions-component 0.1.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.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/_internal/client/PrescriptionsComponentClient.d.ts +25 -0
  4. package/dist/_internal/client/PrescriptionsComponentClient.d.ts.map +1 -0
  5. package/dist/_internal/client/PrescriptionsComponentClient.js +61 -0
  6. package/dist/_internal/client/PrescriptionsComponentClient.js.map +1 -0
  7. package/dist/_internal/client/index.d.ts +3 -0
  8. package/dist/_internal/client/index.d.ts.map +1 -0
  9. package/dist/_internal/client/index.js +2 -0
  10. package/dist/_internal/client/index.js.map +1 -0
  11. package/dist/_internal/client/types.d.ts +47 -0
  12. package/dist/_internal/client/types.d.ts.map +1 -0
  13. package/dist/_internal/client/types.js +2 -0
  14. package/dist/_internal/client/types.js.map +1 -0
  15. package/dist/_internal/component/convex.config.d.ts +7 -0
  16. package/dist/_internal/component/convex.config.d.ts.map +1 -0
  17. package/dist/_internal/component/convex.config.js +8 -0
  18. package/dist/_internal/component/convex.config.js.map +1 -0
  19. package/dist/_internal/component/functions.d.ts +9 -0
  20. package/dist/_internal/component/functions.d.ts.map +1 -0
  21. package/dist/_internal/component/functions.js +11 -0
  22. package/dist/_internal/component/functions.js.map +1 -0
  23. package/dist/_internal/component/index.d.ts +18 -0
  24. package/dist/_internal/component/index.d.ts.map +1 -0
  25. package/dist/_internal/component/index.js +20 -0
  26. package/dist/_internal/component/index.js.map +1 -0
  27. package/dist/_internal/component/schema.d.ts +2 -0
  28. package/dist/_internal/component/schema.d.ts.map +1 -0
  29. package/dist/_internal/component/schema.js +2 -0
  30. package/dist/_internal/component/schema.js.map +1 -0
  31. package/dist/_internal/react/PrescriptionsWidget.d.ts +18 -0
  32. package/dist/_internal/react/PrescriptionsWidget.d.ts.map +1 -0
  33. package/dist/_internal/react/PrescriptionsWidget.js +137 -0
  34. package/dist/_internal/react/PrescriptionsWidget.js.map +1 -0
  35. package/dist/_internal/react/index.d.ts +3 -0
  36. package/dist/_internal/react/index.d.ts.map +1 -0
  37. package/dist/_internal/react/index.js +2 -0
  38. package/dist/_internal/react/index.js.map +1 -0
  39. package/dist/client/index.d.ts +1 -0
  40. package/dist/client/index.js +1 -0
  41. package/dist/component/convex.config.d.ts +2 -0
  42. package/dist/component/convex.config.js +2 -0
  43. package/dist/component/index.d.ts +1 -0
  44. package/dist/component/index.js +1 -0
  45. package/dist/convex/lib/auth.d.ts +7 -0
  46. package/dist/convex/lib/auth.d.ts.map +1 -0
  47. package/dist/convex/lib/auth.js +38 -0
  48. package/dist/convex/lib/auth.js.map +1 -0
  49. package/dist/convex/lib/clinicalNormalize.d.ts +13 -0
  50. package/dist/convex/lib/clinicalNormalize.d.ts.map +1 -0
  51. package/dist/convex/lib/clinicalNormalize.js +82 -0
  52. package/dist/convex/lib/clinicalNormalize.js.map +1 -0
  53. package/dist/convex/lib/dental.d.ts +13 -0
  54. package/dist/convex/lib/dental.d.ts.map +1 -0
  55. package/dist/convex/lib/dental.js +79 -0
  56. package/dist/convex/lib/dental.js.map +1 -0
  57. package/dist/convex/lib/dynamicFieldsStrict.d.ts +9 -0
  58. package/dist/convex/lib/dynamicFieldsStrict.d.ts.map +1 -0
  59. package/dist/convex/lib/dynamicFieldsStrict.js +65 -0
  60. package/dist/convex/lib/dynamicFieldsStrict.js.map +1 -0
  61. package/dist/convex/lib/dynamicRules.d.ts +61 -0
  62. package/dist/convex/lib/dynamicRules.d.ts.map +1 -0
  63. package/dist/convex/lib/dynamicRules.js +221 -0
  64. package/dist/convex/lib/dynamicRules.js.map +1 -0
  65. package/dist/convex/lib/storage.d.ts +59 -0
  66. package/dist/convex/lib/storage.d.ts.map +1 -0
  67. package/dist/convex/lib/storage.js +120 -0
  68. package/dist/convex/lib/storage.js.map +1 -0
  69. package/dist/convex/lib/utils.d.ts +61 -0
  70. package/dist/convex/lib/utils.d.ts.map +1 -0
  71. package/dist/convex/lib/utils.js +135 -0
  72. package/dist/convex/lib/utils.js.map +1 -0
  73. package/dist/convex/lib/validation.d.ts +24 -0
  74. package/dist/convex/lib/validation.d.ts.map +1 -0
  75. package/dist/convex/lib/validation.js +333 -0
  76. package/dist/convex/lib/validation.js.map +1 -0
  77. package/dist/convex/mutations/digitalAssets.d.ts +54 -0
  78. package/dist/convex/mutations/digitalAssets.d.ts.map +1 -0
  79. package/dist/convex/mutations/digitalAssets.js +297 -0
  80. package/dist/convex/mutations/digitalAssets.js.map +1 -0
  81. package/dist/convex/mutations/operational.d.ts +38 -0
  82. package/dist/convex/mutations/operational.d.ts.map +1 -0
  83. package/dist/convex/mutations/operational.js +226 -0
  84. package/dist/convex/mutations/operational.js.map +1 -0
  85. package/dist/convex/mutations/phases.d.ts +45 -0
  86. package/dist/convex/mutations/phases.d.ts.map +1 -0
  87. package/dist/convex/mutations/phases.js +334 -0
  88. package/dist/convex/mutations/phases.js.map +1 -0
  89. package/dist/convex/mutations/prescriptions.d.ts +191 -0
  90. package/dist/convex/mutations/prescriptions.d.ts.map +1 -0
  91. package/dist/convex/mutations/prescriptions.js +1263 -0
  92. package/dist/convex/mutations/prescriptions.js.map +1 -0
  93. package/dist/convex/mutations/syncJobs.d.ts +37 -0
  94. package/dist/convex/mutations/syncJobs.d.ts.map +1 -0
  95. package/dist/convex/mutations/syncJobs.js +238 -0
  96. package/dist/convex/mutations/syncJobs.js.map +1 -0
  97. package/dist/convex/prescriptions/fields.d.ts +50 -0
  98. package/dist/convex/prescriptions/fields.d.ts.map +1 -0
  99. package/dist/convex/prescriptions/fields.js +242 -0
  100. package/dist/convex/prescriptions/fields.js.map +1 -0
  101. package/dist/convex/queries/dynamicFields.d.ts +27 -0
  102. package/dist/convex/queries/dynamicFields.d.ts.map +1 -0
  103. package/dist/convex/queries/dynamicFields.js +119 -0
  104. package/dist/convex/queries/dynamicFields.js.map +1 -0
  105. package/dist/convex/queries/prescriptions.d.ts +583 -0
  106. package/dist/convex/queries/prescriptions.d.ts.map +1 -0
  107. package/dist/convex/queries/prescriptions.js +208 -0
  108. package/dist/convex/queries/prescriptions.js.map +1 -0
  109. package/dist/convex/schema.d.ts +962 -0
  110. package/dist/convex/schema.d.ts.map +1 -0
  111. package/dist/convex/schema.js +434 -0
  112. package/dist/convex/schema.js.map +1 -0
  113. package/dist/convex/types.d.ts +267 -0
  114. package/dist/convex/types.d.ts.map +1 -0
  115. package/dist/convex/types.js +2 -0
  116. package/dist/convex/types.js.map +1 -0
  117. package/dist/react/index.d.ts +1 -0
  118. package/dist/react/index.js +1 -0
  119. package/dist/react/styles.css +54 -0
  120. package/package.json +82 -0
@@ -0,0 +1,242 @@
1
+ // ============================================
2
+ // PRESCRIZIONI - CAMPI DINAMICI (RUNTIME)
3
+ // ============================================
4
+ // Funzioni accessibili agli utenti per leggere catalogo e salvare valori
5
+ import { v } from "convex/values";
6
+ import { mutation, query } from "../_generated/server";
7
+ import { requireIdentityUser, assertPrescriptionAccess } from "../lib/auth";
8
+ import { evaluateDynamicRules, parseRulesetSnapshot } from "../lib/dynamicRules";
9
+ // ============================================
10
+ // QUERY: Lista catalogo campi (runtime)
11
+ // ============================================
12
+ export const listCatalog = query({
13
+ args: {
14
+ includeDeprecated: v.optional(v.boolean()),
15
+ },
16
+ handler: async (ctx, args) => {
17
+ const includeDeprecated = args.includeDeprecated ?? false;
18
+ const allFields = await ctx.db
19
+ .query("prescriptionFieldCatalog")
20
+ .filter((q) => q.eq(q.field("deleted_at"), undefined))
21
+ .collect();
22
+ if (includeDeprecated) {
23
+ return allFields;
24
+ }
25
+ return allFields.filter((f) => f.status === "active");
26
+ },
27
+ });
28
+ // ============================================
29
+ // QUERY: Get campi per una prescrizione specifica
30
+ // ============================================
31
+ // Ritorna i campi con i valori già salvati
32
+ export const getFieldsWithValues = query({
33
+ args: {
34
+ prescriptionId: v.id("prescriptions"),
35
+ },
36
+ handler: async (ctx, args) => {
37
+ const user = await requireIdentityUser(ctx);
38
+ const prescription = await ctx.db.get(args.prescriptionId);
39
+ if (!prescription || prescription.deleted_at) {
40
+ throw new Error("Prescrizione non trovata");
41
+ }
42
+ assertPrescriptionAccess(user, prescription);
43
+ // Parse valori salvati
44
+ let valuesByFieldId = {};
45
+ if (prescription.valuesByFieldId) {
46
+ try {
47
+ valuesByFieldId = JSON.parse(prescription.valuesByFieldId);
48
+ }
49
+ catch (e) {
50
+ console.error("Errore parsing valuesByFieldId:", e);
51
+ }
52
+ }
53
+ // Get catalog fields (include deprecated se hanno valori salvati)
54
+ const savedFieldIds = Object.keys(valuesByFieldId);
55
+ const allFields = await ctx.db
56
+ .query("prescriptionFieldCatalog")
57
+ .filter((q) => q.eq(q.field("deleted_at"), undefined))
58
+ .collect();
59
+ // Filter: active + deprecated che hanno valori salvati
60
+ const relevantFields = allFields.filter((f) => f.status === "active" ||
61
+ (f.status === "deprecated" && savedFieldIds.includes(f.fieldId)));
62
+ // Combine fields con values
63
+ const fieldsWithValues = relevantFields.map((field) => ({
64
+ ...field,
65
+ value: valuesByFieldId[field.fieldId],
66
+ hasValue: field.fieldId in valuesByFieldId,
67
+ }));
68
+ return fieldsWithValues;
69
+ },
70
+ });
71
+ // ============================================
72
+ // MUTATION: Aggiorna valore singolo campo
73
+ // ============================================
74
+ export const updateFieldValue = mutation({
75
+ args: {
76
+ prescriptionId: v.id("prescriptions"),
77
+ fieldId: v.string(),
78
+ value: v.any(), // Può essere string, number, boolean, array
79
+ },
80
+ handler: async (ctx, args) => {
81
+ return await applyFieldValuesUpdate(ctx, args.prescriptionId, {
82
+ [args.fieldId]: args.value,
83
+ });
84
+ },
85
+ });
86
+ // ============================================
87
+ // MUTATION: Aggiorna multipli valori in batch
88
+ // ============================================
89
+ export const updateFieldValues = mutation({
90
+ args: {
91
+ prescriptionId: v.id("prescriptions"),
92
+ values: v.any(), // Record<fieldId, value>
93
+ },
94
+ handler: async (ctx, args) => {
95
+ return await applyFieldValuesUpdate(ctx, args.prescriptionId, args.values);
96
+ },
97
+ });
98
+ async function applyFieldValuesUpdate(ctx, prescriptionId, incomingValues) {
99
+ const user = await requireIdentityUser(ctx);
100
+ const now = Date.now();
101
+ const prescription = await ctx.db.get(prescriptionId);
102
+ if (!prescription || prescription.deleted_at) {
103
+ throw new Error("Prescrizione non trovata");
104
+ }
105
+ assertPrescriptionAccess(user, prescription);
106
+ // State guard: il runtime campi dinamici è modificabile solo in DRAFT.
107
+ if (!["DRAFT"].includes(prescription.status)) {
108
+ throw new Error(`Non è possibile modificare i campi dinamici in stato ${prescription.status}`);
109
+ }
110
+ if (!incomingValues || typeof incomingValues !== "object" || Array.isArray(incomingValues)) {
111
+ throw new Error("Payload values non valido");
112
+ }
113
+ const allFields = await ctx.db
114
+ .query("prescriptionFieldCatalog")
115
+ .filter((q) => q.eq(q.field("deleted_at"), undefined))
116
+ .collect();
117
+ const fieldMap = new Map(allFields.map((f) => [f.fieldId, f]));
118
+ let existingValues = {};
119
+ if (prescription.valuesByFieldId) {
120
+ try {
121
+ existingValues = JSON.parse(prescription.valuesByFieldId);
122
+ }
123
+ catch {
124
+ existingValues = {};
125
+ }
126
+ }
127
+ const candidateValues = { ...existingValues };
128
+ const changedFieldIds = Object.keys(incomingValues);
129
+ // 1) Validazione field existence + deprecate + type (hard)
130
+ for (const fieldId of changedFieldIds) {
131
+ const field = fieldMap.get(fieldId);
132
+ if (!field) {
133
+ throw new Error(`Campo '${fieldId}' non trovato nel catalogo`);
134
+ }
135
+ if (field.status === "deprecated") {
136
+ throw new Error(`Campo '${fieldId}' è deprecato e non può essere modificato`);
137
+ }
138
+ candidateValues[fieldId] = validateFieldValue(field, incomingValues[fieldId]);
139
+ }
140
+ // 2) Regole runtime server-side (visibility/disabled enforcement)
141
+ const phaseInstances = await ctx.db
142
+ .query("phaseInstances")
143
+ .withIndex("by_prescriptionRef", (q) => q.eq("prescriptionRef", prescriptionId))
144
+ .collect();
145
+ const phaseData = {};
146
+ const latestByPhaseType = new Map();
147
+ for (const phase of phaseInstances) {
148
+ const current = latestByPhaseType.get(phase.phaseTypeKey);
149
+ if (!current || phase.ordinal > current.ordinal) {
150
+ latestByPhaseType.set(phase.phaseTypeKey, {
151
+ ordinal: phase.ordinal,
152
+ status: phase.status,
153
+ });
154
+ }
155
+ }
156
+ for (const [phaseTypeKey, data] of latestByPhaseType.entries()) {
157
+ phaseData[phaseTypeKey] = data.status;
158
+ }
159
+ const rulesetVersion = prescription.rulesetVersionId
160
+ ? await ctx.db.get(prescription.rulesetVersionId)
161
+ : null;
162
+ const parsedRules = parseRulesetSnapshot(rulesetVersion?.rulesJsonSnapshot);
163
+ if (parsedRules) {
164
+ const evaluation = evaluateDynamicRules(parsedRules, candidateValues, phaseData);
165
+ const visibleSet = new Set(evaluation.visibleFieldIds);
166
+ const disabledSet = new Set(evaluation.disabledFieldIds);
167
+ const rulesetFieldSet = new Set(parsedRules.fields.map((f) => f.id));
168
+ for (const fieldId of changedFieldIds) {
169
+ if (!rulesetFieldSet.has(fieldId)) {
170
+ throw new Error(`Campo '${fieldId}' non previsto dal ruleset associato`);
171
+ }
172
+ if (!visibleSet.has(fieldId)) {
173
+ throw new Error(`Campo '${fieldId}' non visibile nel contesto corrente`);
174
+ }
175
+ if (disabledSet.has(fieldId)) {
176
+ throw new Error(`Campo '${fieldId}' è disabilitato e non modificabile`);
177
+ }
178
+ }
179
+ }
180
+ await ctx.db.patch(prescriptionId, {
181
+ valuesByFieldId: JSON.stringify(candidateValues),
182
+ updatedAt: now,
183
+ });
184
+ await ctx.db.insert("auditEvents", {
185
+ auditEventId: 0,
186
+ prescriptionRef: prescriptionId,
187
+ at: now,
188
+ actorUserId: user._id,
189
+ actorRole: user.role,
190
+ type: "DYNAMIC_FIELDS_UPDATED",
191
+ payload: {
192
+ changedFieldIds,
193
+ count: changedFieldIds.length,
194
+ },
195
+ });
196
+ return { success: true, changedFieldIds };
197
+ }
198
+ // ============================================
199
+ // HELPER: Validazione valore per type
200
+ // ============================================
201
+ function validateFieldValue(field, value) {
202
+ switch (field.type) {
203
+ case "text":
204
+ if (typeof value !== "string") {
205
+ throw new Error(`Campo '${field.fieldId}': valore deve essere string`);
206
+ }
207
+ return value;
208
+ case "number":
209
+ const num = typeof value === "string" ? parseFloat(value) : value;
210
+ if (typeof num !== "number" || isNaN(num)) {
211
+ throw new Error(`Campo '${field.fieldId}': valore deve essere number`);
212
+ }
213
+ return num;
214
+ case "date":
215
+ // Accetta string ISO date o timestamp
216
+ if (typeof value !== "string" && typeof value !== "number") {
217
+ throw new Error(`Campo '${field.fieldId}': valore deve essere string ISO o timestamp`);
218
+ }
219
+ // Valida che sia una data valida
220
+ const date = new Date(value);
221
+ if (isNaN(date.getTime())) {
222
+ throw new Error(`Campo '${field.fieldId}': data non valida`);
223
+ }
224
+ return value;
225
+ case "checkbox":
226
+ if (typeof value !== "boolean") {
227
+ throw new Error(`Campo '${field.fieldId}': valore deve essere boolean`);
228
+ }
229
+ return value;
230
+ case "select":
231
+ if (typeof value !== "string") {
232
+ throw new Error(`Campo '${field.fieldId}': valore select deve essere string`);
233
+ }
234
+ if (!field.options || !field.options.includes(value)) {
235
+ throw new Error(`Campo '${field.fieldId}': valore '${value}' non è tra le opzioni valide`);
236
+ }
237
+ return value;
238
+ default:
239
+ throw new Error(`Campo '${field.fieldId}': type '${field.type}' non supportato`);
240
+ }
241
+ }
242
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../convex/prescriptions/fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export declare const previewDynamicFields: import("convex/server").RegisteredQuery<"public", {
2
+ phaseTypeKey?: string | undefined;
3
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
4
+ }, Promise<{
5
+ rulesetApplied: boolean;
6
+ fields: {
7
+ fieldId: string;
8
+ label: string;
9
+ description: string | undefined;
10
+ type: "number" | "text" | "date" | "select" | "checkbox";
11
+ options: string[] | undefined;
12
+ status: "active" | "deprecated";
13
+ stepId: string;
14
+ stepTitle: string;
15
+ stepOrder: number;
16
+ currentValue: unknown;
17
+ visible: boolean;
18
+ required: boolean;
19
+ disabled: boolean;
20
+ missingRequired: boolean;
21
+ }[];
22
+ activeModals: {
23
+ title: string;
24
+ message: string;
25
+ }[];
26
+ }>>;
27
+ //# sourceMappingURL=dynamicFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicFields.d.ts","sourceRoot":"","sources":["../../../convex/queries/dynamicFields.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;GA6H/B,CAAC"}
@@ -0,0 +1,119 @@
1
+ import { query } from "../_generated/server";
2
+ import { v } from "convex/values";
3
+ import { requireIdentityUser, assertPrescriptionAccess } from "../lib/auth";
4
+ import { evaluateDynamicRules, parseRulesetSnapshot } from "../lib/dynamicRules";
5
+ export const previewDynamicFields = query({
6
+ args: {
7
+ prescriptionId: v.id("prescriptions"),
8
+ phaseTypeKey: v.optional(v.string()),
9
+ },
10
+ handler: async (ctx, args) => {
11
+ const user = await requireIdentityUser(ctx);
12
+ const prescription = await ctx.db.get(args.prescriptionId);
13
+ if (!prescription || prescription.deleted_at) {
14
+ throw new Error("Prescrizione non trovata");
15
+ }
16
+ assertPrescriptionAccess(user, prescription);
17
+ let valuesByFieldId = {};
18
+ if (prescription.valuesByFieldId) {
19
+ try {
20
+ valuesByFieldId = JSON.parse(prescription.valuesByFieldId);
21
+ }
22
+ catch {
23
+ valuesByFieldId = {};
24
+ }
25
+ }
26
+ const allCatalogFields = await ctx.db
27
+ .query("prescriptionFieldCatalog")
28
+ .filter((q) => q.eq(q.field("deleted_at"), undefined))
29
+ .collect();
30
+ const savedFieldIds = new Set(Object.keys(valuesByFieldId));
31
+ const relevantCatalog = allCatalogFields.filter((f) => f.status === "active" || (f.status === "deprecated" && savedFieldIds.has(f.fieldId)));
32
+ const catalogById = new Map(relevantCatalog.map((f) => [f.fieldId, f]));
33
+ const phaseInstances = await ctx.db
34
+ .query("phaseInstances")
35
+ .withIndex("by_prescriptionRef", (q) => q.eq("prescriptionRef", args.prescriptionId))
36
+ .collect();
37
+ const phaseData = {};
38
+ const latestByPhaseType = new Map();
39
+ for (const phase of phaseInstances) {
40
+ const current = latestByPhaseType.get(phase.phaseTypeKey);
41
+ if (!current || phase.ordinal > current.ordinal) {
42
+ latestByPhaseType.set(phase.phaseTypeKey, {
43
+ ordinal: phase.ordinal,
44
+ status: phase.status,
45
+ });
46
+ }
47
+ }
48
+ for (const [phaseTypeKey, data] of latestByPhaseType.entries()) {
49
+ phaseData[phaseTypeKey] = data.status;
50
+ }
51
+ const rulesetVersion = prescription.rulesetVersionId
52
+ ? await ctx.db.get(prescription.rulesetVersionId)
53
+ : null;
54
+ const parsedState = parseRulesetSnapshot(rulesetVersion?.rulesJsonSnapshot);
55
+ if (!parsedState) {
56
+ return {
57
+ rulesetApplied: false,
58
+ fields: relevantCatalog.map((f) => ({
59
+ fieldId: f.fieldId,
60
+ label: f.label,
61
+ description: f.description,
62
+ type: f.type,
63
+ options: f.options,
64
+ status: f.status,
65
+ stepId: "default",
66
+ stepTitle: "Dati Prescrizione",
67
+ stepOrder: 0,
68
+ currentValue: valuesByFieldId[f.fieldId],
69
+ visible: true,
70
+ required: false,
71
+ disabled: false,
72
+ missingRequired: false,
73
+ })),
74
+ activeModals: [],
75
+ };
76
+ }
77
+ const evaluation = evaluateDynamicRules(parsedState, valuesByFieldId, phaseData);
78
+ const visibleSet = new Set(evaluation.visibleFieldIds);
79
+ const requiredSet = new Set(evaluation.requiredFieldIds);
80
+ const disabledSet = new Set(evaluation.disabledFieldIds);
81
+ const missingSet = new Set(evaluation.missingRequiredFieldIds);
82
+ const stepById = new Map(parsedState.steps.map((s) => [s.id, s]));
83
+ const fields = parsedState.fields
84
+ .filter((field) => catalogById.has(field.id))
85
+ .map((field) => {
86
+ const catalog = catalogById.get(field.id);
87
+ const step = stepById.get(field.stepId);
88
+ return {
89
+ fieldId: field.id,
90
+ label: catalog.label,
91
+ description: catalog.description,
92
+ type: catalog.type,
93
+ options: catalog.options,
94
+ status: catalog.status,
95
+ stepId: field.stepId,
96
+ stepTitle: step?.title || "Step",
97
+ stepOrder: step?.order || 0,
98
+ currentValue: evaluation.fieldValueOverrides[field.id] !== undefined
99
+ ? evaluation.fieldValueOverrides[field.id]
100
+ : valuesByFieldId[field.id],
101
+ visible: visibleSet.has(field.id),
102
+ required: requiredSet.has(field.id),
103
+ disabled: disabledSet.has(field.id),
104
+ missingRequired: missingSet.has(field.id),
105
+ };
106
+ })
107
+ .sort((a, b) => {
108
+ if (a.stepOrder !== b.stepOrder)
109
+ return a.stepOrder - b.stepOrder;
110
+ return a.label.localeCompare(b.label);
111
+ });
112
+ return {
113
+ rulesetApplied: true,
114
+ fields,
115
+ activeModals: evaluation.activeModals,
116
+ };
117
+ },
118
+ });
119
+ //# sourceMappingURL=dynamicFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicFields.js","sourceRoot":"","sources":["../../../convex/queries/dynamicFields.ts"],"names":[],"mappings":"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"}