@dev.smartpricing/message-composer-layer 4.2.11 → 4.2.13-ux.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/Brand/BrandDrawer.vue +1 -0
- package/app/components/Brand/Steps/BrandStepVisual.vue +8 -1
- package/app/components/Editor/RichTextEditor.vue +9 -4
- package/app/components/Email/Editor/Blocks/FooterBlock.vue +2 -0
- package/app/components/Email/Editor/Blocks/FooterSettings.vue +34 -0
- package/app/components/Email/Editor/Blocks/HeadingBlock.vue +2 -0
- package/app/components/Email/Editor/Blocks/HeadingSettings.vue +34 -0
- package/app/components/Email/Editor/Blocks/ParagraphBlock.vue +2 -0
- package/app/components/Email/Editor/Blocks/ParagraphSettings.vue +34 -0
- package/app/components/Email/Editor/Blocks/UnsubscribeLinkBlock.vue +2 -0
- package/app/components/Email/Editor/Blocks/UnsubscribeLinkSettings.vue +33 -0
- package/app/components/Email/SendTestEmailModal.vue +15 -13
- package/app/composables/composerContext.ts +2 -1
- package/app/utils/testIds.const.ts +10 -0
- package/i18n/locales/de.ts +3 -0
- package/i18n/locales/en.ts +3 -0
- package/i18n/locales/es.ts +3 -0
- package/i18n/locales/fr.ts +3 -0
- package/i18n/locales/it.ts +3 -0
- package/package.json +2 -2
|
@@ -3,6 +3,7 @@ import type {
|
|
|
3
3
|
BrandDefaultEmailSettings,
|
|
4
4
|
BrandDefaultButtonSettings,
|
|
5
5
|
} from '@dev.smartpricing/message-composer-utils/types'
|
|
6
|
+
import { DEFAULT_EMAIL_GLOBAL_SETTINGS } from '@dev.smartpricing/message-composer-utils/types'
|
|
6
7
|
import { getPaletteSync } from 'colorthief'
|
|
7
8
|
|
|
8
9
|
import FontFamilySelect from '~/components/Common/FontFamilySelect.vue'
|
|
@@ -169,7 +170,7 @@ function removeColor(index: number) {
|
|
|
169
170
|
<!-- Default email colors -->
|
|
170
171
|
<div class="space-y-2">
|
|
171
172
|
<p class="text-sm font-medium">{{ $t('pages.brands.fields.default_email_colors') }}</p>
|
|
172
|
-
<div class="grid grid-cols-1 sm:grid-cols-
|
|
173
|
+
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
|
173
174
|
<ColorInput
|
|
174
175
|
:brand-colors="colors"
|
|
175
176
|
v-model="defaultEmailSettings.backgroundColor"
|
|
@@ -185,6 +186,12 @@ function removeColor(index: number) {
|
|
|
185
186
|
v-model="defaultEmailSettings.textColor"
|
|
186
187
|
:label="$t('pages.brands.fields.email_text_color')"
|
|
187
188
|
/>
|
|
189
|
+
<ColorInput
|
|
190
|
+
:brand-colors="colors"
|
|
191
|
+
v-model="defaultEmailSettings.linkColor"
|
|
192
|
+
:default-value="defaultEmailSettings.textColor ?? DEFAULT_EMAIL_GLOBAL_SETTINGS.textColor"
|
|
193
|
+
:label="$t('pages.brands.fields.email_link_color')"
|
|
194
|
+
/>
|
|
188
195
|
</div>
|
|
189
196
|
</div>
|
|
190
197
|
|
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
RefineTextResponse,
|
|
10
10
|
} from '@dev.smartpricing/message-composer-utils/types'
|
|
11
11
|
import {
|
|
12
|
+
buildLinkHTMLAttributes,
|
|
12
13
|
convertToWhatsappMarkdown,
|
|
13
14
|
getTipTapExtensions,
|
|
14
15
|
sanitizeContent,
|
|
@@ -39,6 +40,7 @@ const props = withDefaults(
|
|
|
39
40
|
horizontalRule?: boolean
|
|
40
41
|
alignment?: boolean
|
|
41
42
|
link?: boolean
|
|
43
|
+
linkColor?: string
|
|
42
44
|
emoji?: boolean
|
|
43
45
|
}>(),
|
|
44
46
|
{
|
|
@@ -134,9 +136,12 @@ const starterKitConfig = computed(() => {
|
|
|
134
136
|
link: props.link
|
|
135
137
|
? {
|
|
136
138
|
openOnClick: false,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
// Callers that don't opt in with `linkColor` (e.g. ButtonSettings, whose
|
|
140
|
+
// links aren't part of the block-level linkColor feature) keep the old
|
|
141
|
+
// fixed styling instead of an unset `--link-color` custom property.
|
|
142
|
+
HTMLAttributes: props.linkColor
|
|
143
|
+
? { class: 'underline', ...buildLinkHTMLAttributes({ mode: 'live' }) }
|
|
144
|
+
: { class: 'text-primary-600 underline' },
|
|
140
145
|
}
|
|
141
146
|
: false,
|
|
142
147
|
heading: false,
|
|
@@ -373,7 +378,7 @@ defineExpose({
|
|
|
373
378
|
</script>
|
|
374
379
|
|
|
375
380
|
<template>
|
|
376
|
-
<div :data-testid="richTextEditorTestIds.root">
|
|
381
|
+
<div :data-testid="richTextEditorTestIds.root" :style="{ '--link-color': linkColor }">
|
|
377
382
|
<div class="rounded-md border border-accented overflow-hidden">
|
|
378
383
|
<UEditor
|
|
379
384
|
ref="editorRef"
|
|
@@ -18,6 +18,7 @@ const editor = useEditor({
|
|
|
18
18
|
extensions: getTipTapExtensions({
|
|
19
19
|
preset: 'email',
|
|
20
20
|
dynamicValues: true,
|
|
21
|
+
linkColor: { mode: 'live' },
|
|
21
22
|
}),
|
|
22
23
|
})
|
|
23
24
|
|
|
@@ -47,6 +48,7 @@ defineOptions({
|
|
|
47
48
|
fontFamily: block.settings.fontFamily ?? emailEditorStore.resolvedSettings.fontFamily,
|
|
48
49
|
fontSize: `${block.settings.fontSize}px`,
|
|
49
50
|
color: block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
51
|
+
'--link-color': block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
50
52
|
}"
|
|
51
53
|
>
|
|
52
54
|
<EditorContent :editor="editor" class="pointer-events-none" />
|
|
@@ -23,6 +23,19 @@ const content = computed({
|
|
|
23
23
|
},
|
|
24
24
|
})
|
|
25
25
|
|
|
26
|
+
const resolvedLinkColor = computed(
|
|
27
|
+
() => props.block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
function matchTextColor() {
|
|
31
|
+
emailEditorStore.updateBlock(props.block.id, {
|
|
32
|
+
settings: {
|
|
33
|
+
...props.block.settings,
|
|
34
|
+
linkColor: props.block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
26
39
|
function resetTextStyle() {
|
|
27
40
|
emailEditorStore.updateBlock(props.block.id, {
|
|
28
41
|
settings: {
|
|
@@ -38,6 +51,7 @@ function resetColors() {
|
|
|
38
51
|
settings: {
|
|
39
52
|
...props.block.settings,
|
|
40
53
|
textColor: DEFAULT_FOOTER_SETTINGS.textColor,
|
|
54
|
+
linkColor: DEFAULT_FOOTER_SETTINGS.linkColor,
|
|
41
55
|
backgroundColor: DEFAULT_FOOTER_SETTINGS.backgroundColor,
|
|
42
56
|
},
|
|
43
57
|
})
|
|
@@ -63,6 +77,7 @@ defineOptions({
|
|
|
63
77
|
underline
|
|
64
78
|
alignment
|
|
65
79
|
link
|
|
80
|
+
:link-color="resolvedLinkColor"
|
|
66
81
|
emoji
|
|
67
82
|
dynamic-values
|
|
68
83
|
/>
|
|
@@ -113,6 +128,25 @@ defineOptions({
|
|
|
113
128
|
:default-value="emailEditorStore.resolvedSettings.textColor"
|
|
114
129
|
/>
|
|
115
130
|
|
|
131
|
+
<!-- Link Color -->
|
|
132
|
+
<ColorInput
|
|
133
|
+
v-model="block.settings.linkColor"
|
|
134
|
+
:label="$t('editor.email.blocks.heading.settings.link')"
|
|
135
|
+
:default-value="emailEditorStore.resolvedSettings.linkColor"
|
|
136
|
+
:data-testid="footerSettingsTestIds.linkColorInput"
|
|
137
|
+
>
|
|
138
|
+
<template #trailing>
|
|
139
|
+
<UButton
|
|
140
|
+
size="xs"
|
|
141
|
+
color="neutral"
|
|
142
|
+
variant="ghost"
|
|
143
|
+
:label="$t('editor.email.blocks.heading.settings.match_text_color')"
|
|
144
|
+
:data-testid="footerSettingsTestIds.matchTextColorButton"
|
|
145
|
+
@click.stop="matchTextColor"
|
|
146
|
+
/>
|
|
147
|
+
</template>
|
|
148
|
+
</ColorInput>
|
|
149
|
+
|
|
116
150
|
<!-- Background Color -->
|
|
117
151
|
<ColorInput
|
|
118
152
|
v-model="block.settings.backgroundColor"
|
|
@@ -18,6 +18,7 @@ const editor = useEditor({
|
|
|
18
18
|
extensions: getTipTapExtensions({
|
|
19
19
|
preset: 'email',
|
|
20
20
|
dynamicValues: true,
|
|
21
|
+
linkColor: { mode: 'live' },
|
|
21
22
|
}),
|
|
22
23
|
})
|
|
23
24
|
|
|
@@ -47,6 +48,7 @@ defineOptions({
|
|
|
47
48
|
fontFamily: block.settings.fontFamily ?? emailEditorStore.resolvedSettings.fontFamily,
|
|
48
49
|
fontSize: `${block.settings.fontSize}px`,
|
|
49
50
|
color: block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
51
|
+
'--link-color': block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
50
52
|
}"
|
|
51
53
|
>
|
|
52
54
|
<EditorContent :editor="editor" class="pointer-events-none" />
|
|
@@ -30,6 +30,19 @@ const content = computed({
|
|
|
30
30
|
},
|
|
31
31
|
})
|
|
32
32
|
|
|
33
|
+
const resolvedLinkColor = computed(
|
|
34
|
+
() => props.block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
function matchTextColor() {
|
|
38
|
+
emailEditorStore.updateBlock(props.block.id, {
|
|
39
|
+
settings: {
|
|
40
|
+
...props.block.settings,
|
|
41
|
+
linkColor: props.block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
33
46
|
const typeOptions = HEADING_TAGS.slice(0, 3).map((heading) => ({
|
|
34
47
|
value: heading,
|
|
35
48
|
label: t(`editor.email.blocks.text_types.${heading}`),
|
|
@@ -51,6 +64,7 @@ function resetColors() {
|
|
|
51
64
|
settings: {
|
|
52
65
|
...props.block.settings,
|
|
53
66
|
textColor: DEFAULT_HEADING_SETTINGS.textColor,
|
|
67
|
+
linkColor: DEFAULT_HEADING_SETTINGS.linkColor,
|
|
54
68
|
backgroundColor: DEFAULT_HEADING_SETTINGS.backgroundColor,
|
|
55
69
|
},
|
|
56
70
|
})
|
|
@@ -83,6 +97,7 @@ defineOptions({
|
|
|
83
97
|
underline
|
|
84
98
|
alignment
|
|
85
99
|
link
|
|
100
|
+
:link-color="resolvedLinkColor"
|
|
86
101
|
emoji
|
|
87
102
|
improve
|
|
88
103
|
generate
|
|
@@ -146,6 +161,25 @@ defineOptions({
|
|
|
146
161
|
:default-value="emailEditorStore.resolvedSettings.textColor"
|
|
147
162
|
/>
|
|
148
163
|
|
|
164
|
+
<!-- Link Color -->
|
|
165
|
+
<ColorInput
|
|
166
|
+
v-model="block.settings.linkColor"
|
|
167
|
+
:label="$t('editor.email.blocks.heading.settings.link')"
|
|
168
|
+
:default-value="emailEditorStore.resolvedSettings.linkColor"
|
|
169
|
+
:data-testid="headingSettingsTestIds.linkColorInput"
|
|
170
|
+
>
|
|
171
|
+
<template #trailing>
|
|
172
|
+
<UButton
|
|
173
|
+
size="xs"
|
|
174
|
+
color="neutral"
|
|
175
|
+
variant="ghost"
|
|
176
|
+
:label="$t('editor.email.blocks.heading.settings.match_text_color')"
|
|
177
|
+
:data-testid="headingSettingsTestIds.matchTextColorButton"
|
|
178
|
+
@click.stop="matchTextColor"
|
|
179
|
+
/>
|
|
180
|
+
</template>
|
|
181
|
+
</ColorInput>
|
|
182
|
+
|
|
149
183
|
<!-- Background Color -->
|
|
150
184
|
<ColorInput
|
|
151
185
|
v-model="block.settings.backgroundColor"
|
|
@@ -18,6 +18,7 @@ const editor = useEditor({
|
|
|
18
18
|
extensions: getTipTapExtensions({
|
|
19
19
|
preset: 'email',
|
|
20
20
|
dynamicValues: true,
|
|
21
|
+
linkColor: { mode: 'live' },
|
|
21
22
|
}),
|
|
22
23
|
})
|
|
23
24
|
|
|
@@ -47,6 +48,7 @@ defineOptions({
|
|
|
47
48
|
fontFamily: block.settings.fontFamily ?? emailEditorStore.resolvedSettings.fontFamily,
|
|
48
49
|
fontSize: `${block.settings.fontSize}px`,
|
|
49
50
|
color: block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
51
|
+
'--link-color': block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
50
52
|
}"
|
|
51
53
|
>
|
|
52
54
|
<EditorContent :editor="editor" class="pointer-events-none" />
|
|
@@ -30,6 +30,19 @@ const content = computed({
|
|
|
30
30
|
},
|
|
31
31
|
})
|
|
32
32
|
|
|
33
|
+
const resolvedLinkColor = computed(
|
|
34
|
+
() => props.block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
function matchTextColor() {
|
|
38
|
+
emailEditorStore.updateBlock(props.block.id, {
|
|
39
|
+
settings: {
|
|
40
|
+
...props.block.settings,
|
|
41
|
+
linkColor: props.block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
33
46
|
const typeOptions = TEXT_TAGS.map((tag) => ({
|
|
34
47
|
value: tag,
|
|
35
48
|
label: t(`editor.email.blocks.text_types.${tag}`),
|
|
@@ -51,6 +64,7 @@ function resetColors() {
|
|
|
51
64
|
settings: {
|
|
52
65
|
...props.block.settings,
|
|
53
66
|
textColor: DEFAULT_PARAGRAPH_SETTINGS.textColor,
|
|
67
|
+
linkColor: DEFAULT_PARAGRAPH_SETTINGS.linkColor,
|
|
54
68
|
backgroundColor: DEFAULT_PARAGRAPH_SETTINGS.backgroundColor,
|
|
55
69
|
},
|
|
56
70
|
})
|
|
@@ -85,6 +99,7 @@ defineOptions({
|
|
|
85
99
|
horizontal-rule
|
|
86
100
|
alignment
|
|
87
101
|
link
|
|
102
|
+
:link-color="resolvedLinkColor"
|
|
88
103
|
emoji
|
|
89
104
|
improve
|
|
90
105
|
generate
|
|
@@ -147,6 +162,25 @@ defineOptions({
|
|
|
147
162
|
:default-value="emailEditorStore.resolvedSettings.textColor"
|
|
148
163
|
/>
|
|
149
164
|
|
|
165
|
+
<!-- Link Color -->
|
|
166
|
+
<ColorInput
|
|
167
|
+
v-model="block.settings.linkColor"
|
|
168
|
+
:label="$t('editor.email.blocks.heading.settings.link')"
|
|
169
|
+
:default-value="emailEditorStore.resolvedSettings.linkColor"
|
|
170
|
+
:data-testid="paragraphSettingsTestIds.linkColorInput"
|
|
171
|
+
>
|
|
172
|
+
<template #trailing>
|
|
173
|
+
<UButton
|
|
174
|
+
size="xs"
|
|
175
|
+
color="neutral"
|
|
176
|
+
variant="ghost"
|
|
177
|
+
:label="$t('editor.email.blocks.heading.settings.match_text_color')"
|
|
178
|
+
:data-testid="paragraphSettingsTestIds.matchTextColorButton"
|
|
179
|
+
@click.stop="matchTextColor"
|
|
180
|
+
/>
|
|
181
|
+
</template>
|
|
182
|
+
</ColorInput>
|
|
183
|
+
|
|
150
184
|
<!-- Background Color -->
|
|
151
185
|
<ColorInput
|
|
152
186
|
v-model="block.settings.backgroundColor"
|
|
@@ -17,6 +17,7 @@ const editor = useEditor({
|
|
|
17
17
|
extensions: getTipTapExtensions({
|
|
18
18
|
preset: 'email',
|
|
19
19
|
dynamicValues: true,
|
|
20
|
+
linkColor: { mode: 'live' },
|
|
20
21
|
}),
|
|
21
22
|
})
|
|
22
23
|
|
|
@@ -45,6 +46,7 @@ defineOptions({
|
|
|
45
46
|
fontFamily: block.settings.fontFamily ?? emailEditorStore.resolvedSettings.fontFamily,
|
|
46
47
|
fontSize: `${block.settings.fontSize}px`,
|
|
47
48
|
color: block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
49
|
+
'--link-color': block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
48
50
|
textAlign: block.settings.alignment,
|
|
49
51
|
}"
|
|
50
52
|
>
|
|
@@ -24,6 +24,19 @@ const content = computed({
|
|
|
24
24
|
},
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
+
const resolvedLinkColor = computed(
|
|
28
|
+
() => props.block.settings.linkColor ?? emailEditorStore.resolvedSettings.linkColor,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
function matchTextColor() {
|
|
32
|
+
emailEditorStore.updateBlock(props.block.id, {
|
|
33
|
+
settings: {
|
|
34
|
+
...props.block.settings,
|
|
35
|
+
linkColor: props.block.settings.textColor ?? emailEditorStore.resolvedSettings.textColor,
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
27
40
|
function resetTextStyle() {
|
|
28
41
|
emailEditorStore.updateBlock(props.block.id, {
|
|
29
42
|
settings: {
|
|
@@ -39,6 +52,7 @@ function resetColors() {
|
|
|
39
52
|
settings: {
|
|
40
53
|
...props.block.settings,
|
|
41
54
|
textColor: DEFAULT_UNSUBSCRIBE_LINK_SETTINGS.textColor,
|
|
55
|
+
linkColor: DEFAULT_UNSUBSCRIBE_LINK_SETTINGS.linkColor,
|
|
42
56
|
backgroundColor: DEFAULT_UNSUBSCRIBE_LINK_SETTINGS.backgroundColor,
|
|
43
57
|
},
|
|
44
58
|
})
|
|
@@ -63,6 +77,7 @@ defineOptions({
|
|
|
63
77
|
italic
|
|
64
78
|
underline
|
|
65
79
|
link
|
|
80
|
+
:link-color="resolvedLinkColor"
|
|
66
81
|
dynamic-values
|
|
67
82
|
:data-testid="unsubscribeLinkSettingsTestIds.contentEditor"
|
|
68
83
|
/>
|
|
@@ -113,6 +128,24 @@ defineOptions({
|
|
|
113
128
|
:data-testid="unsubscribeLinkSettingsTestIds.textColorInput"
|
|
114
129
|
/>
|
|
115
130
|
|
|
131
|
+
<ColorInput
|
|
132
|
+
v-model="block.settings.linkColor"
|
|
133
|
+
:label="$t('editor.email.blocks.heading.settings.link')"
|
|
134
|
+
:default-value="emailEditorStore.resolvedSettings.linkColor"
|
|
135
|
+
:data-testid="unsubscribeLinkSettingsTestIds.linkColorInput"
|
|
136
|
+
>
|
|
137
|
+
<template #trailing>
|
|
138
|
+
<UButton
|
|
139
|
+
size="xs"
|
|
140
|
+
color="neutral"
|
|
141
|
+
variant="ghost"
|
|
142
|
+
:label="$t('editor.email.blocks.heading.settings.match_text_color')"
|
|
143
|
+
:data-testid="unsubscribeLinkSettingsTestIds.matchTextColorButton"
|
|
144
|
+
@click.stop="matchTextColor"
|
|
145
|
+
/>
|
|
146
|
+
</template>
|
|
147
|
+
</ColorInput>
|
|
148
|
+
|
|
116
149
|
<ColorInput
|
|
117
150
|
v-model="block.settings.backgroundColor"
|
|
118
151
|
:label="$t('editor.email.blocks.heading.settings.backgroundBlock')"
|
|
@@ -87,9 +87,7 @@ const emailEditorStore = useEmailEditorStore()
|
|
|
87
87
|
const composerContext = useComposerContext()
|
|
88
88
|
const { mutate: sendTest, isLoading: isSending, status } = useSendTestEmailMutation()
|
|
89
89
|
|
|
90
|
-
const
|
|
91
|
-
() => composerContext.organizationData?.value?.senderEmail ?? '',
|
|
92
|
-
)
|
|
90
|
+
const senderEmails = computed(() => composerContext.organizationData?.value?.senderEmails ?? [])
|
|
93
91
|
|
|
94
92
|
const accommodationName = computed(
|
|
95
93
|
() => composerContext.organizationData?.value?.accommodationName ?? '',
|
|
@@ -102,10 +100,11 @@ const state = ref<Schema>({
|
|
|
102
100
|
})
|
|
103
101
|
|
|
104
102
|
watch(
|
|
105
|
-
|
|
106
|
-
(
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
senderEmails,
|
|
104
|
+
(emails) => {
|
|
105
|
+
const [firstEmail] = emails
|
|
106
|
+
if (!state.value.from && firstEmail) {
|
|
107
|
+
state.value.from = firstEmail
|
|
109
108
|
}
|
|
110
109
|
},
|
|
111
110
|
{ immediate: true },
|
|
@@ -136,9 +135,7 @@ const schema = z.object({
|
|
|
136
135
|
{ message: t('editor.validation.error.emailInvalid') },
|
|
137
136
|
),
|
|
138
137
|
sender_name: z.string().optional(),
|
|
139
|
-
from: z.string().
|
|
140
|
-
message: t('editor.validation.error.emailInvalid'),
|
|
141
|
-
}),
|
|
138
|
+
from: z.string().min(1, t('editor.validation.error.emailRequired')),
|
|
142
139
|
})
|
|
143
140
|
|
|
144
141
|
type Schema = z.output<typeof schema>
|
|
@@ -217,11 +214,16 @@ watch(status, (newStatus) => {
|
|
|
217
214
|
:data-testid="sendTestEmailModalTestIds.toInput"
|
|
218
215
|
/>
|
|
219
216
|
</UFormField>
|
|
220
|
-
<UFormField
|
|
221
|
-
|
|
217
|
+
<UFormField
|
|
218
|
+
name="from"
|
|
219
|
+
:label="$t('pages.email.test_email_from')"
|
|
220
|
+
:data-testid="sendTestEmailModalTestIds.fromFormField"
|
|
221
|
+
>
|
|
222
|
+
<USelectMenu
|
|
222
223
|
v-model="state.from"
|
|
223
|
-
|
|
224
|
+
:items="senderEmails"
|
|
224
225
|
:placeholder="$t('pages.email.test_email_from_placeholder')"
|
|
226
|
+
:data-testid="sendTestEmailModalTestIds.fromSelect"
|
|
225
227
|
/>
|
|
226
228
|
</UFormField>
|
|
227
229
|
<UFormField
|
|
@@ -2,7 +2,8 @@ import type { InjectionKey, Ref } from 'vue'
|
|
|
2
2
|
import type { AppContextConfig } from '@dev.smartpricing/message-composer-utils/types'
|
|
3
3
|
|
|
4
4
|
export interface OrganizationData {
|
|
5
|
-
|
|
5
|
+
/** Verified sender addresses available for the test-email "from" field, default first. */
|
|
6
|
+
senderEmails: string[]
|
|
6
7
|
/** Tenant accommodation/property name — defaults the test-email sender name */
|
|
7
8
|
accommodationName?: string
|
|
8
9
|
}
|
|
@@ -331,6 +331,8 @@ export const sendTestEmailModalTestIds = {
|
|
|
331
331
|
triggerButton: 'send-test-email-modal-trigger-button',
|
|
332
332
|
toFormField: 'send-test-email-modal-to-form-field',
|
|
333
333
|
toInput: 'send-test-email-modal-to-input',
|
|
334
|
+
fromFormField: 'send-test-email-modal-from-form-field',
|
|
335
|
+
fromSelect: 'send-test-email-modal-from-select',
|
|
334
336
|
senderNameFormField: 'send-test-email-modal-sender-name-form-field',
|
|
335
337
|
senderNameInput: 'send-test-email-modal-sender-name-input',
|
|
336
338
|
cancelButton: 'send-test-email-modal-cancel-button',
|
|
@@ -615,6 +617,8 @@ export const footerSettingsTestIds = {
|
|
|
615
617
|
container: 'footer-settings-container',
|
|
616
618
|
fontSizeField: 'footer-settings-font-size-field',
|
|
617
619
|
fontSizeInput: 'footer-settings-font-size-input',
|
|
620
|
+
linkColorInput: 'footer-settings-link-color-input',
|
|
621
|
+
matchTextColorButton: 'footer-settings-match-text-color-button',
|
|
618
622
|
} as const
|
|
619
623
|
|
|
620
624
|
export const gridBlockTestIds = {
|
|
@@ -653,6 +657,8 @@ export const headingSettingsTestIds = {
|
|
|
653
657
|
tagSelect: 'heading-settings-tag-select',
|
|
654
658
|
fontSizeField: 'heading-settings-font-size-field',
|
|
655
659
|
fontSizeInput: 'heading-settings-font-size-input',
|
|
660
|
+
linkColorInput: 'heading-settings-link-color-input',
|
|
661
|
+
matchTextColorButton: 'heading-settings-match-text-color-button',
|
|
656
662
|
} as const
|
|
657
663
|
|
|
658
664
|
export const htmlBlockTestIds = {
|
|
@@ -691,6 +697,8 @@ export const paragraphSettingsTestIds = {
|
|
|
691
697
|
tagSelect: 'paragraph-settings-tag-select',
|
|
692
698
|
fontSizeField: 'paragraph-settings-font-size-field',
|
|
693
699
|
fontSizeInput: 'paragraph-settings-font-size-input',
|
|
700
|
+
linkColorInput: 'paragraph-settings-link-color-input',
|
|
701
|
+
matchTextColorButton: 'paragraph-settings-match-text-color-button',
|
|
694
702
|
} as const
|
|
695
703
|
|
|
696
704
|
export const socialsBlockTestIds = {
|
|
@@ -732,6 +740,8 @@ export const unsubscribeLinkSettingsTestIds = {
|
|
|
732
740
|
fontSizeInput: 'unsubscribe-link-settings-font-size-input',
|
|
733
741
|
textColorInput: 'unsubscribe-link-settings-text-color-input',
|
|
734
742
|
backgroundColorInput: 'unsubscribe-link-settings-background-color-input',
|
|
743
|
+
linkColorInput: 'unsubscribe-link-settings-link-color-input',
|
|
744
|
+
matchTextColorButton: 'unsubscribe-link-settings-match-text-color-button',
|
|
735
745
|
} as const
|
|
736
746
|
|
|
737
747
|
export const previewByIdTestIds = {
|
package/i18n/locales/de.ts
CHANGED
|
@@ -266,6 +266,8 @@ export default {
|
|
|
266
266
|
color: 'Farbe',
|
|
267
267
|
content: 'Inhalt',
|
|
268
268
|
font: 'Schriftart',
|
|
269
|
+
link: 'Link',
|
|
270
|
+
match_text_color: 'An Textfarbe anpassen',
|
|
269
271
|
size: 'Größe',
|
|
270
272
|
text: 'Text',
|
|
271
273
|
textStyle: 'Textstil',
|
|
@@ -693,6 +695,7 @@ export default {
|
|
|
693
695
|
default_font: 'Standardschriftart',
|
|
694
696
|
email_bg_color: 'Hintergrund',
|
|
695
697
|
email_content_bg_color: 'Inhalt-Hintergrund',
|
|
698
|
+
email_link_color: 'Link-Farbe',
|
|
696
699
|
email_text_color: 'Text',
|
|
697
700
|
extracting_colors: 'Farben werden aus dem Logo extrahiert...',
|
|
698
701
|
logo: 'Logo',
|
package/i18n/locales/en.ts
CHANGED
|
@@ -260,6 +260,8 @@ export default {
|
|
|
260
260
|
color: 'Color',
|
|
261
261
|
content: 'Content',
|
|
262
262
|
font: 'Font',
|
|
263
|
+
link: 'Link',
|
|
264
|
+
match_text_color: 'Match text color',
|
|
263
265
|
size: 'Size',
|
|
264
266
|
text: 'Text',
|
|
265
267
|
textStyle: 'Text style',
|
|
@@ -682,6 +684,7 @@ export default {
|
|
|
682
684
|
default_font: 'Default font',
|
|
683
685
|
email_bg_color: 'Background',
|
|
684
686
|
email_content_bg_color: 'Content background',
|
|
687
|
+
email_link_color: 'Link color',
|
|
685
688
|
email_text_color: 'Text',
|
|
686
689
|
extracting_colors: 'Extracting colors from logo...',
|
|
687
690
|
logo: 'Logo',
|
package/i18n/locales/es.ts
CHANGED
|
@@ -261,6 +261,8 @@ export default {
|
|
|
261
261
|
color: 'Color',
|
|
262
262
|
content: 'Contenido',
|
|
263
263
|
font: 'Fuente',
|
|
264
|
+
link: 'Enlace',
|
|
265
|
+
match_text_color: 'Igualar al color del texto',
|
|
264
266
|
size: 'Tamaño',
|
|
265
267
|
text: 'Texto',
|
|
266
268
|
textStyle: 'Estilo del texto',
|
|
@@ -691,6 +693,7 @@ export default {
|
|
|
691
693
|
default_font: 'Fuente predeterminada',
|
|
692
694
|
email_bg_color: 'Fondo',
|
|
693
695
|
email_content_bg_color: 'Fondo contenido',
|
|
696
|
+
email_link_color: 'Color de enlace',
|
|
694
697
|
email_text_color: 'Texto',
|
|
695
698
|
extracting_colors: 'Extrayendo colores del logo...',
|
|
696
699
|
logo: 'Logo',
|
package/i18n/locales/fr.ts
CHANGED
|
@@ -262,6 +262,8 @@ export default {
|
|
|
262
262
|
color: 'Couleur',
|
|
263
263
|
content: 'Contenu',
|
|
264
264
|
font: 'Police',
|
|
265
|
+
link: 'Lien',
|
|
266
|
+
match_text_color: 'Assortir à la couleur du texte',
|
|
265
267
|
size: 'Taille',
|
|
266
268
|
text: 'Texte',
|
|
267
269
|
textStyle: 'Style de texte',
|
|
@@ -695,6 +697,7 @@ export default {
|
|
|
695
697
|
default_font: 'Police par défaut',
|
|
696
698
|
email_bg_color: 'Fond',
|
|
697
699
|
email_content_bg_color: 'Fond contenu',
|
|
700
|
+
email_link_color: 'Couleur du lien',
|
|
698
701
|
email_text_color: 'Texte',
|
|
699
702
|
extracting_colors: 'Extraction des couleurs du logo...',
|
|
700
703
|
logo: 'Logo',
|
package/i18n/locales/it.ts
CHANGED
|
@@ -261,6 +261,8 @@ export default {
|
|
|
261
261
|
color: 'Colore',
|
|
262
262
|
content: 'Contenuto',
|
|
263
263
|
font: 'Font',
|
|
264
|
+
link: 'Link',
|
|
265
|
+
match_text_color: 'Abbina al colore del testo',
|
|
264
266
|
size: 'Dimensione',
|
|
265
267
|
text: 'Testo',
|
|
266
268
|
textStyle: 'Stile testo',
|
|
@@ -688,6 +690,7 @@ export default {
|
|
|
688
690
|
default_font: 'Font predefinito',
|
|
689
691
|
email_bg_color: 'Sfondo',
|
|
690
692
|
email_content_bg_color: 'Sfondo contenuto',
|
|
693
|
+
email_link_color: 'Colore link',
|
|
691
694
|
email_text_color: 'Testo',
|
|
692
695
|
extracting_colors: 'Estrazione dei colori dal logo...',
|
|
693
696
|
logo: 'Logo',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dev.smartpricing/message-composer-layer",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.13-ux.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./nuxt.config.ts",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"vue-router": "^5.0.7",
|
|
37
37
|
"vue3-emoji-picker": "^1.1.8",
|
|
38
38
|
"zod": "^4.4.3",
|
|
39
|
-
"@dev.smartpricing/message-composer-utils": "4.2.
|
|
39
|
+
"@dev.smartpricing/message-composer-utils": "4.2.13-ux.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@nuxt/eslint": "^1.15.2",
|