@eturnity/eturnity_reusable_components 6.37.0-EPDM-8148.4 → 6.37.0-EPDM-8148.6
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 +1 -1
- package/src/assets/theme.js +3 -3
- package/src/components/iconWrapper/index.vue +11 -4
- package/src/components/inputs/select/index.vue +31 -30
- package/src/components/inputs/select/option/index.vue +5 -1
- package/src/components/tableDropdown/index.vue +9 -18
- package/src/components/tables/mainTable/index.vue +69 -6
- package/src/components/threeDots/index.vue +103 -52
- package/src/helpers/numberConverter.js +5 -14
- package/src/helpers/translateLang.js +12 -0
package/package.json
CHANGED
package/src/assets/theme.js
CHANGED
@@ -3,7 +3,7 @@ const theme = {
|
|
3
3
|
primary: '#48a2d0',
|
4
4
|
secondary: '#fdb813',
|
5
5
|
tertiary: '#d5d5d5',
|
6
|
-
black: '#
|
6
|
+
black: '#263238',
|
7
7
|
yellow: '#fdb813',
|
8
8
|
darkGray: '#818181',
|
9
9
|
gray1: '#666',
|
@@ -20,8 +20,8 @@ const theme = {
|
|
20
20
|
grey5: '#fafafa',
|
21
21
|
grey6: '#555d61',
|
22
22
|
green: '#99db0c',
|
23
|
-
transparentWhite1:'#ffffff32',
|
24
|
-
transparentBlack1:'#263238e6',
|
23
|
+
transparentWhite1: '#ffffff32',
|
24
|
+
transparentBlack1: '#263238e6',
|
25
25
|
disabled: '#dfe1e1',
|
26
26
|
eturnityGrey: '#263238'
|
27
27
|
},
|
@@ -110,7 +110,10 @@ export default {
|
|
110
110
|
required: false
|
111
111
|
},
|
112
112
|
backgroundColor: {
|
113
|
-
required: false
|
113
|
+
required: false,
|
114
|
+
},
|
115
|
+
hasBorder: {
|
116
|
+
required: false,
|
114
117
|
},
|
115
118
|
hoveredBackgroundColor: {
|
116
119
|
required: false,
|
@@ -132,9 +135,13 @@ export default {
|
|
132
135
|
required: false,
|
133
136
|
default: '6px'
|
134
137
|
},
|
135
|
-
isHovered:
|
136
|
-
required:
|
137
|
-
default:
|
138
|
+
isHovered:{
|
139
|
+
required:false,
|
140
|
+
default:false
|
141
|
+
},
|
142
|
+
isStriked:{
|
143
|
+
required:false,
|
144
|
+
default:false
|
138
145
|
}
|
139
146
|
},
|
140
147
|
data() {
|
@@ -93,11 +93,11 @@
|
|
93
93
|
ref="dropdown"
|
94
94
|
v-show="isDropdownOpen"
|
95
95
|
:hoveredIndex="hoveredIndex"
|
96
|
+
:hoveredValue="hoveredValue"
|
96
97
|
:isActive="isActive"
|
97
98
|
:optionWidth="optionWidth"
|
98
|
-
:
|
99
|
-
|
100
|
-
"
|
99
|
+
:hoveredBgColor="colorMode == 'dark' ? '#000000' : dropdownBgColor"
|
100
|
+
:bgColor="colorMode == 'dark' ? 'black' : dropdownBgColor"
|
101
101
|
:fontColor="
|
102
102
|
dropdownFontColor || colorMode == 'dark' ? 'white' : 'black'
|
103
103
|
"
|
@@ -154,7 +154,7 @@ const Selector = styled.div`
|
|
154
154
|
width: 100%;
|
155
155
|
`
|
156
156
|
|
157
|
-
const labelAttrs = { fontSize: String }
|
157
|
+
const labelAttrs = { fontSize: String, fontColor: String }
|
158
158
|
const InputLabel = styled('div', labelAttrs)`
|
159
159
|
color: ${(props) =>
|
160
160
|
props.theme.colors[props.fontColor]
|
@@ -234,11 +234,13 @@ const selectButton = styled('div', selectButtonAttrs)`
|
|
234
234
|
${(props) => (props.disabled ? 'pointer-events: none' : '')};
|
235
235
|
`
|
236
236
|
const selectDropdownAttrs = {
|
237
|
+
hoveredBgColor: String,
|
237
238
|
bgColor: String,
|
238
239
|
fontColor: String,
|
239
240
|
selectWidth: String,
|
240
241
|
optionWidth: String,
|
241
242
|
hoveredIndex: Number,
|
243
|
+
hoveredValue: Number | String,
|
242
244
|
selectedValue: Number | String
|
243
245
|
}
|
244
246
|
const selectDropdown = styled('div', selectDropdownAttrs)`
|
@@ -262,14 +264,13 @@ const selectDropdown = styled('div', selectDropdownAttrs)`
|
|
262
264
|
props.theme.colors[props.fontColor]
|
263
265
|
? props.theme.colors[props.fontColor]
|
264
266
|
: props.fontColor};
|
265
|
-
max-height:
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
backdrop-filter: brightness(1.2);
|
267
|
+
max-height:300px;
|
268
|
+
overflow-y:auto;
|
269
|
+
&>div[data-value="${(props) => props.hoveredValue}"]{
|
270
|
+
background-color:${(props) =>
|
271
|
+
props.theme.colors[props.hoveredBgColor]
|
272
|
+
? props.theme.colors[props.hoveredBgColor]
|
273
|
+
: props.hoveredBgColor};
|
273
274
|
}
|
274
275
|
`
|
275
276
|
const DropdownWrapper = styled('div')`
|
@@ -345,7 +346,8 @@ export default {
|
|
345
346
|
required: false
|
346
347
|
},
|
347
348
|
dropdownBgColor: {
|
348
|
-
required: false
|
349
|
+
required: false,
|
350
|
+
default: 'grey5'
|
349
351
|
},
|
350
352
|
dropdownFontColor: {
|
351
353
|
required: false
|
@@ -406,6 +408,7 @@ export default {
|
|
406
408
|
isActive: false,
|
407
409
|
textSearch: '',
|
408
410
|
hoveredIndex: 0,
|
411
|
+
hoveredValue:null,
|
409
412
|
isClickOutsideActive: false
|
410
413
|
}
|
411
414
|
},
|
@@ -444,13 +447,7 @@ export default {
|
|
444
447
|
this.$emit('input-change', e)
|
445
448
|
},
|
446
449
|
optionHovered(e) {
|
447
|
-
|
448
|
-
if (this.$refs.dropdown) {
|
449
|
-
this.hoveredIndex =
|
450
|
-
this.$refs.dropdown.$children
|
451
|
-
.map((component) => component.$el)
|
452
|
-
.indexOf(optionElement) + 1
|
453
|
-
}
|
450
|
+
this.hoveredValue=e
|
454
451
|
},
|
455
452
|
mouseEnterHandler() {
|
456
453
|
if (this.hoverDropdown) {
|
@@ -504,16 +501,20 @@ export default {
|
|
504
501
|
}
|
505
502
|
},
|
506
503
|
onArrowPress(dir) {
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
504
|
+
let newHoveredElem
|
505
|
+
const currentHoveredElem=this.$refs.dropdown.$el.querySelector(`[data-value="${this.hoveredValue}"]`);
|
506
|
+
if(currentHoveredElem){
|
507
|
+
if(dir>0){
|
508
|
+
newHoveredElem=currentHoveredElem.nextElementSibling
|
509
|
+
}else{
|
510
|
+
newHoveredElem=currentHoveredElem.previousElementSibling
|
511
|
+
}
|
512
|
+
if(newHoveredElem){
|
513
|
+
this.hoveredValue = newHoveredElem.getAttribute('data-value')
|
514
|
+
const topPos = newHoveredElem.offsetTop
|
515
|
+
this.$refs.dropdown.$el.scrollTop = topPos
|
516
|
+
}
|
517
|
+
}
|
517
518
|
}
|
518
519
|
},
|
519
520
|
computed: {
|
@@ -36,6 +36,10 @@ const optionContainer = styled('div', optionProps)`
|
|
36
36
|
padding: 12px 10px;
|
37
37
|
gap: 14px;
|
38
38
|
width: 100%;
|
39
|
+
background-color: ${(props) =>
|
40
|
+
props.theme.colors[props.backgroundColor]
|
41
|
+
? props.theme.colors[props.backgroundColor]
|
42
|
+
: props.backgroundColor};
|
39
43
|
box-sizing: inherit;
|
40
44
|
background-color: ${(props) =>
|
41
45
|
props.theme.colors[props.backgroundColor]
|
@@ -45,7 +49,7 @@ const optionContainer = styled('div', optionProps)`
|
|
45
49
|
background-color: ${(props) =>
|
46
50
|
props.theme.colors[props.hoveredBgColor]
|
47
51
|
? props.theme.colors[props.hoveredBgColor]
|
48
|
-
: props.hoveredBgColor};
|
52
|
+
: props.hoveredBgColor} !important;
|
49
53
|
}
|
50
54
|
`
|
51
55
|
|
@@ -104,12 +104,7 @@
|
|
104
104
|
:src="require('../../assets/icons/collapse_arrow_icon.svg')"
|
105
105
|
/>
|
106
106
|
</arrow-wrapper>
|
107
|
-
<options-container
|
108
|
-
v-if="isOpen"
|
109
|
-
:top="getItemLocation('top')"
|
110
|
-
:left="getItemLocation('left')"
|
111
|
-
ref="optionsContainer"
|
112
|
-
>
|
107
|
+
<options-container v-if="isOpen" ref="optionsContainer">
|
113
108
|
<options-wrapper @click.prevent.stop>
|
114
109
|
<search-container @click.prevent.stop>
|
115
110
|
<search-input
|
@@ -290,8 +285,7 @@ const OptionsContainer = styled('div', optionsAttrs)`
|
|
290
285
|
position: absolute;
|
291
286
|
display: grid;
|
292
287
|
grid-template-rows: 1fr auto;
|
293
|
-
|
294
|
-
left: ${(props) => props.left + 'px'};
|
288
|
+
left: 20px;
|
295
289
|
width: auto;
|
296
290
|
max-height: 360px;
|
297
291
|
min-height: 200px;
|
@@ -512,8 +506,13 @@ export default {
|
|
512
506
|
}
|
513
507
|
},
|
514
508
|
methods: {
|
515
|
-
toggleOpen() {
|
516
|
-
if (
|
509
|
+
toggleOpen(event) {
|
510
|
+
if (
|
511
|
+
this.disabled ||
|
512
|
+
(event &&
|
513
|
+
!(event.target === this.$el) &&
|
514
|
+
!this.$el.contains(event.target))
|
515
|
+
) {
|
517
516
|
return
|
518
517
|
}
|
519
518
|
this.wasClicked = false
|
@@ -560,14 +559,6 @@ export default {
|
|
560
559
|
this.inputText = value
|
561
560
|
this.$emit('dropdown-search', value)
|
562
561
|
},
|
563
|
-
getItemLocation(value) {
|
564
|
-
let ref = this.$refs.dropdownItem[0]
|
565
|
-
let location = ref.$el.getBoundingClientRect()[value]
|
566
|
-
if (value === 'top') {
|
567
|
-
location = location + window.scrollY + 40
|
568
|
-
}
|
569
|
-
return location
|
570
|
-
},
|
571
562
|
clickOutside(event) {
|
572
563
|
if (event.target === this.$el || this.$el.contains(event.target)) {
|
573
564
|
return
|
@@ -1,9 +1,15 @@
|
|
1
1
|
<template>
|
2
|
-
<page-container
|
2
|
+
<page-container
|
3
|
+
:tableHeight="tableHeight"
|
4
|
+
:shouldSetCustomHeight="doesTableContainDraggables"
|
5
|
+
>
|
3
6
|
<table-title v-if="titleText">
|
4
7
|
{{ titleText }}
|
5
8
|
</table-title>
|
6
|
-
<table-scroll
|
9
|
+
<table-scroll
|
10
|
+
ref="tableRef"
|
11
|
+
:isPositionAbsolute="doesTableContainDraggables"
|
12
|
+
>
|
7
13
|
<table-wrapper :fullWidth="fullWidth">
|
8
14
|
<spinner-wrapper v-if="isLoading">
|
9
15
|
<spinner />
|
@@ -26,7 +32,15 @@
|
|
26
32
|
import styled from 'vue-styled-components'
|
27
33
|
import Spinner from '../../spinner'
|
28
34
|
|
29
|
-
const
|
35
|
+
const pageContainerProps = {
|
36
|
+
tableHeight: String,
|
37
|
+
shouldSetCustomHeight: Boolean
|
38
|
+
}
|
39
|
+
const PageContainer = styled('div', pageContainerProps)`
|
40
|
+
position: relative;
|
41
|
+
height: ${(props) =>
|
42
|
+
props.shouldSetCustomHeight ? props.tableHeight : 'auto'};
|
43
|
+
`
|
30
44
|
|
31
45
|
const TableTitle = styled.div`
|
32
46
|
margin-bottom: 16px;
|
@@ -35,15 +49,27 @@ const TableTitle = styled.div`
|
|
35
49
|
text-transform: uppercase;
|
36
50
|
`
|
37
51
|
|
38
|
-
const
|
52
|
+
const tableScrollProps = {
|
53
|
+
isPositionAbsolute: Boolean
|
54
|
+
}
|
55
|
+
|
56
|
+
const TableScroll = styled('div', tableScrollProps)`
|
39
57
|
max-width: 100%;
|
58
|
+
height: auto;
|
59
|
+
${(props) =>
|
60
|
+
props.isPositionAbsolute &&
|
61
|
+
`
|
62
|
+
position: absolute;
|
63
|
+
left: -20px;
|
64
|
+
`}
|
40
65
|
`
|
41
66
|
|
42
67
|
const wrapperAttrs = { fullWidth: Boolean }
|
43
68
|
const TableWrapper = styled('div', wrapperAttrs)`
|
44
69
|
width: ${(props) => (props.fullWidth ? '100%' : 'fit-content')};
|
45
70
|
max-width: 100%;
|
46
|
-
overflow: auto;
|
71
|
+
overflow-x: auto;
|
72
|
+
overflow-y: hidden;
|
47
73
|
|
48
74
|
::-webkit-scrollbar {
|
49
75
|
height: 5px; //height of the whole scrollbar area
|
@@ -67,7 +93,11 @@ const SpinnerWrapper = styled.div`
|
|
67
93
|
justify-items: center;
|
68
94
|
`
|
69
95
|
|
70
|
-
const containerAttrs = {
|
96
|
+
const containerAttrs = {
|
97
|
+
cellPaddings: String,
|
98
|
+
tableCursor: String
|
99
|
+
}
|
100
|
+
|
71
101
|
const TableContainer = styled('table', containerAttrs)`
|
72
102
|
width: 100%;
|
73
103
|
border-collapse: collapse;
|
@@ -378,6 +408,39 @@ export default {
|
|
378
408
|
tableCursor: {
|
379
409
|
required: false
|
380
410
|
}
|
411
|
+
},
|
412
|
+
data() {
|
413
|
+
return {
|
414
|
+
tableHeight: 'auto',
|
415
|
+
doesTableContainDraggables: false
|
416
|
+
}
|
417
|
+
},
|
418
|
+
mounted() {
|
419
|
+
this.observeTableHeight()
|
420
|
+
},
|
421
|
+
beforeDestroy() {
|
422
|
+
if (this.resizeObserver) {
|
423
|
+
this.resizeObserver.disconnect()
|
424
|
+
}
|
425
|
+
},
|
426
|
+
methods: {
|
427
|
+
observeTableHeight() {
|
428
|
+
if (!this.$refs.tableRef) return
|
429
|
+
|
430
|
+
const tableElement = this.$refs.tableRef.$el
|
431
|
+
|
432
|
+
this.resizeObserver = new ResizeObserver(() => {
|
433
|
+
const newTableHeight = this.titleText
|
434
|
+
? tableElement.offsetHeight + 33
|
435
|
+
: tableElement.offsetHeight
|
436
|
+
this.tableHeight = `${newTableHeight}px`
|
437
|
+
this.doesTableContainDraggables = Boolean(
|
438
|
+
tableElement.querySelector('.drag-container')
|
439
|
+
)
|
440
|
+
})
|
441
|
+
|
442
|
+
this.resizeObserver.observe(tableElement)
|
443
|
+
}
|
381
444
|
}
|
382
445
|
}
|
383
446
|
</script>
|
@@ -1,66 +1,65 @@
|
|
1
1
|
<template>
|
2
|
-
<page-container @click="toggleButton()">
|
2
|
+
<page-container @click="toggleButton()" ref="pageContainer" :activated="isOpen">
|
3
3
|
<button-container ref="dropdownItem">
|
4
4
|
<dot-item />
|
5
5
|
<dot-item />
|
6
6
|
<dot-item />
|
7
7
|
</button-container>
|
8
8
|
<dropdown-container
|
9
|
-
v-if="isOpen"
|
10
9
|
@click.stop
|
11
|
-
:top="getItemLocation('top')"
|
12
|
-
:right="getItemLocation('right')"
|
13
10
|
:containerWidth="childOpen ? 440 : 240"
|
14
11
|
ref="dropdownContainer"
|
15
12
|
>
|
16
|
-
<
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
13
|
+
<template v-if="isOpen">
|
14
|
+
<loading-container v-if="isLoading">
|
15
|
+
<spinner />
|
16
|
+
</loading-container>
|
17
|
+
<children-container
|
18
|
+
class="child"
|
19
|
+
:isOpen="hoverItem !== null"
|
20
|
+
v-if="hoverItem !== null && !isLoading"
|
21
|
+
>
|
22
|
+
<option-child
|
23
|
+
v-for="child in childOpen"
|
24
|
+
:key="child.value"
|
25
|
+
@click.stop="
|
28
26
|
onSelect({
|
29
27
|
item: child,
|
30
28
|
hasChildren: hasChildren(child)
|
31
29
|
})
|
32
30
|
"
|
33
|
-
|
31
|
+
@keyup.enter.stop="
|
34
32
|
onSelect({
|
35
33
|
item: child,
|
36
34
|
hasChildren: hasChildren(child)
|
37
35
|
})
|
38
36
|
"
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
37
|
+
>
|
38
|
+
{{ child.name }}
|
39
|
+
</option-child>
|
40
|
+
</children-container>
|
41
|
+
<options-container v-if="!isLoading">
|
42
|
+
<option-item
|
43
|
+
v-for="(item, index) in options"
|
44
|
+
:key="item.value"
|
45
|
+
tabindex="0"
|
46
|
+
@click.stop="onSelect({ item: item, hasChildren: hasChildren(item) })"
|
47
|
+
@keyup.enter="
|
50
48
|
onSelect({ item: item, hasChildren: hasChildren(item) })
|
51
49
|
"
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
@mouseover="onItemHover({ index, item })"
|
51
|
+
:isDisabled="item.disabled"
|
52
|
+
>
|
53
|
+
<arrow-left
|
54
|
+
:hasChildren="hasChildren(item)"
|
55
|
+
v-if="hasChildren(item)"
|
56
|
+
/>
|
57
|
+
<span>
|
60
58
|
{{ item.name }}
|
61
59
|
</span>
|
62
|
-
|
63
|
-
|
60
|
+
</option-item>
|
61
|
+
</options-container>
|
62
|
+
</template>
|
64
63
|
</dropdown-container>
|
65
64
|
</page-container>
|
66
65
|
</template>
|
@@ -124,16 +123,20 @@
|
|
124
123
|
import styled from 'vue-styled-components'
|
125
124
|
import Spinner from '../spinner'
|
126
125
|
|
127
|
-
const
|
126
|
+
const PageContainerAttrs = {
|
127
|
+
activated: Boolean
|
128
|
+
}
|
129
|
+
const PageContainer = styled('div', PageContainerAttrs)`
|
128
130
|
display: grid;
|
129
131
|
align-items: center;
|
130
132
|
justify-items: center;
|
131
133
|
width: 30px;
|
132
134
|
height: 30px;
|
135
|
+
border-radius: 4px;
|
136
|
+
background-color: ${(props) => props.activated ? props.theme.colors.grey5 : ''};
|
133
137
|
|
134
138
|
&:hover {
|
135
139
|
background-color: ${(props) => props.theme.colors.grey5};
|
136
|
-
border-radius: 4px;
|
137
140
|
}
|
138
141
|
`
|
139
142
|
|
@@ -158,12 +161,11 @@ const DotItem = styled.div`
|
|
158
161
|
border-radius: 50%;
|
159
162
|
`
|
160
163
|
|
161
|
-
const dropdownAttrs = {
|
164
|
+
const dropdownAttrs = {
|
165
|
+
containerWidth: Number
|
166
|
+
}
|
162
167
|
const DropdownContainer = styled('div', dropdownAttrs)`
|
163
168
|
z-index: 99;
|
164
|
-
height: 200px;
|
165
|
-
top: ${(props) => props.top + 'px'};
|
166
|
-
left: ${(props) => props.right - props.containerWidth + 'px'};
|
167
169
|
position: absolute;
|
168
170
|
display: grid;
|
169
171
|
grid-template-columns: auto auto;
|
@@ -173,8 +175,8 @@ const LoadingContainer = styled.div`
|
|
173
175
|
border: 1px solid ${(props) => props.theme.colors.grey3};
|
174
176
|
display: grid;
|
175
177
|
grid-template-columns: 1fr;
|
176
|
-
min-width:
|
177
|
-
height:
|
178
|
+
min-width: 100px;
|
179
|
+
height: 100px;
|
178
180
|
align-items: center;
|
179
181
|
justify-items: center;
|
180
182
|
background: #fff;
|
@@ -255,6 +257,9 @@ const ChildrenContainer = styled('div', childAttrs)`
|
|
255
257
|
height: max-content;
|
256
258
|
max-height: 200px;
|
257
259
|
overflow: auto;
|
260
|
+
position: absolute;
|
261
|
+
top: 0;
|
262
|
+
right: 100%;
|
258
263
|
`
|
259
264
|
|
260
265
|
export default {
|
@@ -294,18 +299,64 @@ export default {
|
|
294
299
|
this.isOpen = !this.isOpen
|
295
300
|
|
296
301
|
if (this.isOpen) {
|
302
|
+
this.setContextMenuPosition()
|
303
|
+
window.addEventListener('resize', this.toggleButton)
|
297
304
|
document.addEventListener('click', this.clickOutside)
|
298
305
|
} else {
|
306
|
+
window.removeEventListener('resize', this.toggleButton)
|
299
307
|
document.removeEventListener('click', this.clickOutside)
|
300
308
|
}
|
301
309
|
},
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
310
|
+
setContextMenuPosition() {
|
311
|
+
const contextMenu = this.$refs.dropdownContainer.$el
|
312
|
+
const button = this.$refs.pageContainer.$el
|
313
|
+
const rectButton = button.getBoundingClientRect()
|
314
|
+
const relativeParent = this.findRelativeParent(contextMenu)
|
315
|
+
const rectRelativeParent = relativeParent.getBoundingClientRect()
|
316
|
+
|
317
|
+
const positionArray = this.determineElementQuarter(button, rectButton)
|
318
|
+
contextMenu.style.transform = ''
|
319
|
+
if (positionArray.includes('left')) {
|
320
|
+
contextMenu.style.left = (rectButton.right - rectRelativeParent.left + 5) + 'px'
|
321
|
+
} else {
|
322
|
+
contextMenu.style.left = (rectButton.left - rectRelativeParent.left - 5) + 'px'
|
323
|
+
contextMenu.style.transform = 'translateX(-100%)'
|
324
|
+
}
|
325
|
+
if (positionArray.includes('top')) {
|
326
|
+
contextMenu.style.top = (rectButton.top - rectRelativeParent.top) + 'px'
|
327
|
+
} else {
|
328
|
+
contextMenu.style.top = (rectButton.bottom - rectRelativeParent.top) + 'px'
|
329
|
+
contextMenu.style.transform += ' translateY(-100%)'
|
330
|
+
}
|
331
|
+
},
|
332
|
+
findRelativeParent(element) {
|
333
|
+
while (element.parentElement) {
|
334
|
+
if (window.getComputedStyle(element.parentElement).position === 'relative') {
|
335
|
+
return element.parentElement
|
336
|
+
}
|
337
|
+
element = element.parentElement
|
338
|
+
}
|
339
|
+
return null
|
340
|
+
},
|
341
|
+
determineElementQuarter(element, rect) {
|
342
|
+
const viewportWidth = window.innerWidth
|
343
|
+
const viewportHeight = window.innerHeight
|
344
|
+
|
345
|
+
const horizontalMidpoint = viewportWidth / 2
|
346
|
+
const verticalMidpoint = viewportHeight / 2
|
347
|
+
|
348
|
+
const isLeft = rect.left + rect.width / 2 < horizontalMidpoint
|
349
|
+
const isTop = rect.top + rect.height / 2 < verticalMidpoint
|
350
|
+
|
351
|
+
if (isLeft && isTop) {
|
352
|
+
return ['left', 'top']
|
353
|
+
} else if (isLeft && !isTop) {
|
354
|
+
return ['left', 'bottom']
|
355
|
+
} else if (!isLeft && isTop) {
|
356
|
+
return ['right', 'top']
|
357
|
+
} else {
|
358
|
+
return ['right', 'bottom']
|
307
359
|
}
|
308
|
-
return location
|
309
360
|
},
|
310
361
|
hasChildren(item) {
|
311
362
|
return !!item.children && !!item.children.length
|
@@ -1,12 +1,11 @@
|
|
1
|
+
import { langForLocaleString } from './translateLang'
|
2
|
+
|
1
3
|
export const stringToNumber = ({
|
2
|
-
value,
|
4
|
+
value = '',
|
3
5
|
numberPrecision = false,
|
4
|
-
allowNegative
|
6
|
+
allowNegative = false
|
5
7
|
}) => {
|
6
8
|
// This is for saving. It converts our input string to a readable number
|
7
|
-
if (value === undefined) {
|
8
|
-
value = ''
|
9
|
-
}
|
10
9
|
let newVal = value.toString()
|
11
10
|
const selectedLang = localStorage.getItem('lang')
|
12
11
|
// The first replace will replace not allowed characters with a blank
|
@@ -94,16 +93,8 @@ export const stringToNumber = ({
|
|
94
93
|
|
95
94
|
export const numberToString = ({ value, numberPrecision, minDecimals }) => {
|
96
95
|
const minimumRounding = minDecimals ? minDecimals : 0
|
97
|
-
let selectedLang = localStorage.getItem('lang')
|
98
|
-
? localStorage.getItem('lang') === 'fr-lu'
|
99
|
-
? 'fr-fr'
|
100
|
-
: localStorage.getItem('lang')
|
101
|
-
: 'en-US'
|
102
|
-
if (selectedLang == 'null') {
|
103
|
-
selectedLang = 'en-US'
|
104
|
-
}
|
105
96
|
value = parseFloat(value)
|
106
|
-
return value.toLocaleString(
|
97
|
+
return value.toLocaleString(langForLocaleString(), {
|
107
98
|
minimumFractionDigits: minimumRounding, // removing this for now. Why do we need this to be a minimum amount?
|
108
99
|
maximumFractionDigits: numberPrecision
|
109
100
|
})
|
@@ -78,6 +78,7 @@ export const datePickerLang = (lang) => {
|
|
78
78
|
}
|
79
79
|
|
80
80
|
export const tinyLanguage = (lang) => {
|
81
|
+
// the function is used to pass correct language to Tiny MCE text editor https://www.tiny.cloud/docs/tinymce/6/ui-localization/#language
|
81
82
|
if (
|
82
83
|
lang === 'de' ||
|
83
84
|
lang === 'de-de' ||
|
@@ -106,3 +107,14 @@ export const tinyLanguage = (lang) => {
|
|
106
107
|
return langCode
|
107
108
|
}
|
108
109
|
}
|
110
|
+
|
111
|
+
export const langForLocaleString = () => {
|
112
|
+
const selectedLang = localStorage.getItem('lang')
|
113
|
+
? localStorage.getItem('lang') === 'fr-lu'
|
114
|
+
? 'fr-fr'
|
115
|
+
: localStorage.getItem('lang') === 'fr-ch'
|
116
|
+
? 'de-ch'
|
117
|
+
: localStorage.getItem('lang')
|
118
|
+
: 'en-US'
|
119
|
+
return selectedLang !== 'null' ? selectedLang : 'en-US'
|
120
|
+
}
|