domma-cms 0.3.0 → 0.5.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.
- package/README.md +3 -3
- package/admin/css/admin.css +1 -1
- package/admin/dist/domma/domma-tools.css +2313 -0
- package/admin/dist/domma/domma-tools.min.js +10 -0
- package/admin/index.html +4 -0
- package/admin/js/api.js +1 -1
- package/admin/js/app.js +8 -4
- package/admin/js/config/sidebar-config.js +1 -1
- package/admin/js/lib/markdown-toolbar.js +18 -10
- package/admin/js/templates/action-editor.html +171 -0
- package/admin/js/templates/actions-list.html +19 -0
- package/admin/js/templates/api-reference.html +1411 -0
- package/admin/js/templates/block-editor.html +158 -0
- package/admin/js/templates/blocks.html +8 -0
- package/admin/js/templates/collection-editor.html +47 -0
- package/admin/js/templates/collection-entries.html +3 -0
- package/admin/js/templates/collections.html +51 -4
- package/admin/js/templates/documentation.html +258 -0
- package/{plugins/form-builder/admin → admin/js}/templates/form-editor.html +238 -199
- package/{plugins/form-builder/admin → admin/js}/templates/form-submissions.html +30 -30
- package/{plugins/form-builder/admin/templates/forms-list.html → admin/js/templates/forms.html} +17 -17
- package/admin/js/templates/login.html +29 -4
- package/admin/js/templates/my-profile.html +17 -0
- package/admin/js/templates/page-editor.html +39 -0
- package/admin/js/templates/pages.html +6 -1
- package/admin/js/templates/pro-docs.html +259 -0
- package/admin/js/templates/role-editor.html +59 -0
- package/admin/js/templates/roles.html +10 -0
- package/admin/js/templates/settings.html +123 -21
- package/admin/js/templates/tutorials.html +81 -0
- package/admin/js/templates/user-editor.html +7 -0
- package/admin/js/templates/users.html +3 -26
- package/admin/js/templates/view-editor.html +201 -0
- package/admin/js/templates/view-preview.html +51 -0
- package/admin/js/templates/views-list.html +19 -0
- package/admin/js/views/action-editor.js +1 -0
- package/admin/js/views/actions-list.js +1 -0
- package/admin/js/views/api-reference.js +1 -0
- package/admin/js/views/block-editor.js +8 -0
- package/admin/js/views/blocks.js +4 -0
- package/admin/js/views/collection-editor.js +3 -3
- package/admin/js/views/collection-entries.js +1 -1
- package/admin/js/views/collections.js +1 -1
- package/admin/js/views/dashboard.js +1 -1
- package/admin/js/views/form-editor.js +8 -0
- package/admin/js/views/form-submissions.js +1 -0
- package/admin/js/views/forms.js +1 -0
- package/admin/js/views/index.js +1 -1
- package/admin/js/views/login.js +2 -2
- package/admin/js/views/media.js +1 -1
- package/admin/js/views/my-profile.js +1 -0
- package/admin/js/views/page-editor.js +34 -15
- package/admin/js/views/pages.js +5 -5
- package/admin/js/views/plugins.js +10 -10
- package/admin/js/views/pro-docs.js +1 -0
- package/admin/js/views/role-editor.js +1 -0
- package/admin/js/views/roles.js +4 -0
- package/admin/js/views/settings.js +3 -1
- package/admin/js/views/user-editor.js +1 -1
- package/admin/js/views/users.js +4 -7
- package/admin/js/views/view-editor.js +1 -0
- package/admin/js/views/view-preview.js +1 -0
- package/admin/js/views/views-list.js +1 -0
- package/bin/cli.js +1 -1
- package/config/auth.json +1 -0
- package/config/connections.json.bak +9 -0
- package/config/connections.json.example +9 -0
- package/config/plugins.json +19 -29
- package/config/server.json +6 -6
- package/config/site.json +12 -2
- package/package.json +24 -10
- package/plugins/example-analytics/stats.json +17 -12
- package/plugins/theme-roller/admin/templates/theme-roller.html +71 -0
- package/plugins/theme-roller/admin/views/theme-roller-view.js +403 -0
- package/plugins/theme-roller/config.js +1 -0
- package/plugins/theme-roller/plugin.js +233 -0
- package/plugins/theme-roller/plugin.json +31 -0
- package/plugins/theme-roller/public/active-theme.css +0 -0
- package/plugins/theme-roller/public/inject-head-late.html +1 -0
- package/public/css/forms.css +1 -0
- package/public/css/site.css +1 -1
- package/public/js/forms.js +1 -0
- package/public/js/site.js +1 -1
- package/scripts/build.js +194 -129
- package/scripts/pro.js +254 -0
- package/scripts/reset.js +33 -8
- package/scripts/seed.js +343 -78
- package/scripts/setup.js +1 -0
- package/server/middleware/auth.js +136 -120
- package/server/routes/api/actions.js +200 -0
- package/server/routes/api/auth.js +292 -146
- package/server/routes/api/blocks.js +84 -0
- package/server/routes/api/collections.js +79 -27
- package/{plugins/form-builder/plugin.js → server/routes/api/forms.js} +483 -505
- package/server/routes/api/layouts.js +49 -39
- package/server/routes/api/media.js +118 -92
- package/server/routes/api/navigation.js +40 -36
- package/server/routes/api/pages.js +132 -118
- package/server/routes/api/plugins.js +6 -3
- package/server/routes/api/settings.js +104 -88
- package/server/routes/api/users.js +27 -19
- package/server/routes/api/views.js +148 -0
- package/server/routes/public.js +124 -108
- package/server/server.js +269 -181
- package/server/services/actions.js +387 -0
- package/server/services/adapterRegistry.js +98 -0
- package/server/services/adapters/FileAdapter.js +192 -0
- package/server/services/adapters/MongoAdapter.js +220 -0
- package/server/services/blocks.js +162 -0
- package/server/services/collections.js +74 -86
- package/server/services/connectionManager.js +102 -0
- package/server/services/content.js +312 -307
- package/server/services/email.js +126 -0
- package/server/services/forms.js +173 -0
- package/server/services/markdown.js +1378 -747
- package/server/services/permissionRegistry.js +173 -0
- package/server/services/presetCollections.js +251 -0
- package/server/services/renderer.js +75 -1
- package/server/services/roles.js +227 -0
- package/server/services/rowAccess.js +104 -0
- package/server/services/userProfiles.js +199 -0
- package/server/services/users.js +281 -212
- package/server/services/views.js +280 -0
- package/server/templates/page.html +119 -113
- package/plugins/form-builder/admin/templates/form-settings.html +0 -29
- package/plugins/form-builder/admin/views/form-editor.js +0 -1444
- package/plugins/form-builder/admin/views/form-settings.js +0 -38
- package/plugins/form-builder/admin/views/form-submissions.js +0 -295
- package/plugins/form-builder/admin/views/forms-list.js +0 -164
- package/plugins/form-builder/config.js +0 -9
- package/plugins/form-builder/data/forms/consent.json +0 -104
- package/plugins/form-builder/data/forms/contact-details.json +0 -99
- package/plugins/form-builder/data/forms/contacts.json +0 -66
- package/plugins/form-builder/data/forms/feedback.json +0 -130
- package/plugins/form-builder/data/submissions/consent.json +0 -13
- package/plugins/form-builder/data/submissions/contact-details.json +0 -1
- package/plugins/form-builder/data/submissions/contacts.json +0 -26
- package/plugins/form-builder/data/submissions/feedback.json +0 -1
- package/plugins/form-builder/plugin.json +0 -52
- package/plugins/form-builder/public/inject-body.html +0 -352
- package/plugins/form-builder/public/inject-head.html +0 -58
- package/plugins/form-builder/public/package.json +0 -1
- package/scripts/copy-domma.js +0 -48
- package/server/services/userTypes.js +0 -167
- /package/{plugins/form-builder/public → public/js}/form-logic-engine.js +0 -0
|
@@ -91,6 +91,40 @@
|
|
|
91
91
|
</select>
|
|
92
92
|
</div>
|
|
93
93
|
</div>
|
|
94
|
+
<div class="row mb-3">
|
|
95
|
+
<div class="col-6">
|
|
96
|
+
<label class="form-label">Theme Override</label>
|
|
97
|
+
<select id="field-theme" class="form-select">
|
|
98
|
+
<option value="">— Use site default —</option>
|
|
99
|
+
<option value="charcoal-dark">Charcoal Dark</option>
|
|
100
|
+
<option value="charcoal-light">Charcoal Light</option>
|
|
101
|
+
<option value="ocean-dark">Ocean Dark</option>
|
|
102
|
+
<option value="ocean-light">Ocean Light</option>
|
|
103
|
+
<option value="forest-dark">Forest Dark</option>
|
|
104
|
+
<option value="forest-light">Forest Light</option>
|
|
105
|
+
<option value="sunset-dark">Sunset Dark</option>
|
|
106
|
+
<option value="sunset-light">Sunset Light</option>
|
|
107
|
+
<option value="royal-dark">Royal Dark</option>
|
|
108
|
+
<option value="royal-light">Royal Light</option>
|
|
109
|
+
<option value="lemon-dark">Lemon Dark</option>
|
|
110
|
+
<option value="lemon-light">Lemon Light</option>
|
|
111
|
+
<option value="silver-dark">Silver Dark</option>
|
|
112
|
+
<option value="silver-light">Silver Light</option>
|
|
113
|
+
<option value="grayve-dark">Grayve Dark</option>
|
|
114
|
+
<option value="grayve-light">Grayve Light</option>
|
|
115
|
+
<option value="mint-dark">Mint Dark</option>
|
|
116
|
+
<option value="mint-light">Mint Light</option>
|
|
117
|
+
</select>
|
|
118
|
+
<small class="form-hint">Overrides the site-wide theme for this page only.</small>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="row mb-3">
|
|
122
|
+
<div class="col">
|
|
123
|
+
<label class="form-label">Tags</label>
|
|
124
|
+
<div id="field-tags"></div>
|
|
125
|
+
<small class="form-hint">Comma-separated keywords for filtering and search.</small>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
94
128
|
<div class="row">
|
|
95
129
|
<div class="col-auto">
|
|
96
130
|
<label class="form-check-label">
|
|
@@ -102,6 +136,11 @@
|
|
|
102
136
|
<input id="field-sidebar" type="checkbox" class="form-check"> Show Sidebar
|
|
103
137
|
</label>
|
|
104
138
|
</div>
|
|
139
|
+
<div class="col-auto">
|
|
140
|
+
<label class="form-check-label">
|
|
141
|
+
<input id="field-show-breadcrumbs" type="checkbox" class="form-check" checked> Show Breadcrumbs
|
|
142
|
+
</label>
|
|
143
|
+
</div>
|
|
105
144
|
</div>
|
|
106
145
|
</div>
|
|
107
146
|
|
|
@@ -3,16 +3,21 @@
|
|
|
3
3
|
<a href="#/pages/new" class="btn btn-primary"><span data-icon="plus"></span> New Page</a>
|
|
4
4
|
</div>
|
|
5
5
|
|
|
6
|
-
<div class="toolbar mb-3">
|
|
6
|
+
<div class="toolbar mb-3" style="display:flex;gap:.5rem;align-items:center;flex-wrap:wrap;">
|
|
7
7
|
<select id="status-filter" class="form-select form-select-sm" style="width:auto">
|
|
8
8
|
<option value="">All statuses</option>
|
|
9
9
|
<option value="published">Published</option>
|
|
10
10
|
<option value="draft">Draft</option>
|
|
11
11
|
</select>
|
|
12
|
+
<div class="btn-group" style="margin-left:auto;">
|
|
13
|
+
<button id="view-table-btn" class="btn btn-sm btn-primary" data-tooltip="Table view"><span data-icon="list"></span></button>
|
|
14
|
+
<button id="view-tree-btn" class="btn btn-sm btn-ghost" data-tooltip="Tree view"><span data-icon="tree"></span></button>
|
|
15
|
+
</div>
|
|
12
16
|
</div>
|
|
13
17
|
|
|
14
18
|
<div class="card">
|
|
15
19
|
<div class="card-body">
|
|
16
20
|
<div id="pages-table"></div>
|
|
21
|
+
<div id="pages-tree" style="display:none;"></div>
|
|
17
22
|
</div>
|
|
18
23
|
</div>
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
<div class="view-header">
|
|
2
|
+
<h1><span data-icon="zap"></span> Pro Documentation</h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<div class="tabs" id="pro-docs-tabs">
|
|
6
|
+
<div class="tab-list">
|
|
7
|
+
<button class="tab-item active">Views</button>
|
|
8
|
+
<button class="tab-item">Actions</button>
|
|
9
|
+
<button class="tab-item">CTA Shortcode</button>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="tab-content">
|
|
12
|
+
|
|
13
|
+
<!-- ── Views tab ─────────────────────────────────────── -->
|
|
14
|
+
<div class="tab-panel active">
|
|
15
|
+
|
|
16
|
+
<div class="card card-collapsible mb-4">
|
|
17
|
+
<div class="card-header" role="button" tabindex="0">
|
|
18
|
+
<div class="card-header-content"><h2><span data-icon="eye"></span> What is a View?</h2></div>
|
|
19
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="card-body docs-body">
|
|
22
|
+
<p>A <strong>View</strong> is a saved MongoDB aggregation pipeline that runs against a collection and returns shaped results. Views are created under <strong>Data → Views</strong> and exposed via a REST endpoint that respects role-level and row-level access.</p>
|
|
23
|
+
<p>Views require a MongoDB connection configured in <code>config/connections.json</code>.</p>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div class="card card-collapsible mb-4">
|
|
28
|
+
<div class="card-header" role="button" tabindex="0">
|
|
29
|
+
<div class="card-header-content"><h2><span data-icon="layers"></span> Allowed Pipeline Stages</h2></div>
|
|
30
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="card-body docs-body">
|
|
33
|
+
<table class="table table-sm">
|
|
34
|
+
<thead><tr><th>Stage</th><th>Purpose</th></tr></thead>
|
|
35
|
+
<tbody>
|
|
36
|
+
<tr><td><code>$match</code></td><td>Filter documents by field values</td></tr>
|
|
37
|
+
<tr><td><code>$sort</code></td><td>Order results</td></tr>
|
|
38
|
+
<tr><td><code>$project</code></td><td>Include, exclude, or rename fields</td></tr>
|
|
39
|
+
<tr><td><code>$lookup</code></td><td>Join from another collection</td></tr>
|
|
40
|
+
<tr><td><code>$unwind</code></td><td>Flatten an array field</td></tr>
|
|
41
|
+
<tr><td><code>$addFields</code></td><td>Compute new fields</td></tr>
|
|
42
|
+
<tr><td><code>$group</code></td><td>Aggregate (count, sum, etc.)</td></tr>
|
|
43
|
+
<tr><td><code>$limit</code></td><td>Cap results</td></tr>
|
|
44
|
+
<tr><td><code>$skip</code></td><td>Skip N results</td></tr>
|
|
45
|
+
<tr><td><code>$count</code></td><td>Return a document count</td></tr>
|
|
46
|
+
</tbody>
|
|
47
|
+
</table>
|
|
48
|
+
<p class="text-muted" style="margin-top:.75rem;">Blocked: <code>$out</code>, <code>$merge</code>, <code>$function</code>, <code>$accumulator</code>, <code>$graphLookup</code></p>
|
|
49
|
+
<p>Collections are prefixed <code>cms_</code> in MongoDB — use this prefix in <code>$lookup</code> <code>from</code> values.</p>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class="card card-collapsible mb-4">
|
|
54
|
+
<div class="card-header" role="button" tabindex="0">
|
|
55
|
+
<div class="card-header-content"><h2><span data-icon="code"></span> Example Pipeline</h2></div>
|
|
56
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="card-body docs-body">
|
|
59
|
+
<p>Match active entries and count related submissions:</p>
|
|
60
|
+
<pre class="code-block"><code>[
|
|
61
|
+
{ "$match": { "data.isActive": true } },
|
|
62
|
+
{
|
|
63
|
+
"$lookup": {
|
|
64
|
+
"from": "cms_feedback",
|
|
65
|
+
"localField": "_id",
|
|
66
|
+
"foreignField": "data.userId",
|
|
67
|
+
"as": "submissions"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{ "$addFields": { "submissionCount": { "$size": "$submissions" } } },
|
|
71
|
+
{ "$project": { "data.name": 1, "data.email": 1, "submissionCount": 1 } },
|
|
72
|
+
{ "$sort": { "submissionCount": -1 } }
|
|
73
|
+
]</code></pre>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div class="card card-collapsible mb-4">
|
|
78
|
+
<div class="card-header" role="button" tabindex="0">
|
|
79
|
+
<div class="card-header-content"><h2><span data-icon="lock"></span> Access Control</h2></div>
|
|
80
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="card-body docs-body">
|
|
83
|
+
<table class="table table-sm">
|
|
84
|
+
<thead><tr><th>Setting</th><th>Description</th></tr></thead>
|
|
85
|
+
<tbody>
|
|
86
|
+
<tr><td>Allowed Roles</td><td>Which roles can call <code>GET /api/views/:slug/public</code></td></tr>
|
|
87
|
+
<tr><td>Public</td><td>No authentication required when checked</td></tr>
|
|
88
|
+
<tr><td>Row-Level — Owner</td><td>User sees only entries they created</td></tr>
|
|
89
|
+
<tr><td>Row-Level — Field Match</td><td>A specified entry field must match a user property</td></tr>
|
|
90
|
+
</tbody>
|
|
91
|
+
</table>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
</div><!-- /Views tab -->
|
|
96
|
+
|
|
97
|
+
<!-- ── Actions tab ───────────────────────────────────── -->
|
|
98
|
+
<div class="tab-panel">
|
|
99
|
+
|
|
100
|
+
<div class="card card-collapsible mb-4">
|
|
101
|
+
<div class="card-header" role="button" tabindex="0">
|
|
102
|
+
<div class="card-header-content"><h2><span data-icon="zap"></span> What is an Action?</h2></div>
|
|
103
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
104
|
+
</div>
|
|
105
|
+
<div class="card-body docs-body">
|
|
106
|
+
<p>An <strong>Action</strong> is a named sequence of steps that runs against a single collection entry. Actions are defined under <strong>Data → Actions</strong> and can be triggered from the entry list or via the <code>[cta]</code> shortcode on any public page.</p>
|
|
107
|
+
<p>Actions require a MongoDB connection configured in <code>config/connections.json</code>.</p>
|
|
108
|
+
<p>Steps run in order. If a step fails, execution stops and a partial result is returned with a <code>stepsCompleted</code> count.</p>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<div class="card card-collapsible mb-4">
|
|
113
|
+
<div class="card-header" role="button" tabindex="0">
|
|
114
|
+
<div class="card-header-content"><h2><span data-icon="list"></span> Step Types</h2></div>
|
|
115
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="card-body docs-body">
|
|
118
|
+
<table class="table table-sm">
|
|
119
|
+
<thead><tr><th>Type</th><th>What it does</th></tr></thead>
|
|
120
|
+
<tbody>
|
|
121
|
+
<tr><td><code>updateField</code></td><td>Sets a field on the entry to a new value</td></tr>
|
|
122
|
+
<tr><td><code>deleteEntry</code></td><td>Permanently deletes the target entry</td></tr>
|
|
123
|
+
<tr><td><code>moveToCollection</code></td><td>Moves the entry to a different collection</td></tr>
|
|
124
|
+
<tr><td><code>webhook</code></td><td>POSTs entry data to an external URL</td></tr>
|
|
125
|
+
<tr><td><code>email</code></td><td>Sends an email via the configured SMTP server</td></tr>
|
|
126
|
+
</tbody>
|
|
127
|
+
</table>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<div class="card card-collapsible mb-4">
|
|
132
|
+
<div class="card-header" role="button" tabindex="0">
|
|
133
|
+
<div class="card-header-content"><h2><span data-icon="tag"></span> Template Variables</h2></div>
|
|
134
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
135
|
+
</div>
|
|
136
|
+
<div class="card-body docs-body">
|
|
137
|
+
<p>All step field values support <code>{{...}}</code> interpolation:</p>
|
|
138
|
+
<table class="table table-sm">
|
|
139
|
+
<thead><tr><th>Variable</th><th>Value</th></tr></thead>
|
|
140
|
+
<tbody>
|
|
141
|
+
<tr><td><code>{{entry.data.fieldName}}</code></td><td>Any field from the target entry</td></tr>
|
|
142
|
+
<tr><td><code>{{entry.id}}</code></td><td>The entry's UUID</td></tr>
|
|
143
|
+
<tr><td><code>{{now}}</code></td><td>Current ISO 8601 timestamp</td></tr>
|
|
144
|
+
<tr><td><code>{{user.name}}</code></td><td>Name of the triggering user</td></tr>
|
|
145
|
+
<tr><td><code>{{user.email}}</code></td><td>Email of the triggering user</td></tr>
|
|
146
|
+
<tr><td><code>{{user.id}}</code></td><td>UUID of the triggering user</td></tr>
|
|
147
|
+
<tr><td><code>{{env.CMS_PUBLIC_*}}</code></td><td>Public environment variables</td></tr>
|
|
148
|
+
</tbody>
|
|
149
|
+
</table>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<div class="card card-collapsible mb-4">
|
|
154
|
+
<div class="card-header" role="button" tabindex="0">
|
|
155
|
+
<div class="card-header-content"><h2><span data-icon="code"></span> Step Examples</h2></div>
|
|
156
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
157
|
+
</div>
|
|
158
|
+
<div class="card-body docs-body">
|
|
159
|
+
<p><strong>updateField</strong> — mark an entry as approved:</p>
|
|
160
|
+
<pre class="code-block"><code>{ "field": "status", "value": "approved" }</code></pre>
|
|
161
|
+
<p><strong>webhook</strong> — notify an external service:</p>
|
|
162
|
+
<pre class="code-block"><code>{
|
|
163
|
+
"url": "https://hooks.example.com/notify",
|
|
164
|
+
"headers": { "X-Secret": "{{env.CMS_PUBLIC_HOOK_SECRET}}" }
|
|
165
|
+
}</code></pre>
|
|
166
|
+
<p><strong>email</strong> — send confirmation to applicant:</p>
|
|
167
|
+
<pre class="code-block"><code>{
|
|
168
|
+
"to": "{{entry.data.email}}",
|
|
169
|
+
"subject": "Your application was approved",
|
|
170
|
+
"body": "Hi {{entry.data.name}}, your application has been approved."
|
|
171
|
+
}</code></pre>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
</div><!-- /Actions tab -->
|
|
176
|
+
|
|
177
|
+
<!-- ── CTA Shortcode tab ──────────────────────────────── -->
|
|
178
|
+
<div class="tab-panel">
|
|
179
|
+
|
|
180
|
+
<div class="card card-collapsible mb-4">
|
|
181
|
+
<div class="card-header" role="button" tabindex="0">
|
|
182
|
+
<div class="card-header-content"><h2><span data-icon="mouse-pointer"></span> What is the CTA shortcode?</h2></div>
|
|
183
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
184
|
+
</div>
|
|
185
|
+
<div class="card-body docs-body">
|
|
186
|
+
<p>The <code>[cta]</code> shortcode places an action-trigger button in any public page. Clicking it calls <code>POST /api/actions/:slug/public</code> with the entry ID, using the logged-in user's JWT.</p>
|
|
187
|
+
<p>If the user is not logged in, a warning toast is shown instead.</p>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
|
|
191
|
+
<div class="card card-collapsible mb-4">
|
|
192
|
+
<div class="card-header" role="button" tabindex="0">
|
|
193
|
+
<div class="card-header-content"><h2><span data-icon="code"></span> Syntax & Attributes</h2></div>
|
|
194
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
195
|
+
</div>
|
|
196
|
+
<div class="card-body docs-body">
|
|
197
|
+
<p><strong>Wrapping form:</strong></p>
|
|
198
|
+
<pre class="code-block"><code>[cta action="slug" entry="entry-id" icon="check" confirm="Are you sure?"]Button label[/cta]</code></pre>
|
|
199
|
+
<p><strong>Self-closing form:</strong></p>
|
|
200
|
+
<pre class="code-block"><code>[cta action="slug" entry="entry-id" label="Button label" /]</code></pre>
|
|
201
|
+
<table class="table table-sm" style="margin-top:1rem;">
|
|
202
|
+
<thead><tr><th>Attribute</th><th>Required</th><th>Default</th><th>Description</th></tr></thead>
|
|
203
|
+
<tbody>
|
|
204
|
+
<tr><td><code>action</code></td><td>Yes</td><td>—</td><td>Action slug</td></tr>
|
|
205
|
+
<tr><td><code>entry</code></td><td>Yes</td><td>—</td><td>Entry UUID to act on</td></tr>
|
|
206
|
+
<tr><td><code>label</code></td><td>No</td><td><code>"Run"</code></td><td>Button text (self-closing only)</td></tr>
|
|
207
|
+
<tr><td><code>style</code></td><td>No</td><td><code>"primary"</code></td><td>primary · secondary · ghost · danger</td></tr>
|
|
208
|
+
<tr><td><code>icon</code></td><td>No</td><td>—</td><td>Domma icon name</td></tr>
|
|
209
|
+
<tr><td><code>size</code></td><td>No</td><td>—</td><td>sm · md · lg</td></tr>
|
|
210
|
+
<tr><td><code>confirm</code></td><td>No</td><td>—</td><td>Confirmation prompt before executing</td></tr>
|
|
211
|
+
</tbody>
|
|
212
|
+
</table>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<div class="card card-collapsible mb-4">
|
|
217
|
+
<div class="card-header" role="button" tabindex="0">
|
|
218
|
+
<div class="card-header-content"><h2><span data-icon="grid"></span> Collection Integration</h2></div>
|
|
219
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="card-body docs-body">
|
|
222
|
+
<p>Add per-entry buttons to any <code>[collection]</code> shortcode:</p>
|
|
223
|
+
<pre class="code-block"><code>[collection slug="applications" display="cards" title-field="name"
|
|
224
|
+
cta="approve-application"
|
|
225
|
+
cta-label="Approve"
|
|
226
|
+
cta-icon="check"
|
|
227
|
+
cta-style="primary"
|
|
228
|
+
cta-confirm="Approve this application?" /]</code></pre>
|
|
229
|
+
<table class="table table-sm" style="margin-top:1rem;">
|
|
230
|
+
<thead><tr><th>Attribute</th><th>Default</th><th>Description</th></tr></thead>
|
|
231
|
+
<tbody>
|
|
232
|
+
<tr><td><code>cta</code></td><td>—</td><td>Action slug — enables per-entry buttons</td></tr>
|
|
233
|
+
<tr><td><code>cta-label</code></td><td><code>"Run"</code></td><td>Button label</td></tr>
|
|
234
|
+
<tr><td><code>cta-icon</code></td><td>—</td><td>Domma icon name</td></tr>
|
|
235
|
+
<tr><td><code>cta-style</code></td><td><code>"primary"</code></td><td>Button variant</td></tr>
|
|
236
|
+
<tr><td><code>cta-confirm</code></td><td>—</td><td>Confirmation prompt</td></tr>
|
|
237
|
+
</tbody>
|
|
238
|
+
</table>
|
|
239
|
+
<p>All three display modes support CTA buttons: <strong>cards</strong> (card footer), <strong>list</strong> (inline), <strong>table</strong> (dedicated column).</p>
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
|
|
243
|
+
<div class="card card-collapsible mb-4">
|
|
244
|
+
<div class="card-header" role="button" tabindex="0">
|
|
245
|
+
<div class="card-header-content"><h2><span data-icon="book-open"></span> Full Reference</h2></div>
|
|
246
|
+
<span class="card-collapse-icon" data-icon="chevron-down"></span>
|
|
247
|
+
</div>
|
|
248
|
+
<div class="card-body docs-body">
|
|
249
|
+
<p>See the public documentation for live examples and the complete attribute reference:</p>
|
|
250
|
+
<a href="/resources/pro/cta" target="_blank" class="btn btn-ghost btn-sm">
|
|
251
|
+
<span data-icon="external-link"></span> CTA Shortcode Reference
|
|
252
|
+
</a>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
</div><!-- /CTA tab -->
|
|
257
|
+
|
|
258
|
+
</div><!-- .tab-content -->
|
|
259
|
+
</div><!-- .tabs -->
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<div class="view-header">
|
|
2
|
+
<h1><span data-icon="shield"></span> <span id="role-title">Edit Role</span></h1>
|
|
3
|
+
<div>
|
|
4
|
+
<a href="#/roles" class="btn btn-secondary"><span data-icon="arrow-left"></span> Back</a>
|
|
5
|
+
<button id="btn-save-role" class="btn btn-primary"><span data-icon="save"></span> Save</button>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="tabs" id="role-tabs">
|
|
10
|
+
<div class="tab-list">
|
|
11
|
+
<button class="tab-item active">General</button>
|
|
12
|
+
<button class="tab-item">Permissions</button>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="tab-content">
|
|
15
|
+
<!-- General Tab -->
|
|
16
|
+
<div class="tab-panel active" id="panel-general">
|
|
17
|
+
<div class="card">
|
|
18
|
+
<div class="card-body">
|
|
19
|
+
<div class="row">
|
|
20
|
+
<div class="col-6">
|
|
21
|
+
<div class="mb-3">
|
|
22
|
+
<label class="form-label">Name (slug)</label>
|
|
23
|
+
<input id="role-name" type="text" class="form-input" placeholder="e.g. moderator">
|
|
24
|
+
<p class="form-hint">Lowercase identifier. Cannot be changed for the root admin
|
|
25
|
+
role.</p>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="col-6">
|
|
29
|
+
<div class="mb-3">
|
|
30
|
+
<label class="form-label">Display Label</label>
|
|
31
|
+
<input id="role-label" type="text" class="form-input" placeholder="e.g. Moderator">
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="row">
|
|
36
|
+
<div class="col-6">
|
|
37
|
+
<div class="mb-3">
|
|
38
|
+
<label class="form-label">Level</label>
|
|
39
|
+
<input id="role-level" type="number" class="form-input" min="0">
|
|
40
|
+
<p class="form-hint">Lower = more privileged. 0 is reserved for the root admin.</p>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="col-6">
|
|
44
|
+
<div class="mb-3">
|
|
45
|
+
<label class="form-label">Badge Colour</label>
|
|
46
|
+
<select id="role-badge" class="form-input"></select>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<!-- Permissions Tab -->
|
|
55
|
+
<div class="tab-panel" id="panel-permissions">
|
|
56
|
+
<div id="permissions-container"></div>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<div class="view-header">
|
|
2
|
+
<h1><span data-icon="shield"></span> Roles & Permissions</h1>
|
|
3
|
+
<button id="btn-add-role" class="btn btn-primary"><span data-icon="plus"></span> Add Role</button>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<div class="card">
|
|
7
|
+
<div class="card-body">
|
|
8
|
+
<div id="roles-table"></div>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
<button class="tab-item">Email / SMTP</button>
|
|
12
12
|
<button class="tab-item">Back to Top</button>
|
|
13
13
|
<button class="tab-item">Cookie Consent</button>
|
|
14
|
+
<button class="tab-item">Breadcrumbs</button>
|
|
14
15
|
<button class="tab-item">Custom CSS</button>
|
|
15
16
|
</div>
|
|
16
17
|
<div class="tab-content">
|
|
@@ -104,6 +105,10 @@
|
|
|
104
105
|
<option value="grayve-dark">Grayve Dark</option>
|
|
105
106
|
<option value="grayve-light">Grayve Light</option>
|
|
106
107
|
</optgroup>
|
|
108
|
+
<optgroup label="Mint">
|
|
109
|
+
<option value="mint-dark">Mint Dark</option>
|
|
110
|
+
<option value="mint-light">Mint Light</option>
|
|
111
|
+
</optgroup>
|
|
107
112
|
<optgroup label="Other">
|
|
108
113
|
<option value="christmas-dark">Christmas Dark</option>
|
|
109
114
|
<option value="christmas-light">Christmas Light</option>
|
|
@@ -154,6 +159,10 @@
|
|
|
154
159
|
<optgroup label="Grayve">
|
|
155
160
|
<option value="grayve-dark">Grayve Dark</option>
|
|
156
161
|
<option value="grayve-light">Grayve Light</option>
|
|
162
|
+
</optgroup>
|
|
163
|
+
<optgroup label="Mint">
|
|
164
|
+
<option value="mint-dark">Mint Dark</option>
|
|
165
|
+
<option value="mint-light">Mint Light</option>
|
|
157
166
|
</optgroup>
|
|
158
167
|
<optgroup label="Other">
|
|
159
168
|
<option value="christmas-dark">Christmas Dark</option>
|
|
@@ -296,52 +305,48 @@
|
|
|
296
305
|
|
|
297
306
|
<!-- Back to Top -->
|
|
298
307
|
<div class="tab-panel">
|
|
299
|
-
<div class="
|
|
300
|
-
<
|
|
308
|
+
<div class="mb-3">
|
|
309
|
+
<label class="form-label">Label <span class="text-muted" style="font-weight:400;">(optional)</span></label>
|
|
310
|
+
<input id="field-btt-label" type="text" class="form-input" placeholder="Back to top">
|
|
311
|
+
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.8rem;">Leave blank for icon-only button.</p>
|
|
312
|
+
</div>
|
|
313
|
+
<div class="grid grid-cols-2 gap-3 mb-4">
|
|
314
|
+
<div>
|
|
301
315
|
<label class="form-check-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
|
|
302
316
|
<input id="field-btt-enabled" type="checkbox" class="form-check"> Enable Back to Top button
|
|
303
317
|
</label>
|
|
304
318
|
</div>
|
|
319
|
+
<div>
|
|
320
|
+
<label class="form-check-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
|
|
321
|
+
<input id="field-btt-smooth" type="checkbox" class="form-check"> Smooth scroll
|
|
322
|
+
</label>
|
|
323
|
+
</div>
|
|
305
324
|
</div>
|
|
306
|
-
<div class="
|
|
307
|
-
<div
|
|
325
|
+
<div class="grid grid-cols-2 gap-3">
|
|
326
|
+
<div>
|
|
308
327
|
<label class="form-label">Scroll Threshold (px)</label>
|
|
309
328
|
<input id="field-btt-threshold" type="number" class="form-input" placeholder="300">
|
|
310
329
|
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.8rem;">Show button after scrolling this many pixels.</p>
|
|
311
330
|
</div>
|
|
312
|
-
<div
|
|
331
|
+
<div>
|
|
313
332
|
<label class="form-label">Position</label>
|
|
314
333
|
<select id="field-btt-position" class="form-select">
|
|
315
334
|
<option value="bottom-right">Bottom Right</option>
|
|
316
335
|
<option value="bottom-left">Bottom Left</option>
|
|
317
336
|
</select>
|
|
318
337
|
</div>
|
|
319
|
-
<div
|
|
338
|
+
<div>
|
|
320
339
|
<label class="form-label">Side Offset (px)</label>
|
|
321
340
|
<input id="field-btt-offset" type="number" class="form-input" placeholder="32">
|
|
322
341
|
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.8rem;">Distance from the left or right
|
|
323
342
|
edge.</p>
|
|
324
343
|
</div>
|
|
325
|
-
|
|
326
|
-
<div class="row mb-3">
|
|
327
|
-
<div class="col-4">
|
|
344
|
+
<div>
|
|
328
345
|
<label class="form-label">Bottom Offset (px)</label>
|
|
329
346
|
<input id="field-btt-bottom-offset" type="number" class="form-input" placeholder="32">
|
|
330
347
|
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.8rem;">Distance from the bottom edge.</p>
|
|
331
348
|
</div>
|
|
332
349
|
</div>
|
|
333
|
-
<div class="row mb-3">
|
|
334
|
-
<div class="col-6">
|
|
335
|
-
<label class="form-label">Label <span class="text-muted" style="font-weight:400;">(optional)</span></label>
|
|
336
|
-
<input id="field-btt-label" type="text" class="form-input" placeholder="Back to top">
|
|
337
|
-
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.8rem;">Leave blank for icon-only button.</p>
|
|
338
|
-
</div>
|
|
339
|
-
<div class="col-6" style="padding-top:2rem;">
|
|
340
|
-
<label class="form-check-label" style="display:flex;align-items:center;gap:.5rem;cursor:pointer;">
|
|
341
|
-
<input id="field-btt-smooth" type="checkbox" class="form-check"> Smooth scroll
|
|
342
|
-
</label>
|
|
343
|
-
</div>
|
|
344
|
-
</div>
|
|
345
350
|
</div>
|
|
346
351
|
|
|
347
352
|
<!-- Cookie Consent -->
|
|
@@ -446,6 +451,103 @@
|
|
|
446
451
|
</div>
|
|
447
452
|
</div>
|
|
448
453
|
|
|
454
|
+
<!-- Custom CSS -->
|
|
455
|
+
<!-- Breadcrumbs -->
|
|
456
|
+
<div class="tab-panel">
|
|
457
|
+
<div class="row mb-3">
|
|
458
|
+
<div class="col">
|
|
459
|
+
<div class="card">
|
|
460
|
+
<div class="card-header"><strong>Breadcrumb Navigation</strong></div>
|
|
461
|
+
<div class="card-body">
|
|
462
|
+
<p class="text-muted mb-3" style="font-size:.875rem;">
|
|
463
|
+
When enabled, a frosted pill breadcrumb trail is fixed to your chosen viewport corner on all public
|
|
464
|
+
pages.
|
|
465
|
+
Individual pages can opt-out via "Show Breadcrumbs" in the page editor.
|
|
466
|
+
</p>
|
|
467
|
+
<div class="row mb-4">
|
|
468
|
+
<div class="col-auto" style="display:flex;align-items:center;gap:.75rem;">
|
|
469
|
+
<input id="field-breadcrumbs-enabled" type="checkbox" class="form-check">
|
|
470
|
+
<label for="field-breadcrumbs-enabled">Enable breadcrumbs on all pages</label>
|
|
471
|
+
</div>
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<div class="row mb-4" style="align-items:flex-end;gap:0;">
|
|
475
|
+
<div class="col-sm-4">
|
|
476
|
+
<label class="form-label">Home label</label>
|
|
477
|
+
<input id="field-breadcrumbs-home-label" type="text" class="form-input" placeholder="Home">
|
|
478
|
+
</div>
|
|
479
|
+
</div>
|
|
480
|
+
|
|
481
|
+
<label class="form-label" style="margin-bottom:.6rem;">Pill Position & Offsets</label>
|
|
482
|
+
<div class="row" style="align-items:flex-start;gap:0;">
|
|
483
|
+
|
|
484
|
+
<!-- Corner picker -->
|
|
485
|
+
<div class="col-auto" style="margin-right:1.5rem;margin-bottom:1rem;">
|
|
486
|
+
<div id="bc-pos-grid"
|
|
487
|
+
style="display:grid;grid-template-columns:1fr 1fr;gap:2px;border:1px solid var(--border-color,rgba(255,255,255,.1));border-radius:10px;overflow:hidden;background:var(--border-color,rgba(255,255,255,.07));width:fit-content;">
|
|
488
|
+
<button type="button" class="bc-pos-btn" data-pos="TL"
|
|
489
|
+
style="display:flex;flex-direction:column;align-items:flex-start;padding:.55rem .8rem;background:none;border:none;cursor:pointer;font-size:.78rem;color:var(--text-muted,#888);border-right:1px solid var(--border-color,rgba(255,255,255,.08));border-bottom:1px solid var(--border-color,rgba(255,255,255,.08));border-radius:0;gap:.05rem;user-select:none;transition:background .15s,color .15s;min-width:72px;">
|
|
490
|
+
<span
|
|
491
|
+
style="font-size:.6rem;opacity:.55;letter-spacing:.06em;text-transform:uppercase;line-height:1.2;">Top</span>
|
|
492
|
+
<span style="font-weight:600;">↖ Left</span>
|
|
493
|
+
</button>
|
|
494
|
+
<button type="button" class="bc-pos-btn" data-pos="TR"
|
|
495
|
+
style="display:flex;flex-direction:column;align-items:flex-end;padding:.55rem .8rem;background:none;border:none;cursor:pointer;font-size:.78rem;color:var(--text-muted,#888);border-bottom:1px solid var(--border-color,rgba(255,255,255,.08));border-radius:0;gap:.05rem;user-select:none;transition:background .15s,color .15s;min-width:72px;">
|
|
496
|
+
<span
|
|
497
|
+
style="font-size:.6rem;opacity:.55;letter-spacing:.06em;text-transform:uppercase;line-height:1.2;">Top</span>
|
|
498
|
+
<span style="font-weight:600;">Right ↗</span>
|
|
499
|
+
</button>
|
|
500
|
+
<button type="button" class="bc-pos-btn" data-pos="BL"
|
|
501
|
+
style="display:flex;flex-direction:column;align-items:flex-start;padding:.55rem .8rem;background:none;border:none;cursor:pointer;font-size:.78rem;color:var(--text-muted,#888);border-right:1px solid var(--border-color,rgba(255,255,255,.08));border-radius:0;gap:.05rem;user-select:none;transition:background .15s,color .15s;min-width:72px;">
|
|
502
|
+
<span style="font-weight:600;">↙ Left</span>
|
|
503
|
+
<span
|
|
504
|
+
style="font-size:.6rem;opacity:.55;letter-spacing:.06em;text-transform:uppercase;line-height:1.2;">Bottom</span>
|
|
505
|
+
</button>
|
|
506
|
+
<button type="button" class="bc-pos-btn" data-pos="BR"
|
|
507
|
+
style="display:flex;flex-direction:column;align-items:flex-end;padding:.55rem .8rem;background:none;border:none;cursor:pointer;font-size:.78rem;color:var(--text-muted,#888);border-radius:0;gap:.05rem;user-select:none;transition:background .15s,color .15s;min-width:72px;">
|
|
508
|
+
<span style="font-weight:600;">Right ↘</span>
|
|
509
|
+
<span
|
|
510
|
+
style="font-size:.6rem;opacity:.55;letter-spacing:.06em;text-transform:uppercase;line-height:1.2;">Bottom</span>
|
|
511
|
+
</button>
|
|
512
|
+
</div>
|
|
513
|
+
<input type="hidden" id="field-breadcrumbs-position" value="TL">
|
|
514
|
+
</div>
|
|
515
|
+
|
|
516
|
+
<!-- Offsets -->
|
|
517
|
+
<div class="col-sm-3" style="margin-right:1rem;">
|
|
518
|
+
<label class="form-label" for="field-bc-offset-x">Horizontal offset</label>
|
|
519
|
+
<div style="display:flex;align-items:center;gap:.4rem;">
|
|
520
|
+
<input id="field-bc-offset-x" type="number" class="form-input" min="0" max="500" placeholder="8"
|
|
521
|
+
style="max-width:90px;">
|
|
522
|
+
<span class="text-muted" style="font-size:.8rem;">px</span>
|
|
523
|
+
</div>
|
|
524
|
+
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.75rem;">Distance from left or
|
|
525
|
+
right edge.</p>
|
|
526
|
+
</div>
|
|
527
|
+
|
|
528
|
+
<div class="col-sm-3">
|
|
529
|
+
<label class="form-label" for="field-bc-offset-y">Vertical offset</label>
|
|
530
|
+
<div style="display:flex;align-items:center;gap:.4rem;">
|
|
531
|
+
<input id="field-bc-offset-y" type="number" class="form-input" min="0" max="500" placeholder="60"
|
|
532
|
+
style="max-width:90px;">
|
|
533
|
+
<span class="text-muted" style="font-size:.8rem;">px</span>
|
|
534
|
+
</div>
|
|
535
|
+
<p class="form-hint text-muted" style="margin-top:.35rem;font-size:.75rem;">Distance from top or
|
|
536
|
+
bottom edge.</p>
|
|
537
|
+
</div>
|
|
538
|
+
</div>
|
|
539
|
+
|
|
540
|
+
</div>
|
|
541
|
+
</div>
|
|
542
|
+
</div>
|
|
543
|
+
</div>
|
|
544
|
+
<div class="row">
|
|
545
|
+
<div class="col">
|
|
546
|
+
<button id="save-breadcrumbs-btn" class="btn btn-primary"><span data-icon="save"></span> Save Breadcrumbs Settings</button>
|
|
547
|
+
</div>
|
|
548
|
+
</div>
|
|
549
|
+
</div>
|
|
550
|
+
|
|
449
551
|
<!-- Custom CSS -->
|
|
450
552
|
<div class="tab-panel">
|
|
451
553
|
<div class="row mb-3">
|