@flowselections/admin-installatietechniek 1.0.1 → 1.0.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.
@@ -23,6 +23,9 @@ const setUserPermissionInput = z.object({
23
23
  const userPermissionsInput = z.object({
24
24
  userId: z.string().uuid(),
25
25
  });
26
+ const moduleOrderInput = z.object({
27
+ moduleIds: z.array(z.string().trim().min(1).max(100)).max(200),
28
+ });
26
29
  const assignRoleInput = z.object({
27
30
  userId: z.string().uuid(),
28
31
  role: roleSchema,
@@ -187,6 +190,53 @@ export const syncModuleRegistry = createServerFn({ method: "POST" })
187
190
  }
188
191
  return { ok: true, count: modules.length };
189
192
  });
193
+ /**
194
+ * Volgorde van modules in de zijbalk. Leesbaar voor elke ingelogde gebruiker,
195
+ * zodat de shell hem kan toepassen.
196
+ */
197
+ export const getModuleOrder = createServerFn({ method: "GET" })
198
+ .middleware([requireSupabaseAuth])
199
+ .handler(async ({ context }) => {
200
+ const { data, error } = await context.supabase
201
+ .from("module_registry")
202
+ .select("module_id, name, sort_order, is_active")
203
+ .eq("is_active", true);
204
+ if (error)
205
+ throw error;
206
+ const safe = Array.isArray(data) ? data : [];
207
+ // Rijen zonder sort_order blijven `null`: de client bepaalt hun plek op
208
+ // basis van de bronvolgorde van de shell (geen alfabetische fallback).
209
+ return {
210
+ modules: safe
211
+ .map((row) => ({
212
+ id: row.module_id,
213
+ name: row.name,
214
+ sortOrder: typeof row.sort_order === "number" ? row.sort_order : null,
215
+ }))
216
+ .sort((a, b) => {
217
+ const ao = a.sortOrder ?? Number.MAX_SAFE_INTEGER;
218
+ const bo = b.sortOrder ?? Number.MAX_SAFE_INTEGER;
219
+ return ao - bo;
220
+ }),
221
+ };
222
+ });
223
+ /** Slaat de volgorde op: index in de aangeleverde lijst wordt sort_order. */
224
+ export const setModuleOrder = createServerFn({ method: "POST" })
225
+ .middleware([requireSupabaseAuth])
226
+ .inputValidator((data) => moduleOrderInput.parse(data))
227
+ .handler(async ({ context, data }) => {
228
+ await requireAdmin(context);
229
+ const ids = Array.isArray(data.moduleIds) ? data.moduleIds : [];
230
+ for (let i = 0; i < ids.length; i++) {
231
+ const { error } = await context.supabase
232
+ .from("module_registry")
233
+ .update({ sort_order: i })
234
+ .eq("module_id", ids[i]);
235
+ if (error)
236
+ throw error;
237
+ }
238
+ return { ok: true, count: ids.length };
239
+ });
190
240
  export const getModulePermissions = createServerFn({ method: "GET" })
191
241
  .middleware([requireSupabaseAuth])
192
242
  .handler(async ({ context }) => {
@@ -46,9 +46,9 @@ export function useDiscoveredModules() {
46
46
  found.set(first, (isTopLevel && title?.trim()) || existing || prettify(first));
47
47
  }
48
48
  }
49
- return Array.from(found.entries())
50
- .map(([id, name]) => ({ id, name }))
51
- .sort((a, b) => a.name.localeCompare(b.name, "nl"));
49
+ // Geen alfabetische sortering: de volgorde van de routeboom is de
50
+ // standaardvolgorde van de shell.
51
+ return Array.from(found.entries()).map(([id, name]) => ({ id, name }));
52
52
  // eslint-disable-next-line react-hooks/exhaustive-deps
53
53
  }, [ids]);
54
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowselections/admin-installatietechniek",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "flowselections": {
5
5
  "moduleId": "admin-installatietechniek",
6
6
  "pages": [
@@ -55,7 +55,7 @@
55
55
  "devDependencies": {
56
56
  "@cloudflare/vite-plugin": "^1.25.5",
57
57
  "@eslint/js": "^9.32.0",
58
- "@flowselections/core": "1.0.12",
58
+ "@flowselections/core": "1.0.16",
59
59
  "@lovable.dev/vite-tanstack-config": "2.13.1",
60
60
  "@rsbuild/core": "^1.0.0",
61
61
  "@tailwindcss/vite": "^4.2.1",