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.
- 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 +167 -23
- 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/navigation.json +5 -15
- package/config/plugins.json +19 -29
- package/config/server.json +6 -6
- package/config/site.json +16 -6
- package/package.json +25 -10
- package/plugins/example-analytics/stats.json +17 -12
- package/plugins/form-builder/data/forms/contacts.json +62 -62
- package/plugins/form-builder/data/forms/enquiries.json +103 -0
- package/plugins/form-builder/data/forms/feedback.json +17 -16
- package/plugins/form-builder/data/forms/notes.json +79 -0
- package/plugins/form-builder/data/forms/to-do.json +100 -0
- package/plugins/form-builder/data/submissions/contacts.json +1 -26
- package/plugins/form-builder/data/submissions/notes.json +1 -0
- package/plugins/form-builder/data/submissions/to-do.json +1 -0
- 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 +677 -128
- 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} +491 -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 +98 -2
- 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 +124 -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/submissions/consent.json +0 -13
- 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/data/submissions/{contact-details.json → enquiries.json} +0 -0
- /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>
|