@weni/unnnic-system 3.1.3 → 3.1.4-alpha.3

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 (51) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/apple-64.png +0 -0
  3. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts +60 -3
  4. package/dist/components/ChatsMessage/ChatsMessage.vue.d.ts.map +1 -1
  5. package/dist/components/ChatsMessage/ChatsMessageText.vue.d.ts +42 -3
  6. package/dist/components/ChatsMessage/ChatsMessageText.vue.d.ts.map +1 -1
  7. package/dist/components/DatePicker/DatePicker.vue.d.ts +2 -2
  8. package/dist/components/DropArea/DropArea.vue.d.ts +2 -0
  9. package/dist/components/DropArea/DropArea.vue.d.ts.map +1 -1
  10. package/dist/components/EmojiPicker/EmojiPicker.vue.d.ts.map +1 -1
  11. package/dist/components/InputDatePicker/InputDatePicker.vue.d.ts +3 -3
  12. package/dist/components/ModalDialog/ModalDialog.vue.d.ts +1 -1
  13. package/dist/components/ModalDialog/ModalDialog.vue.d.ts.map +1 -1
  14. package/dist/components/ModalUpload/ModalUpload.vue.d.ts +6 -0
  15. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts +9 -0
  16. package/dist/components/TemplatePreview/TemplatePreview.vue.d.ts.map +1 -0
  17. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts +15 -0
  18. package/dist/components/TemplatePreview/TemplatePreviewModal.vue.d.ts.map +1 -0
  19. package/dist/components/UploadArea/UploadArea.vue.d.ts +6 -0
  20. package/dist/{es-5ee61601.mjs → es-c9f02312.mjs} +1 -1
  21. package/dist/{index-33c1d3d4.mjs → index-1caa0110.mjs} +7178 -6974
  22. package/dist/locales/en.json.d.ts +1 -0
  23. package/dist/locales/es.json.d.ts +1 -0
  24. package/dist/locales/pt_br.json.d.ts +1 -0
  25. package/dist/{pt-br-e6fd44f8.mjs → pt-br-d6d372a9.mjs} +1 -1
  26. package/dist/style.css +1 -1
  27. package/dist/unnnic.mjs +26 -24
  28. package/dist/unnnic.umd.js +42 -41
  29. package/package.json +1 -1
  30. package/public/apple-64.png +0 -0
  31. package/src/assets/img/previews/doc-preview.png +0 -0
  32. package/src/assets/img/previews/image-preview.png +0 -0
  33. package/src/assets/img/previews/video-preview.png +0 -0
  34. package/src/components/ChatsMessage/ChatsMessage.vue +15 -0
  35. package/src/components/ChatsMessage/ChatsMessageText.vue +58 -4
  36. package/src/components/DropArea/DropArea.vue +26 -2
  37. package/src/components/EmojiPicker/EmojiPicker.vue +16 -1
  38. package/src/components/EmojiPicker/__tests__/EmojiPicker.spec.js +6 -4
  39. package/src/components/ModalDialog/ModalDialog.vue +27 -29
  40. package/src/components/ModalDialog/__tests__/__snapshots__/ModalDialog.spec.js.snap +1 -1
  41. package/src/components/TemplatePreview/TemplatePreview.vue +249 -0
  42. package/src/components/TemplatePreview/TemplatePreviewModal.vue +51 -0
  43. package/src/components/TemplatePreview/types.d.ts +16 -0
  44. package/src/components/index.ts +8 -2
  45. package/src/locales/en.json +1 -0
  46. package/src/locales/es.json +1 -0
  47. package/src/locales/pt_br.json +1 -0
  48. package/src/stories/TemplatePreview.stories.js +94 -0
  49. package/src/stories/TemplatePreviewModal.stories.js +110 -0
  50. package/dist/components/index.d.ts +0 -18063
  51. package/dist/components/index.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weni/unnnic-system",
3
- "version": "3.1.3",
3
+ "version": "3.1.4-alpha.3",
4
4
  "type": "commonjs",
5
5
  "files": [
6
6
  "dist",
Binary file
@@ -3,6 +3,7 @@
3
3
  class="unnnic-chats-message"
4
4
  :class="{
5
5
  sent: type === 'sent',
6
+ automatic: automatic,
6
7
  sending: status === 'sending',
7
8
  'is-document': isDocument,
8
9
  'is-media': isMedia,
@@ -45,7 +46,9 @@
45
46
  />
46
47
  <UnnnicChatsMessageText
47
48
  v-if="isText"
49
+ :locale="locale"
48
50
  :text="slotText"
51
+ :isAutomatic="automatic"
49
52
  />
50
53
  <div
51
54
  v-if="isDocument"
@@ -156,6 +159,10 @@ export default {
156
159
  },
157
160
  mixins: [UnnnicI18n],
158
161
  props: {
162
+ locale: {
163
+ type: String,
164
+ default: 'en',
165
+ },
159
166
  enableReply: {
160
167
  type: Boolean,
161
168
  default: false,
@@ -171,6 +178,10 @@ export default {
171
178
  return ['received', 'sent'].includes(type);
172
179
  },
173
180
  },
181
+ automatic: {
182
+ type: Boolean,
183
+ default: false,
184
+ },
174
185
  time: {
175
186
  type: Date,
176
187
  required: true,
@@ -323,6 +334,10 @@ $defaultLineHeight: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
323
334
 
324
335
  &.sent {
325
336
  background-color: #cff8f4;
337
+
338
+ &.automatic {
339
+ background-color: $unnnic-color-aux-blue-50;
340
+ }
326
341
  }
327
342
 
328
343
  &.sending {
@@ -1,18 +1,45 @@
1
1
  <template>
2
- <p
3
- class="unnnic-chats-message__text"
4
- v-html="formattedText"
5
- />
2
+ <section class="unnnic-chats-message__text__container">
3
+ <p
4
+ class="unnnic-chats-message__text"
5
+ v-html="formattedText"
6
+ />
7
+ <p v-if="isAutomatic" class="unnnic-chats-message__text--automatic">
8
+ {{ i18n('automatic_message') }}
9
+ </p>
10
+ </section>
6
11
  </template>
7
12
 
8
13
  <script>
14
+ import UnnnicI18n from '../../mixins/i18n';
15
+
9
16
  export default {
10
17
  name: 'ChatsMessageText',
18
+ mixins: [UnnnicI18n],
11
19
  props: {
20
+ locale: {
21
+ type: String,
22
+ default: 'en',
23
+ },
12
24
  text: {
13
25
  type: String,
14
26
  required: true,
15
27
  },
28
+ isAutomatic: {
29
+ type: Boolean,
30
+ default: false,
31
+ },
32
+ },
33
+ data() {
34
+ return {
35
+ defaultTranslations: {
36
+ automatic_message: {
37
+ 'pt-br': 'Mensagem de abertura automática',
38
+ en: 'Automatic Opening Message',
39
+ es: 'Mensaje de apertura automático',
40
+ },
41
+ },
42
+ };
16
43
  },
17
44
  computed: {
18
45
  formattedText() {
@@ -78,3 +105,30 @@ export default {
78
105
  },
79
106
  };
80
107
  </script>
108
+
109
+ <style lang="scss" scoped>
110
+ @use '@/assets/scss/unnnic' as *;
111
+
112
+ * {
113
+ padding: 0;
114
+ margin: 0;
115
+ }
116
+
117
+ .unnnic-chats-message__text {
118
+ &__container {
119
+ display: flex;
120
+ flex-direction: column;
121
+ gap: $unnnic-spacing-sm;
122
+ padding: $unnnic-spacing-nano 0;
123
+ font-size: $unnnic-font-size-body-gt;
124
+ color: $unnnic-color-neutral-dark;
125
+ line-height: $unnnic-font-size-body-gt + $unnnic-line-height-medium;
126
+ word-break: break-word;
127
+ }
128
+ &--automatic {
129
+ font-size: $unnnic-font-size-body-md;
130
+ line-height: $unnnic-line-height-caption-1;
131
+ color: $unnnic-color-aux-blue-500;
132
+ }
133
+ }
134
+ </style>
@@ -11,7 +11,7 @@
11
11
  @dragleave.stop.prevent="dragleave"
12
12
  @dragend.stop.prevent="dragend"
13
13
  @drop.stop.prevent="drop"
14
- @click="() => $refs.file.click()"
14
+ @click="handleDropzoneClick"
15
15
  >
16
16
  <UnnnicIcon
17
17
  class="unnnic-upload-area__dropzone__icon"
@@ -64,7 +64,7 @@
64
64
  </template>
65
65
 
66
66
  <script setup>
67
- import { ref, computed, getCurrentInstance } from 'vue';
67
+ import { ref, computed, getCurrentInstance, useTemplateRef } from 'vue';
68
68
  import mime from 'mime';
69
69
 
70
70
  import UnnnicIcon from '../Icon.vue';
@@ -73,6 +73,7 @@ const isDragging = ref(false);
73
73
  const hasError = ref(false);
74
74
  const dragEnterCounter = ref(0);
75
75
  const file = ref();
76
+ const fileRef = useTemplateRef('file');
76
77
 
77
78
  const props = defineProps({
78
79
  acceptMultiple: {
@@ -111,6 +112,11 @@ const props = defineProps({
111
112
  type: String,
112
113
  default: '',
113
114
  },
115
+
116
+ disabled: {
117
+ type: Boolean,
118
+ default: false,
119
+ }
114
120
  });
115
121
 
116
122
  const emit = defineEmits([
@@ -135,15 +141,21 @@ const formattedSupportedFormats = computed(() => {
135
141
  });
136
142
 
137
143
  function dragenter() {
144
+ if (props.disabled) return;
145
+
138
146
  dragEnterCounter.value += 1;
139
147
  isDragging.value = true;
140
148
  }
141
149
 
142
150
  function dragover() {
151
+ if (props.disabled) return;
152
+
143
153
  isDragging.value = true;
144
154
  }
145
155
 
146
156
  function dragleave() {
157
+ if (props.disabled) return;
158
+
147
159
  dragEnterCounter.value -= 1;
148
160
  if (dragEnterCounter.value === 0) {
149
161
  isDragging.value = false;
@@ -151,10 +163,14 @@ function dragleave() {
151
163
  }
152
164
 
153
165
  function dragend() {
166
+ if (props.disabled) return;
167
+
154
168
  isDragging.value = false;
155
169
  }
156
170
 
157
171
  function drop(event) {
172
+ if (props.disabled) return;
173
+
158
174
  isDragging.value = false;
159
175
 
160
176
  const { files } = event.dataTransfer;
@@ -164,7 +180,15 @@ function drop(event) {
164
180
  }
165
181
  }
166
182
 
183
+ function handleDropzoneClick() {
184
+ if (props.disabled) return;
185
+
186
+ fileRef.value.click();
187
+ }
188
+
167
189
  function handleFileChange(event) {
190
+ if (props.disabled) return;
191
+
168
192
  const { files } = event.target;
169
193
 
170
194
  if (validateFiles(files)) {
@@ -9,7 +9,10 @@
9
9
  :data="emojiIndex"
10
10
  set="apple"
11
11
  theme="light"
12
- :preview="false"
12
+ emoji="point_up"
13
+ :title="title"
14
+ :showPreview="true"
15
+ showSkinTones
13
16
  :search="true"
14
17
  nav-position="bottom"
15
18
  no-results-emoji="cry"
@@ -71,6 +74,8 @@ const translation = (key: string) => {
71
74
  return get(localeMsgs, key) || get(enMsgs, key) || key
72
75
  }
73
76
 
77
+ const title = computed(() => translation('emoji_picker.title'))
78
+
74
79
  const translations = computed(() => ({
75
80
  search: translation('emoji_picker.search'),
76
81
  notfound: translation('emoji_picker.notfound'),
@@ -156,6 +161,16 @@ const onEmojiSelect = (emoji: Emoji) => {
156
161
  :deep(.emoji-mart-anchor-bar) {
157
162
  background-color: #00A49F; // $unnnic-color-weni-600
158
163
  }
164
+
165
+ :deep(.emoji-type-image.emoji-set-apple) {
166
+ background-image: url('./apple-64.png') !important;
167
+ }
168
+
169
+ :deep(.emoji-type-image.emoji-set-facebook),
170
+ :deep(.emoji-type-image.emoji-set-google),
171
+ :deep(.emoji-type-image.emoji-set-twitter) {
172
+ background-image: none !important;
173
+ }
159
174
  }
160
175
 
161
176
  @keyframes slideInUp {
@@ -50,7 +50,7 @@ describe('UnnnicEmojiPicker', () => {
50
50
  stubs: {
51
51
  Picker: {
52
52
  name: 'Picker',
53
- props: ['data', 'set', 'theme', 'preview', 'search', 'navPosition', 'noResultsEmoji', 'maxFrequentRows', 'i18n', 'color'],
53
+ props: ['data', 'set', 'theme', 'emoji', 'title', 'showPreview', 'search', 'navPosition', 'noResultsEmoji', 'maxFrequentRows', 'i18n', 'color'],
54
54
  emits: ['select', 'click-outside'],
55
55
  template: '<div class="emoji-mart-picker" @select="$emit(\'select\', $event)" @click-outside="$emit(\'click-outside\')"></div>'
56
56
  }
@@ -69,7 +69,9 @@ describe('UnnnicEmojiPicker', () => {
69
69
  expect(picker.exists()).toBe(true);
70
70
  expect(picker.props('set')).toBe('apple');
71
71
  expect(picker.props('theme')).toBe('light');
72
- expect(picker.props('preview')).toBe(false);
72
+ expect(picker.props('emoji')).toBe('point_up');
73
+ expect(picker.props('title')).toBe('Escolha seu emoji...');
74
+ expect(picker.props('showPreview')).toBe(true);
73
75
  expect(picker.props('search')).toBe(true);
74
76
  expect(picker.props('navPosition')).toBe('bottom');
75
77
  expect(picker.props('noResultsEmoji')).toBe('cry');
@@ -94,7 +96,7 @@ describe('UnnnicEmojiPicker', () => {
94
96
  stubs: {
95
97
  Picker: {
96
98
  name: 'Picker',
97
- props: ['data', 'set', 'theme', 'preview', 'search', 'navPosition', 'noResultsEmoji', 'maxFrequentRows', 'i18n', 'color'],
99
+ props: ['data', 'set', 'theme', 'emoji', 'title', 'showPreview', 'search', 'navPosition', 'noResultsEmoji', 'maxFrequentRows', 'i18n', 'color'],
98
100
  emits: ['select', 'click-outside'],
99
101
  template: '<div class="emoji-mart-picker" @select="$emit(\'select\', $event)"></div>'
100
102
  }
@@ -131,7 +133,7 @@ describe('UnnnicEmojiPicker', () => {
131
133
  it('renders bottom position class when position is bottom', async () => {
132
134
  const custom = mount(UnnnicEmojiPicker, {
133
135
  props: { position: 'bottom' },
134
- global: { stubs: { Picker: { name: 'Picker', props: ['data','set','theme','preview','search','navPosition','noResultsEmoji','maxFrequentRows','i18n','color'], template: '<div />' } } }
136
+ global: { stubs: { Picker: { name: 'Picker', props: ['data','set','theme','emoji','title','showPreview','search','navPosition','noResultsEmoji','maxFrequentRows','i18n','color'], template: '<div />' } } }
135
137
  });
136
138
  expect(custom.classes()).toContain('emoji-picker--bottom');
137
139
  custom.unmount();
@@ -24,10 +24,7 @@
24
24
  </section>
25
25
 
26
26
  <section class="unnnic-modal-dialog__container__body">
27
- <header
28
- v-if="title"
29
- class="unnnic-modal-dialog__container__header"
30
- >
27
+ <header v-if="title" class="unnnic-modal-dialog__container__header">
31
28
  <section class="unnnic-modal-dialog__container__title-container">
32
29
  <UnnnicIcon
33
30
  v-if="icon || type"
@@ -49,6 +46,7 @@
49
46
  data-testid="close-icon"
50
47
  icon="close"
51
48
  clickable
49
+ scheme="neutral-cloudy"
52
50
  @click="close()"
53
51
  />
54
52
  </header>
@@ -98,12 +96,12 @@
98
96
  </template>
99
97
 
100
98
  <script>
101
- import UnnnicIcon from '../Icon.vue';
102
- import UnnnicButton from '../Button/Button.vue';
103
- import UnnnicI18n from '../../mixins/i18n';
99
+ import UnnnicIcon from "../Icon.vue";
100
+ import UnnnicButton from "../Button/Button.vue";
101
+ import UnnnicI18n from "../../mixins/i18n";
104
102
 
105
103
  export default {
106
- name: 'UnnnicModalDialog',
104
+ name: "UnnnicModalDialog",
107
105
  components: {
108
106
  UnnnicIcon,
109
107
  UnnnicButton,
@@ -120,29 +118,29 @@ export default {
120
118
  },
121
119
  type: {
122
120
  type: String,
123
- default: '',
121
+ default: "",
124
122
  validate(type) {
125
- return ['success', 'warning', 'attention'].includes(type);
123
+ return ["success", "warning", "attention"].includes(type);
126
124
  },
127
125
  },
128
126
  size: {
129
127
  type: String,
130
- default: 'md',
128
+ default: "md",
131
129
  validate(size) {
132
- return ['sm', 'md', 'lg'].includes(size);
130
+ return ["sm", "md", "lg"].includes(size);
133
131
  },
134
132
  },
135
133
  title: {
136
134
  type: String,
137
- default: '',
135
+ default: "",
138
136
  },
139
137
  icon: {
140
138
  type: String,
141
- default: '',
139
+ default: "",
142
140
  },
143
141
  iconScheme: {
144
142
  type: String,
145
- default: '',
143
+ default: "",
146
144
  },
147
145
  showCloseIcon: {
148
146
  type: Boolean,
@@ -165,26 +163,26 @@ export default {
165
163
  default: () => ({}),
166
164
  },
167
165
  },
168
- emits: ['primaryButtonClick', 'secondaryButtonClick', 'update:modelValue'],
166
+ emits: ["primaryButtonClick", "secondaryButtonClick", "update:modelValue"],
169
167
 
170
168
  data() {
171
169
  return {
172
170
  defaultTranslations: {
173
171
  cancel: {
174
- 'pt-br': 'Cancelar',
175
- en: 'Cancel',
176
- es: 'Cancelar',
172
+ "pt-br": "Cancelar",
173
+ en: "Cancel",
174
+ es: "Cancelar",
177
175
  },
178
176
  },
179
177
  iconsMapper: {
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' },
178
+ success: { icon: "check_circle", scheme: "aux-green-500" },
179
+ warning: { icon: "warning", scheme: "aux-red-500" },
180
+ attention: { icon: "error", scheme: "aux-yellow-500" },
183
181
  },
184
182
  primaryButtonTypeMapper: {
185
- success: 'primary',
186
- warning: 'warning',
187
- attention: 'attention',
183
+ success: "primary",
184
+ warning: "warning",
185
+ attention: "attention",
188
186
  },
189
187
  };
190
188
  },
@@ -195,17 +193,17 @@ export default {
195
193
  },
196
194
  methods: {
197
195
  close() {
198
- this.$emit('update:modelValue', false);
196
+ this.$emit("update:modelValue", false);
199
197
  },
200
198
  updateBodyOverflow(isHidden) {
201
- document.body.style.overflow = isHidden ? 'hidden' : '';
199
+ document.body.style.overflow = isHidden ? "hidden" : "";
202
200
  },
203
201
  },
204
202
  };
205
203
  </script>
206
204
 
207
205
  <style lang="scss" scoped>
208
- @use '@/assets/scss/unnnic' as *;
206
+ @use "@/assets/scss/unnnic" as *;
209
207
  * {
210
208
  margin: 0;
211
209
  padding: 0;
@@ -312,7 +310,7 @@ export default {
312
310
  &__actions {
313
311
  display: grid;
314
312
  grid-template-columns: 1fr 1fr;
315
- grid-template-areas: 'secondary-button primary-button';
313
+ grid-template-areas: "secondary-button primary-button";
316
314
  gap: $unnnic-spacing-sm;
317
315
  padding: $unnnic-spacing-md;
318
316
  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-darkest" data-testid="close-icon"></unnnic-icon-stub>
14
+ <unnnic-icon-stub data-v-68ebadeb="" filled="false" next="false" icon="close" clickable="true" size="md" scheme="neutral-cloudy" 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">