@antelopejs/dms-mailing 0.6.1 → 0.7.1

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 (236) hide show
  1. package/README.md +8 -7
  2. package/dist/constants.d.ts +1 -2
  3. package/dist/constants.js +2 -3
  4. package/dist/constants.js.map +1 -1
  5. package/dist/data/templates-table.d.ts +4 -1
  6. package/dist/data/templates-table.js +55 -20
  7. package/dist/data/templates-table.js.map +1 -1
  8. package/dist/data-types/categories-type.d.ts +5 -5
  9. package/dist/db/models/index.d.ts +0 -1
  10. package/dist/db/models/index.js +0 -1
  11. package/dist/db/models/index.js.map +1 -1
  12. package/dist/db/models/send-events.model.js +2 -3
  13. package/dist/db/models/send-events.model.js.map +1 -1
  14. package/dist/db/models/sends.model.js +2 -3
  15. package/dist/db/models/sends.model.js.map +1 -1
  16. package/dist/db/models/templates.model.d.ts +10 -1
  17. package/dist/db/models/templates.model.js +29 -10
  18. package/dist/db/models/templates.model.js.map +1 -1
  19. package/dist/db/tables/index.d.ts +0 -1
  20. package/dist/db/tables/index.js +0 -1
  21. package/dist/db/tables/index.js.map +1 -1
  22. package/dist/db/tables/settings.table.d.ts +0 -1
  23. package/dist/db/tables/settings.table.js +0 -4
  24. package/dist/db/tables/settings.table.js.map +1 -1
  25. package/dist/db/tables/templates.table.d.ts +7 -4
  26. package/dist/db/tables/templates.table.js +4 -14
  27. package/dist/db/tables/templates.table.js.map +1 -1
  28. package/dist/engine/formats.d.ts +13 -0
  29. package/dist/engine/formats.js +85 -0
  30. package/dist/engine/formats.js.map +1 -0
  31. package/dist/engine/index.d.ts +1 -0
  32. package/dist/engine/index.js +1 -0
  33. package/dist/engine/index.js.map +1 -1
  34. package/dist/engine/resolve.d.ts +2 -1
  35. package/dist/engine/resolve.js +14 -7
  36. package/dist/engine/resolve.js.map +1 -1
  37. package/dist/engine/tokens.d.ts +2 -1
  38. package/dist/engine/tokens.js +3 -5
  39. package/dist/engine/tokens.js.map +1 -1
  40. package/dist/frontend-module.d.ts +2 -0
  41. package/dist/frontend-module.js +24 -0
  42. package/dist/frontend-module.js.map +1 -0
  43. package/dist/hooks/index.d.ts +0 -1
  44. package/dist/hooks/index.js +0 -1
  45. package/dist/hooks/index.js.map +1 -1
  46. package/dist/hooks/tenant-export.js +4 -1
  47. package/dist/hooks/tenant-export.js.map +1 -1
  48. package/dist/implementations/dms-mailing/index.d.ts +3 -3
  49. package/dist/implementations/dms-mailing/index.js +8 -7
  50. package/dist/implementations/dms-mailing/index.js.map +1 -1
  51. package/dist/index.js +2 -20
  52. package/dist/index.js.map +1 -1
  53. package/dist/pages/overview.d.ts +1 -1
  54. package/dist/pages/overview.js +11 -13
  55. package/dist/pages/overview.js.map +1 -1
  56. package/dist/pages/sends.d.ts +1 -1
  57. package/dist/pages/sends.js +16 -8
  58. package/dist/pages/sends.js.map +1 -1
  59. package/dist/pages/settings/form.js +8 -0
  60. package/dist/pages/settings/form.js.map +1 -1
  61. package/dist/pages/templates.js +3 -8
  62. package/dist/pages/templates.js.map +1 -1
  63. package/dist/pages/toolbar.d.ts +12 -0
  64. package/dist/pages/toolbar.js +41 -0
  65. package/dist/pages/toolbar.js.map +1 -0
  66. package/dist/realtime.d.ts +2 -2
  67. package/dist/realtime.js +8 -8
  68. package/dist/realtime.js.map +1 -1
  69. package/dist/routes/metrics.d.ts +9 -2
  70. package/dist/routes/metrics.js +90 -35
  71. package/dist/routes/metrics.js.map +1 -1
  72. package/dist/routes/period.d.ts +1 -0
  73. package/dist/routes/period.js +19 -0
  74. package/dist/routes/period.js.map +1 -1
  75. package/dist/routes/sends.js +6 -3
  76. package/dist/routes/sends.js.map +1 -1
  77. package/dist/routes/settings.js +6 -7
  78. package/dist/routes/settings.js.map +1 -1
  79. package/dist/routes/templates.d.ts +8 -4
  80. package/dist/routes/templates.js +41 -20
  81. package/dist/routes/templates.js.map +1 -1
  82. package/dist/services/categories.d.ts +2 -1
  83. package/dist/services/categories.js +9 -0
  84. package/dist/services/categories.js.map +1 -1
  85. package/dist/services/declarations.js +42 -184
  86. package/dist/services/declarations.js.map +1 -1
  87. package/dist/services/events.js +1 -1
  88. package/dist/services/events.js.map +1 -1
  89. package/dist/services/localized-text.d.ts +7 -0
  90. package/dist/services/localized-text.js +28 -0
  91. package/dist/services/localized-text.js.map +1 -0
  92. package/dist/services/send-import.js +0 -2
  93. package/dist/services/send-import.js.map +1 -1
  94. package/dist/services/send-stat-items.js +34 -12
  95. package/dist/services/send-stat-items.js.map +1 -1
  96. package/dist/services/send-stats.d.ts +7 -0
  97. package/dist/services/send-stats.js +17 -5
  98. package/dist/services/send-stats.js.map +1 -1
  99. package/dist/services/send.d.ts +2 -0
  100. package/dist/services/send.js +11 -12
  101. package/dist/services/send.js.map +1 -1
  102. package/dist/services/sender-declaration.d.ts +2 -0
  103. package/dist/services/sender-declaration.js +18 -0
  104. package/dist/services/sender-declaration.js.map +1 -0
  105. package/dist/services/settings.d.ts +1 -1
  106. package/dist/services/settings.js +1 -5
  107. package/dist/services/settings.js.map +1 -1
  108. package/dist/services/starters.d.ts +2 -2
  109. package/dist/services/starters.js +1 -10
  110. package/dist/services/starters.js.map +1 -1
  111. package/dist/services/templates.d.ts +13 -7
  112. package/dist/services/templates.js +72 -33
  113. package/dist/services/templates.js.map +1 -1
  114. package/dist/services/webhook-status.d.ts +2 -1
  115. package/dist/services/webhook-status.js +6 -5
  116. package/dist/services/webhook-status.js.map +1 -1
  117. package/dist/types/settings.d.ts +8 -0
  118. package/dist/types/settings.js +33 -6
  119. package/dist/types/settings.js.map +1 -1
  120. package/dist/validation/declarations.schema.d.ts +25 -7
  121. package/dist/validation/declarations.schema.js +16 -3
  122. package/dist/validation/declarations.schema.js.map +1 -1
  123. package/dist/validation/settings.schema.d.ts +41 -41
  124. package/dist/validation/settings.schema.js +30 -6
  125. package/dist/validation/settings.schema.js.map +1 -1
  126. package/dist/validation/templates.schema.d.ts +13 -0
  127. package/dist/validation/templates.schema.js +6 -1
  128. package/dist/validation/templates.schema.js.map +1 -1
  129. package/frontend-vue/app/components/CategoriesInput.vue +15 -13
  130. package/frontend-vue/app/components/FunnelCard.vue +46 -3
  131. package/frontend-vue/app/components/NewTemplateModal.vue +4 -2
  132. package/frontend-vue/app/components/OverviewGate.vue +0 -8
  133. package/frontend-vue/app/components/ProviderPill.vue +50 -0
  134. package/frontend-vue/app/components/SendDrawer.vue +206 -183
  135. package/frontend-vue/app/components/StarterGallery.vue +1 -1
  136. package/frontend-vue/app/components/TemplateCard.vue +4 -1
  137. package/frontend-vue/app/components/TemplateDrawer.vue +3 -5
  138. package/frontend-vue/app/components/TemplateGallery.vue +57 -17
  139. package/frontend-vue/app/components/TemplatePreviewFrame.vue +41 -11
  140. package/frontend-vue/app/components/editor/EditorTemplatePane.vue +1 -3
  141. package/frontend-vue/app/components/editor/EditorTitle.vue +1 -7
  142. package/frontend-vue/app/composables/useLocalizedDefaults.ts +5 -7
  143. package/frontend-vue/app/composables/useMailingApi.ts +3 -3
  144. package/frontend-vue/app/composables/useMailingReads.ts +2 -2
  145. package/frontend-vue/app/composables/useTemplateCategories.ts +8 -7
  146. package/frontend-vue/app/types/mailing.ts +18 -0
  147. package/frontend-vue/app/utils/categories.ts +58 -49
  148. package/frontend-vue/app/utils/funnel.ts +25 -0
  149. package/frontend-vue/app/utils/period.ts +0 -7
  150. package/frontend-vue/app/utils/starters.ts +3 -1
  151. package/frontend-vue/app/utils/tokens.ts +6 -1
  152. package/frontend-vue/i18n/locales/mailing-en-GB.json +19 -28
  153. package/frontend-vue/i18n/locales/mailing-fr-FR.json +19 -28
  154. package/frontend-vue/package.json +1 -1
  155. package/frontend-vue/tests/categories-input.test.ts +4 -10
  156. package/frontend-vue/tests/categories.test.ts +55 -17
  157. package/frontend-vue/tests/conditions.test.ts +1 -4
  158. package/frontend-vue/tests/funnel-card.test.ts +27 -0
  159. package/frontend-vue/tests/funnel.test.ts +25 -0
  160. package/frontend-vue/tests/localized-defaults.test.ts +0 -29
  161. package/frontend-vue/tests/new-template-modal.test.ts +1 -1
  162. package/frontend-vue/tests/overview-gate.test.ts +1 -24
  163. package/frontend-vue/tests/page-reads.test.ts +9 -25
  164. package/frontend-vue/tests/period.test.ts +0 -12
  165. package/frontend-vue/tests/replay-toast.test.ts +2 -1
  166. package/frontend-vue/tests/send-drawer.test.ts +123 -0
  167. package/frontend-vue/tests/template-drawer.test.ts +1 -1
  168. package/frontend-vue/tests/template-gallery.test.ts +90 -3
  169. package/frontend-vue/tests/template-preview-frame.test.ts +92 -0
  170. package/package.json +8 -7
  171. package/skills/dms-mailing/SKILL.md +25 -18
  172. package/src/constants.ts +2 -2
  173. package/src/data/sends-table.ts +1 -1
  174. package/src/data/templates-table.ts +125 -33
  175. package/src/db/models/index.ts +0 -1
  176. package/src/db/models/send-events.model.ts +2 -2
  177. package/src/db/models/sends.model.ts +7 -8
  178. package/src/db/models/templates.model.ts +64 -16
  179. package/src/db/tables/index.ts +0 -1
  180. package/src/db/tables/settings.table.ts +0 -8
  181. package/src/db/tables/templates.table.ts +12 -17
  182. package/src/engine/formats.ts +124 -0
  183. package/src/engine/index.ts +1 -0
  184. package/src/engine/resolve.ts +18 -7
  185. package/src/engine/tokens.ts +7 -5
  186. package/src/frontend-module.ts +36 -0
  187. package/src/hooks/index.ts +0 -1
  188. package/src/hooks/tenant-export.ts +8 -1
  189. package/src/implementations/dms-mailing/index.ts +5 -16
  190. package/src/index.ts +3 -29
  191. package/src/pages/overview.ts +20 -16
  192. package/src/pages/sends.ts +27 -11
  193. package/src/pages/settings/form.ts +16 -0
  194. package/src/pages/templates.ts +4 -8
  195. package/src/pages/toolbar.ts +77 -0
  196. package/src/realtime.ts +17 -8
  197. package/src/routes/metrics.ts +158 -45
  198. package/src/routes/period.ts +32 -0
  199. package/src/routes/sends.ts +13 -4
  200. package/src/routes/settings.ts +11 -8
  201. package/src/routes/templates.ts +81 -37
  202. package/src/services/categories.ts +14 -1
  203. package/src/services/declarations.ts +64 -317
  204. package/src/services/events.ts +1 -1
  205. package/src/services/localized-text.ts +53 -0
  206. package/src/services/send-import.ts +2 -2
  207. package/src/services/send-stat-items.ts +60 -13
  208. package/src/services/send-stats.ts +37 -5
  209. package/src/services/send.ts +19 -20
  210. package/src/services/sender-declaration.ts +27 -0
  211. package/src/services/settings.ts +3 -10
  212. package/src/services/starters.ts +3 -15
  213. package/src/services/templates.ts +109 -63
  214. package/src/services/webhook-status.ts +3 -3
  215. package/src/types/settings.ts +55 -5
  216. package/src/validation/declarations.schema.ts +29 -3
  217. package/src/validation/settings.schema.ts +56 -14
  218. package/src/validation/templates.schema.ts +10 -0
  219. package/dist/db/models/template-slugs.model.d.ts +0 -27
  220. package/dist/db/models/template-slugs.model.js +0 -43
  221. package/dist/db/models/template-slugs.model.js.map +0 -1
  222. package/dist/db/tables/template-slugs.table.d.ts +0 -7
  223. package/dist/db/tables/template-slugs.table.js +0 -35
  224. package/dist/db/tables/template-slugs.table.js.map +0 -1
  225. package/dist/hooks/database-ready.d.ts +0 -7
  226. package/dist/hooks/database-ready.js +0 -26
  227. package/dist/hooks/database-ready.js.map +0 -1
  228. package/dist/services/fingerprint.d.ts +0 -1
  229. package/dist/services/fingerprint.js +0 -20
  230. package/dist/services/fingerprint.js.map +0 -1
  231. package/frontend-vue/app/components/PageHeader.vue +0 -94
  232. package/frontend-vue/app/composables/useOverviewSetup.ts +0 -21
  233. package/src/db/models/template-slugs.model.ts +0 -61
  234. package/src/db/tables/template-slugs.table.ts +0 -29
  235. package/src/hooks/database-ready.ts +0 -47
  236. package/src/services/fingerprint.ts +0 -22
@@ -5,59 +5,59 @@ export declare const MIN_WEBHOOK_SECRET_LENGTH = 32;
5
5
  export declare const WEBHOOK_SECRET_TOO_SHORT: string;
6
6
  export declare const categorySchema: z.ZodObject<{
7
7
  id: z.ZodString;
8
- label: z.ZodString;
8
+ label: z.ZodRecord<z.ZodString, z.ZodString>;
9
9
  icon: z.ZodString;
10
10
  }, "strip", z.ZodTypeAny, {
11
11
  id: string;
12
- label: string;
12
+ label: Record<string, string>;
13
13
  icon: string;
14
14
  }, {
15
15
  id: string;
16
- label: string;
16
+ label: Record<string, string>;
17
17
  icon: string;
18
18
  }>;
19
19
  declare const categoryEntrySchema: z.ZodObject<{
20
20
  id: z.ZodString;
21
- label: z.ZodString;
21
+ label: z.ZodRecord<z.ZodString, z.ZodString>;
22
22
  icon: z.ZodString;
23
23
  } & {
24
24
  moveTo: z.ZodOptional<z.ZodString>;
25
25
  }, "strip", z.ZodTypeAny, {
26
26
  id: string;
27
- label: string;
27
+ label: Record<string, string>;
28
28
  icon: string;
29
29
  moveTo?: string | undefined;
30
30
  }, {
31
31
  id: string;
32
- label: string;
32
+ label: Record<string, string>;
33
33
  icon: string;
34
34
  moveTo?: string | undefined;
35
35
  }>;
36
36
  export type CategoryEntry = z.infer<typeof categoryEntrySchema>;
37
37
  export declare const categoriesSchema: z.ZodEffects<z.ZodArray<z.ZodObject<{
38
38
  id: z.ZodString;
39
- label: z.ZodString;
39
+ label: z.ZodRecord<z.ZodString, z.ZodString>;
40
40
  icon: z.ZodString;
41
41
  } & {
42
42
  moveTo: z.ZodOptional<z.ZodString>;
43
43
  }, "strip", z.ZodTypeAny, {
44
44
  id: string;
45
- label: string;
45
+ label: Record<string, string>;
46
46
  icon: string;
47
47
  moveTo?: string | undefined;
48
48
  }, {
49
49
  id: string;
50
- label: string;
50
+ label: Record<string, string>;
51
51
  icon: string;
52
52
  moveTo?: string | undefined;
53
53
  }>, "many">, {
54
54
  id: string;
55
- label: string;
55
+ label: Record<string, string>;
56
56
  icon: string;
57
57
  moveTo?: string | undefined;
58
58
  }[], {
59
59
  id: string;
60
- label: string;
60
+ label: Record<string, string>;
61
61
  icon: string;
62
62
  moveTo?: string | undefined;
63
63
  }[]>;
@@ -71,28 +71,28 @@ export declare const settingsSchema: z.ZodObject<{
71
71
  webhookSecret: z.ZodString;
72
72
  categories: z.ZodEffects<z.ZodArray<z.ZodObject<{
73
73
  id: z.ZodString;
74
- label: z.ZodString;
74
+ label: z.ZodRecord<z.ZodString, z.ZodString>;
75
75
  icon: z.ZodString;
76
76
  } & {
77
77
  moveTo: z.ZodOptional<z.ZodString>;
78
78
  }, "strip", z.ZodTypeAny, {
79
79
  id: string;
80
- label: string;
80
+ label: Record<string, string>;
81
81
  icon: string;
82
82
  moveTo?: string | undefined;
83
83
  }, {
84
84
  id: string;
85
- label: string;
85
+ label: Record<string, string>;
86
86
  icon: string;
87
87
  moveTo?: string | undefined;
88
88
  }>, "many">, {
89
89
  id: string;
90
- label: string;
90
+ label: Record<string, string>;
91
91
  icon: string;
92
92
  moveTo?: string | undefined;
93
93
  }[], {
94
94
  id: string;
95
- label: string;
95
+ label: Record<string, string>;
96
96
  icon: string;
97
97
  moveTo?: string | undefined;
98
98
  }[]>;
@@ -100,30 +100,30 @@ export declare const settingsSchema: z.ZodObject<{
100
100
  fallbackLocale: string;
101
101
  logRetentionDays: number;
102
102
  blockOnMissingVariables: boolean;
103
- senderName: string;
104
- senderEmail: string;
105
- replyTo: string;
106
- webhookSecret: string;
107
103
  categories: {
108
104
  id: string;
109
- label: string;
105
+ label: Record<string, string>;
110
106
  icon: string;
111
107
  moveTo?: string | undefined;
112
108
  }[];
113
- }, {
114
- fallbackLocale: string;
115
- logRetentionDays: number;
116
- blockOnMissingVariables: boolean;
117
109
  senderName: string;
118
110
  senderEmail: string;
119
111
  replyTo: string;
120
112
  webhookSecret: string;
113
+ }, {
114
+ fallbackLocale: string;
115
+ logRetentionDays: number;
116
+ blockOnMissingVariables: boolean;
121
117
  categories: {
122
118
  id: string;
123
- label: string;
119
+ label: Record<string, string>;
124
120
  icon: string;
125
121
  moveTo?: string | undefined;
126
122
  }[];
123
+ senderName: string;
124
+ senderEmail: string;
125
+ replyTo: string;
126
+ webhookSecret: string;
127
127
  }>;
128
128
  export declare const settingsPatchSchema: z.ZodObject<{
129
129
  fallbackLocale: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
@@ -135,28 +135,28 @@ export declare const settingsPatchSchema: z.ZodObject<{
135
135
  webhookSecret: z.ZodOptional<z.ZodString>;
136
136
  categories: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodObject<{
137
137
  id: z.ZodString;
138
- label: z.ZodString;
138
+ label: z.ZodRecord<z.ZodString, z.ZodString>;
139
139
  icon: z.ZodString;
140
140
  } & {
141
141
  moveTo: z.ZodOptional<z.ZodString>;
142
142
  }, "strip", z.ZodTypeAny, {
143
143
  id: string;
144
- label: string;
144
+ label: Record<string, string>;
145
145
  icon: string;
146
146
  moveTo?: string | undefined;
147
147
  }, {
148
148
  id: string;
149
- label: string;
149
+ label: Record<string, string>;
150
150
  icon: string;
151
151
  moveTo?: string | undefined;
152
152
  }>, "many">, {
153
153
  id: string;
154
- label: string;
154
+ label: Record<string, string>;
155
155
  icon: string;
156
156
  moveTo?: string | undefined;
157
157
  }[], {
158
158
  id: string;
159
- label: string;
159
+ label: Record<string, string>;
160
160
  icon: string;
161
161
  moveTo?: string | undefined;
162
162
  }[]>>;
@@ -166,31 +166,31 @@ export declare const settingsPatchSchema: z.ZodObject<{
166
166
  fallbackLocale?: string | undefined;
167
167
  logRetentionDays?: number | undefined;
168
168
  blockOnMissingVariables?: boolean | undefined;
169
- senderName?: string | undefined;
170
- senderEmail?: string | undefined;
171
- replyTo?: string | undefined;
172
- webhookSecret?: string | undefined;
173
169
  categories?: {
174
170
  id: string;
175
- label: string;
171
+ label: Record<string, string>;
176
172
  icon: string;
177
173
  moveTo?: string | undefined;
178
174
  }[] | undefined;
175
+ senderName?: string | undefined;
176
+ senderEmail?: string | undefined;
177
+ replyTo?: string | undefined;
178
+ webhookSecret?: string | undefined;
179
179
  missingVariables?: "send" | "refuse" | undefined;
180
180
  }, {
181
181
  fallbackLocale?: string | undefined;
182
182
  logRetentionDays?: number | undefined;
183
183
  blockOnMissingVariables?: boolean | undefined;
184
- senderName?: string | undefined;
185
- senderEmail?: string | undefined;
186
- replyTo?: string | undefined;
187
- webhookSecret?: string | undefined;
188
184
  categories?: {
189
185
  id: string;
190
- label: string;
186
+ label: Record<string, string>;
191
187
  icon: string;
192
188
  moveTo?: string | undefined;
193
189
  }[] | undefined;
190
+ senderName?: string | undefined;
191
+ senderEmail?: string | undefined;
192
+ replyTo?: string | undefined;
193
+ webhookSecret?: string | undefined;
194
194
  missingVariables?: "send" | "refuse" | undefined;
195
195
  }>;
196
196
  export type SettingsPatch = z.infer<typeof settingsPatchSchema>;
@@ -4,6 +4,7 @@ exports.settingsPatchSchema = exports.settingsSchema = exports.categoriesSchema
4
4
  const node_url_1 = require("node:url");
5
5
  const zod_1 = require("zod");
6
6
  const constants_1 = require("../constants");
7
+ const interface_dms_mailing_1 = require("@antelopejs/interface-dms-mailing");
7
8
  const engine_1 = require("../engine");
8
9
  exports.MIN_RETENTION_DAYS = 1;
9
10
  exports.MAX_RETENTION_DAYS = 3650;
@@ -23,12 +24,23 @@ exports.WEBHOOK_SECRET_TOO_SHORT = messageKey("fields.webhookSecret.too_short");
23
24
  const MISSING_VARIABLES_POLICIES = ["refuse", "send"];
24
25
  exports.categorySchema = zod_1.z.object({
25
26
  id: zod_1.z.string().max(constants_1.MAX_NAME_LENGTH).regex(constants_1.SLUG_PATTERN),
26
- label: zod_1.z.string().trim().max(constants_1.MAX_NAME_LENGTH),
27
+ label: zod_1.z.record(zod_1.z.string().trim().max(constants_1.MAX_NAME_LENGTH)),
27
28
  icon: zod_1.z.string().regex(CATEGORY_ICON_PATTERN),
28
29
  });
29
30
  const categoryEntrySchema = exports.categorySchema.extend({
30
31
  moveTo: zod_1.z.string().regex(constants_1.SLUG_PATTERN).optional(),
31
32
  });
33
+ function languagesOf(entries) {
34
+ const codes = entries.flatMap((entry) => Object.keys(entry.label));
35
+ return [...new Set([interface_dms_mailing_1.LOCALIZED_TEXT_FALLBACK_LOCALE, ...codes])];
36
+ }
37
+ function entriesIn(entries, locale) {
38
+ return entries.map(({ id, label, moveTo }) => ({
39
+ id,
40
+ label: label[locale] || label[interface_dms_mailing_1.LOCALIZED_TEXT_FALLBACK_LOCALE] || "",
41
+ moveTo,
42
+ }));
43
+ }
32
44
  const isKept = (entry) => entry.moveTo === undefined;
33
45
  function duplicateIssues(entries) {
34
46
  const labels = new Set();
@@ -61,13 +73,25 @@ function moveIssues(entries, kept) {
61
73
  : [{ message: UNKNOWN_MOVE_TARGET, path: [index, "moveTo"] }]);
62
74
  }
63
75
  function refineCategoryEntries(entries, context) {
64
- const kept = new Set(entries.filter(isKept).map((entry) => entry.id));
76
+ const kept = new Set(entries.filter((entry) => entry.moveTo === undefined).map(({ id }) => id));
77
+ const labelIssues = languagesOf(entries).flatMap((locale) => {
78
+ const inLocale = entriesIn(entries, locale);
79
+ return [...blankLabelIssues(inLocale), ...duplicateIssues(inLocale)];
80
+ });
81
+ const seen = new Set();
65
82
  [
66
- ...blankLabelIssues(entries),
67
- ...duplicateIssues(entries),
83
+ ...labelIssues,
68
84
  ...marketingIssues(kept),
69
- ...moveIssues(entries, kept),
70
- ].forEach((issue) => context.addIssue({ code: zod_1.z.ZodIssueCode.custom, ...issue }));
85
+ ...moveIssues(entriesIn(entries, interface_dms_mailing_1.LOCALIZED_TEXT_FALLBACK_LOCALE), kept),
86
+ ]
87
+ .filter((issue) => {
88
+ const id = JSON.stringify(issue);
89
+ if (seen.has(id))
90
+ return false;
91
+ seen.add(id);
92
+ return true;
93
+ })
94
+ .forEach((issue) => context.addIssue({ code: zod_1.z.ZodIssueCode.custom, ...issue }));
71
95
  }
72
96
  exports.categoriesSchema = zod_1.z
73
97
  .array(categoryEntrySchema)
@@ -1 +1 @@
1
- {"version":3,"file":"settings.schema.js","sourceRoot":"","sources":["../../src/validation/settings.schema.ts"],"names":[],"mappings":";;;AAAA,uCAAyC;AACzC,6BAAwB;AACxB,4CAA6D;AAC7D,sCAA+C;AAElC,QAAA,kBAAkB,GAAG,CAAC,CAAC;AACvB,QAAA,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAClD,MAAM,kBAAkB,GAAG,SAAS,CAAC;AACrC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,UAAU,GAAG,EAAE,CAAC;AAMT,QAAA,yBAAyB,GAAG,EAAE,CAAC;AAE5C,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,yBAAyB,IAAI,EAAE,CAAC;AAC7E,MAAM,cAAc,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAAC;AAC/D,MAAM,kBAAkB,GAAG,UAAU,CAAC,4BAA4B,CAAC,CAAC;AACpE,MAAM,kBAAkB,GAAG,UAAU,CAAC,+BAA+B,CAAC,CAAC;AACvE,MAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAC3C,QAAA,wBAAwB,GAAG,UAAU,CAChD,gCAAgC,CACjC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAU,CAAC;AAElD,QAAA,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,2BAAe,CAAC,CAAC,KAAK,CAAC,wBAAY,CAAC;IACvD,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,2BAAe,CAAC;IAC7C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;CAC9C,CAAC,CAAC;AAMH,MAAM,mBAAmB,GAAG,sBAAc,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,wBAAY,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAUH,MAAM,MAAM,GAAG,CAAC,KAAoB,EAAW,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;AAM7E,SAAS,eAAe,CAAC,OAAwB;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;aACrE,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAOD,SAAS,gBAAgB,CAAC,OAAwB;IAChD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACtC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAC5E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB;IACxC,OAAO,IAAI,CAAC,GAAG,CAAC,2BAAkB,CAAC;QACjC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CACjB,OAAwB,EACxB,IAAiB;IAEjB,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACtC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAgB,CAAC;QAC/C,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAwB,EACxB,OAAwB;IAExB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE;QACE,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAC5B,GAAG,eAAe,CAAC,OAAO,CAAC;QAC3B,GAAG,eAAe,CAAC,IAAI,CAAC;QACxB,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;KAC7B,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAClB,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAC5D,CAAC;AACJ,CAAC;AAMY,QAAA,gBAAgB,GAAG,OAAC;KAC9B,KAAK,CAAC,mBAAmB,CAAC;KAC1B,WAAW,CAAC,qBAAqB,CAAC,CAAC;AAEtC,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAGD,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,wBAAa,EAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1E,CAAC;AAED,MAAM,qBAAqB,GAAG,OAAC;KAC5B,MAAM,EAAE;KACR,IAAI,EAAE;KACN,SAAS,CAAC,cAAc,CAAC;KACzB,IAAI,CAAC,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAEjD,QAAA,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,cAAc,EAAE,OAAC;SACd,MAAM,EAAE;SACR,IAAI,EAAE;SACN,GAAG,CAAC,iBAAiB,CAAC;SACtB,MAAM,CAAC,kBAAkB,CAAC;IAC7B,gBAAgB,EAAE,OAAC;SAChB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,0BAAkB,CAAC;SACvB,GAAG,CAAC,0BAAkB,CAAC;IAC1B,uBAAuB,EAAE,OAAC,CAAC,OAAO,EAAE;IACpC,UAAU,EAAE,OAAC;SACV,MAAM,EAAE;SACR,IAAI,EAAE;SACN,GAAG,CAAC,2BAAe,CAAC;SACpB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,WAAW,EAAE,qBAAqB;IAClC,OAAO,EAAE,qBAAqB;IAC9B,aAAa,EAAE,OAAC;SACb,MAAM,EAAE;SACR,GAAG,CAAC,iCAAyB,EAAE,gCAAwB,CAAC;SACxD,GAAG,CAAC,2BAAe,CAAC;IACvB,UAAU,EAAE,wBAAgB;CAC7B,CAAC,CAAC;AAOU,QAAA,mBAAmB,GAAG,sBAAc;KAC9C,OAAO,EAAE;KACT,MAAM,CAAC;IACN,gBAAgB,EAAE,OAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE;CAChE,CAAC;KACD,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"settings.schema.js","sourceRoot":"","sources":["../../src/validation/settings.schema.ts"],"names":[],"mappings":"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"}
@@ -349,6 +349,19 @@ export declare const testSendSchema: z.ZodObject<{
349
349
  data?: Record<string, unknown> | undefined;
350
350
  locale?: string | undefined;
351
351
  }>;
352
+ export declare const templateDetailsSchema: z.ZodObject<{
353
+ name: z.ZodString;
354
+ slug: z.ZodOptional<z.ZodString>;
355
+ category: z.ZodOptional<z.ZodNullable<z.ZodString>>;
356
+ }, "strip", z.ZodTypeAny, {
357
+ name: string;
358
+ category?: string | null | undefined;
359
+ slug?: string | undefined;
360
+ }, {
361
+ name: string;
362
+ category?: string | null | undefined;
363
+ slug?: string | undefined;
364
+ }>;
352
365
  export declare const duplicateSchema: z.ZodObject<{
353
366
  slug: z.ZodString;
354
367
  name: z.ZodString;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.replayFailedSchema = exports.replaySchema = exports.duplicateSchema = exports.testSendSchema = exports.realSendSchema = exports.previewSchema = exports.previewVersionSchema = exports.testDataSchema = exports.saveContentSchema = exports.variablesSchema = exports.variableListSchema = exports.variableSchema = exports.versionNumberSchema = exports.restoreVersionSchema = exports.publishSchema = exports.draftRevisionSchema = exports.templateContentSchema = exports.localeContentSchema = exports.blockSchema = exports.conditionSchema = exports.createTemplateSchema = exports.slugSchema = void 0;
3
+ exports.replayFailedSchema = exports.replaySchema = exports.duplicateSchema = exports.templateDetailsSchema = exports.testSendSchema = exports.realSendSchema = exports.previewSchema = exports.previewVersionSchema = exports.testDataSchema = exports.saveContentSchema = exports.variablesSchema = exports.variableListSchema = exports.variableSchema = exports.versionNumberSchema = exports.restoreVersionSchema = exports.publishSchema = exports.draftRevisionSchema = exports.templateContentSchema = exports.localeContentSchema = exports.blockSchema = exports.conditionSchema = exports.createTemplateSchema = exports.slugSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const constants_1 = require("../constants");
6
6
  const MIN_HEADING_SIZE = 12;
@@ -139,6 +139,11 @@ exports.realSendSchema = zod_1.z.object({
139
139
  exports.testSendSchema = exports.previewSchema.extend({
140
140
  to: zod_1.z.array(zod_1.z.string().email()).min(1).max(MAX_TEST_RECIPIENT_COUNT),
141
141
  });
142
+ exports.templateDetailsSchema = zod_1.z.object({
143
+ name: zod_1.z.string().trim().min(1).max(constants_1.MAX_NAME_LENGTH),
144
+ slug: zod_1.z.string().optional(),
145
+ category: zod_1.z.string().nullable().optional(),
146
+ });
142
147
  exports.duplicateSchema = zod_1.z.object({
143
148
  slug: exports.slugSchema,
144
149
  name: zod_1.z.string().trim().min(1).max(constants_1.MAX_NAME_LENGTH),
@@ -1 +1 @@
1
- {"version":3,"file":"templates.schema.js","sourceRoot":"","sources":["../../src/validation/templates.schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.schema.js","sourceRoot":"","sources":["../../src/validation/templates.schema.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  <script setup lang="ts">
2
2
  import { useSortableList } from '../composables/useSortableList'
3
- import { useLocalizedDefaults } from '../composables/useLocalizedDefaults'
4
3
  import { useCategoryUsage } from '../composables/useMailingReads'
5
4
  import { isMarketingCategory } from '../utils/system-variables'
6
5
  import {
@@ -14,12 +13,14 @@ import {
14
13
  NO_CATEGORY,
15
14
  redirectMoves,
16
15
  serializeCategories,
16
+ toEditableRows,
17
17
  toStoredCategories,
18
18
  withMoves,
19
+ withLabelIn,
19
20
  type CategoryEntry,
20
21
  type EditableCategory,
21
22
  } from '../utils/categories'
22
- import type { TemplateCategory } from '../types/mailing'
23
+ import type { StoredCategory } from '../types/mailing'
23
24
 
24
25
  interface CategoriesInputProps {
25
26
  modelValue?: CategoryEntry[] | null
@@ -53,8 +54,8 @@ const MOVE_FIELD_COMPONENT = 'DmsSelect'
53
54
  const LABEL_PART = 'label'
54
55
  const ROW_FIELD_UI = { error: 'mt-1 ps-9 text-[12px]' }
55
56
 
56
- const { t } = useI18n()
57
- const localized = useLocalizedDefaults()
57
+ // Labels are edited in the interface's language, the others kept as stored.
58
+ const { t, locale } = useI18n()
58
59
  const { confirm } = useConfirm()
59
60
 
60
61
  let nextKey = 0
@@ -90,11 +91,7 @@ const rowErrorPattern = (index: number): RegExp =>
90
91
  new RegExp(`^${FIELD_NAME}\\.${index}\\.`)
91
92
 
92
93
  function toRows(value: CategoryEntry[]): EditableCategory[] {
93
- return localized.categories(keptCategories(value)).map((category) => ({
94
- ...category,
95
- key: keyOf(),
96
- isNew: false,
97
- }))
94
+ return toEditableRows(keptCategories(value), locale.value, keyOf)
98
95
  }
99
96
 
100
97
  function movesOf(value: CategoryEntry[]): CategoryEntry[] {
@@ -102,11 +99,11 @@ function movesOf(value: CategoryEntry[]): CategoryEntry[] {
102
99
  }
103
100
 
104
101
  function currentEntries(): CategoryEntry[] {
105
- return withMoves(toStoredCategories(rows.value), removed.value)
102
+ return withMoves(toStoredCategories(rows.value, locale.value), removed.value)
106
103
  }
107
104
 
108
105
  function onEdit(): void {
109
- const stored = toStoredCategories(rows.value)
106
+ const stored = toStoredCategories(rows.value, locale.value)
110
107
  stored.forEach((category, index) => {
111
108
  const row = rows.value[index]
112
109
  if (row) row.id = category.id
@@ -122,6 +119,7 @@ function addCategory(): void {
122
119
  id: '',
123
120
  label: '',
124
121
  icon: newCategoryIcon(rows.value),
122
+ labels: {},
125
123
  isNew: true,
126
124
  })
127
125
  }
@@ -147,8 +145,12 @@ function isRemovable(row: EditableCategory): boolean {
147
145
  return row.isNew || !isMarketingCategory(row.id)
148
146
  }
149
147
 
150
- function categoryOf(row: EditableCategory): TemplateCategory {
151
- return { id: row.id, label: row.label, icon: row.icon }
148
+ function categoryOf(row: EditableCategory): StoredCategory {
149
+ return {
150
+ id: row.id,
151
+ label: withLabelIn(row.labels, locale.value, row.label),
152
+ icon: row.icon,
153
+ }
152
154
  }
153
155
 
154
156
  function moveOptions(row: EditableCategory): MoveOption[] {
@@ -2,10 +2,13 @@
2
2
  import { mailingPath, type FunnelResponse } from '../composables/useMailingApi'
3
3
  import {
4
4
  biggestDrop,
5
+ deltaTone,
6
+ formatDelta,
5
7
  formatRate,
6
8
  FUNNEL_KINDS,
7
9
  FUNNEL_LEAK_STEP,
8
10
  funnelTakeaway,
11
+ isCompared,
9
12
  isMeasured,
10
13
  type FunnelStepReading,
11
14
  type FunnelTakeaway,
@@ -21,6 +24,24 @@ const SKELETON_ROWS = 5
21
24
  const KEY_PREFIX = 'dms_mailing.funnel_card.'
22
25
  const NOT_TRACKED_KEY = 'dms_mailing.metrics.not_tracked'
23
26
 
27
+ /**
28
+ * A row's columns: label, meter, count, rate, and the change while the
29
+ * toolbar compares. Written out whole so Tailwind sees every class.
30
+ */
31
+ const ROW_GRID = {
32
+ plain:
33
+ '@md:grid-cols-[6.5rem_minmax(0,1fr)_4.5rem_3.5rem] grid-cols-[minmax(0,1fr)_auto_auto]',
34
+ compared:
35
+ '@md:grid-cols-[6.5rem_minmax(0,1fr)_4.5rem_3.5rem_4rem] grid-cols-[minmax(0,1fr)_auto_auto_auto]',
36
+ }
37
+ const METER_SPAN = { plain: 'col-span-3', compared: 'col-span-4' }
38
+ const UNTRACKED_SPAN = { plain: 'col-span-2', compared: 'col-span-3' }
39
+ const DELTA_TONE_CLASSES: Record<ReturnType<typeof deltaTone>, string> = {
40
+ success: 'text-success',
41
+ error: 'text-error',
42
+ neutral: 'text-dimmed',
43
+ }
44
+
24
45
  const TAKEAWAY_KEYS: Record<FunnelTakeaway, string> = {
25
46
  empty: `${KEY_PREFIX}no_drop`,
26
47
  untracked: `${KEY_PREFIX}untracked`,
@@ -86,6 +107,16 @@ const takeaway = computed(() => {
86
107
 
87
108
  const isLeak = (step: FunnelStepReading): boolean =>
88
109
  step.id === FUNNEL_LEAK_STEP
110
+
111
+ /** "No comparison" in the toolbar drops the column rather than leave dashes. */
112
+ const layout = computed(() => (isCompared(steps.value) ? 'compared' : 'plain'))
113
+
114
+ const deltaTitle = (step: FunnelStepReading): string | undefined =>
115
+ step.previousCount === undefined
116
+ ? undefined
117
+ : t(`${KEY_PREFIX}compared_count`, {
118
+ value: numberFormat.value.format(step.previousCount),
119
+ })
89
120
  </script>
90
121
 
91
122
  <template>
@@ -115,7 +146,8 @@ const isLeak = (step: FunnelStepReading): boolean =>
115
146
  v-for="step in steps"
116
147
  :key="step.id"
117
148
  data-funnel-step
118
- class="@md:grid-cols-[6.5rem_minmax(0,1fr)_4.5rem_3.5rem] grid grid-cols-[minmax(0,1fr)_auto_auto] items-center gap-x-3 gap-y-1.5"
149
+ class="grid items-center gap-x-3 gap-y-1.5"
150
+ :class="ROW_GRID[layout]"
119
151
  >
120
152
  <span
121
153
  class="truncate text-[12.5px]"
@@ -125,7 +157,8 @@ const isLeak = (step: FunnelStepReading): boolean =>
125
157
  </span>
126
158
  <DmsMeter
127
159
  as="span"
128
- class="@md:order-none @md:col-span-1 order-last col-span-3"
160
+ class="@md:order-none @md:col-span-1 order-last"
161
+ :class="METER_SPAN[layout]"
129
162
  :value="isMeasured(step) ? step.count : 0"
130
163
  :max="Math.max(total, 1)"
131
164
  :tone="isLeak(step) ? 'warning' : 'primary'"
@@ -143,11 +176,21 @@ const isLeak = (step: FunnelStepReading): boolean =>
143
176
  >
144
177
  {{ formatRate(step.rate, locale) }}
145
178
  </span>
179
+ <span
180
+ v-if="layout === 'compared'"
181
+ data-funnel-delta
182
+ class="text-right font-mono text-[11.5px] tabular-nums"
183
+ :class="DELTA_TONE_CLASSES[deltaTone(step)]"
184
+ :title="deltaTitle(step)"
185
+ >
186
+ {{ formatDelta(step.delta, locale) }}
187
+ </span>
146
188
  </template>
147
189
  <span
148
190
  v-else
149
191
  data-funnel-untracked
150
- class="text-dimmed col-span-2 text-right text-[11.5px]"
192
+ class="text-dimmed text-right text-[11.5px]"
193
+ :class="UNTRACKED_SPAN[layout]"
151
194
  >
152
195
  {{ t(NOT_TRACKED_KEY) }}
153
196
  </span>
@@ -267,7 +267,7 @@ async function submit(): Promise<void> {
267
267
  if (!canSubmit.value) return
268
268
  saving.value = true
269
269
  try {
270
- const [id] = await api.createTemplate(creationInput())
270
+ const { _id: id } = await api.createTemplate(creationInput())
271
271
  close(true)
272
272
  if (id) await navigateDms(editorRoute(id))
273
273
  } catch (error) {
@@ -330,7 +330,9 @@ async function submit(): Promise<void> {
330
330
  :ui="{ base: 'font-mono' }"
331
331
  :trailing-icon="slugIssue ? undefined : 'i-ph-check-circle'"
332
332
  :aria-invalid="Boolean(slugError)"
333
- @update:model-value="(value: unknown) => onSlugInput(String(value))"
333
+ @update:model-value="
334
+ (value: unknown) => onSlugInput(String(value))
335
+ "
334
336
  />
335
337
  <UBadge
336
338
  color="neutral"
@@ -36,13 +36,6 @@ const { t } = useI18n()
36
36
  const { open: openModal } = useModal()
37
37
 
38
38
  const { data: facts, error, status, refresh } = useSetupFacts()
39
- /**
40
- * The header's period selector sets up once the dashboard has: a server
41
- * render, which renders the dashboard once the facts are in, would otherwise
42
- * set the selector up first and render the cards with a period the browser's
43
- * cards do not have yet as they hydrate.
44
- */
45
- const DashboardRendered = holdPageHeaderActions()
46
39
  const isResumed = ref(false)
47
40
 
48
41
  /** A failure shows once its retry is over; the facts read last stay meanwhile. */
@@ -207,5 +200,4 @@ function createTemplate(): void {
207
200
 
208
201
  <slot v-if="showsDashboard" />
209
202
  </div>
210
- <DashboardRendered />
211
203
  </template>
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import { useProviderInfo } from '../composables/useMailingReads'
3
+ import type { MailingComponentProps } from '../types/component'
4
+ import type { ProviderInfo } from '../types/mailing'
5
+
6
+ interface ProviderPillProps extends MailingComponentProps {
7
+ showProvider?: boolean
8
+ }
9
+
10
+ defineOptions({ inheritAttrs: false })
11
+
12
+ const props = withDefaults(defineProps<ProviderPillProps>(), {
13
+ showProvider: true,
14
+ })
15
+
16
+ const { t } = useI18n()
17
+
18
+ /** Shown as "no provider" when the read fails. */
19
+ const NO_PROVIDER: ProviderInfo = { name: '', connected: false, features: null }
20
+
21
+ const providerRead = useProviderInfo(() => props.showProvider)
22
+ const provider = computed<ProviderInfo | null>(() =>
23
+ providerRead.error.value ? NO_PROVIDER : providerRead.data.value,
24
+ )
25
+
26
+ /** The leading child of the page toolbar: is a provider carrying the mail. */
27
+ const pill = computed(() =>
28
+ provider.value?.connected
29
+ ? {
30
+ tone: 'success',
31
+ dot: 'live',
32
+ label: t('dms_mailing.page_header.provider_connected', {
33
+ name: provider.value.name,
34
+ }),
35
+ }
36
+ : {
37
+ tone: 'warning',
38
+ dot: 'static',
39
+ label: t('dms_mailing.page_header.no_provider'),
40
+ },
41
+ )
42
+ </script>
43
+
44
+ <template>
45
+ <DmsStatusPill
46
+ v-if="props.showProvider && provider"
47
+ v-bind="pill"
48
+ :title="t('dms_mailing.page_header.provider_hint')"
49
+ />
50
+ </template>