@weni/unnnic-system 3.0.5-alpha.0 → 3.1.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.
- package/CHANGELOG.md +14 -1
- package/dist/components/DataTable/index.vue.d.ts +47 -139
- package/dist/components/DataTable/index.vue.d.ts.map +1 -1
- package/dist/components/DatePicker/DatePicker.vue.d.ts +2 -2
- package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +3 -3
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts +1 -1
- package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
- package/dist/components/index.d.ts +7 -263
- package/dist/components/index.d.ts.map +1 -1
- package/dist/{es-e4780f92.mjs → es-b95265ef.mjs} +1 -1
- package/dist/{index-c20c8a10.mjs → index-d6c4fffb.mjs} +8984 -9134
- package/dist/{pt-br-9e604702.mjs → pt-br-80b6b07a.mjs} +1 -1
- package/dist/style.css +1 -1
- package/dist/unnnic.mjs +24 -26
- package/dist/unnnic.umd.js +43 -44
- package/package.json +2 -2
- package/src/components/DataTable/index.vue +40 -67
- package/src/components/ModalDialog/ModalDialog.vue +29 -27
- package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
- package/src/components/index.ts +2 -8
- package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +0 -9
- package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +0 -1
- package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +0 -15
- package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +0 -1
- package/src/assets/img/previews/doc-preview.png +0 -0
- package/src/assets/img/previews/image-preview.png +0 -0
- package/src/assets/img/previews/video-preview.png +0 -0
- package/src/components/TemplatePreview/TemplatePreview.vue +0 -249
- package/src/components/TemplatePreview/TemplatePreviewModal.vue +0 -51
- package/src/components/TemplatePreview/types.d.ts +0 -16
- package/src/stories/TemplatePreview.stories.js +0 -94
- package/src/stories/TemplatePreviewModal.stories.js +0 -110
package/package.json
CHANGED
|
@@ -154,14 +154,8 @@
|
|
|
154
154
|
</table>
|
|
155
155
|
</template>
|
|
156
156
|
|
|
157
|
-
<script lang="ts">
|
|
158
|
-
export default {
|
|
159
|
-
name: 'UnnnicDataTable',
|
|
160
|
-
};
|
|
161
|
-
</script>
|
|
162
|
-
|
|
163
157
|
<script setup lang="ts">
|
|
164
|
-
import { computed, ref, useSlots } from 'vue';
|
|
158
|
+
import { computed, ComputedRef, ref, useSlots } from 'vue';
|
|
165
159
|
|
|
166
160
|
import Icon from '../Icon.vue';
|
|
167
161
|
import IconArrowsDefault from '../icons/iconArrowsDefault.vue';
|
|
@@ -179,6 +173,27 @@ type DataTableItem = {
|
|
|
179
173
|
[key: string]: any;
|
|
180
174
|
};
|
|
181
175
|
|
|
176
|
+
interface Props {
|
|
177
|
+
headers: DataTableHeader[];
|
|
178
|
+
items: DataTableItem[];
|
|
179
|
+
isLoading?: boolean;
|
|
180
|
+
size?: 'sm' | 'md';
|
|
181
|
+
height?: string;
|
|
182
|
+
maxHeight?: string;
|
|
183
|
+
clickable?: boolean;
|
|
184
|
+
fixedHeaders?: boolean;
|
|
185
|
+
hideHeaders?: boolean;
|
|
186
|
+
hidePagination?: boolean;
|
|
187
|
+
page?: number;
|
|
188
|
+
pageTotal?: number;
|
|
189
|
+
pageInterval?: number;
|
|
190
|
+
locale?: string;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
defineOptions({
|
|
194
|
+
name: 'UnnnicDataTable',
|
|
195
|
+
});
|
|
196
|
+
|
|
182
197
|
const slots = useSlots();
|
|
183
198
|
|
|
184
199
|
const emit = defineEmits<{
|
|
@@ -187,64 +202,22 @@ const emit = defineEmits<{
|
|
|
187
202
|
'update:page': [page: number];
|
|
188
203
|
}>();
|
|
189
204
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
};
|
|
207
|
-
height: {
|
|
208
|
-
type: String;
|
|
209
|
-
default: '';
|
|
210
|
-
};
|
|
211
|
-
maxHeight: {
|
|
212
|
-
type: String;
|
|
213
|
-
default: '';
|
|
214
|
-
};
|
|
215
|
-
clickable: {
|
|
216
|
-
type: Boolean;
|
|
217
|
-
default: false;
|
|
218
|
-
};
|
|
219
|
-
fixedHeaders: {
|
|
220
|
-
type: Boolean;
|
|
221
|
-
default: false;
|
|
222
|
-
};
|
|
223
|
-
hideHeaders: {
|
|
224
|
-
type: Boolean;
|
|
225
|
-
default: false;
|
|
226
|
-
};
|
|
227
|
-
hidePagination: {
|
|
228
|
-
type: Boolean;
|
|
229
|
-
default: false;
|
|
230
|
-
};
|
|
231
|
-
page: {
|
|
232
|
-
type: Number;
|
|
233
|
-
default: 1;
|
|
234
|
-
};
|
|
235
|
-
pageTotal: {
|
|
236
|
-
type: Number;
|
|
237
|
-
default: 0;
|
|
238
|
-
};
|
|
239
|
-
pageInterval: {
|
|
240
|
-
type: Number;
|
|
241
|
-
default: 5;
|
|
242
|
-
};
|
|
243
|
-
locale: {
|
|
244
|
-
type: string;
|
|
245
|
-
default: 'en';
|
|
246
|
-
};
|
|
247
|
-
}>();
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
208
|
+
isLoading: false,
|
|
209
|
+
size: 'md',
|
|
210
|
+
height: '',
|
|
211
|
+
maxHeight: '',
|
|
212
|
+
clickable: false,
|
|
213
|
+
fixedHeaders: false,
|
|
214
|
+
hideHeaders: false,
|
|
215
|
+
hidePagination: false,
|
|
216
|
+
page: 1,
|
|
217
|
+
pageTotal: 0,
|
|
218
|
+
pageInterval: 5,
|
|
219
|
+
locale: 'en',
|
|
220
|
+
});
|
|
248
221
|
|
|
249
222
|
const defaultTranslations = {
|
|
250
223
|
without_results: {
|
|
@@ -266,7 +239,7 @@ const shouldHideHeaders = computed(() => {
|
|
|
266
239
|
return props.hideHeaders || !props.headers.length;
|
|
267
240
|
});
|
|
268
241
|
|
|
269
|
-
const headersItemsKeys: string[] = computed(() => {
|
|
242
|
+
const headersItemsKeys: ComputedRef<string[]> = computed(() => {
|
|
270
243
|
return props.headers.map((header) => header.itemKey);
|
|
271
244
|
});
|
|
272
245
|
|
|
@@ -281,7 +254,7 @@ const getHeaderColumnSize = (header: DataTableHeader): string => {
|
|
|
281
254
|
: header.size || '1fr';
|
|
282
255
|
};
|
|
283
256
|
|
|
284
|
-
const gridTemplateColumns: string = computed(() => {
|
|
257
|
+
const gridTemplateColumns: ComputedRef<string> = computed(() => {
|
|
285
258
|
const columnSizes = props.headers.length
|
|
286
259
|
? props.headers.map(getHeaderColumnSize)
|
|
287
260
|
: props.items[0].content.map(() => '1fr');
|
|
@@ -24,7 +24,10 @@
|
|
|
24
24
|
</section>
|
|
25
25
|
|
|
26
26
|
<section class="unnnic-modal-dialog__container__body">
|
|
27
|
-
<header
|
|
27
|
+
<header
|
|
28
|
+
v-if="title"
|
|
29
|
+
class="unnnic-modal-dialog__container__header"
|
|
30
|
+
>
|
|
28
31
|
<section class="unnnic-modal-dialog__container__title-container">
|
|
29
32
|
<UnnnicIcon
|
|
30
33
|
v-if="icon || type"
|
|
@@ -46,7 +49,6 @@
|
|
|
46
49
|
data-testid="close-icon"
|
|
47
50
|
icon="close"
|
|
48
51
|
clickable
|
|
49
|
-
scheme="neutral-cloudy"
|
|
50
52
|
@click="close()"
|
|
51
53
|
/>
|
|
52
54
|
</header>
|
|
@@ -96,12 +98,12 @@
|
|
|
96
98
|
</template>
|
|
97
99
|
|
|
98
100
|
<script>
|
|
99
|
-
import UnnnicIcon from
|
|
100
|
-
import UnnnicButton from
|
|
101
|
-
import UnnnicI18n from
|
|
101
|
+
import UnnnicIcon from '../Icon.vue';
|
|
102
|
+
import UnnnicButton from '../Button/Button.vue';
|
|
103
|
+
import UnnnicI18n from '../../mixins/i18n';
|
|
102
104
|
|
|
103
105
|
export default {
|
|
104
|
-
name:
|
|
106
|
+
name: 'UnnnicModalDialog',
|
|
105
107
|
components: {
|
|
106
108
|
UnnnicIcon,
|
|
107
109
|
UnnnicButton,
|
|
@@ -118,29 +120,29 @@ export default {
|
|
|
118
120
|
},
|
|
119
121
|
type: {
|
|
120
122
|
type: String,
|
|
121
|
-
default:
|
|
123
|
+
default: '',
|
|
122
124
|
validate(type) {
|
|
123
|
-
return [
|
|
125
|
+
return ['success', 'warning', 'attention'].includes(type);
|
|
124
126
|
},
|
|
125
127
|
},
|
|
126
128
|
size: {
|
|
127
129
|
type: String,
|
|
128
|
-
default:
|
|
130
|
+
default: 'md',
|
|
129
131
|
validate(size) {
|
|
130
|
-
return [
|
|
132
|
+
return ['sm', 'md', 'lg'].includes(size);
|
|
131
133
|
},
|
|
132
134
|
},
|
|
133
135
|
title: {
|
|
134
136
|
type: String,
|
|
135
|
-
default:
|
|
137
|
+
default: '',
|
|
136
138
|
},
|
|
137
139
|
icon: {
|
|
138
140
|
type: String,
|
|
139
|
-
default:
|
|
141
|
+
default: '',
|
|
140
142
|
},
|
|
141
143
|
iconScheme: {
|
|
142
144
|
type: String,
|
|
143
|
-
default:
|
|
145
|
+
default: '',
|
|
144
146
|
},
|
|
145
147
|
showCloseIcon: {
|
|
146
148
|
type: Boolean,
|
|
@@ -163,26 +165,26 @@ export default {
|
|
|
163
165
|
default: () => ({}),
|
|
164
166
|
},
|
|
165
167
|
},
|
|
166
|
-
emits: [
|
|
168
|
+
emits: ['primaryButtonClick', 'secondaryButtonClick', 'update:modelValue'],
|
|
167
169
|
|
|
168
170
|
data() {
|
|
169
171
|
return {
|
|
170
172
|
defaultTranslations: {
|
|
171
173
|
cancel: {
|
|
172
|
-
|
|
173
|
-
en:
|
|
174
|
-
es:
|
|
174
|
+
'pt-br': 'Cancelar',
|
|
175
|
+
en: 'Cancel',
|
|
176
|
+
es: 'Cancelar',
|
|
175
177
|
},
|
|
176
178
|
},
|
|
177
179
|
iconsMapper: {
|
|
178
|
-
success: { icon:
|
|
179
|
-
warning: { icon:
|
|
180
|
-
attention: { icon:
|
|
180
|
+
success: { icon: 'check_circle', scheme: 'aux-green-500' },
|
|
181
|
+
warning: { icon: 'warning', scheme: 'aux-red-500' },
|
|
182
|
+
attention: { icon: 'error', scheme: 'aux-yellow-500' },
|
|
181
183
|
},
|
|
182
184
|
primaryButtonTypeMapper: {
|
|
183
|
-
success:
|
|
184
|
-
warning:
|
|
185
|
-
attention:
|
|
185
|
+
success: 'primary',
|
|
186
|
+
warning: 'warning',
|
|
187
|
+
attention: 'attention',
|
|
186
188
|
},
|
|
187
189
|
};
|
|
188
190
|
},
|
|
@@ -193,17 +195,17 @@ export default {
|
|
|
193
195
|
},
|
|
194
196
|
methods: {
|
|
195
197
|
close() {
|
|
196
|
-
this.$emit(
|
|
198
|
+
this.$emit('update:modelValue', false);
|
|
197
199
|
},
|
|
198
200
|
updateBodyOverflow(isHidden) {
|
|
199
|
-
document.body.style.overflow = isHidden ?
|
|
201
|
+
document.body.style.overflow = isHidden ? 'hidden' : '';
|
|
200
202
|
},
|
|
201
203
|
},
|
|
202
204
|
};
|
|
203
205
|
</script>
|
|
204
206
|
|
|
205
207
|
<style lang="scss" scoped>
|
|
206
|
-
@use
|
|
208
|
+
@use '@/assets/scss/unnnic' as *;
|
|
207
209
|
* {
|
|
208
210
|
margin: 0;
|
|
209
211
|
padding: 0;
|
|
@@ -310,7 +312,7 @@ export default {
|
|
|
310
312
|
&__actions {
|
|
311
313
|
display: grid;
|
|
312
314
|
grid-template-columns: 1fr 1fr;
|
|
313
|
-
grid-template-areas:
|
|
315
|
+
grid-template-areas: 'secondary-button primary-button';
|
|
314
316
|
gap: $unnnic-spacing-sm;
|
|
315
317
|
padding: $unnnic-spacing-md;
|
|
316
318
|
flex-shrink: 0;
|
|
@@ -11,7 +11,7 @@ exports[`ModalDialog.vue > Elements rendering > matches the snapshot 1`] = `
|
|
|
11
11
|
<unnnic-icon-stub data-v-68ebadeb="" filled="false" next="false" icon="test-icon" clickable="false" size="md" scheme="neutral-darkest" data-testid="title-icon" class="unnnic-modal-dialog__container__title-icon"></unnnic-icon-stub>
|
|
12
12
|
<h1 data-v-68ebadeb="" class="unnnic-modal-dialog__container__title-text" data-testid="title-text">Test Title</h1>
|
|
13
13
|
</section>
|
|
14
|
-
<unnnic-icon-stub data-v-68ebadeb="" filled="false" next="false" icon="close" clickable="true" size="md" scheme="neutral-
|
|
14
|
+
<unnnic-icon-stub data-v-68ebadeb="" filled="false" next="false" icon="close" clickable="true" size="md" scheme="neutral-darkest" data-testid="close-icon"></unnnic-icon-stub>
|
|
15
15
|
</header>
|
|
16
16
|
<section data-v-68ebadeb="" class="unnnic-modal-dialog__container__content"></section>
|
|
17
17
|
<section data-v-68ebadeb="" data-testid="actions-section" class="unnnic-modal-dialog__container__actions">
|
package/src/components/index.ts
CHANGED
|
@@ -88,9 +88,7 @@ import ModalDialog from "./ModalDialog/ModalDialog.vue";
|
|
|
88
88
|
import Tour from "./Tour/Tour.vue";
|
|
89
89
|
import Navigator from "./Navigator/index.vue";
|
|
90
90
|
import SelectTime from "./SelectTime/index.vue";
|
|
91
|
-
import
|
|
92
|
-
import TemplatePreviewModal from "./TemplatePreview/TemplatePreviewModal.vue";
|
|
93
|
-
import DataTable from './DataTable/index.vue';
|
|
91
|
+
import DataTable from "./DataTable/index.vue";
|
|
94
92
|
|
|
95
93
|
type VueComponent = Component;
|
|
96
94
|
|
|
@@ -189,8 +187,6 @@ export const components: ComponentsMap = {
|
|
|
189
187
|
unnnicTour: Tour,
|
|
190
188
|
unnnicNavigator: Navigator,
|
|
191
189
|
unnnicSelectTime: SelectTime,
|
|
192
|
-
unnnicTemplatePreview: TemplatePreview,
|
|
193
|
-
unnnicTemplatePreviewModal: TemplatePreviewModal,
|
|
194
190
|
unnnicDataTable: DataTable,
|
|
195
191
|
};
|
|
196
192
|
|
|
@@ -284,7 +280,5 @@ export const unnnicDrawer = Drawer;
|
|
|
284
280
|
export const unnnicTableNext = TableNext;
|
|
285
281
|
export const unnnicTour = Tour;
|
|
286
282
|
export const unnnicNavigator = Navigator;
|
|
283
|
+
export const unnnicDataTable = DataTable as VueComponent;
|
|
287
284
|
export const unnnicSelectTime = SelectTime as VueComponent;
|
|
288
|
-
export const unnnicTemplatePreview = TemplatePreview as VueComponent;
|
|
289
|
-
export const unnnicTemplatePreviewModal = TemplatePreviewModal as VueComponent;
|
|
290
|
-
export const unnnicDataTable = DataTable;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Template } from './types';
|
|
2
|
-
interface Props {
|
|
3
|
-
template?: Template | null;
|
|
4
|
-
}
|
|
5
|
-
declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
|
|
6
|
-
template: Template | null;
|
|
7
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLElement>;
|
|
8
|
-
export default _default;
|
|
9
|
-
//# sourceMappingURL=TemplatePreview.vue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatePreview.vue.d.ts","sourceRoot":"","sources":["../../../src/components/TemplatePreview/TemplatePreview.vue"],"names":[],"mappings":"AAgGA;AA6PA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAQxC,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B;;cADY,QAAQ,GAAG,IAAI;;AAkN5B,wBAQG"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Template } from './types';
|
|
2
|
-
interface Props {
|
|
3
|
-
locale?: string;
|
|
4
|
-
template: Template;
|
|
5
|
-
modelValue: boolean;
|
|
6
|
-
}
|
|
7
|
-
declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
8
|
-
close: () => any;
|
|
9
|
-
}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
|
|
10
|
-
onClose?: (() => any) | undefined;
|
|
11
|
-
}>, {
|
|
12
|
-
locale: string;
|
|
13
|
-
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
14
|
-
export default _default;
|
|
15
|
-
//# sourceMappingURL=TemplatePreviewModal.vue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatePreviewModal.vue.d.ts","sourceRoot":"","sources":["../../../src/components/TemplatePreview/TemplatePreviewModal.vue"],"names":[],"mappings":"AAWA;AAwDA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUxC,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;;;;;;YAHU,MAAM;;AAgGjB,wBASG"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<section class="unnnic-template-preview">
|
|
3
|
-
<section
|
|
4
|
-
:class="[
|
|
5
|
-
'unnnic-template-preview__content',
|
|
6
|
-
{ 'unnnic-template-preview__content--has-media': hasHeaderMedia },
|
|
7
|
-
]"
|
|
8
|
-
>
|
|
9
|
-
<header
|
|
10
|
-
v-if="hasHeader"
|
|
11
|
-
:class="`unnnic-template-preview__header__${
|
|
12
|
-
template?.header.type === 'TEXT' ? 'text' : 'media'
|
|
13
|
-
}`"
|
|
14
|
-
>
|
|
15
|
-
<img
|
|
16
|
-
class="unnnic-template-preview__header__media__preview"
|
|
17
|
-
v-if="
|
|
18
|
-
template?.header.type === 'MEDIA' &&
|
|
19
|
-
template?.header.mediaType === 'IMAGE'
|
|
20
|
-
"
|
|
21
|
-
:src="template.header.src || imagePreview"
|
|
22
|
-
/>
|
|
23
|
-
<template
|
|
24
|
-
v-else-if="
|
|
25
|
-
template?.header.type === 'MEDIA' &&
|
|
26
|
-
template?.header.mediaType === 'VIDEO'
|
|
27
|
-
"
|
|
28
|
-
>
|
|
29
|
-
<video
|
|
30
|
-
v-if="template.header.src"
|
|
31
|
-
class="unnnic-template-preview__header__media__preview"
|
|
32
|
-
:src="template.header.src"
|
|
33
|
-
controls
|
|
34
|
-
/>
|
|
35
|
-
<img
|
|
36
|
-
v-else
|
|
37
|
-
class="unnnic-template-preview__header__media__preview"
|
|
38
|
-
:src="videoPreview"
|
|
39
|
-
/>
|
|
40
|
-
</template>
|
|
41
|
-
<template
|
|
42
|
-
v-else-if="
|
|
43
|
-
template?.header.type === 'MEDIA' &&
|
|
44
|
-
template?.header.mediaType === 'DOCUMENT'
|
|
45
|
-
"
|
|
46
|
-
>
|
|
47
|
-
<img
|
|
48
|
-
class="unnnic-template-preview__header__media__preview"
|
|
49
|
-
:src="documentPreview"
|
|
50
|
-
/>
|
|
51
|
-
</template>
|
|
52
|
-
<h1
|
|
53
|
-
class="unnnic-template-preview__header__text__preview"
|
|
54
|
-
v-else-if="template?.header.type === 'TEXT'"
|
|
55
|
-
>
|
|
56
|
-
{{ template.header.text }}
|
|
57
|
-
</h1>
|
|
58
|
-
</header>
|
|
59
|
-
<section
|
|
60
|
-
v-if="hasBody"
|
|
61
|
-
:class="[
|
|
62
|
-
'unnnic-template-preview__body',
|
|
63
|
-
{ 'unnnic-template-preview__body--has-media': hasHeaderMedia },
|
|
64
|
-
]"
|
|
65
|
-
>
|
|
66
|
-
<section v-html="parsedBody"></section>
|
|
67
|
-
</section>
|
|
68
|
-
<footer
|
|
69
|
-
v-if="hasFooter"
|
|
70
|
-
:class="[
|
|
71
|
-
'unnnic-template-preview__footer',
|
|
72
|
-
{ 'unnnic-template-preview__footer--has-media': hasHeaderMedia },
|
|
73
|
-
]"
|
|
74
|
-
>
|
|
75
|
-
{{ template?.footer }}
|
|
76
|
-
</footer>
|
|
77
|
-
</section>
|
|
78
|
-
<footer v-if="hasButtons" class="unnnic-template-preview__buttons">
|
|
79
|
-
<section
|
|
80
|
-
v-for="(button, index) in template?.buttons"
|
|
81
|
-
:key="`button-${index}`"
|
|
82
|
-
class="unnnic-template-preview__buttons__button"
|
|
83
|
-
>
|
|
84
|
-
<UnnnicIcon
|
|
85
|
-
class="unnnic-template-preview__buttons__button__icon"
|
|
86
|
-
:icon="getButtonIcon(button.type)"
|
|
87
|
-
scheme="aux-blue-500"
|
|
88
|
-
size="ant"
|
|
89
|
-
/>
|
|
90
|
-
<p class="unnnic-template-preview__buttons__button__text">
|
|
91
|
-
{{ button.text }}
|
|
92
|
-
</p>
|
|
93
|
-
</section>
|
|
94
|
-
</footer>
|
|
95
|
-
</section>
|
|
96
|
-
</template>
|
|
97
|
-
|
|
98
|
-
<script lang="ts" setup>
|
|
99
|
-
import { computed } from "vue";
|
|
100
|
-
|
|
101
|
-
import type { Template } from "./types";
|
|
102
|
-
|
|
103
|
-
import imagePreview from "../../assets/img/previews/image-preview.png";
|
|
104
|
-
import documentPreview from "../../assets/img/previews/doc-preview.png";
|
|
105
|
-
import videoPreview from "../../assets/img/previews/video-preview.png";
|
|
106
|
-
|
|
107
|
-
import UnnnicIcon from "../Icon.vue";
|
|
108
|
-
|
|
109
|
-
interface Props {
|
|
110
|
-
template?: Template | null;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
114
|
-
template: null,
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
const hasHeader = computed(
|
|
118
|
-
() => props.template?.header && props.template.header.type
|
|
119
|
-
);
|
|
120
|
-
const hasHeaderMedia = computed(
|
|
121
|
-
() => !!props.template?.header && props.template.header.type === "MEDIA"
|
|
122
|
-
);
|
|
123
|
-
const hasBody = computed(
|
|
124
|
-
() => !!props.template?.body && props.template.body.length > 0
|
|
125
|
-
);
|
|
126
|
-
const hasFooter = computed(
|
|
127
|
-
() => !!props.template?.footer && props.template.footer.length > 0
|
|
128
|
-
);
|
|
129
|
-
const hasButtons = computed(
|
|
130
|
-
() => !!props.template?.buttons && props.template.buttons.length > 0
|
|
131
|
-
);
|
|
132
|
-
const parsedBody = computed(() => {
|
|
133
|
-
if (!hasBody.value) return "";
|
|
134
|
-
|
|
135
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
136
|
-
const result = props
|
|
137
|
-
.template!.body!.replaceAll("\n", "<br/>")
|
|
138
|
-
.replaceAll(/(?:\*)([^*<\n]+)(?:\*)/g, "<strong>$1</strong>")
|
|
139
|
-
.replaceAll(/(?:_)([^_<\n]+)(?:_)/g, "<i>$1</i>")
|
|
140
|
-
.replaceAll(/(?:~)([^~<\n]+)(?:~)/g, "<s>$1</s>")
|
|
141
|
-
.replaceAll(/(?:```)([^```<\n]+)(?:```)/g, "<tt>$1</tt>")
|
|
142
|
-
.replaceAll(/{{.*?}}/g, (match) => `<strong>${match}</strong>`);
|
|
143
|
-
|
|
144
|
-
return result;
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
const getButtonIcon = (buttonType) => {
|
|
148
|
-
const buttonMapper = {
|
|
149
|
-
PHONE_NUMBER: "phone",
|
|
150
|
-
URL: "open_in_new",
|
|
151
|
-
COPY_CODE: "content_copy",
|
|
152
|
-
FLOW: "",
|
|
153
|
-
QUICK_REPLY: "reply",
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
return buttonMapper[buttonType] || "";
|
|
157
|
-
};
|
|
158
|
-
</script>
|
|
159
|
-
|
|
160
|
-
<style lang="scss" scoped>
|
|
161
|
-
@use "@/assets/scss/unnnic" as *;
|
|
162
|
-
|
|
163
|
-
.unnnic-template-preview {
|
|
164
|
-
display: flex;
|
|
165
|
-
flex-direction: column;
|
|
166
|
-
box-shadow: $unnnic-shadow-level-near;
|
|
167
|
-
background-color: $unnnic-color-background-white;
|
|
168
|
-
width: 368px;
|
|
169
|
-
border-radius: $unnnic-border-radius-md;
|
|
170
|
-
|
|
171
|
-
&__content {
|
|
172
|
-
display: flex;
|
|
173
|
-
flex-direction: column;
|
|
174
|
-
gap: $unnnic-space-3;
|
|
175
|
-
padding: $unnnic-space-4 $unnnic-space-3;
|
|
176
|
-
|
|
177
|
-
&--has-media {
|
|
178
|
-
padding: $unnnic-space-1;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
&__header {
|
|
183
|
-
&__text {
|
|
184
|
-
&__preview {
|
|
185
|
-
font-family: $unnnic-font-family-secondary;
|
|
186
|
-
font-weight: $unnnic-font-weight-bold;
|
|
187
|
-
font-size: $unnnic-font-size-body-gt;
|
|
188
|
-
line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
|
|
189
|
-
color: $unnnic-color-neutral-dark;
|
|
190
|
-
|
|
191
|
-
margin: $unnnic-space-0;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
&__media {
|
|
196
|
-
&__preview {
|
|
197
|
-
width: 100%;
|
|
198
|
-
object-fit: cover;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
&__body {
|
|
204
|
-
font-family: $unnnic-font-family-secondary;
|
|
205
|
-
font-weight: $unnnic-font-weight-regular;
|
|
206
|
-
font-size: $unnnic-font-size-body-gt;
|
|
207
|
-
line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
|
|
208
|
-
color: $unnnic-color-neutral-cloudy;
|
|
209
|
-
|
|
210
|
-
&--has-media {
|
|
211
|
-
padding: $unnnic-space-0 $unnnic-space-2;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
&__footer {
|
|
216
|
-
font-family: $unnnic-font-family-secondary;
|
|
217
|
-
font-weight: $unnnic-font-weight-regular;
|
|
218
|
-
font-size: $unnnic-font-size-body-md;
|
|
219
|
-
line-height: $unnnic-font-size-body-md + $unnnic-line-height-medium;
|
|
220
|
-
color: $unnnic-color-neutral-clean;
|
|
221
|
-
|
|
222
|
-
&--has-media {
|
|
223
|
-
padding: $unnnic-space-0 $unnnic-space-3 $unnnic-space-2;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
&__buttons {
|
|
228
|
-
font-family: $unnnic-font-family-secondary;
|
|
229
|
-
font-weight: $unnnic-font-weight-bold;
|
|
230
|
-
font-size: $unnnic-font-size-body-gt;
|
|
231
|
-
line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
|
|
232
|
-
|
|
233
|
-
&__button {
|
|
234
|
-
margin: 0;
|
|
235
|
-
display: flex;
|
|
236
|
-
align-items: center;
|
|
237
|
-
justify-content: center;
|
|
238
|
-
gap: $unnnic-space-2;
|
|
239
|
-
padding: $unnnic-space-3;
|
|
240
|
-
border-top: 1px solid $unnnic-color-neutral-light;
|
|
241
|
-
|
|
242
|
-
&__text {
|
|
243
|
-
color: $unnnic-color-aux-blue-500;
|
|
244
|
-
margin: $unnnic-space-0;
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
</style>
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<UnnnicModalDialog
|
|
3
|
-
:model-value="modelValue"
|
|
4
|
-
@update:modelValue="$event === false && $emit('close')"
|
|
5
|
-
:title="defaultTranslations.title[props.locale]"
|
|
6
|
-
:show-close-icon="true"
|
|
7
|
-
class="unnnic-template-preview-modal"
|
|
8
|
-
>
|
|
9
|
-
<UnnnicTemplatePreview :template="template" />
|
|
10
|
-
</UnnnicModalDialog>
|
|
11
|
-
</template>
|
|
12
|
-
|
|
13
|
-
<script lang="ts" setup>
|
|
14
|
-
import UnnnicTemplatePreview from "./TemplatePreview.vue";
|
|
15
|
-
import UnnnicModalDialog from "../ModalDialog/ModalDialog.vue";
|
|
16
|
-
|
|
17
|
-
import type { Template } from "./types";
|
|
18
|
-
|
|
19
|
-
const defaultTranslations = {
|
|
20
|
-
title: {
|
|
21
|
-
"pt-br": "Visualizar modelo",
|
|
22
|
-
en: "Template preview",
|
|
23
|
-
es: "Vista previa de plantilla",
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
interface Props {
|
|
28
|
-
locale?: string;
|
|
29
|
-
template: Template;
|
|
30
|
-
modelValue: boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
34
|
-
locale: "en",
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
defineEmits<{
|
|
38
|
-
close: void;
|
|
39
|
-
}>();
|
|
40
|
-
</script>
|
|
41
|
-
|
|
42
|
-
<style lang="scss" scoped>
|
|
43
|
-
@use "@/assets/scss/unnnic" as *;
|
|
44
|
-
|
|
45
|
-
:deep(.unnnic-modal-dialog__container__content) {
|
|
46
|
-
display: flex;
|
|
47
|
-
align-items: center;
|
|
48
|
-
justify-content: center;
|
|
49
|
-
background-color: $unnnic-color-neutral-lightest;
|
|
50
|
-
}
|
|
51
|
-
</style>
|