@farm-investimentos/front-mfe-components 9.3.1 → 9.3.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm-investimentos/front-mfe-components",
3
- "version": "9.3.1",
3
+ "version": "9.3.2",
4
4
  "author": "farm investimentos",
5
5
  "private": false,
6
6
  "main": "./dist/front-mfe-components.common.js",
@@ -50,6 +50,15 @@
50
50
  &.farm-chip--lighten {
51
51
  color: themeColor('secondary');
52
52
  }
53
+ &.farm-chip--darken {
54
+ color: white;
55
+ }
56
+ }
57
+
58
+ &[color='secondary'] {
59
+ &.farm-chip--lighten {
60
+ color: white;
61
+ }
53
62
  }
54
63
 
55
64
  &--outlined {
@@ -0,0 +1,134 @@
1
+ import Form from './Form.vue';
2
+
3
+ export default {
4
+ title: 'Form/Form',
5
+ component: Form,
6
+ parameters: {
7
+ docs: {
8
+ description: {
9
+ component: `Form<br />
10
+ selector: <em>farm-form</em>
11
+ `,
12
+ },
13
+ },
14
+ viewMode: 'docs',
15
+ },
16
+ };
17
+
18
+ const styles = {
19
+ vForm: {
20
+ maxWidth: '480px',
21
+ },
22
+ footer: {
23
+ display: 'flex',
24
+ justifyContent: 'end',
25
+ },
26
+ };
27
+
28
+ export const Primary = () => ({
29
+ data() {
30
+ return {
31
+ form: {
32
+ document: 'Document',
33
+ name: 'Name',
34
+ },
35
+ validForm: false,
36
+ rules: {
37
+ required: value => !!value || 'Campo obrigatório',
38
+ },
39
+ styles,
40
+ };
41
+ },
42
+ template: `
43
+ <farm-form v-model="validForm" :style="[styles.vForm]" ref="form">
44
+ <section>
45
+ <div>
46
+ <farm-label :required="true">Documento</farm-label>
47
+ <farm-textfield v-model="form.document" :rules="[rules.required]" />
48
+ </div>
49
+ </section>
50
+ <section>
51
+ <div>
52
+ <farm-label :required="true">Nome</farm-label>
53
+ <farm-textfield v-model="form.name" :rules="[rules.required]" />
54
+ </div>
55
+ </section>
56
+ <div class="footer" :style="[styles.footer]">
57
+ <farm-btn color="secondary" outlined @click="$refs.form.reset()" class="mr-3">Reset</farm-btn>
58
+ <farm-btn color="secondary" :disabled="!validForm">Salvar</farm-btn>
59
+ </div>
60
+ </farm-form>
61
+ `,
62
+ });
63
+
64
+ export const Secondary = () => ({
65
+ data() {
66
+ return {
67
+ form: {
68
+ document: 'Document',
69
+ not: 'Not required field',
70
+ },
71
+ validForm: false,
72
+ rules: {
73
+ required: value => !!value || 'Campo obrigatório',
74
+ },
75
+ styles,
76
+ };
77
+ },
78
+ template: `
79
+ <farm-form v-model="validForm" :style="[styles.vForm]" ref="form">
80
+ <section>
81
+ <div>
82
+ <farm-label :required="true">Documento</farm-label>
83
+ <farm-textfield v-model="form.document" :rules="[rules.required]" />
84
+ </div>
85
+ </section>
86
+ <section>
87
+ <div>
88
+ <farm-label>not</farm-label>
89
+ <farm-textfield v-model="form.not" />
90
+ </div>
91
+ </section>
92
+ <div class="footer" :style="[styles.footer]">
93
+ <farm-btn color="secondary" outlined @click="$refs.form.reset()" class="mr-3">Reset</farm-btn>
94
+ <farm-btn color="secondary" :disabled="!validForm">Salvar</farm-btn>
95
+ </div>
96
+ </farm-form>
97
+ `,
98
+ });
99
+
100
+ export const InitInvalid = () => ({
101
+ data() {
102
+ return {
103
+ form: {
104
+ document: '',
105
+ name: '',
106
+ },
107
+ validForm: false,
108
+ rules: {
109
+ required: value => !!value || 'Campo obrigatório',
110
+ },
111
+ styles,
112
+ };
113
+ },
114
+ template: `
115
+ <farm-form v-model="validForm" :style="[styles.vForm]" ref="form">
116
+ <section>
117
+ <div>
118
+ <farm-label :required="true">Documento</farm-label>
119
+ <farm-textfield v-model="form.document" :rules="[rules.required]" />
120
+ </div>
121
+ </section>
122
+ <section>
123
+ <div>
124
+ <farm-label :required="true">Nome</farm-label>
125
+ <farm-textfield v-model="form.name" :rules="[rules.required]" />
126
+ </div>
127
+ </section>
128
+ <div class="footer" :style="[styles.footer]">
129
+ <farm-btn color="secondary" outlined @click="$refs.form.reset()" class="mr-3">Reset</farm-btn>
130
+ <farm-btn color="secondary" :disabled="!validForm">Salvar</farm-btn>
131
+ </div>
132
+ </farm-form>
133
+ `,
134
+ });
@@ -0,0 +1,67 @@
1
+ <template>
2
+ <form class="farm-form"><slot></slot></form>
3
+ </template>
4
+ <script lang="ts">
5
+ import Vue, { onMounted, reactive, ref, getCurrentInstance } from 'vue';
6
+
7
+ type ErrorsBag = Record<number, boolean>;
8
+
9
+ export default Vue.extend({
10
+ name: 'farm-form',
11
+ props: {
12
+ value: { type: [Array, Boolean], required: true },
13
+ },
14
+ inheritAttrs: true,
15
+ setup(props, { emit }) {
16
+ const innerValue = ref(props.value);
17
+ const errorsBag = reactive({} as ErrorsBag);
18
+ let validationFields = [];
19
+
20
+ const dispatchError = () => {
21
+ const keys = Object.keys(errorsBag);
22
+ const errorsIds = keys.filter(key => !errorsBag[key]);
23
+ emit('input', errorsIds.length === 0);
24
+ };
25
+
26
+ const watchInput = (field: any) => {
27
+ field.$watch(
28
+ 'hasError',
29
+ () => {
30
+ errorsBag[field._uid] = field.valid;
31
+ dispatchError();
32
+ },
33
+ { immediate: true }
34
+ );
35
+ };
36
+
37
+ const reset = () => {
38
+ validationFields.forEach(field => {
39
+ field.reset();
40
+ });
41
+ };
42
+
43
+ const recursiveFormField = $node => {
44
+ $node.$children.forEach($leaf => {
45
+ if ($leaf.$children.length > 1) {
46
+ recursiveFormField($leaf);
47
+ } else if ($leaf.$children[0] && $leaf.$children[0].validate) {
48
+ validationFields.push($leaf.$children[0]);
49
+ }
50
+ });
51
+ };
52
+
53
+ onMounted(() => {
54
+ recursiveFormField(getCurrentInstance().proxy);
55
+ validationFields.forEach(field => {
56
+ watchInput(field);
57
+ });
58
+ });
59
+
60
+ return {
61
+ innerValue,
62
+ errorsBag,
63
+ reset,
64
+ };
65
+ },
66
+ });
67
+ </script>
@@ -0,0 +1,16 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import Form from '../Form';
3
+
4
+ describe('Form component', () => {
5
+ let wrapper;
6
+ let component;
7
+
8
+ beforeEach(() => {
9
+ wrapper = shallowMount(Form);
10
+ component = wrapper.vm;
11
+ });
12
+
13
+ test('Created hook', () => {
14
+ expect(wrapper).toBeDefined();
15
+ });
16
+ });
@@ -0,0 +1,4 @@
1
+ import Form from './Form.vue';
2
+
3
+ export { Form };
4
+ export default Form;
@@ -0,0 +1,6 @@
1
+ interface IRadioGroup {
2
+ id: Number;
3
+ label: String;
4
+ }
5
+
6
+ export default IRadioGroup;
@@ -0,0 +1,82 @@
1
+ .farm-radio-group {
2
+ border: none;
3
+ cursor: default;
4
+ display: flex;
5
+ width: 100%;
6
+ &__item {
7
+ font-size: 16px;
8
+ line-height: 1.1;
9
+ cursor: pointer;
10
+ display: grid;
11
+ grid-template-columns: 16px auto;
12
+ gap: 8px;
13
+ color: rgba(0,0,0,.6);
14
+ margin-top: 16px;
15
+ margin-right: 16px;
16
+ }
17
+ }
18
+
19
+ .farm-radio-group--column {
20
+ flex-direction: column;
21
+ }
22
+
23
+ input[type="radio"] {
24
+ -webkit-appearance: none;
25
+ appearance: none;
26
+ background-color: #ffffff;
27
+ margin: 0;
28
+ font: inherit;
29
+ color: rgba(0,0,0,.6);
30
+ width: 18px;
31
+ height: 18px;
32
+ border: 1.5px solid rgba(0,0,0,.6);
33
+ border-radius: 50%;
34
+ transform: translate(-12px);
35
+ display: grid;
36
+ place-content: center;
37
+ cursor: pointer;
38
+ }
39
+
40
+ input[type="radio"]::before {
41
+ content: "";
42
+ width: 10px;
43
+ height: 10px;
44
+ border-radius: 50%;
45
+ transform: scale(0);
46
+ transition: 120ms transform ease-in-out;
47
+ box-shadow: inset 16px 16px var(--radio-group-color);
48
+ background-color: CanvasText;
49
+ }
50
+
51
+ input[type="radio"]:checked::before {
52
+ transform: scale(1);
53
+ }
54
+
55
+ input[type="radio"]:focus {
56
+ outline: none;
57
+ outline-offset: none;
58
+ }
59
+
60
+ input[type="radio"]:checked {
61
+ border: 1.5px solid var(--radio-group-color);
62
+ }
63
+
64
+ input[type='radio']:hover {
65
+ box-shadow: 0px 0px 0px 8px rgba(0, 0, 0, 0.1);
66
+ background-color: rgba(0, 0, 0, 0.1);
67
+ border-radius: 50%;
68
+ opacity: 1;
69
+ }
70
+
71
+ input[type='radio']:active {
72
+ animation: pulse 0.2s 1 ease-out;
73
+ }
74
+
75
+ @keyframes pulse {
76
+ from {
77
+ box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.2), 0 0 0 0 rgba(0, 0, 0, 0.2);
78
+ }
79
+ to {
80
+ box-shadow: 0 0 0 8px rgba(0, 0, 0, 0.2), 0 0 0 8px rgba(0, 0, 0, 0.2);
81
+ }
82
+ }
@@ -0,0 +1,34 @@
1
+ import RadioGroup from './RadioGroup';
2
+
3
+ export default {
4
+ title: 'Form/RadioGroup',
5
+ component: RadioGroup,
6
+ parameters: {
7
+ docs: {
8
+ description: {
9
+ component: `RadioGroup<br />
10
+ selector: <em>farm-radio-group</em>
11
+ `,
12
+ },
13
+ },
14
+ viewMode: 'docs',
15
+ },
16
+ };
17
+
18
+ export const Primary = () => ({
19
+ data() {
20
+ return {
21
+ buttons: [
22
+ { label: 'Button 1', id: 1 },
23
+ { label: 'Button 2', id: 2 },
24
+ { label: 'Button 3', id: 3 }
25
+ ],
26
+ checkedValue: 1
27
+ };
28
+ },
29
+ template: `<div>
30
+ <farm-radio-group v-model="checkedValue" column :buttons="buttons" />
31
+ </div>`,
32
+ });
33
+
34
+ Primary.storyName = 'Basic';
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <div
3
+ :class="{
4
+ 'farm-radio-group': true,
5
+ 'farm-radio-group--column': $props.column,
6
+ }">
7
+ <div class="farm-radio-group__item"
8
+ v-for="(button, index) in buttons"
9
+ :key="`farm-radio-group_` + index"
10
+ @click="clicked(button.id)"
11
+ >
12
+ <input
13
+ type="radio"
14
+ name="radio"
15
+ :checked="button.id === $props.value"
16
+ :id="`farm-radio-group_` + index"
17
+ :style="cssVars"
18
+ :value="button.id"
19
+ >
20
+ <label>
21
+ {{button.label}}
22
+ </label>
23
+ </div>
24
+ </div>
25
+ </template>
26
+ <script lang="ts">
27
+ import Vue, { PropType } from 'vue';
28
+ import IRadioGroup from './IRadioGroup';
29
+ export default Vue.extend({
30
+ name: 'farm-radio-group',
31
+ props: {
32
+ /**
33
+ * Array of buttons
34
+ */
35
+ buttons: {
36
+ type: Array as PropType<Array<IRadioGroup>>,
37
+ default: () => [],
38
+ },
39
+ /**
40
+ * v-model
41
+ */
42
+ value: {
43
+ required: true,
44
+ },
45
+ column: {
46
+ type: Boolean,
47
+ default: false
48
+ },
49
+ color: {
50
+ type: String,
51
+ default: '#00B493',
52
+ }
53
+ },
54
+ methods: {
55
+ clicked(value) {
56
+ this.$emit('input', value);
57
+ }
58
+ },
59
+ computed: {
60
+ cssVars () {
61
+ return {
62
+ '--radio-group-color': this.color
63
+ };
64
+ }
65
+ }
66
+
67
+ });
68
+ </script>
69
+ <style lang="scss" scoped>
70
+ @import './RadioGroup.scss';
71
+ </style>
@@ -0,0 +1,20 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import RadioGroup from '../RadioGroup';
3
+
4
+ describe('RadioGroup component', () => {
5
+ let wrapper;
6
+
7
+ beforeEach(() => {
8
+ wrapper = shallowMount(RadioGroup, {});
9
+ });
10
+
11
+ test('Created hook', () => {
12
+ expect(wrapper).toBeDefined();
13
+ });
14
+
15
+ describe('mount component', () => {
16
+ it('renders correctly', () => {
17
+ expect(wrapper.element).toMatchSnapshot();
18
+ });
19
+ });
20
+ });
@@ -0,0 +1,4 @@
1
+ import RadioGroup from './RadioGroup.vue';
2
+
3
+ export { RadioGroup };
4
+ export default RadioGroup;
@@ -16,7 +16,6 @@ export default {
16
16
  };
17
17
 
18
18
  export const Primary = () => ({
19
- components: { 'farm-container': Container },
20
19
  template: '<farm-container>content</farm-container>',
21
20
  });
22
21
 
@@ -0,0 +1,6 @@
1
+ .farm-row {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ flex: 1 1 auto;
5
+ margin: -12px;
6
+ }
@@ -0,0 +1,22 @@
1
+ import Row from './Row.vue';
2
+
3
+ export default {
4
+ title: 'Layout/Row',
5
+ component: Row,
6
+ parameters: {
7
+ docs: {
8
+ description: {
9
+ component: `Row<br />
10
+ selector: <em>farm-row</em>
11
+ `,
12
+ },
13
+ },
14
+ viewMode: 'docs',
15
+ },
16
+ };
17
+
18
+ export const Primary = () => ({
19
+ template: '<farm-row>row content</farm-row>',
20
+ });
21
+
22
+ Primary.storyName = 'Basic';
@@ -0,0 +1,22 @@
1
+ <template>
2
+ <component v-bind:is="tag" class="farm-row">
3
+ <slot></slot>
4
+ </component>
5
+ </template>
6
+ <script lang="ts">
7
+ import Vue from 'vue';
8
+
9
+ export default Vue.extend({
10
+ name: 'farm-row',
11
+ props: {
12
+ /**
13
+ * Html tag
14
+ */
15
+ tag: { type: String, default: 'div' },
16
+ },
17
+ inheritAttrs: true,
18
+ });
19
+ </script>
20
+ <style lang="scss" scoped>
21
+ @import 'Row.scss';
22
+ </style>
@@ -0,0 +1,22 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import Row from '../Row';
3
+
4
+ describe('Row component', () => {
5
+ let wrapper;
6
+ let component;
7
+
8
+ beforeEach(() => {
9
+ wrapper = shallowMount(Row);
10
+ component = wrapper.vm;
11
+ });
12
+
13
+ test('Created hook', () => {
14
+ expect(wrapper).toBeDefined();
15
+ });
16
+
17
+ describe('mount component', () => {
18
+ it('renders correctly', () => {
19
+ expect(wrapper.element).toMatchSnapshot();
20
+ });
21
+ });
22
+ });
@@ -0,0 +1,4 @@
1
+ import Row from './Row.vue';
2
+
3
+ export { Row };
4
+ export default Row;
@@ -11,9 +11,9 @@ $secondary: (
11
11
  );
12
12
 
13
13
  $neutral: (
14
- base: #EEEEEE,
14
+ base: #E0E0E0,
15
15
  lighten: #F5F5F5,
16
- darken: #E0E0E0,
16
+ darken: #5C5C5C,
17
17
  );
18
18
 
19
19
  $error: (
@@ -42,7 +42,7 @@ $success: (
42
42
 
43
43
  $extra-1: (
44
44
  base: #8E24AA,
45
- lighten: #E8F5E9,
45
+ lighten: #F3E5F5,
46
46
  darken: #4A148C,
47
47
  );
48
48
 
@@ -42,7 +42,7 @@ export const Primary = () => ({
42
42
  <farm-textfield v-model="form.name" />
43
43
  </div>
44
44
  <div class="footer" :style="[styles.footer]">
45
- <v-btn color="secondary" :disabled="!validForm">Salvar</v-btn>
45
+ <farm-btn color="secondary" :disabled="!validForm">Salvar</farm-btn>
46
46
  </div>
47
47
  </v-form>
48
48
  `,
package/src/main.ts CHANGED
@@ -69,12 +69,14 @@ export * from './components/ResetTableRowSelection';
69
69
  export * from './components/MultipleSelectShortener';
70
70
  export * from './components/SelectModalOptions';
71
71
  export * from './components/ChipInviteStatus';
72
+ export * from './components/Form';
72
73
  export * from './components/Label';
73
74
  export * from './components/Logger';
74
75
  export * from './components/Logger/LoggerItem';
75
76
  export * from './components/Icon';
76
77
  export * from './components/Modal';
77
78
  export * from './components/ProgressBar';
79
+ export * from './components/RadioGroup';
78
80
  export * from './components/Stepper';
79
81
  export * from './components/Switcher';
80
82
  export * from './components/TextField';
@@ -83,4 +85,5 @@ export * from './components/Typography';
83
85
 
84
86
  export * from './components/layout/Container';
85
87
  export * from './components/layout/ContainerFooter';
88
+ export * from './components/layout/Row';
86
89
  export * from './components/layout/Line';