@eturnity/eturnity_reusable_components 7.39.5-qa-elisee-7.42.1 → 7.45.1-EPDM-12459.0

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eturnity/eturnity_reusable_components",
3
- "version": "7.39.5-qa-elisee-7.42.1",
3
+ "version": "7.45.1-EPDM-12459.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "src"
@@ -35,9 +35,6 @@ const theme = {
35
35
  tablet: '768px',
36
36
  tabletLarge: '950px',
37
37
  },
38
- fonts: {
39
- mainFont: '"Figtree", sans-serif',
40
- },
41
38
  borderRadius: '4px',
42
39
  }
43
40
 
@@ -0,0 +1,70 @@
1
+ /* eslint-disable */
2
+ import { h } from 'vue'
3
+ import { mount } from '@vue/test-utils'
4
+ import InfoBanner from '@/components/banner/infoBanner'
5
+ import theme from '@/assets/theme'
6
+
7
+ jest.mock('@/components/icon/iconCache.mjs', () => ({
8
+ // need to mock this due to how jest handles import.meta
9
+ fetchIcon: jest.fn(() => Promise.resolve('')),
10
+ }))
11
+
12
+ describe('Info Banner Component', () => {
13
+ const props = {
14
+ isOpen: false,
15
+ buttonLabel: 'Gotcha',
16
+ }
17
+
18
+ const global = {
19
+ provide: {
20
+ theme,
21
+ },
22
+ }
23
+
24
+ it('info banner is shown when isOpen props is true', async () => {
25
+ const wrapper = mount(InfoBanner, {
26
+ props,
27
+ global,
28
+ })
29
+
30
+ const bannerWrapper = wrapper.find('[data-test-id="info_banner_wrapper"]')
31
+ expect(bannerWrapper.exists()).toBe(true)
32
+ expect(bannerWrapper.classes()).not.toContain('visible')
33
+ expect(bannerWrapper.classes()).toContain('hidden')
34
+ await wrapper.setProps({ isOpen: true })
35
+ expect(bannerWrapper.classes()).toContain('visible')
36
+ expect(bannerWrapper.classes()).not.toContain('hidden')
37
+ })
38
+
39
+ it('info banner slots is display when user passed slots content', async () => {
40
+ const titleText = 'Sample title'
41
+ const bodyText = 'Sample body text'
42
+
43
+ const wrapper = mount(InfoBanner, {
44
+ props,
45
+ slots: {
46
+ title: titleText,
47
+ body: bodyText,
48
+ },
49
+ global,
50
+ })
51
+
52
+ const modalTitleEl = wrapper.find('[data-test-id="modal_title"]')
53
+ expect(modalTitleEl.text()).toBe(titleText)
54
+ const modalBodyEl = wrapper.find('[data-test-id="modal_body"]')
55
+ expect(modalBodyEl.text()).toBe(bodyText)
56
+ })
57
+
58
+ it('info banner on-close event is emitted when modal close button is clicked', async () => {
59
+ const wrapper = mount(InfoBanner, {
60
+ props,
61
+ global,
62
+ })
63
+
64
+ const modalCloseButton = wrapper.find('.close')
65
+ await modalCloseButton.trigger('click')
66
+ expect(wrapper.emitted('on-close')).toBeTruthy()
67
+ const emittedEvent = wrapper.emitted('on-close')
68
+ expect(emittedEvent).toHaveLength(1)
69
+ })
70
+ })
@@ -0,0 +1,42 @@
1
+ import InfoBanner from './index.vue'
2
+ import theme from '@/assets/theme'
3
+ export default {
4
+ title: 'InfoBanner',
5
+ component: InfoBanner,
6
+ tags: ['autodocs'],
7
+ }
8
+
9
+ // <RCInfoBanner
10
+ // :isOpen="true"
11
+ // buttonLabel="Got it"
12
+ // @on-close="handleClose"
13
+ // >
14
+ // <template #title>Sample title</template>
15
+ // <template #body>Sample body</template>
16
+ // </RCInfoBanner>
17
+
18
+ export const Default = {
19
+ args: {
20
+ isOpen: false,
21
+ buttonLabel: 'Got it',
22
+ },
23
+ }
24
+
25
+ export const OpenedInfoBanner = {
26
+ args: {
27
+ isOpen: true,
28
+ buttonLabel: 'Got it',
29
+ },
30
+ render: (args) => ({
31
+ components: { InfoBanner },
32
+ setup() {
33
+ return { args }
34
+ },
35
+ template: `
36
+ <InfoBanner v-bind="args">
37
+ <template #title>Sample title</template>
38
+ <template #body>Sample body</template>
39
+ </InfoBanner>
40
+ `,
41
+ }),
42
+ }
@@ -1,45 +1,75 @@
1
1
  <template>
2
- <ActionModal :is-open="isOpen" @on-close="closeModal">
2
+ <RCModal
3
+ data-test-id="info_banner_wrapper"
4
+ :is-open="isOpen"
5
+ @on-close="closeModal"
6
+ >
3
7
  <ModalContainer>
4
- <template name="title">
8
+ <ModalTitle v-if="$slots.title" data-test-id="modal_title">
5
9
  <slot name="title"></slot>
6
- </template>
7
- <template name="body">
10
+ </ModalTitle>
11
+ <TextContainer v-if="$slots.body" data-test-id="modal_body">
8
12
  <slot name="body"></slot>
9
- </template>
10
- <template name="buttons">
11
- <ButtonContainer>
12
- <Button
13
- min-width="150px"
14
- :text="$gettext('Got it')"
15
- type="primary"
16
- @click="closeModal"
17
- />
18
- </ButtonContainer>
19
- </template>
13
+ </TextContainer>
14
+ <ButtonContainer>
15
+ <RCButton
16
+ data-test-id="modal_buttons"
17
+ min-width="150px"
18
+ :text="buttonText"
19
+ type="primary"
20
+ @click="closeModal"
21
+ />
22
+ </ButtonContainer>
20
23
  </ModalContainer>
21
- </ActionModal>
24
+ </RCModal>
22
25
  </template>
23
26
  <script>
24
27
  import styled from 'vue3-styled-components'
25
- import ActionModal from '../actionModal'
28
+ import RCModal from '@/components/modals/modal'
29
+ import RCButton from '@/components/buttons/mainButton'
26
30
 
27
31
  const ModalContainer = styled.div`
28
32
  width: 450px;
33
+ display: flex;
34
+ flex-direction: column;
29
35
  min-height: 205px;
30
36
  padding: 40px 40px 30px 40px;
31
37
  `
38
+
39
+ const ModalTitle = styled.div`
40
+ color: ${(props) => props.theme.colors.black};
41
+ font-family: inherit;
42
+ font-size: 18px;
43
+ font-style: normal;
44
+ font-weight: 700;
45
+ line-height: 120%;
46
+ text-transform: uppercase;
47
+ `
32
48
  const ButtonContainer = styled.div`
33
49
  display: inline-flex;
34
- align-items: flex-start;
50
+ flex-grow: 1;
51
+ align-items: flex-end;
35
52
  gap: 20px;
36
53
  `
54
+ const TextContainer = styled.div`
55
+ color: ${(props) => props.theme.colors.black};
56
+ font-family: inherit;
57
+ font-size: 13px;
58
+ font-style: normal;
59
+ font-weight: 400;
60
+ line-height: normal;
61
+ padding: 30px 0px;
62
+ white-space: pre-wrap;
63
+ `
37
64
  export default {
38
65
  name: 'InfoModal',
39
66
  components: {
40
67
  ModalContainer,
68
+ ModalTitle,
69
+ TextContainer,
41
70
  ButtonContainer,
42
- ActionModal,
71
+ RCModal,
72
+ RCButton,
43
73
  },
44
74
  props: {
45
75
  isOpen: {
@@ -47,6 +77,16 @@
47
77
  default: false,
48
78
  type: Boolean,
49
79
  },
80
+ buttonLabel: {
81
+ default: null,
82
+ type: String,
83
+ },
84
+ },
85
+ computed: {
86
+ buttonText() {
87
+ //work around for storybook not finding the $gettext function
88
+ return this.buttonLabel || this.$gettext('Got it')
89
+ },
50
90
  },
51
91
  methods: {
52
92
  closeModal() {
@@ -111,10 +111,10 @@
111
111
  props.backgroundColor ? props.backgroundColor : 'transparent'};
112
112
  padding: ${(props) => (props.backgroundColor ? '3px' : '0')};
113
113
  }
114
- svg path:not(.fix) {
114
+ svg path {
115
115
  ${({ theme, color }) => color && `fill: ${theme.colors[color] || color};`}
116
116
  }
117
- &:hover svg path:not(.fix) {
117
+ &:hover svg path {
118
118
  ${({ theme, hoveredColor }) =>
119
119
  hoveredColor && `fill: ${theme.colors[hoveredColor] || hoveredColor};`}
120
120
  }
@@ -1,10 +1,6 @@
1
1
  <template>
2
- <InfoContainer
3
- background-color="backgrounColor"
4
- :border-color="borderColor"
5
- :has-dashed-border="hasDashedBorder"
6
- >
7
- <RCIcon :color="color" name="info" size="24px" />
2
+ <InfoContainer>
3
+ <RCIcon name="info" size="24px" :color="color" />
8
4
  <TextContainer>
9
5
  <slot></slot>
10
6
  </TextContainer>
@@ -14,24 +10,12 @@
14
10
  <script>
15
11
  import styled from 'vue3-styled-components'
16
12
  import RCIcon from '../icon'
17
- const propsContainer = {
18
- backgroundColor: String,
19
- hasDashedBorder: Boolean,
20
- borderColor: String,
21
- }
22
- const InfoContainer = styled('div', propsContainer)`
13
+
14
+ const InfoContainer = styled.div`
23
15
  display: flex;
24
16
  gap: 15px;
25
- padding: 15px;
26
- border: 1px ${(props) => (props.hasDashedBorder ? 'dashed' : 'solid')}
27
- ${(props) =>
28
- props.theme.colors[props.borderColor]
29
- ? props.theme.colors[props.borderColor]
30
- : props.borderColor};
31
- background-color: ${(props) =>
32
- props.theme.colors[props.backgroundColor]
33
- ? props.theme.colors[props.backgroundColor]
34
- : props.backgroundColor};
17
+ padding: 20px;
18
+ border: 1px dashed ${(props) => props.theme.colors.grey4};
35
19
  border-radius: 4px;
36
20
  `
37
21
 
@@ -49,19 +33,8 @@
49
33
  },
50
34
  props: {
51
35
  color: {
52
- required: false,
53
- },
54
- backgrounColor: {
55
- required: false,
56
- },
57
- hasDashedBorder: {
58
- required: false,
59
- default: true,
60
- },
61
- borderColor: {
62
- required: false,
63
- default: 'grey4',
64
- },
65
- },
36
+ required: false
37
+ }
38
+ }
66
39
  }
67
40
  </script>
@@ -2,6 +2,7 @@
2
2
  <ComponentWrapper>
3
3
  <IconWrapper :size="size">
4
4
  <IconImg
5
+ data-test-id="infoText_trigger"
5
6
  @click.prevent="toggleShowInfo()"
6
7
  @mouseenter="openTrigger == 'onHover' ? toggleShowInfo() : ''"
7
8
  @mouseleave="openTrigger == 'onHover' ? toggleShowInfo() : ''"
@@ -18,11 +19,10 @@
18
19
  :align-arrow="alignArrow"
19
20
  :half-computed-text-info-width="halfComputedTextInfoWidth"
20
21
  :icon-size="size"
21
- :info-position="infoPosition"
22
22
  :max-width="maxWidth"
23
23
  :width="width"
24
24
  ><slot></slot>
25
- <span v-if="text.length > 0" v-html="text"></span>
25
+ <span v-html="text"></span>
26
26
  </TextOverlay>
27
27
  </IconWrapper>
28
28
  </ComponentWrapper>
@@ -45,14 +45,10 @@
45
45
  alignArrow: String,
46
46
  width: String,
47
47
  halfComputedTextInfoWidth: Number,
48
- infoPosition: String,
49
48
  }
50
49
  const TextOverlay = styled('div', textAttrs)`
51
50
  position: absolute;
52
- ${(props) =>
53
- props.infoPosition == 'top'
54
- ? 'bottom : calc(' + props.iconSize + ' + 15px)'
55
- : 'top : calc(' + props.iconSize + ' + 15px)'};
51
+ top: ${(props) => 'calc(' + props.iconSize + ' + 15px)'};
56
52
  ${(props) =>
57
53
  props.alignArrow === 'left'
58
54
  ? 'left: calc(' + props.iconSize + ' /2 - 18px)'
@@ -68,17 +64,14 @@
68
64
  font-weight: 400;
69
65
  line-height: normal;
70
66
  border-radius: 4px;
71
- z-index: 999;
67
+ z-index: 99;
72
68
  color: ${(props) => props.theme.colors.white};
73
69
 
74
70
  :before {
75
71
  content: '';
76
72
  background-color: ${(props) => props.theme.colors.black};
77
73
  position: absolute;
78
-
79
- ${(props) =>
80
- props.infoPosition == 'top' ? 'bottom : -10px' : 'top: 2px'};
81
-
74
+ top: 2px;
82
75
  ${(props) =>
83
76
  props.alignArrow === 'left'
84
77
  ? 'left:40px;'
@@ -122,37 +115,26 @@
122
115
  props: {
123
116
  text: {
124
117
  required: false,
125
- default: '',
126
- type: String,
127
118
  },
128
119
  size: {
129
120
  required: false,
130
121
  default: '14px',
131
- type: String,
132
- },
133
- infoPosition: {
134
- required: false,
135
- default: 'bottom',
136
- type: String,
137
122
  },
138
123
  alignArrow: {
139
124
  required: false,
140
125
  default: 'center',
141
- type: String,
142
126
  },
143
127
  openTrigger: {
144
128
  required: false,
145
129
  default: 'onHover', // onHover, onClick
146
- type: String,
147
130
  },
148
131
  width: {
149
132
  required: false,
150
133
  default: '200px',
151
- type: String,
152
134
  },
153
135
  maxWidth: {
154
- default: '400px',
155
136
  type: String,
137
+ default: '400px',
156
138
  },
157
139
  },
158
140
  data() {
@@ -3,68 +3,73 @@ import InputText from './index.vue'
3
3
  export default {
4
4
  title: 'InputText',
5
5
  component: InputText,
6
- tags: ['autodocs'],
6
+ // argTypes: {},
7
7
  }
8
8
 
9
- // import InputText from "@eturnity/eturnity_reusable_components/src/components/inputs/inputText"
10
- // To use:
11
- // <input-text
12
- // placeholder="Company name"
13
- // :value="companyName"
14
- // @input-change="onInputChange({ value: $event, type: 'companyName' })"
15
- // :isError="checkErrors()"
16
- // :errorMessage="This is my error message"
17
- // infoTextAlign="right" // left by default
18
- // infoTextMessage="My info message"
19
- // label="Question 5"
20
- // alignItems="horizontal" // horizontal, vertical
21
- // inputWidth="250px"
22
- // minWidth="100px"
23
- // />
9
+ const Template = (args, { argTypes }) => ({
10
+ // Components used in your story `template` are defined in the `components` object
11
+ components: { InputText },
12
+ // The story's `args` need to be mapped into the template through the `setup()` method
13
+ props: Object.keys(argTypes),
14
+ template: '<input-text v-bind="$props" />',
24
15
 
25
- export const Default = {
26
- args: {
27
- placeholder: 'Company name',
28
- disabled: false,
29
- value: '',
30
- inputWidth: '200px',
31
- minWidth: '10ch',
32
- isError: false,
33
- label: 'label test',
34
- labelOptional: true,
35
- },
16
+ // import InputText from "@eturnity/eturnity_reusable_components/src/components/inputs/inputText"
17
+ // To use:
18
+ // <input-text
19
+ // placeholder="Company name"
20
+ // :value="companyName"
21
+ // @input-change="onInputChange({ value: $event, type: 'companyName' })"
22
+ // :isError="checkErrors()"
23
+ // :errorMessage="This is my error message"
24
+ // infoTextAlign="right" // left by default
25
+ // infoTextMessage="My info message"
26
+ // label="Question 5"
27
+ // alignItems="horizontal" // horizontal, vertical
28
+ // inputWidth="250px"
29
+ // minWidth="100px"
30
+ // />
31
+ })
32
+
33
+ export const Default = Template.bind({})
34
+ Default.args = {
35
+ placeholder: 'Company name',
36
+ disabled: false,
37
+ value: '',
38
+ inputWidth: '200px',
39
+ minWidth: '10ch',
40
+ unitName: 'pc',
41
+ isError: false,
42
+ textAlign: 'left',
36
43
  }
37
44
 
38
- export const HasError = {
39
- args: {
40
- placeholder: 'Enter Value',
41
- errorMessage: 'This field is required',
42
- isError: true,
43
- disabled: false,
44
- inputWidth: '200px',
45
- },
45
+ export const hasError = Template.bind({})
46
+ hasError.args = {
47
+ placeholder: 'Enter Value',
48
+ errorMessage: 'This field is required',
49
+ isError: true,
50
+ disabled: false,
51
+ inputWidth: '200px',
46
52
  }
47
53
 
48
- export const Disabled = {
49
- args: {
50
- placeholder: 'Enter Value',
51
- disabled: true,
52
- value: '',
53
- inputWidth: '200px',
54
- isError: false,
55
- },
54
+ export const Disabled = Template.bind({})
55
+ Disabled.args = {
56
+ placeholder: 'Enter Value',
57
+ disabled: true,
58
+ value: '',
59
+ inputWidth: '200px',
60
+ isError: false,
56
61
  }
57
62
 
58
- export const WithLabel = {
59
- args: {
60
- placeholder: 'Company name',
61
- disabled: false,
62
- label: 'What is the best company in Switzerland?',
63
- value: 'Eturnity',
64
- inputWidth: '200px',
65
- unitName: 'pc',
66
- isError: false,
67
- errorMessage: 'Maximum 5 characters',
68
- alignItems: 'vertical',
69
- },
63
+ export const WithLabel = Template.bind({})
64
+ WithLabel.args = {
65
+ placeholder: 'Company name',
66
+ disabled: false,
67
+ label: 'What is the best company in Switzerland?',
68
+ value: 'Eturnity',
69
+ inputWidth: '200px',
70
+ unitName: 'pc',
71
+ isError: false,
72
+ errorMessage: 'Maximum 5 characters',
73
+ textAlign: 'left',
74
+ alignItems: 'vertical',
70
75
  }