@geekity/cms 0.35.0 → 0.37.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 (269) hide show
  1. package/admin/components/blocks.njk +250 -0
  2. package/admin/components/card.njk +4 -2
  3. package/admin/components/job-status.njk +15 -10
  4. package/admin/components/upload.njk +26 -0
  5. package/admin/pages/comments/all.njk +1 -1
  6. package/admin/pages/dashboard/home.njk +33 -32
  7. package/admin/pages/documents/editor.njk +34 -19
  8. package/admin/pages/federation/followers.njk +3 -2
  9. package/admin/pages/media/file.njk +5 -4
  10. package/admin/pages/media/library.njk +7 -3
  11. package/admin/pages/plugins/screen.njk +5 -35
  12. package/admin/pages/settings/general.njk +4 -1
  13. package/admin/pages/tools/export.njk +54 -51
  14. package/admin/pages/tools/maintenance.njk +2 -1
  15. package/admin/pages/users/edit.njk +3 -0
  16. package/admin/src/admin.css +1 -0
  17. package/admin/static/admin.css +374 -0
  18. package/admin/static/job-status.js +158 -0
  19. package/admin/static/upload-drop.js +225 -0
  20. package/dist/admin/blocks.d.ts +133 -0
  21. package/dist/admin/blocks.d.ts.map +1 -0
  22. package/dist/admin/blocks.js +454 -0
  23. package/dist/admin/blocks.js.map +1 -0
  24. package/dist/admin/core-widgets.d.ts +3 -0
  25. package/dist/admin/core-widgets.d.ts.map +1 -0
  26. package/dist/admin/core-widgets.js +17 -0
  27. package/dist/admin/core-widgets.js.map +1 -0
  28. package/dist/admin/documents.d.ts.map +1 -1
  29. package/dist/admin/documents.js +0 -2
  30. package/dist/admin/documents.js.map +1 -1
  31. package/dist/admin/engagement.d.ts +16 -0
  32. package/dist/admin/engagement.d.ts.map +1 -0
  33. package/dist/admin/engagement.js +38 -0
  34. package/dist/admin/engagement.js.map +1 -0
  35. package/dist/admin/federation.d.ts +2 -0
  36. package/dist/admin/federation.d.ts.map +1 -1
  37. package/dist/admin/federation.js +2 -1
  38. package/dist/admin/federation.js.map +1 -1
  39. package/dist/admin/formatting.d.ts +1 -0
  40. package/dist/admin/formatting.d.ts.map +1 -1
  41. package/dist/admin/formatting.js +18 -0
  42. package/dist/admin/formatting.js.map +1 -1
  43. package/dist/admin/index.d.ts +2 -2
  44. package/dist/admin/index.d.ts.map +1 -1
  45. package/dist/admin/index.js +2 -2
  46. package/dist/admin/index.js.map +1 -1
  47. package/dist/admin/job-status.d.ts +1 -0
  48. package/dist/admin/job-status.d.ts.map +1 -1
  49. package/dist/admin/job-status.js +1 -0
  50. package/dist/admin/job-status.js.map +1 -1
  51. package/dist/admin/media.d.ts +6 -9
  52. package/dist/admin/media.d.ts.map +1 -1
  53. package/dist/admin/media.js +85 -27
  54. package/dist/admin/media.js.map +1 -1
  55. package/dist/admin/posts-by-path.d.ts +11 -0
  56. package/dist/admin/posts-by-path.d.ts.map +1 -0
  57. package/dist/admin/posts-by-path.js +59 -0
  58. package/dist/admin/posts-by-path.js.map +1 -0
  59. package/dist/admin/routes.d.ts +0 -2
  60. package/dist/admin/routes.d.ts.map +1 -1
  61. package/dist/admin/routes.js +24 -12
  62. package/dist/admin/routes.js.map +1 -1
  63. package/dist/admin/templates.d.ts.map +1 -1
  64. package/dist/admin/templates.js +2 -0
  65. package/dist/admin/templates.js.map +1 -1
  66. package/dist/admin/tools.js +1 -1
  67. package/dist/admin/tools.js.map +1 -1
  68. package/dist/admin/uploads.d.ts +2 -1
  69. package/dist/admin/uploads.d.ts.map +1 -1
  70. package/dist/admin/uploads.js +5 -2
  71. package/dist/admin/uploads.js.map +1 -1
  72. package/dist/admin/widget-fediverse.d.ts +3 -0
  73. package/dist/admin/widget-fediverse.d.ts.map +1 -0
  74. package/dist/admin/widget-fediverse.js +49 -0
  75. package/dist/admin/widget-fediverse.js.map +1 -0
  76. package/dist/admin/widget-followers.d.ts +3 -0
  77. package/dist/admin/widget-followers.d.ts.map +1 -0
  78. package/dist/admin/widget-followers.js +37 -0
  79. package/dist/admin/widget-followers.js.map +1 -0
  80. package/dist/admin/widget-health.d.ts +3 -0
  81. package/dist/admin/widget-health.d.ts.map +1 -0
  82. package/dist/admin/widget-health.js +103 -0
  83. package/dist/admin/widget-health.js.map +1 -0
  84. package/dist/admin/widget-interactions.d.ts +4 -0
  85. package/dist/admin/widget-interactions.d.ts.map +1 -0
  86. package/dist/admin/widget-interactions.js +99 -0
  87. package/dist/admin/widget-interactions.js.map +1 -0
  88. package/dist/admin/widget-posting.d.ts +3 -0
  89. package/dist/admin/widget-posting.d.ts.map +1 -0
  90. package/dist/admin/widget-posting.js +111 -0
  91. package/dist/admin/widget-posting.js.map +1 -0
  92. package/dist/admin/widget-scheduled.d.ts +4 -0
  93. package/dist/admin/widget-scheduled.d.ts.map +1 -0
  94. package/dist/admin/widget-scheduled.js +30 -0
  95. package/dist/admin/widget-scheduled.js.map +1 -0
  96. package/dist/admin/widget-top-posts.d.ts +4 -0
  97. package/dist/admin/widget-top-posts.d.ts.map +1 -0
  98. package/dist/admin/widget-top-posts.js +55 -0
  99. package/dist/admin/widget-top-posts.js.map +1 -0
  100. package/dist/admin/widgets.d.ts +35 -0
  101. package/dist/admin/widgets.d.ts.map +1 -0
  102. package/dist/admin/widgets.js +103 -0
  103. package/dist/admin/widgets.js.map +1 -0
  104. package/dist/cms/app.d.ts.map +1 -1
  105. package/dist/cms/app.js +2 -1
  106. package/dist/cms/app.js.map +1 -1
  107. package/dist/cms/boot.d.ts.map +1 -1
  108. package/dist/cms/boot.js +3 -2
  109. package/dist/cms/boot.js.map +1 -1
  110. package/dist/cms/services.d.ts.map +1 -1
  111. package/dist/cms/services.js +19 -0
  112. package/dist/cms/services.js.map +1 -1
  113. package/dist/content/alt-text.d.ts +1 -0
  114. package/dist/content/alt-text.d.ts.map +1 -1
  115. package/dist/content/alt-text.js +26 -1
  116. package/dist/content/alt-text.js.map +1 -1
  117. package/dist/content/sqlite/catalog.d.ts.map +1 -1
  118. package/dist/content/sqlite/catalog.js +15 -2
  119. package/dist/content/sqlite/catalog.js.map +1 -1
  120. package/dist/content/store.d.ts +10 -0
  121. package/dist/content/store.d.ts.map +1 -1
  122. package/dist/content/store.js.map +1 -1
  123. package/dist/content/write.d.ts.map +1 -1
  124. package/dist/content/write.js +3 -1
  125. package/dist/content/write.js.map +1 -1
  126. package/dist/federation/backfill.d.ts +1 -1
  127. package/dist/federation/backfill.d.ts.map +1 -1
  128. package/dist/federation/backfill.js +5 -1
  129. package/dist/federation/backfill.js.map +1 -1
  130. package/dist/federation/follower-history.d.ts +16 -0
  131. package/dist/federation/follower-history.d.ts.map +1 -0
  132. package/dist/federation/follower-history.js +61 -0
  133. package/dist/federation/follower-history.js.map +1 -0
  134. package/dist/federation/inbox.d.ts.map +1 -1
  135. package/dist/federation/inbox.js +2 -1
  136. package/dist/federation/inbox.js.map +1 -1
  137. package/dist/federation/records.d.ts +1 -0
  138. package/dist/federation/records.d.ts.map +1 -1
  139. package/dist/federation/records.js +24 -6
  140. package/dist/federation/records.js.map +1 -1
  141. package/dist/files/data-files.d.ts +1 -0
  142. package/dist/files/data-files.d.ts.map +1 -1
  143. package/dist/files/data-files.js +6 -0
  144. package/dist/files/data-files.js.map +1 -1
  145. package/dist/jobs/queue.d.ts.map +1 -1
  146. package/dist/jobs/queue.js +5 -0
  147. package/dist/jobs/queue.js.map +1 -1
  148. package/dist/jobs/types.d.ts +7 -0
  149. package/dist/jobs/types.d.ts.map +1 -1
  150. package/dist/jobs/types.js.map +1 -1
  151. package/dist/media/library.d.ts +9 -0
  152. package/dist/media/library.d.ts.map +1 -1
  153. package/dist/media/library.js +25 -1
  154. package/dist/media/library.js.map +1 -1
  155. package/dist/plugin.d.ts +275 -21
  156. package/dist/plugin.d.ts.map +1 -1
  157. package/dist/plugin.js +9 -8
  158. package/dist/plugin.js.map +1 -1
  159. package/dist/plugins/fetch.d.ts +0 -5
  160. package/dist/plugins/fetch.d.ts.map +1 -1
  161. package/dist/plugins/fetch.js +31 -7
  162. package/dist/plugins/fetch.js.map +1 -1
  163. package/dist/plugins/host-api.d.ts +3 -0
  164. package/dist/plugins/host-api.d.ts.map +1 -0
  165. package/dist/plugins/host-api.js +8 -0
  166. package/dist/plugins/host-api.js.map +1 -0
  167. package/dist/plugins/install.d.ts.map +1 -1
  168. package/dist/plugins/install.js +4 -2
  169. package/dist/plugins/install.js.map +1 -1
  170. package/dist/plugins/page-tags.d.ts +8 -0
  171. package/dist/plugins/page-tags.d.ts.map +1 -0
  172. package/dist/plugins/page-tags.js +73 -0
  173. package/dist/plugins/page-tags.js.map +1 -0
  174. package/dist/plugins/registry.d.ts +4 -1
  175. package/dist/plugins/registry.d.ts.map +1 -1
  176. package/dist/plugins/registry.js +50 -9
  177. package/dist/plugins/registry.js.map +1 -1
  178. package/dist/plugins/site.js +1 -1
  179. package/dist/plugins/site.js.map +1 -1
  180. package/dist/store/admin-store.d.ts +2 -2
  181. package/dist/store/admin-store.d.ts.map +1 -1
  182. package/dist/store/admin-store.js.map +1 -1
  183. package/dist/store/comments.d.ts +7 -0
  184. package/dist/store/comments.d.ts.map +1 -1
  185. package/dist/store/comments.js +21 -0
  186. package/dist/store/comments.js.map +1 -1
  187. package/dist/store/deliveries.d.ts +1 -0
  188. package/dist/store/deliveries.d.ts.map +1 -1
  189. package/dist/store/deliveries.js +6 -0
  190. package/dist/store/deliveries.js.map +1 -1
  191. package/dist/store/inbox.d.ts +16 -0
  192. package/dist/store/inbox.d.ts.map +1 -1
  193. package/dist/store/inbox.js +62 -0
  194. package/dist/store/inbox.js.map +1 -1
  195. package/dist/store/queue-database.d.ts +6 -0
  196. package/dist/store/queue-database.d.ts.map +1 -1
  197. package/dist/store/queue-database.js +16 -1
  198. package/dist/store/queue-database.js.map +1 -1
  199. package/dist/store/webmentions.d.ts +1 -0
  200. package/dist/store/webmentions.d.ts.map +1 -1
  201. package/dist/store/webmentions.js +6 -0
  202. package/dist/store/webmentions.js.map +1 -1
  203. package/dist/web/env.d.ts +3 -0
  204. package/dist/web/env.d.ts.map +1 -1
  205. package/dist/web/feed-item.d.ts +4 -3
  206. package/dist/web/feed-item.d.ts.map +1 -1
  207. package/dist/web/feed-item.js +8 -2
  208. package/dist/web/feed-item.js.map +1 -1
  209. package/dist/web/listing-pages.d.ts.map +1 -1
  210. package/dist/web/listing-pages.js +7 -2
  211. package/dist/web/listing-pages.js.map +1 -1
  212. package/dist/web/page-tags.d.ts +4 -0
  213. package/dist/web/page-tags.d.ts.map +1 -0
  214. package/dist/web/page-tags.js +39 -0
  215. package/dist/web/page-tags.js.map +1 -0
  216. package/dist/web/render.d.ts +2 -0
  217. package/dist/web/render.d.ts.map +1 -1
  218. package/dist/web/render.js +14 -0
  219. package/dist/web/render.js.map +1 -1
  220. package/dist/web/routes.d.ts +2 -1
  221. package/dist/web/routes.d.ts.map +1 -1
  222. package/dist/web/routes.js +3 -1
  223. package/dist/web/routes.js.map +1 -1
  224. package/package.json +6 -1
  225. package/themes/default/layouts/base.njk +6 -4
  226. package/dist/comments/routes.d.ts +0 -65
  227. package/dist/comments/routes.d.ts.map +0 -1
  228. package/dist/comments/routes.js +0 -235
  229. package/dist/comments/routes.js.map +0 -1
  230. package/dist/content/media.d.ts +0 -85
  231. package/dist/content/media.d.ts.map +0 -1
  232. package/dist/content/media.js +0 -237
  233. package/dist/content/media.js.map +0 -1
  234. package/dist/content/read-form.d.ts +0 -31
  235. package/dist/content/read-form.d.ts.map +0 -1
  236. package/dist/content/read-form.js +0 -157
  237. package/dist/content/read-form.js.map +0 -1
  238. package/dist/content/read.d.ts +0 -29
  239. package/dist/content/read.d.ts.map +0 -1
  240. package/dist/content/read.js +0 -82
  241. package/dist/content/read.js.map +0 -1
  242. package/dist/export/export-archives.d.ts +0 -29
  243. package/dist/export/export-archives.d.ts.map +0 -1
  244. package/dist/export/export-archives.js +0 -88
  245. package/dist/export/export-archives.js.map +0 -1
  246. package/dist/federation/mount.d.ts +0 -53
  247. package/dist/federation/mount.d.ts.map +0 -1
  248. package/dist/federation/mount.js +0 -344
  249. package/dist/federation/mount.js.map +0 -1
  250. package/dist/mail/credentials.d.ts +0 -62
  251. package/dist/mail/credentials.d.ts.map +0 -1
  252. package/dist/mail/credentials.js +0 -86
  253. package/dist/mail/credentials.js.map +0 -1
  254. package/dist/site/setting-rows.d.ts +0 -45
  255. package/dist/site/setting-rows.d.ts.map +0 -1
  256. package/dist/site/setting-rows.js +0 -361
  257. package/dist/site/setting-rows.js.map +0 -1
  258. package/dist/site/settings-form.d.ts +0 -30
  259. package/dist/site/settings-form.d.ts.map +0 -1
  260. package/dist/site/settings-form.js +0 -54
  261. package/dist/site/settings-form.js.map +0 -1
  262. package/dist/site/site-json.d.ts +0 -38
  263. package/dist/site/site-json.d.ts.map +0 -1
  264. package/dist/site/site-json.js +0 -69
  265. package/dist/site/site-json.js.map +0 -1
  266. package/dist/webmention/routes.d.ts +0 -37
  267. package/dist/webmention/routes.d.ts.map +0 -1
  268. package/dist/webmention/routes.js +0 -75
  269. package/dist/webmention/routes.js.map +0 -1
@@ -0,0 +1,158 @@
1
+ /* Redraws a queued or running job's status box until the job ends.
2
+
3
+ A box carries the job's name in data-job-status and, while the job is
4
+ active, the page to fetch in data-job-refresh. A box that also names
5
+ data-job-redraw is redrawn from that page only when the job's state
6
+ changes on the data-job-refresh page.
7
+
8
+ Plain ES5-shaped browser JavaScript, like copy.js: it is served as it is
9
+ written. */
10
+ (function () {
11
+ var EVERY = 3000;
12
+ var AFTER_FAILURE = 15000;
13
+ var ANNOUNCE_PROGRESS_EVERY = 15000;
14
+
15
+ var boxes = document.querySelectorAll('[data-job-status][data-job-refresh]');
16
+ if (!boxes.length) return;
17
+
18
+ /* Made before any update, so screen readers are watching it when the
19
+ first one arrives. */
20
+ var live = document.createElement('div');
21
+ live.className = 'sr-only';
22
+ live.setAttribute('role', 'status');
23
+ document.body.appendChild(live);
24
+ var said = { text: '', at: 0 };
25
+
26
+ Array.prototype.forEach.call(boxes, watch);
27
+
28
+ function watch(box) {
29
+ var selector = '[data-job-status="' + CSS.escape(box.getAttribute('data-job-status')) + '"]';
30
+ var region = regionOf(box);
31
+ var drawn = region.outerHTML;
32
+ var waiting = false;
33
+ checkAgain(region, false);
34
+ later(EVERY);
35
+
36
+ document.addEventListener('visibilitychange', function () {
37
+ if (document.hidden || !waiting) return;
38
+ waiting = false;
39
+ poll();
40
+ });
41
+
42
+ function later(delay) {
43
+ setTimeout(function () {
44
+ if (document.hidden) waiting = true;
45
+ else poll();
46
+ }, delay);
47
+ }
48
+
49
+ function poll() {
50
+ var redraw = box.getAttribute('data-job-redraw');
51
+ var polled;
52
+ find(box.getAttribute('data-job-refresh'))
53
+ .then(function (found) {
54
+ polled = found;
55
+ if (!redraw) return polled;
56
+ if (
57
+ polled &&
58
+ polled.getAttribute('data-job-state') === box.getAttribute('data-job-state')
59
+ ) {
60
+ return box;
61
+ }
62
+ return find(redraw);
63
+ })
64
+ .then(function (next) {
65
+ if (!next) {
66
+ drop(region);
67
+ if (polled) announce(polled, true);
68
+ return;
69
+ }
70
+ var nextRegion = regionOf(next);
71
+ if (next !== box && nextRegion.outerHTML !== drawn) {
72
+ drawn = nextRegion.outerHTML;
73
+ var changed =
74
+ next.getAttribute('data-job-state') !== box.getAttribute('data-job-state');
75
+ var replacement = document.importNode(nextRegion, true);
76
+ swapKeepingFocus(region, replacement);
77
+ region = replacement;
78
+ box = region.matches(selector) ? region : region.querySelector(selector);
79
+ announce(box, changed);
80
+ }
81
+ if (!box.hasAttribute('data-job-refresh')) return;
82
+ checkAgain(region, false);
83
+ later(EVERY);
84
+ })
85
+ .catch(function () {
86
+ checkAgain(region, true);
87
+ later(AFTER_FAILURE);
88
+ });
89
+ }
90
+
91
+ function find(url) {
92
+ return fetch(url, { credentials: 'same-origin' })
93
+ .then(function (response) {
94
+ if (!response.ok || response.redirected) throw new Error(String(response.status));
95
+ return response.text();
96
+ })
97
+ .then(function (html) {
98
+ /* A template's content is inert: the other page's nonced <style>
99
+ elements are neither applied nor checked against this page's CSP. */
100
+ var parsed = document.createElement('template');
101
+ parsed.innerHTML = html;
102
+ return parsed.content.querySelector(selector);
103
+ });
104
+ }
105
+ }
106
+
107
+ function regionOf(box) {
108
+ return box.closest('[data-job-region]') || box;
109
+ }
110
+
111
+ function checkAgain(region, shown) {
112
+ Array.prototype.forEach.call(
113
+ region.querySelectorAll('[data-job-check-again]'),
114
+ function (link) {
115
+ link.hidden = !shown;
116
+ },
117
+ );
118
+ }
119
+
120
+ function swapKeepingFocus(old, replacement) {
121
+ var focused = document.activeElement;
122
+ var inside = old.contains(focused);
123
+ old.replaceWith(replacement);
124
+ if (!inside) return;
125
+ var same = Array.prototype.filter.call(
126
+ replacement.querySelectorAll(focused.tagName),
127
+ function (candidate) {
128
+ return candidate.textContent.trim() === focused.textContent.trim();
129
+ },
130
+ )[0];
131
+ if (!same) {
132
+ replacement.tabIndex = -1;
133
+ same = replacement;
134
+ }
135
+ same.focus({ preventScroll: true });
136
+ }
137
+
138
+ function drop(region) {
139
+ var inside = region.contains(document.activeElement);
140
+ region.remove();
141
+ if (!inside) return;
142
+ var main = document.getElementById('main');
143
+ main.tabIndex = -1;
144
+ main.focus({ preventScroll: true });
145
+ }
146
+
147
+ function announce(box, changed) {
148
+ var message = box.querySelector('[data-job-message]');
149
+ var text =
150
+ box.getAttribute('data-job-label') +
151
+ '.' +
152
+ (message ? ' ' + message.textContent.replace(/\s+/g, ' ').trim() : '');
153
+ var now = Date.now();
154
+ if (text === said.text || (!changed && now - said.at < ANNOUNCE_PROGRESS_EVERY)) return;
155
+ said = { text: text, at: now };
156
+ live.textContent = text;
157
+ }
158
+ })();
@@ -0,0 +1,225 @@
1
+ /* Uploads in place: an Upload button and a drop target wherever the admin
2
+ asks for a file (TASK-439).
3
+
4
+ components/upload.njk renders each control `hidden`, so a page with no
5
+ script is the same page it was. This reveals them, posts each chosen or
6
+ dropped file to the control's data-upload-url, the JSON endpoint the
7
+ editor's body uses, and hands what came back to its kind's handler in
8
+ KINDS. A refused file says why in the control's status line and changes
9
+ nothing else on the page.
10
+
11
+ Plain ES5-shaped browser JavaScript, like media.js: it is served as it is
12
+ written. */
13
+ (function () {
14
+ var controls = document.querySelectorAll('[data-upload-drop]');
15
+ if (!controls.length || !window.fetch || !window.FormData) return;
16
+
17
+ var DRAGGING = ['outline-2', 'outline-offset-4', 'outline-dashed', 'outline-primary'];
18
+
19
+ var KINDS = {
20
+ photos: { landed: addTile },
21
+ field: { landed: fillField },
22
+ select: { landed: chooseOption },
23
+ library: { landed: function () {}, finished: reload },
24
+ };
25
+
26
+ Array.prototype.forEach.call(controls, enhance);
27
+
28
+ /* A file dropped just beside a target would otherwise replace the page
29
+ with the file, and take an unsaved post with it. */
30
+ document.addEventListener('dragover', function (event) {
31
+ if (!carriesFiles(event) || event.defaultPrevented) return;
32
+ event.preventDefault();
33
+ event.dataTransfer.dropEffect = 'none';
34
+ });
35
+ document.addEventListener('drop', function (event) {
36
+ if (carriesFiles(event)) event.preventDefault();
37
+ });
38
+
39
+ function enhance(control) {
40
+ var kind = KINDS[control.getAttribute('data-upload-drop')];
41
+ var target = document.getElementById(control.getAttribute('data-upload-target'));
42
+ if (!kind || !target) return;
43
+
44
+ var input = control.querySelector('[data-upload-input]');
45
+ var zone = target.closest('.fieldset') || target;
46
+ var depth = 0;
47
+ control.hidden = false;
48
+
49
+ input.addEventListener('change', function () {
50
+ var files = Array.prototype.slice.call(input.files);
51
+ input.value = '';
52
+ send(control, kind, target, files);
53
+ });
54
+
55
+ zone.addEventListener('dragenter', function (event) {
56
+ if (!carriesFiles(event)) return;
57
+ event.preventDefault();
58
+ depth += 1;
59
+ setDragging(zone, true);
60
+ });
61
+ zone.addEventListener('dragover', function (event) {
62
+ if (!carriesFiles(event)) return;
63
+ event.preventDefault();
64
+ event.dataTransfer.dropEffect = 'copy';
65
+ });
66
+ zone.addEventListener('dragleave', function () {
67
+ depth = Math.max(0, depth - 1);
68
+ if (depth === 0) setDragging(zone, false);
69
+ });
70
+ zone.addEventListener('drop', function (event) {
71
+ if (!carriesFiles(event)) return;
72
+ event.preventDefault();
73
+ depth = 0;
74
+ setDragging(zone, false);
75
+ var files = Array.prototype.slice.call(event.dataTransfer.files);
76
+ send(control, kind, target, input.multiple ? files : files.slice(0, 1));
77
+ });
78
+ }
79
+
80
+ function carriesFiles(event) {
81
+ var types = event.dataTransfer ? event.dataTransfer.types : [];
82
+ return Array.prototype.indexOf.call(types, 'Files') !== -1;
83
+ }
84
+
85
+ function setDragging(zone, on) {
86
+ DRAGGING.forEach(function (name) {
87
+ zone.classList.toggle(name, on);
88
+ });
89
+ }
90
+
91
+ function send(control, kind, target, files) {
92
+ var landed = 0;
93
+ var refusals = [];
94
+ var queue = files.slice();
95
+
96
+ function next() {
97
+ var file = queue.shift();
98
+ if (!file) return Promise.resolve();
99
+ say(control, 'Uploading ' + file.name + '…', false);
100
+ return upload(control, file)
101
+ .then(function (result) {
102
+ kind.landed(control, target, result, file);
103
+ landed += 1;
104
+ })
105
+ .catch(function (error) {
106
+ refusals.push(error.message);
107
+ })
108
+ .then(next);
109
+ }
110
+
111
+ return next().then(function () {
112
+ if (refusals.length) {
113
+ say(control, refusals.join(' '), true);
114
+ } else {
115
+ say(control, landed === 1 ? 'Uploaded.' : 'Uploaded ' + landed + ' files.', false);
116
+ }
117
+ if (landed && kind.finished) kind.finished(control, refusals.length);
118
+ });
119
+ }
120
+
121
+ function upload(control, file) {
122
+ var payload = new FormData();
123
+ var token = document.querySelector('input[name="csrf_token"]');
124
+ payload.set('csrf_token', token ? token.value : '');
125
+ payload.set('file', file);
126
+ if (control.hasAttribute('data-upload-images')) payload.set('images', '1');
127
+
128
+ return fetch(control.getAttribute('data-upload-url'), {
129
+ method: 'POST',
130
+ body: payload,
131
+ credentials: 'same-origin',
132
+ headers: { accept: 'application/json' },
133
+ })
134
+ .catch(function () {
135
+ throw new Error(file.name + ' could not be uploaded.');
136
+ })
137
+ .then(function (response) {
138
+ return response
139
+ .json()
140
+ .catch(function () {
141
+ return {};
142
+ })
143
+ .then(function (result) {
144
+ if (!response.ok || typeof result.url !== 'string') {
145
+ throw new Error(
146
+ result.error || file.name + ' was refused (' + response.status + ').',
147
+ );
148
+ }
149
+ return result;
150
+ });
151
+ });
152
+ }
153
+
154
+ function say(control, message, error) {
155
+ var status = control.querySelector('[data-upload-status]');
156
+ status.textContent = message;
157
+ status.classList.toggle('text-error', error);
158
+ }
159
+
160
+ function addTile(control, grid, result, file) {
161
+ var template = document.querySelector('template[data-upload-tile="' + grid.id + '"]');
162
+ var tile = template.content.firstElementChild.cloneNode(true);
163
+ var box = tile.querySelector('input');
164
+ var picture = tile.querySelector('img');
165
+ box.name = control.getAttribute('data-upload-name') + freeIndex(control, grid);
166
+ box.value = result.url;
167
+ box.checked = true;
168
+ picture.src = result.url;
169
+ picture.alt = file.name;
170
+ grid.insertBefore(tile, grid.firstChild);
171
+ Array.prototype.forEach.call(
172
+ grid.parentElement.querySelectorAll('[data-upload-reveal]'),
173
+ function (shown) {
174
+ shown.hidden = false;
175
+ },
176
+ );
177
+ Array.prototype.forEach.call(
178
+ grid.parentElement.querySelectorAll('[data-upload-empty]'),
179
+ function (gone) {
180
+ gone.hidden = true;
181
+ },
182
+ );
183
+ }
184
+
185
+ function freeIndex(control, grid) {
186
+ var prefix = control.getAttribute('data-upload-name');
187
+ var highest = -1;
188
+ Array.prototype.forEach.call(grid.closest('form').elements, function (element) {
189
+ if (element.name && element.name.indexOf(prefix) === 0) {
190
+ var index = Number(element.name.slice(prefix.length));
191
+ if (index > highest) highest = index;
192
+ }
193
+ });
194
+ return highest + 1;
195
+ }
196
+
197
+ function fillField(control, box, result) {
198
+ box.value = result.url;
199
+ box.dispatchEvent(new Event('input', { bubbles: true }));
200
+ box.dispatchEvent(new Event('change', { bubbles: true }));
201
+ var preview = document.getElementById(control.getAttribute('data-upload-preview'));
202
+ if (preview) {
203
+ preview.src = result.url;
204
+ preview.hidden = false;
205
+ }
206
+ }
207
+
208
+ function chooseOption(control, menu, result, file) {
209
+ var option = document.createElement('option');
210
+ option.value = result.url;
211
+ option.textContent = file.name;
212
+ menu.appendChild(option);
213
+ menu.value = result.url;
214
+ menu.dispatchEvent(new Event('change', { bubbles: true }));
215
+ }
216
+
217
+ function reload(control, refused) {
218
+ if (!refused) {
219
+ window.location.reload();
220
+ return;
221
+ }
222
+ var status = control.querySelector('[data-upload-status]');
223
+ status.textContent += ' Reload the page to see the files that did upload.';
224
+ }
225
+ })();
@@ -0,0 +1,133 @@
1
+ import type { PluginScreenText } from '../plugin.ts';
2
+ export type DrawnBlock = {
3
+ readonly kind: 'empty';
4
+ readonly caption: string | undefined;
5
+ } | {
6
+ readonly kind: 'paragraph';
7
+ readonly parts: readonly PluginScreenText[];
8
+ } | {
9
+ readonly kind: 'table';
10
+ readonly table: DrawnTable;
11
+ } | {
12
+ readonly kind: 'stats';
13
+ readonly stats: readonly DrawnStat[];
14
+ } | ({
15
+ readonly kind: 'timeSeries';
16
+ } & DrawnTimeSeries) | {
17
+ readonly kind: 'ranked';
18
+ readonly caption: string;
19
+ readonly items: readonly DrawnRankedItem[];
20
+ } | ({
21
+ readonly kind: 'bars';
22
+ } & DrawnBars) | ({
23
+ readonly kind: 'calendar';
24
+ } & DrawnCalendar);
25
+ type DrawnCell = PluginScreenText | {
26
+ readonly time: string | null;
27
+ } | {
28
+ readonly text: string;
29
+ readonly href: string | undefined;
30
+ };
31
+ interface DrawnTable {
32
+ readonly caption: string;
33
+ readonly columns: readonly string[];
34
+ readonly rows: readonly (readonly DrawnCell[])[];
35
+ }
36
+ interface DrawnChange {
37
+ readonly arrow: '▲' | '▼' | '';
38
+ readonly text: string;
39
+ readonly tone: 'better' | 'worse' | 'none';
40
+ }
41
+ interface DrawnStat {
42
+ readonly label: string;
43
+ readonly value: string;
44
+ readonly change?: DrawnChange;
45
+ }
46
+ interface DrawnFigure {
47
+ readonly id: string;
48
+ readonly description: string;
49
+ readonly width: number;
50
+ readonly height: number;
51
+ readonly columns: readonly string[];
52
+ readonly rows: readonly {
53
+ readonly heading: string;
54
+ readonly cells: readonly string[];
55
+ }[];
56
+ }
57
+ interface DrawnTimeSeries extends DrawnFigure {
58
+ readonly plot: {
59
+ readonly left: number;
60
+ readonly right: number;
61
+ readonly top: number;
62
+ readonly bottom: number;
63
+ };
64
+ readonly yTicks: readonly {
65
+ readonly y: number;
66
+ readonly label: string;
67
+ }[];
68
+ readonly xTicks: readonly {
69
+ readonly x: number;
70
+ readonly label: string;
71
+ }[];
72
+ readonly series: readonly {
73
+ readonly name: string;
74
+ readonly path: string;
75
+ readonly end: {
76
+ readonly x: number;
77
+ readonly y: number;
78
+ };
79
+ }[];
80
+ readonly bands: readonly {
81
+ readonly x: number;
82
+ readonly width: number;
83
+ readonly title: string;
84
+ }[];
85
+ }
86
+ interface DrawnRankedItem {
87
+ readonly label: string;
88
+ readonly value: string;
89
+ readonly href: string | undefined;
90
+ readonly widthPercent: number;
91
+ }
92
+ interface DrawnBars extends DrawnFigure {
93
+ readonly plot: DrawnTimeSeries['plot'];
94
+ readonly yTicks: DrawnTimeSeries['yTicks'];
95
+ readonly series: readonly string[];
96
+ readonly bars: readonly {
97
+ readonly tick: string | undefined;
98
+ readonly centerX: number;
99
+ readonly total: {
100
+ readonly y: number;
101
+ readonly text: string;
102
+ } | undefined;
103
+ readonly segments: readonly {
104
+ readonly series: number;
105
+ readonly x: number;
106
+ readonly y: number;
107
+ readonly width: number;
108
+ readonly height: number;
109
+ readonly title: string;
110
+ }[];
111
+ }[];
112
+ }
113
+ type CalendarLevel = 0 | 1 | 2 | 3 | 4;
114
+ interface DrawnCalendar extends DrawnFigure {
115
+ readonly cells: readonly {
116
+ readonly x: number;
117
+ readonly y: number;
118
+ readonly level: CalendarLevel;
119
+ readonly title: string;
120
+ }[];
121
+ readonly months: readonly {
122
+ readonly x: number;
123
+ readonly label: string;
124
+ }[];
125
+ readonly weekdays: readonly {
126
+ readonly y: number;
127
+ readonly label: string;
128
+ }[];
129
+ readonly cell: number;
130
+ }
131
+ export declare function drawBlock(block: unknown): DrawnBlock;
132
+ export {};
133
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/admin/blocks.ts"],"names":[],"mappings":"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"}