@farm-investimentos/front-mfe-components 11.4.6 → 11.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/front-mfe-components.common.js +592 -384
  2. package/dist/front-mfe-components.common.js.map +1 -1
  3. package/dist/front-mfe-components.css +1 -1
  4. package/dist/front-mfe-components.umd.js +592 -384
  5. package/dist/front-mfe-components.umd.js.map +1 -1
  6. package/dist/front-mfe-components.umd.min.js +1 -1
  7. package/dist/front-mfe-components.umd.min.js.map +1 -1
  8. package/package.json +3 -2
  9. package/src/components/CopyToClipboard/CopyToClipboard.stories.js +7 -0
  10. package/src/components/CopyToClipboard/CopyToClipboard.vue +11 -3
  11. package/src/components/Form/Form.stories.js +16 -2
  12. package/src/components/Form/Form.vue +4 -2
  13. package/src/components/IdCaption/IdCaption.vue +1 -1
  14. package/src/components/RadioGroup/RadioGroup.vue +14 -2
  15. package/src/components/Switcher/Switcher.scss +16 -12
  16. package/src/components/Switcher/Switcher.stories.js +24 -2
  17. package/src/components/Switcher/Switcher.vue +5 -3
  18. package/src/components/TableContextMenu/TableContextMenu.vue +3 -1
  19. package/src/components/TextFieldV2/TextFieldV2.scss +64 -0
  20. package/src/components/TextFieldV2/TextFieldV2.stories.js +176 -2
  21. package/src/components/TextFieldV2/TextFieldV2.vue +143 -5
  22. package/src/components/TextFieldV2/__tests__/TextFieldV2.spec.js +21 -0
  23. package/src/components/Typography/BodyText/BodyText.vue +1 -1
  24. package/src/components/Typography/Caption/Caption.vue +1 -1
  25. package/src/components/Typography/Heading/Heading.vue +1 -1
  26. package/src/components/Typography/Subtitle/Subtitle.stories.js +4 -4
  27. package/src/components/Typography/Subtitle/Subtitle.vue +1 -1
  28. package/src/components/Typography/Typography.vue +14 -1
  29. package/src/components/layout/Col/Col.scss +1 -1
  30. package/src/components/layout/Line/Line.vue +4 -1
  31. package/src/examples/VuetifyDialog.stories.js +119 -0
  32. package/src/examples/ConfirmDialog.stories.js +0 -43
  33. package/src/examples/Modal.stories.js +0 -181
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm-investimentos/front-mfe-components",
3
- "version": "11.4.6",
3
+ "version": "11.5.0",
4
4
  "author": "farm investimentos",
5
5
  "private": false,
6
6
  "main": "./dist/front-mfe-components.common.js",
@@ -49,8 +49,9 @@
49
49
  "sass": "~1.32.0",
50
50
  "sass-loader": "^10.0.0",
51
51
  "storybook-addon-designs": "^6.2.1",
52
+ "text-mask-addons": "^3.8.0",
52
53
  "typescript": "~4.1.5",
53
- "v-mask": "^2.3.0",
54
+ "v-mask": "2.3.0",
54
55
  "vue-template-compiler": "2.7.10"
55
56
  },
56
57
  "browserslist": [
@@ -23,3 +23,10 @@ export const Primary = () => ({
23
23
  <farm-copytoclipboard toCopy="To be copied" />
24
24
  </div>`,
25
25
  });
26
+
27
+ export const NoIcon = () => ({
28
+ components: { 'farm-copytoclipboard': CopyToClipboard },
29
+ template: `<div style="max-width: 480px; padding-top: 80px; padding-left: 80px;">
30
+ <farm-copytoclipboard toCopy="To be copied" :isIcon="false" />
31
+ </div>`,
32
+ });
@@ -2,9 +2,13 @@
2
2
  <farm-tooltip v-model="show">
3
3
  {{ feedbackMessage }}
4
4
  <template v-slot:activator="{}">
5
- <farm-btn icon :disabled="disabled" @click="onClick">
5
+ <farm-btn v-if="isIcon" title="Copiar" icon :disabled="disabled" @click="onClick">
6
6
  <farm-icon size="xs">content-copy</farm-icon>
7
7
  </farm-btn>
8
+ <farm-btn v-else outlined title="Copiar" :disabled="disabled" @click="onClick">
9
+ <farm-icon>content-copy</farm-icon>
10
+ Copiar
11
+ </farm-btn>
8
12
  </template>
9
13
  </farm-tooltip>
10
14
  </template>
@@ -20,12 +24,16 @@ export default Vue.extend({
20
24
  * Content to be copied to clipboard
21
25
  */
22
26
  toCopy: { type: String, required: true },
27
+ /**
28
+ * Is button with icon?
29
+ */
30
+ isIcon: { type: Boolean, default: true },
23
31
  },
24
32
  setup(props) {
25
33
  const show = ref(false);
26
34
  const feedbackMessage = ref('');
27
35
  const disabled = ref(false);
28
- const { toCopy } = toRefs(props);
36
+ const { toCopy, isIcon } = toRefs(props);
29
37
 
30
38
  const onClick = async () => {
31
39
  disabled.value = true;
@@ -45,6 +53,7 @@ export default Vue.extend({
45
53
 
46
54
  return {
47
55
  show,
56
+ isIcon,
48
57
  feedbackMessage,
49
58
  disabled,
50
59
  onClick,
@@ -52,4 +61,3 @@ export default Vue.extend({
52
61
  },
53
62
  });
54
63
  </script>
55
-
@@ -33,13 +33,19 @@ export const Primary = () => ({
33
33
  document: 'Document',
34
34
  name: 'Name',
35
35
  checkbox: true,
36
- birthDate: new Date('1980/09/20').toISOString()
36
+ birthDate: new Date('1980/09/20').toISOString(),
37
+ selectId: 1,
37
38
  },
38
39
  validForm: false,
39
40
  rules: {
40
41
  required: value => !!value || 'Campo obrigatório',
41
42
  checked: value => !!value || 'Deve estar marcado',
42
43
  },
44
+ items: [
45
+ { value: null, text: '' },
46
+ { value: 1, text: 'label 1' },
47
+ { value: 2, text: 'label 2' },
48
+ ],
43
49
  styles,
44
50
  };
45
51
  },
@@ -55,6 +61,9 @@ export const Primary = () => ({
55
61
  <farm-label :required="true">True/false</farm-label>
56
62
  <farm-checkbox v-model="form.checkbox" :rules="[rules.checked]" />
57
63
 
64
+ <farm-label :required="true">Select</farm-label>
65
+ <v-select :rules="[rules.required]" :items="items" v-model="form.selectId"/>
66
+
58
67
  <farm-label :required="true">Birthdate:</farm-label>
59
68
  <DatePicker
60
69
  ref="birthDate"
@@ -87,6 +96,11 @@ export const Secondary = () => ({
87
96
  required: value => !!value || 'Campo obrigatório',
88
97
  },
89
98
  styles,
99
+ items: [
100
+ { value: null, text: '' },
101
+ { value: 1, text: 'label 1' },
102
+ { value: 2, text: 'label 2' },
103
+ ],
90
104
  };
91
105
  },
92
106
  template: `
@@ -220,4 +234,4 @@ export const DatePickers = () => ({
220
234
  </div>
221
235
  </farm-form>
222
236
  `,
223
- });
237
+ });
@@ -9,7 +9,7 @@ type ErrorsBag = Record<number, boolean>;
9
9
  export default Vue.extend({
10
10
  name: 'farm-form',
11
11
  props: {
12
- value: { type: [Boolean], required: true },
12
+ value: { type: [Boolean] },
13
13
  },
14
14
  inheritAttrs: true,
15
15
  setup(props, { emit }) {
@@ -42,7 +42,9 @@ export default Vue.extend({
42
42
 
43
43
  const recursiveFormField = $node => {
44
44
  $node.$children.forEach($leaf => {
45
- if ($leaf.$children.length > 1) {
45
+ if($leaf.validate) {
46
+ validationFields.push($leaf);
47
+ } else if ($leaf.$children.length > 1) {
46
48
  recursiveFormField($leaf);
47
49
  } else if ($leaf.$children[0] && $leaf.$children[0].validate) {
48
50
  validationFields.push($leaf.$children[0]);
@@ -55,7 +55,7 @@ export default Vue.extend({
55
55
  default: 'primary',
56
56
  },
57
57
  /**
58
- * copy to clipboard
58
+ * Text to be copied to clipboard
59
59
  */
60
60
  copyText: {
61
61
  type: String,
@@ -52,9 +52,21 @@ export default Vue.extend({
52
52
  default: false,
53
53
  },
54
54
  color: {
55
- type: String,
55
+ type: String as PropType<
56
+ | 'primary'
57
+ | 'secondary'
58
+ | 'neutral'
59
+ | 'info'
60
+ | 'success'
61
+ | 'error'
62
+ | 'warning'
63
+ | 'success'
64
+ | 'extra-1'
65
+ | 'extra-2'
66
+ | 'gray'
67
+ >,
56
68
  default: 'primary',
57
- },
69
+ }
58
70
  },
59
71
  setup(props, { emit }) {
60
72
  const innerValue = ref(props.value);
@@ -1,17 +1,25 @@
1
1
  .farm-switch--selected {
2
- background-color: var(--v-secondary-base);
2
+ background-color: var(--farm-primary-base);
3
3
  }
4
4
 
5
5
  .farm-switch--idle {
6
- background-color: var(--v-error-base);
6
+ background-color: var(--farm-neutral-base);
7
+ }
8
+
9
+ .farm-switch--disabled-on {
10
+ background-color: var(--farm-primary-lighten);
11
+ }
12
+
13
+ .farm-switch--disabled-off {
14
+ background-color: var(--farm-neutral-lighten);
7
15
  }
8
16
 
9
17
  .farm-switch {
10
18
  display: inline-block;
11
19
  position: relative;
12
20
  cursor: pointer;
13
- width: 32px;
14
- height: 20px;
21
+ width: 24px;
22
+ height: 16px;
15
23
  border-radius: 9999px;
16
24
 
17
25
  &:focus {
@@ -22,10 +30,6 @@
22
30
  display: block;
23
31
  }
24
32
 
25
- &--disabled {
26
- opacity: 0.6;
27
- cursor: default;
28
- }
29
33
  }
30
34
 
31
35
  .farm-switch__background {
@@ -40,10 +44,10 @@
40
44
 
41
45
  .farm-switch__indicator {
42
46
  position: absolute;
43
- height: 20px;
44
- width: 20px;
45
- left: -2px;
46
- top: -4px;
47
+ height: 16px;
48
+ width: 16px;
49
+ left: -4px;
50
+ top: -2px;
47
51
  background-color: #ffffff;
48
52
  border-radius: 9999px;
49
53
  box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.16);
@@ -8,7 +8,7 @@ export default {
8
8
  export const Primary = () => ({
9
9
  data() {
10
10
  return {
11
- selectedValue: false,
11
+ selectedValue: true,
12
12
  };
13
13
  },
14
14
  template: `<div>
@@ -16,7 +16,29 @@ export const Primary = () => ({
16
16
  </div>`,
17
17
  });
18
18
 
19
- export const Disabled = () => ({
19
+ export const OnDisabled = () => ({
20
+ data() {
21
+ return {
22
+ selectedValue: true,
23
+ };
24
+ },
25
+ template: `<div>
26
+ <farm-switcher v-model="selectedValue" block :disabled="true" />
27
+ </div>`,
28
+ });
29
+
30
+ export const Off = () => ({
31
+ data() {
32
+ return {
33
+ selectedValue: false,
34
+ };
35
+ },
36
+ template: `<div>
37
+ <farm-switcher v-model="selectedValue" block :disabled="false" />
38
+ </div>`,
39
+ });
40
+
41
+ export const OffDisabled = () => ({
20
42
  data() {
21
43
  return {
22
44
  selectedValue: false,
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div
3
- :class="{ 'farm-switch': true, 'farm-switch--disabled': isDisabled }"
3
+ :class="{ 'farm-switch': true }"
4
4
  role="checkbox"
5
5
  @click="toggle"
6
6
  @keydown.space.prevent="toggle"
@@ -35,8 +35,10 @@ export default Vue.extend({
35
35
  computed: {
36
36
  backgroundStyles() {
37
37
  return {
38
- 'farm-switch--selected': this.value,
39
- 'farm-switch--idle': !this.value,
38
+ 'farm-switch--selected': this.value && !this.isDisabled,
39
+ 'farm-switch--idle': !this.value && !this.isDisabled,
40
+ 'farm-switch--disabled-on': this.value && this.isDisabled,
41
+ 'farm-switch--disabled-off': !this.value && this.isDisabled,
40
42
  };
41
43
  },
42
44
  indicatorStyles() {
@@ -40,6 +40,9 @@ export default Vue.extend({
40
40
  name: 'farm-context-menu',
41
41
  components: {},
42
42
  props: {
43
+ /**
44
+ * Items to populate the context menu
45
+ */
43
46
  items: {
44
47
  type: Array as PropType<Array<IContextMenuOption>>,
45
48
  required: true,
@@ -54,7 +57,6 @@ export default Vue.extend({
54
57
  onClick(handler) {
55
58
  if (handler !== undefined) {
56
59
  this.$emit(handler);
57
- // handler();
58
60
  }
59
61
  },
60
62
  toggleValue() {
@@ -0,0 +1,64 @@
1
+ .farm-textfield {
2
+ height: 64px;
3
+ &--input {
4
+ display: flex;
5
+ align-items: center;
6
+ gap: 8px;
7
+ border: 1px solid;
8
+ border-color: var(--farm-gray-lighten);
9
+ height: 36px;
10
+ border-radius: 5px;
11
+ padding: 8px;
12
+ margin-bottom: 8px;
13
+
14
+ > button {
15
+ display: flex;
16
+ }
17
+
18
+ &>input {
19
+ flex: 1;
20
+ outline: none;
21
+ color: var(--farm-neutral-darken);
22
+ font-size: 12px;
23
+ font-weight: 400;
24
+ }
25
+
26
+ width: 100%;
27
+ }
28
+
29
+ .farm-caption {
30
+ line-height: 12px;
31
+ }
32
+ }
33
+
34
+ .farm-textfield--touched.farm-textfield--validatable {
35
+ &.farm-textfield--error {
36
+ .farm-textfield {
37
+ &--input {
38
+ border-color: var(--farm-error-base);
39
+
40
+ &>input {
41
+ color: var(--farm-neutral-darken);
42
+ }
43
+
44
+ .farm-icon {
45
+ color: var(--farm-error-base);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+
52
+ .farm-textfield--blured.farm-textfield--validatable:not(.farm-textfield--error) {
53
+ .farm-textfield--input {
54
+ border-color: var(--farm-primary-base);
55
+
56
+ &>input {
57
+ color: var(--farm-neutral-darken);
58
+ }
59
+
60
+ .farm-icon {
61
+ color: var(--farm-primary-base);
62
+ }
63
+ }
64
+ }
@@ -1,6 +1,16 @@
1
1
  import { withDesign } from 'storybook-addon-designs';
2
2
  import TextFieldV2 from './TextFieldV2.vue';
3
3
 
4
+ import createNumberMask from 'text-mask-addons/dist/createNumberMask';
5
+ const currencyMask = createNumberMask({
6
+ prefix: 'R$',
7
+ allowDecimal: true,
8
+ includeThousandsSeparator: true,
9
+ thousandsSeparatorSymbol: '.',
10
+ decimalSymbol: ',',
11
+ allowNegative: false,
12
+ });
13
+
4
14
  export default {
5
15
  title: 'Form/TextFieldV2',
6
16
  component: TextFieldV2,
@@ -25,11 +35,175 @@ export default {
25
35
  export const Primary = () => ({
26
36
  data() {
27
37
  return {
28
- v: 'some text',
38
+ v: 'input text',
39
+ };
40
+ },
41
+ template: `<div style="width: 480px">
42
+ <farm-textfield-v2 v-model="v" />
43
+ v-model: {{ v }}
44
+ </div>`,
45
+ });
46
+
47
+ export const Disabled = () => ({
48
+ data() {
49
+ return {
50
+ v: 'input text',
51
+ };
52
+ },
53
+ template: `<div style="width: 480px">
54
+ <farm-textfield-v2 v-model="v" disabled />
55
+ </div>`,
56
+ });
57
+
58
+ export const Readonly = () => ({
59
+ data() {
60
+ return {
61
+ v: 'input text',
62
+ };
63
+ },
64
+ template: `<div style="width: 480px">
65
+ <farm-textfield-v2 v-model="v" readonly />
66
+ </div>`,
67
+ });
68
+
69
+ export const Validate = () => ({
70
+ data() {
71
+ return {
72
+ v1: 'input 1',
73
+ v2: '',
74
+ v3: '',
75
+ v4: '',
76
+ rules: {
77
+ required: value => !!value || 'Required field',
78
+ email: v =>
79
+ /^\w+([.-]?\w+)*@\w+([.-]?\w+)*(\.\w{2,3})+$/.test(v) || 'Must be an e-mail',
80
+ },
81
+ };
82
+ },
83
+ template: `<div style="width: 480px">
84
+ <farm-label required>Required field</farm-label>
85
+ <farm-textfield-v2 v-model="v1" :rules="[rules.required]" />
86
+
87
+ <farm-label>E-mail</farm-label>
88
+ <farm-textfield-v2 v-model="v2" :rules="[rules.email]" />
89
+
90
+ <farm-label required>Required and e-mail</farm-label>
91
+ <farm-textfield-v2 v-model="v3" :rules="[rules.required, rules.email]" />
92
+
93
+ <farm-label required>Required field with hint</farm-label>
94
+ <farm-textfield-v2 v-model="v4" :rules="[rules.required]" hint="hint text" />
95
+
96
+ </div>`,
97
+ });
98
+
99
+ export const Icon = () => ({
100
+ data() {
101
+ return {
102
+ v: '',
103
+ };
104
+ },
105
+ methods: {
106
+ show() {
107
+ alert('On icon click');
108
+ },
109
+ },
110
+ template: `<div style="width: 480px">
111
+ <farm-textfield-v2 v-model="v" icon="eye" onClickIcon="this.show" />
112
+ <farm-textfield-v2 v-model="v" icon="eye" icon-position="left" onClickIcon="this.show" />
113
+ </div>`,
114
+ });
115
+
116
+ export const HintText = () => ({
117
+ data() {
118
+ return {
119
+ v: 'input text',
120
+ };
121
+ },
122
+ template: `<div style="width: 480px; display: flex;">
123
+ <farm-textfield-v2 v-model="v" hint="Hint text" />
124
+ </div>`,
125
+ });
126
+
127
+ export const UpdateValue = () => ({
128
+ data() {
129
+ return {
130
+ counter: 1,
131
+ v: '1',
29
132
  };
30
133
  },
134
+ methods: {
135
+ onClick() {
136
+ this.counter++;
137
+ this.v = this.counter;
138
+ },
139
+ },
31
140
  template: `<div style="width: 480px">
32
141
  <farm-textfield-v2 v-model="v" />
33
- value: {{ v }}
142
+ <farm-btn @click="onClick">Add 1 to counter and update v-model</farm-btn>
143
+ <br />counter: {{ counter }}
144
+ <br />v-model: {{ v }}
145
+ </div>`,
146
+ });
147
+
148
+ export const Types = () => ({
149
+ data() {
150
+ return {
151
+ types: ['text', 'password', 'email', 'date', 'search', 'color', 'tel', 'url'],
152
+ };
153
+ },
154
+ template: `<div style="width: 480px">
155
+ <div v-for="type in types" :key="'input_type_' + type">
156
+ <farm-label>Type: {{ type }}</farm-label>
157
+ <farm-textfield-v2 :type="type" />
158
+ </div>
159
+ </div>`,
160
+ });
161
+
162
+ export const Reset = () => ({
163
+ data() {
164
+ return {
165
+ v: 'input text',
166
+ rules: {
167
+ required: value => !!value || 'Required field',
168
+ },
169
+ };
170
+ },
171
+ methods: {
172
+ reset() {
173
+ this.$refs.input.reset();
174
+ this.$refs.inputValidatable.reset();
175
+ },
176
+ },
177
+ template: `<div style="width: 480px">
178
+
179
+ <farm-label>Not Required</farm-label>
180
+ <farm-textfield-v2 v-model="v" ref="input" />
181
+
182
+ <farm-label required>Required</farm-label>
183
+ <farm-textfield-v2 v-model="v" ref="inputValidatable" :rules="[rules.required]" />
184
+
185
+ <farm-btn @click="reset">reset</farm-btn>
186
+
187
+ </div>`,
188
+ });
189
+
190
+ export const Mask = () => ({
191
+ data() {
192
+ return {
193
+ v: '',
194
+ v2: '',
195
+ mask: '###.###.###/##',
196
+ currencyMask,
197
+ };
198
+ },
199
+ template: `<div style="width: 480px">
200
+ <farm-label>CPF Mask ({{ mask }})</farm-label>
201
+ <farm-textfield-v2 v-model="v" :v-mask="mask" />
202
+ v-model: {{ v }}
203
+
204
+ <farm-label>Number Mask (R$ ##.###.###,##)</farm-label>
205
+ <farm-textfield-v2 v-model="v2" :v-mask="currencyMask" />
206
+ v-model: {{ v2 }}
207
+
34
208
  </div>`,
35
209
  });