@itfin/components 1.3.65 → 1.3.67
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/scss/directives/tooltip.scss +2 -1
- package/src/components/panels/Panel.vue +1 -0
- package/src/components/panels/PanelList.vue +64 -3
- package/src/components/table/Table2.vue +7 -1
- package/src/components/table/TableGroup.vue +4 -4
- package/src/components/table/TableHeader.vue +1 -1
- package/src/components/table/table2.scss +5 -0
package/package.json
CHANGED
|
@@ -14,12 +14,13 @@ $dark-tooltip-color: #7b52eb;
|
|
|
14
14
|
--itf-tooltip-shadow: 0 0 20px 4px rgba(87, 78, 101, 0.15), 0 4px 80px -8px rgba(211, 208, 219, 0.25), 0 4px 4px -2px rgba(156, 150, 164, 0.15);
|
|
15
15
|
--itf-tooltip-color: #{$dark-body-color};
|
|
16
16
|
--itf-tooltip-bg-color: #{$dark-tooltip-color};
|
|
17
|
+
--itf-tooltip-font-size: 0.875rem;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
.tippy-box[data-theme~=itfin] {
|
|
20
21
|
color: var(--itf-tooltip-color);
|
|
21
22
|
background-color: var(--itf-tooltip-bg-color);
|
|
22
|
-
font-size:
|
|
23
|
+
font-size: var(--itf-tooltip-font-size);
|
|
23
24
|
border-radius: 5px;
|
|
24
25
|
box-shadow: var(--itf-tooltip-shadow);
|
|
25
26
|
padding: 5px;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="b-panel-list-container">
|
|
3
|
-
<
|
|
3
|
+
<transition-group
|
|
4
|
+
name="slide"
|
|
5
|
+
tag="div"
|
|
6
|
+
class="b-panel-list"
|
|
7
|
+
@before-enter="addAnimateClass"
|
|
8
|
+
@before-leave="beforeLeave"
|
|
9
|
+
>
|
|
4
10
|
<template v-for="(panel, n) of panelsStack">
|
|
5
11
|
<panel
|
|
6
12
|
:key="n"
|
|
@@ -10,6 +16,7 @@
|
|
|
10
16
|
:expandable="panelsStack.length > 1"
|
|
11
17
|
:collapsed="panel.isCollapsed"
|
|
12
18
|
:closeable="panel.isCloseable"
|
|
19
|
+
:animate="panel.isAnimate"
|
|
13
20
|
@expand="expandPanel(panel)"
|
|
14
21
|
@fullsize="fullsizePanel(panel)"
|
|
15
22
|
@close="closePanel(panel)"
|
|
@@ -66,10 +73,10 @@
|
|
|
66
73
|
</template>
|
|
67
74
|
</panel>
|
|
68
75
|
</template>
|
|
69
|
-
</
|
|
76
|
+
</transition-group>
|
|
70
77
|
</div>
|
|
71
78
|
</template>
|
|
72
|
-
<style>
|
|
79
|
+
<style lang="scss">
|
|
73
80
|
.b-panel-list-container {
|
|
74
81
|
width: 100%;
|
|
75
82
|
height: 100%;
|
|
@@ -88,6 +95,45 @@
|
|
|
88
95
|
right: 0;
|
|
89
96
|
top: 0;
|
|
90
97
|
}
|
|
98
|
+
|
|
99
|
+
$an-time: .1s;
|
|
100
|
+
$double-an-time: $an-time * 2;
|
|
101
|
+
|
|
102
|
+
.animate.slide-enter-active {
|
|
103
|
+
min-width: 0 !important;
|
|
104
|
+
/* подвоюємо час, для коректної швидкості анімації, у випадку якщо max-width застосовуємо тільки на половину */
|
|
105
|
+
animation: $double-an-time linear slidein forwards;
|
|
106
|
+
}
|
|
107
|
+
.animate.slide-leave-active {
|
|
108
|
+
min-width: 0 !important;
|
|
109
|
+
/* подвоюємо час, для коректної швидкості анімації, у випадку якщо max-width застосовуємо тільки на половину */
|
|
110
|
+
animation: $double-an-time linear slidein reverse;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
@keyframes slidein {
|
|
114
|
+
0% {
|
|
115
|
+
max-width: 0;
|
|
116
|
+
}
|
|
117
|
+
100% {
|
|
118
|
+
max-width: 100%;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.b-panel {
|
|
123
|
+
transition: min-width $an-time linear, flex-grow $an-time linear;
|
|
124
|
+
|
|
125
|
+
> div {
|
|
126
|
+
transition: opacity $an-time linear;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.slide-enter-active > div {
|
|
131
|
+
opacity: 0;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.opacity-null > div {
|
|
135
|
+
opacity: 0 !important;
|
|
136
|
+
}
|
|
91
137
|
</style>
|
|
92
138
|
<script lang="ts">
|
|
93
139
|
import { Vue, Component, Prop } from 'vue-property-decorator';
|
|
@@ -137,6 +183,7 @@ export default class PanelList extends Vue {
|
|
|
137
183
|
|
|
138
184
|
nextId:number = 0;
|
|
139
185
|
|
|
186
|
+
|
|
140
187
|
created() {
|
|
141
188
|
if (this.firstPanel) {
|
|
142
189
|
this.internalOpenPanel(this.firstPanel.type, this.firstPanel.payload);
|
|
@@ -211,13 +258,16 @@ export default class PanelList extends Vue {
|
|
|
211
258
|
newPanel.isCloseable = false;
|
|
212
259
|
}
|
|
213
260
|
let newStack = [...this.panelsStack];
|
|
261
|
+
let isAnimation = true;
|
|
214
262
|
if (openIndex) {
|
|
263
|
+
isAnimation = newStack.length === openIndex;
|
|
215
264
|
newStack = newStack.slice(0, openIndex);
|
|
216
265
|
}
|
|
217
266
|
this.panelsStack = newStack;
|
|
218
267
|
return new Promise(res => {
|
|
219
268
|
this.$nextTick(() => { // щоб панелі змінювались при редагуванні
|
|
220
269
|
const n = newStack.length;
|
|
270
|
+
newPanel.isAnimate = isAnimation;
|
|
221
271
|
newPanel.emit = (event, ...args) => this.emitEvent(event, ...args);
|
|
222
272
|
newPanel.open = (type, payload) => this.openPanel(type, payload, n + 1);
|
|
223
273
|
newPanel.close = () => this.closePanel(newPanel);
|
|
@@ -332,5 +382,16 @@ export default class PanelList extends Vue {
|
|
|
332
382
|
this.panelsStack = this.panelsStack.slice(0, 1);
|
|
333
383
|
}
|
|
334
384
|
}
|
|
385
|
+
|
|
386
|
+
beforeLeave (element) {
|
|
387
|
+
element.classList.add('opacity-null');
|
|
388
|
+
this.addAnimateClass(element);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
addAnimateClass(element) {
|
|
392
|
+
if (element.__vue__.$options.propsData.animate) {
|
|
393
|
+
element.classList.add('animate');
|
|
394
|
+
}
|
|
395
|
+
}
|
|
335
396
|
}
|
|
336
397
|
</script>
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
|
|
3
|
-
<div class="itf-table2 scrollable scrollable-x" :class="{
|
|
3
|
+
<div class="itf-table2 scrollable scrollable-x" :class="{
|
|
4
|
+
'table-striped': striped,
|
|
5
|
+
'table-absolute': absolute,
|
|
6
|
+
'table-clickable': clickable,
|
|
7
|
+
'permanent-checkboxes': selectedIds.length
|
|
8
|
+
}" :style="{ '--indicator-area-width': `${indicatorType === 'none' ? 1 : indicatorWidth}px` }">
|
|
4
9
|
<itf-checkbox-group v-model="selectedIds">
|
|
5
10
|
<template v-for="(group, index) in groups">
|
|
6
11
|
<div class="table-view-body">
|
|
@@ -103,6 +108,7 @@ class itfTable2 extends Vue {
|
|
|
103
108
|
@Prop(Boolean) expandedAll;
|
|
104
109
|
@Prop(Boolean) striped;
|
|
105
110
|
@Prop(Boolean) absolute;
|
|
111
|
+
@Prop(Boolean) clickable;
|
|
106
112
|
|
|
107
113
|
state = {
|
|
108
114
|
selectedIds: [],
|
|
@@ -99,14 +99,14 @@
|
|
|
99
99
|
<div v-if="isShowTable && showSummary" class="table-row-template d-flex align-items-stretch table-summary" :class="{'table-summary-persist': persistSummary}">
|
|
100
100
|
<div class="shadow-area"></div>
|
|
101
101
|
|
|
102
|
-
<div class="table-summary-columns d-flex tw-flex-row align-items-center">
|
|
102
|
+
<div class="table-summary-columns d-flex tw-flex-row align-items-center w-100 flex-grow-1">
|
|
103
103
|
<span
|
|
104
104
|
v-for="(column, n) in visibleColumns"
|
|
105
105
|
v-if="column.visible !== false"
|
|
106
106
|
:key="n"
|
|
107
107
|
:data-column="n"
|
|
108
|
-
class="position-relative line-overflow"
|
|
109
|
-
:style="`width: ${column.width}px; max-width: ${column.width}px;`">
|
|
108
|
+
class="position-relative line-overflow px-1"
|
|
109
|
+
:style="column.grow ? `min-width: ${column.minWidth}px; flex-grow: 1;` : `width: ${column.width}px; max-width: ${column.width}px;`">
|
|
110
110
|
<itf-dropdown append-to-context text right @open="persistSummary = true" @close="persistSummary = false" autoclose="outside">
|
|
111
111
|
<template #button>
|
|
112
112
|
<span data-test="summary-column" class="invisible-summary d-flex align-items-center justify-content-end flex-auto">
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
{{$t('components.table.calculate')}}
|
|
115
115
|
<itf-icon name="chevron_down" />
|
|
116
116
|
</span>
|
|
117
|
-
<span v-else>
|
|
117
|
+
<span v-else class="text-truncate">
|
|
118
118
|
<span class="summary-text text-uppercase pe-2">{{getCalculateMethodTitle(column.calculate)}}</span>
|
|
119
119
|
<slot :name="`summary.${column.property}`" :value="getCalculateMethodValue(column.calculate, column)" :raw="!column.calculate.includes('count') && !column.calculate.includes('percent')">
|
|
120
120
|
<span>{{getCalculateMethodValue(column.calculate, column)}}</span>
|
|
@@ -279,7 +279,7 @@ class itfTableHeader extends Vue {
|
|
|
279
279
|
let newWidth;
|
|
280
280
|
const mouseMoveHandler = (event) => {
|
|
281
281
|
const delta = event.pageX - startX;
|
|
282
|
-
newWidth = Math.max(columnWidth + delta,
|
|
282
|
+
newWidth = Math.max(columnWidth + delta, 50);
|
|
283
283
|
columns.forEach((column) => {
|
|
284
284
|
if (!this.sortedColumns[index].grow) {
|
|
285
285
|
column.style.width = `${newWidth}px`;
|