domma-cms 0.3.0 → 0.5.2

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 (150) hide show
  1. package/README.md +3 -3
  2. package/admin/css/admin.css +1 -1
  3. package/admin/dist/domma/domma-tools.css +2313 -0
  4. package/admin/dist/domma/domma-tools.min.js +10 -0
  5. package/admin/index.html +4 -0
  6. package/admin/js/api.js +1 -1
  7. package/admin/js/app.js +8 -4
  8. package/admin/js/config/sidebar-config.js +1 -1
  9. package/admin/js/lib/markdown-toolbar.js +18 -10
  10. package/admin/js/templates/action-editor.html +171 -0
  11. package/admin/js/templates/actions-list.html +19 -0
  12. package/admin/js/templates/api-reference.html +1411 -0
  13. package/admin/js/templates/block-editor.html +158 -0
  14. package/admin/js/templates/blocks.html +8 -0
  15. package/admin/js/templates/collection-editor.html +47 -0
  16. package/admin/js/templates/collection-entries.html +3 -0
  17. package/admin/js/templates/collections.html +51 -4
  18. package/admin/js/templates/documentation.html +258 -0
  19. package/{plugins/form-builder/admin → admin/js}/templates/form-editor.html +238 -199
  20. package/{plugins/form-builder/admin → admin/js}/templates/form-submissions.html +30 -30
  21. package/{plugins/form-builder/admin/templates/forms-list.html → admin/js/templates/forms.html} +17 -17
  22. package/admin/js/templates/login.html +29 -4
  23. package/admin/js/templates/my-profile.html +17 -0
  24. package/admin/js/templates/page-editor.html +39 -0
  25. package/admin/js/templates/pages.html +6 -1
  26. package/admin/js/templates/pro-docs.html +259 -0
  27. package/admin/js/templates/role-editor.html +59 -0
  28. package/admin/js/templates/roles.html +10 -0
  29. package/admin/js/templates/settings.html +167 -23
  30. package/admin/js/templates/tutorials.html +81 -0
  31. package/admin/js/templates/user-editor.html +7 -0
  32. package/admin/js/templates/users.html +3 -26
  33. package/admin/js/templates/view-editor.html +201 -0
  34. package/admin/js/templates/view-preview.html +51 -0
  35. package/admin/js/templates/views-list.html +19 -0
  36. package/admin/js/views/action-editor.js +1 -0
  37. package/admin/js/views/actions-list.js +1 -0
  38. package/admin/js/views/api-reference.js +1 -0
  39. package/admin/js/views/block-editor.js +8 -0
  40. package/admin/js/views/blocks.js +4 -0
  41. package/admin/js/views/collection-editor.js +3 -3
  42. package/admin/js/views/collection-entries.js +1 -1
  43. package/admin/js/views/collections.js +1 -1
  44. package/admin/js/views/dashboard.js +1 -1
  45. package/admin/js/views/form-editor.js +8 -0
  46. package/admin/js/views/form-submissions.js +1 -0
  47. package/admin/js/views/forms.js +1 -0
  48. package/admin/js/views/index.js +1 -1
  49. package/admin/js/views/login.js +2 -2
  50. package/admin/js/views/media.js +1 -1
  51. package/admin/js/views/my-profile.js +1 -0
  52. package/admin/js/views/page-editor.js +34 -15
  53. package/admin/js/views/pages.js +5 -5
  54. package/admin/js/views/plugins.js +10 -10
  55. package/admin/js/views/pro-docs.js +1 -0
  56. package/admin/js/views/role-editor.js +1 -0
  57. package/admin/js/views/roles.js +4 -0
  58. package/admin/js/views/settings.js +3 -1
  59. package/admin/js/views/user-editor.js +1 -1
  60. package/admin/js/views/users.js +4 -7
  61. package/admin/js/views/view-editor.js +1 -0
  62. package/admin/js/views/view-preview.js +1 -0
  63. package/admin/js/views/views-list.js +1 -0
  64. package/bin/cli.js +1 -1
  65. package/config/auth.json +1 -0
  66. package/config/connections.json.bak +9 -0
  67. package/config/connections.json.example +9 -0
  68. package/config/navigation.json +5 -15
  69. package/config/plugins.json +19 -29
  70. package/config/server.json +6 -6
  71. package/config/site.json +16 -6
  72. package/package.json +25 -10
  73. package/plugins/example-analytics/stats.json +17 -12
  74. package/plugins/form-builder/data/forms/contacts.json +62 -62
  75. package/plugins/form-builder/data/forms/enquiries.json +103 -0
  76. package/plugins/form-builder/data/forms/feedback.json +17 -16
  77. package/plugins/form-builder/data/forms/notes.json +79 -0
  78. package/plugins/form-builder/data/forms/to-do.json +100 -0
  79. package/plugins/form-builder/data/submissions/contacts.json +1 -26
  80. package/plugins/form-builder/data/submissions/notes.json +1 -0
  81. package/plugins/form-builder/data/submissions/to-do.json +1 -0
  82. package/plugins/theme-roller/admin/templates/theme-roller.html +71 -0
  83. package/plugins/theme-roller/admin/views/theme-roller-view.js +403 -0
  84. package/plugins/theme-roller/config.js +1 -0
  85. package/plugins/theme-roller/plugin.js +233 -0
  86. package/plugins/theme-roller/plugin.json +31 -0
  87. package/plugins/theme-roller/public/active-theme.css +0 -0
  88. package/plugins/theme-roller/public/inject-head-late.html +1 -0
  89. package/public/css/forms.css +1 -0
  90. package/public/css/site.css +1 -1
  91. package/public/js/forms.js +1 -0
  92. package/public/js/site.js +1 -1
  93. package/scripts/build.js +194 -129
  94. package/scripts/pro.js +254 -0
  95. package/scripts/reset.js +33 -8
  96. package/scripts/seed.js +677 -128
  97. package/scripts/setup.js +1 -0
  98. package/server/middleware/auth.js +136 -120
  99. package/server/routes/api/actions.js +200 -0
  100. package/server/routes/api/auth.js +292 -146
  101. package/server/routes/api/blocks.js +84 -0
  102. package/server/routes/api/collections.js +79 -27
  103. package/{plugins/form-builder/plugin.js → server/routes/api/forms.js} +491 -505
  104. package/server/routes/api/layouts.js +49 -39
  105. package/server/routes/api/media.js +118 -92
  106. package/server/routes/api/navigation.js +40 -36
  107. package/server/routes/api/pages.js +132 -118
  108. package/server/routes/api/plugins.js +6 -3
  109. package/server/routes/api/settings.js +104 -88
  110. package/server/routes/api/users.js +27 -19
  111. package/server/routes/api/views.js +148 -0
  112. package/server/routes/public.js +124 -108
  113. package/server/server.js +269 -181
  114. package/server/services/actions.js +387 -0
  115. package/server/services/adapterRegistry.js +98 -0
  116. package/server/services/adapters/FileAdapter.js +192 -0
  117. package/server/services/adapters/MongoAdapter.js +220 -0
  118. package/server/services/blocks.js +162 -0
  119. package/server/services/collections.js +74 -86
  120. package/server/services/connectionManager.js +102 -0
  121. package/server/services/content.js +312 -307
  122. package/server/services/email.js +126 -0
  123. package/server/services/forms.js +173 -0
  124. package/server/services/markdown.js +1378 -747
  125. package/server/services/permissionRegistry.js +173 -0
  126. package/server/services/presetCollections.js +251 -0
  127. package/server/services/renderer.js +98 -2
  128. package/server/services/roles.js +227 -0
  129. package/server/services/rowAccess.js +104 -0
  130. package/server/services/userProfiles.js +199 -0
  131. package/server/services/users.js +281 -212
  132. package/server/services/views.js +280 -0
  133. package/server/templates/page.html +124 -113
  134. package/plugins/form-builder/admin/templates/form-settings.html +0 -29
  135. package/plugins/form-builder/admin/views/form-editor.js +0 -1444
  136. package/plugins/form-builder/admin/views/form-settings.js +0 -38
  137. package/plugins/form-builder/admin/views/form-submissions.js +0 -295
  138. package/plugins/form-builder/admin/views/forms-list.js +0 -164
  139. package/plugins/form-builder/config.js +0 -9
  140. package/plugins/form-builder/data/forms/consent.json +0 -104
  141. package/plugins/form-builder/data/forms/contact-details.json +0 -99
  142. package/plugins/form-builder/data/submissions/consent.json +0 -13
  143. package/plugins/form-builder/plugin.json +0 -52
  144. package/plugins/form-builder/public/inject-body.html +0 -352
  145. package/plugins/form-builder/public/inject-head.html +0 -58
  146. package/plugins/form-builder/public/package.json +0 -1
  147. package/scripts/copy-domma.js +0 -48
  148. package/server/services/userTypes.js +0 -167
  149. /package/plugins/form-builder/data/submissions/{contact-details.json → enquiries.json} +0 -0
  150. /package/{plugins/form-builder/public → public/js}/form-logic-engine.js +0 -0
@@ -1,167 +0,0 @@
1
- /**
2
- * User Types Service
3
- * Preset Collection — seeds roles on first startup, caches them in memory.
4
- * Auth middleware calls getRoleMap() / getPermissionsFor() at request time.
5
- */
6
- import fs from 'fs/promises';
7
- import path from 'path';
8
- import { v4 as uuidv4 } from 'uuid';
9
- import { config } from '../config.js';
10
-
11
- const COLLECTIONS_DIR = path.resolve(config.content.collectionsDir);
12
- const SLUG = 'user-types';
13
- const DIR = path.join(COLLECTIONS_DIR, SLUG);
14
- const SCHEMA_PATH = path.join(DIR, 'schema.json');
15
- const DATA_PATH = path.join(DIR, 'data.json');
16
-
17
- const RESOURCES = ['pages', 'settings', 'navigation', 'layouts', 'media', 'users', 'plugins', 'collections'];
18
-
19
- const PRESET_SCHEMA = {
20
- slug: SLUG,
21
- title: 'User Types',
22
- description: 'CMS role definitions — managed by the system.',
23
- preset: true,
24
- fields: [
25
- { name: 'name', label: 'Name (slug)', type: 'text', required: true },
26
- { name: 'label', label: 'Label', type: 'text', required: true },
27
- { name: 'level', label: 'Level', type: 'number', required: true },
28
- { name: 'permissions', label: 'Permissions', type: 'multi-select', options: RESOURCES },
29
- { name: 'badgeClass', label: 'Badge Class', type: 'select',
30
- options: ['badge-danger','badge-warning','badge-info','badge-secondary','badge-success','badge-primary'] }
31
- ],
32
- api: {
33
- create: { enabled: false, access: 'admin' },
34
- read: { enabled: false, access: 'admin' },
35
- update: { enabled: false, access: 'admin' },
36
- delete: { enabled: false, access: 'admin' }
37
- }
38
- };
39
-
40
- const SEED_ENTRIES = [
41
- { name: 'admin', label: 'Admin', level: 0, permissions: RESOURCES, badgeClass: 'badge-danger' },
42
- { name: 'manager', label: 'Manager', level: 1, permissions: ['pages','settings','navigation','layouts','media','users','collections'], badgeClass: 'badge-warning' },
43
- { name: 'editor', label: 'Editor', level: 2, permissions: ['pages','media'], badgeClass: 'badge-info' },
44
- { name: 'subscriber', label: 'Subscriber', level: 3, permissions: [], badgeClass: 'badge-secondary' }
45
- ];
46
-
47
- // ---------------------------------------------------------------------------
48
- // In-memory cache
49
- // ---------------------------------------------------------------------------
50
-
51
- /** @type {Map<string,{label:string,level:number,badgeClass:string}>} */
52
- let roleMap = new Map();
53
-
54
- /** @type {Map<string,string[]>} */
55
- let permissionsMap = new Map();
56
-
57
- /**
58
- * Build in-memory maps from an array of data entries.
59
- *
60
- * @param {object[]} entries
61
- */
62
- function buildCache(entries) {
63
- roleMap = new Map();
64
- permissionsMap = new Map();
65
-
66
- for (const entry of entries) {
67
- const d = entry.data;
68
- roleMap.set(d.name, { label: d.label, level: d.level, badgeClass: d.badgeClass || '' });
69
- for (const resource of (d.permissions || [])) {
70
- if (!permissionsMap.has(resource)) permissionsMap.set(resource, []);
71
- permissionsMap.get(resource).push(d.name);
72
- }
73
- }
74
- }
75
-
76
- // ---------------------------------------------------------------------------
77
- // Public API
78
- // ---------------------------------------------------------------------------
79
-
80
- /**
81
- * Seed the preset collection on first startup (no-op if data.json already exists).
82
- *
83
- * @returns {Promise<void>}
84
- */
85
- export async function seed() {
86
- await fs.mkdir(DIR, { recursive: true });
87
-
88
- // Always write schema (overwrite to keep in sync with code)
89
- await fs.writeFile(SCHEMA_PATH, JSON.stringify(PRESET_SCHEMA, null, 2) + '\n', 'utf8');
90
-
91
- // Only write data if it doesn't exist yet
92
- try {
93
- await fs.access(DATA_PATH);
94
- } catch {
95
- const entries = SEED_ENTRIES.map(data => ({
96
- id: uuidv4(),
97
- data,
98
- createdAt: new Date().toISOString(),
99
- updatedAt: new Date().toISOString()
100
- }));
101
- await fs.writeFile(DATA_PATH, JSON.stringify(entries, null, 2) + '\n', 'utf8');
102
- }
103
- }
104
-
105
- /**
106
- * Load the collection from disk into the in-memory cache.
107
- *
108
- * @returns {Promise<void>}
109
- */
110
- export async function load() {
111
- try {
112
- const raw = await fs.readFile(DATA_PATH, 'utf8');
113
- const entries = JSON.parse(raw);
114
- buildCache(entries);
115
- } catch (err) {
116
- console.warn('[userTypes] Failed to load user-types collection:', err.message);
117
- }
118
- }
119
-
120
- /**
121
- * Reload from disk — call after any CRUD on the user-types collection.
122
- *
123
- * @returns {Promise<void>}
124
- */
125
- export async function invalidate() {
126
- await load();
127
- }
128
-
129
- /**
130
- * Return the full role map.
131
- *
132
- * @returns {Map<string,{label:string,level:number,badgeClass:string}>}
133
- */
134
- export function getRoleMap() {
135
- return roleMap;
136
- }
137
-
138
- /**
139
- * Return the level for a named role, or Infinity if not found.
140
- *
141
- * @param {string} roleName
142
- * @returns {number}
143
- */
144
- export function getRoleLevel(roleName) {
145
- return roleMap.get(roleName)?.level ?? Infinity;
146
- }
147
-
148
- /**
149
- * Return the role names allowed to access a resource, or [] if resource unknown.
150
- *
151
- * @param {string} resource
152
- * @returns {string[]}
153
- */
154
- export function getPermissionsFor(resource) {
155
- return permissionsMap.get(resource) ?? [];
156
- }
157
-
158
- /**
159
- * Return role names ordered from most to least privileged.
160
- *
161
- * @returns {string[]}
162
- */
163
- export function getRoleHierarchy() {
164
- return [...roleMap.entries()]
165
- .sort((a, b) => a[1].level - b[1].level)
166
- .map(([key]) => key);
167
- }