@itfin/components 1.3.100 → 1.4.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 (151) hide show
  1. package/package.json +1 -1
  2. package/src/components/button/Button.vue +4 -2
  3. package/src/components/card/BentoCard.vue +70 -19
  4. package/src/components/card/BentoGrid.vue +21 -8
  5. package/src/components/filter/FilterAmountRange.vue +50 -42
  6. package/src/components/filter/FilterBadge.vue +27 -22
  7. package/src/components/filter/FilterFacetsList.vue +21 -17
  8. package/src/components/filter/FilterPanel.vue +141 -44
  9. package/src/components/filter/index.stories.js +0 -2
  10. package/src/components/form/Label.vue +19 -2
  11. package/src/components/icon/Icon.vue +4 -2
  12. package/src/components/icon/components/fi_fingerprint.vue +4 -0
  13. package/src/components/icon/components/nomi-ai.vue +6 -0
  14. package/src/components/icon/components/nomi-arrow-down.vue +4 -0
  15. package/src/components/icon/components/nomi-arrow-right-top.vue +4 -0
  16. package/src/components/icon/components/nomi-arrow-up.vue +4 -0
  17. package/src/components/icon/components/nomi-arrow_down.vue +4 -0
  18. package/src/components/icon/components/nomi-arrow_up.vue +4 -0
  19. package/src/components/icon/components/nomi-arrows.vue +7 -0
  20. package/src/components/icon/components/nomi-calendar-alt.vue +4 -0
  21. package/src/components/icon/components/nomi-calendar-alt2.vue +4 -0
  22. package/src/components/icon/components/nomi-calendar.vue +11 -0
  23. package/src/components/icon/components/nomi-card.vue +4 -0
  24. package/src/components/icon/components/nomi-clear.vue +4 -0
  25. package/src/components/icon/components/nomi-close.vue +5 -0
  26. package/src/components/icon/components/nomi-counterparty.vue +4 -0
  27. package/src/components/icon/components/nomi-dashboard.vue +4 -0
  28. package/src/components/icon/components/nomi-expand.vue +7 -0
  29. package/src/components/icon/components/nomi-eye-close.vue +4 -0
  30. package/src/components/icon/components/nomi-eye-open.vue +4 -0
  31. package/src/components/icon/components/nomi-eye.vue +4 -0
  32. package/src/components/icon/components/nomi-filter.vue +4 -0
  33. package/src/components/icon/components/nomi-help.vue +5 -0
  34. package/src/components/icon/components/nomi-hide.vue +4 -0
  35. package/src/components/icon/components/nomi-logout.vue +5 -0
  36. package/src/components/icon/components/nomi-money.vue +4 -0
  37. package/src/components/icon/components/nomi-move-left.vue +4 -0
  38. package/src/components/icon/components/nomi-move-right.vue +4 -0
  39. package/src/components/icon/components/nomi-pen.vue +5 -0
  40. package/src/components/icon/components/nomi-person.vue +5 -0
  41. package/src/components/icon/components/nomi-pin.vue +7 -0
  42. package/src/components/icon/components/nomi-project.vue +4 -0
  43. package/src/components/icon/components/nomi-recurrence.vue +2 -0
  44. package/src/components/icon/components/nomi-repeat.vue +7 -0
  45. package/src/components/icon/components/nomi-report.vue +4 -0
  46. package/src/components/icon/components/nomi-scissors.vue +4 -0
  47. package/src/components/icon/components/nomi-settings.vue +4 -0
  48. package/src/components/icon/components/nomi-sort-asc.vue +7 -0
  49. package/src/components/icon/components/nomi-sort-desc.vue +7 -0
  50. package/src/components/icon/components/nomi-table-view.vue +4 -0
  51. package/src/components/icon/components/nomi-tag.vue +4 -0
  52. package/src/components/icon/components/nomi-target.vue +4 -0
  53. package/src/components/icon/components/nomi-text.vue +6 -0
  54. package/src/components/icon/components/nomi-transactions.vue +8 -0
  55. package/src/components/icon/components/nomi-trash.vue +4 -0
  56. package/src/components/icon/components/nomi-unpin.vue +7 -0
  57. package/src/components/icon/components/nomi-user.vue +5 -0
  58. package/src/components/icon/convert-icons.js +11 -0
  59. package/src/components/icon/icons.js +332 -286
  60. package/src/components/icon/new-icons/ai.svg +5 -0
  61. package/src/components/icon/new-icons/arrow-down.svg +3 -0
  62. package/src/components/icon/new-icons/arrow-right-top.svg +3 -0
  63. package/src/components/icon/new-icons/arrow-up.svg +3 -0
  64. package/src/components/icon/new-icons/arrow_down.svg +3 -0
  65. package/src/components/icon/new-icons/arrow_up.svg +3 -0
  66. package/src/components/icon/new-icons/arrows.svg +6 -0
  67. package/src/components/icon/new-icons/calendar-alt.svg +3 -0
  68. package/src/components/icon/new-icons/calendar-alt2.svg +3 -0
  69. package/src/components/icon/new-icons/calendar.svg +10 -0
  70. package/src/components/icon/new-icons/card.svg +3 -0
  71. package/src/components/icon/new-icons/clear.svg +3 -0
  72. package/src/components/icon/new-icons/close.svg +4 -0
  73. package/src/components/icon/new-icons/counterparty.svg +3 -0
  74. package/src/components/icon/new-icons/dashboard.svg +3 -0
  75. package/src/components/icon/new-icons/expand.svg +6 -0
  76. package/src/components/icon/new-icons/eye-close.svg +3 -0
  77. package/src/components/icon/new-icons/eye-open.svg +3 -0
  78. package/src/components/icon/new-icons/eye.svg +3 -0
  79. package/src/components/icon/new-icons/filter.svg +3 -0
  80. package/src/components/icon/new-icons/help.svg +4 -0
  81. package/src/components/icon/new-icons/hide.svg +3 -0
  82. package/src/components/icon/new-icons/logout.svg +4 -0
  83. package/src/components/icon/new-icons/money.svg +3 -0
  84. package/src/components/icon/new-icons/move-left.svg +3 -0
  85. package/src/components/icon/new-icons/move-right.svg +3 -0
  86. package/src/components/icon/new-icons/pen.svg +4 -0
  87. package/src/components/icon/new-icons/person.svg +4 -0
  88. package/src/components/icon/new-icons/pin.svg +6 -0
  89. package/src/components/icon/new-icons/project.svg +3 -0
  90. package/src/components/icon/new-icons/recurrence.svg +1 -0
  91. package/src/components/icon/new-icons/repeat.svg +6 -0
  92. package/src/components/icon/new-icons/report.svg +3 -0
  93. package/src/components/icon/new-icons/scissors.svg +3 -0
  94. package/src/components/icon/new-icons/settings.svg +3 -0
  95. package/src/components/icon/new-icons/sort-asc.svg +6 -0
  96. package/src/components/icon/new-icons/sort-desc.svg +6 -0
  97. package/src/components/icon/new-icons/table-view.svg +3 -0
  98. package/src/components/icon/new-icons/tag.svg +3 -0
  99. package/src/components/icon/new-icons/target.svg +3 -0
  100. package/src/components/icon/new-icons/text.svg +5 -0
  101. package/src/components/icon/new-icons/transactions.svg +7 -0
  102. package/src/components/icon/new-icons/trash.svg +3 -0
  103. package/src/components/icon/new-icons/unpin.svg +6 -0
  104. package/src/components/icon/new-icons/user.svg +4 -0
  105. package/src/components/modal/DeleteConfirmModal.vue +0 -2
  106. package/src/components/modal/ItemEditor.vue +1 -5
  107. package/src/components/pagination/Pagination.vue +3 -2
  108. package/src/components/pagination/Pagination2.vue +179 -0
  109. package/src/components/panels/Panel.vue +23 -7
  110. package/src/components/panels/PanelItemEdit.vue +62 -0
  111. package/src/components/panels/PanelLink.vue +26 -6
  112. package/src/components/panels/PanelList.vue +27 -26
  113. package/src/components/panels/helpers.spec.ts +27 -0
  114. package/src/components/panels/helpers.ts +37 -0
  115. package/src/components/popover/NoticePopout.vue +1 -1
  116. package/src/components/select/Select.vue +1 -1
  117. package/src/components/sortable/draggable.js +2 -1
  118. package/src/components/table/Table2.vue +35 -8
  119. package/src/components/table/TableBody.vue +10 -18
  120. package/src/components/table/TableGroup.vue +29 -13
  121. package/src/components/table/TableHeader.vue +120 -69
  122. package/src/components/table/TableRowToggle.vue +51 -0
  123. package/src/components/table/TableRows.vue +20 -29
  124. package/src/components/table/index.stories.js +22 -200
  125. package/src/components/table/table2.scss +237 -68
  126. package/src/components/text-field/MoneyField.vue +23 -21
  127. package/src/components/text-field/TextField.vue +12 -8
  128. package/src/components/tree/TreeEditor.vue +615 -0
  129. package/src/components/view/View.vue +244 -0
  130. package/src/components/view/index.stories.js +588 -0
  131. package/src/helpers/formatters.js +14 -1
  132. package/src/helpers/tree/cdbl.js +32 -0
  133. package/src/helpers/tree/cint.js +43 -0
  134. package/src/helpers/tree/domDrag.js +911 -0
  135. package/src/helpers/tree/domFinds.js +20 -0
  136. package/src/helpers/tree/domGetPointFromEvent.js +53 -0
  137. package/src/helpers/tree/domIsClientXYIn.js +65 -0
  138. package/src/helpers/tree/domRemove.js +50 -0
  139. package/src/helpers/tree/evem.js +27 -0
  140. package/src/helpers/tree/genID.js +56 -0
  141. package/src/helpers/tree/isEle.js +28 -0
  142. package/src/helpers/tree/isestr.js +35 -0
  143. package/src/helpers/tree/isint.js +40 -0
  144. package/src/helpers/tree/isnbr.js +24 -0
  145. package/src/helpers/tree/isnum.js +38 -0
  146. package/src/helpers/tree/ispint.js +41 -0
  147. package/src/helpers/tree/isstr.js +27 -0
  148. package/src/helpers/tree.js +30 -0
  149. package/src/helpers/vuetifyColor.js +136 -0
  150. package/src/locales/en.js +17 -0
  151. package/src/locales/uk.js +17 -0
@@ -0,0 +1,615 @@
1
+ <template>
2
+ <div
3
+ :style="{
4
+ '--itf-tree-editor-disabled-font-size': `${textDisabledFontSize}px`,
5
+ '--itf-tree-editor-disabled-padding-left': `${textDisabledPaddingLeft}px`,
6
+ '--itf-tree-editor-disabled-background-color': $options.filters.color2hex(textDisabledBackgroundColor),
7
+ '--itf-tree-editor-disabled-color': $options.filters.color2hex(textDisabledColor),
8
+ '--itf-tree-editor-join-block-color': $options.filters.color2hex(joinBlockColor),
9
+ '--itf-tree-editor-shift-block-color': $options.filters.color2hex(shiftBlockColor),
10
+ '--itf-tree-editor-shift-line-color': $options.filters.color2hex(shiftLineColor)
11
+ }"
12
+ >
13
+ <div style="position:relative; user-select:none;">
14
+ <template v-for="(node,knode) in nodes">
15
+ <div
16
+ :key="get(node,itemKey,knode)"
17
+ class="itf-tree-editor_node"
18
+ :class="{ 'hidden': isNodeHidden(node) }"
19
+ :style="`transition:all 0.2s linear; cursor:pointer; outline:none; padding-left:${(node.nk.length - toggleStartLevel - 1)*indent}px;`"
20
+ :dragindex="knode"
21
+ tabindex="0"
22
+ dragtag
23
+ @mouseenter="(e)=>{$emit('mouseenter',{event:e,ele:e.target,node,knode})}"
24
+ @mouseleave="(e)=>{$emit('mouseleave',{event:e,ele:e.target,node,knode})}"
25
+ @keyup.enter="(e)=>{$emit('click',{event:e,ele:e.target,node,knode})}"
26
+ @click="(e)=>{$emit('click',{event:e,ele:e.target,node,knode})}"
27
+ >
28
+ <div v-if="node.level >= toggleStartLevel" class="itf-tree-editor_node_toggle ps-2">
29
+ <itf-button
30
+ v-if="autoToggleTree && node.level >= toggleStartLevel && node.Children && node.Children.length > 0"
31
+ small
32
+ @click.stop="toggleNode($event, node, knode)"
33
+ >
34
+ <itf-icon v-if="isNodeToggled(node)" name="plus" size="24" />
35
+ <itf-icon v-if="!isNodeToggled(node)" name="minus" size="24" />
36
+ </itf-button>
37
+ </div>
38
+ <div class="itf-tree-editor_node_content" :data-node="node[itemKey]">
39
+ <slot
40
+ name="item"
41
+ :isFirstElement="knode === 0"
42
+ :isLastElement="knode === nodes.length - 1"
43
+ :item="node"
44
+ :node="node"
45
+ :knode="knode"
46
+ />
47
+ </div>
48
+ </div>
49
+ </template>
50
+ <div
51
+ :style="{
52
+ position: 'absolute',
53
+ 'z-index': 9999,
54
+ left: `${dgTipLeft}px`,
55
+ top: `${dgTipTop}px`,
56
+ '--itf-tree-editor-tip-width': `${dgTipWidth}px`,
57
+ '--itf-tree-editor-tip-height': `${dgTipHeight}px`,
58
+ }"
59
+ >
60
+ <div v-if="dgTipMode==='lineTop'" class="itf-tree-editor_border-top" />
61
+ <div v-else-if="dgTipMode==='lineBottom'" class="itf-tree-editor_border-bottom" />
62
+ <div v-else-if="dgTipMode==='block'" class="itf-tree-editor_inside" />
63
+ <div v-else-if="dgTipMode==='disabled'" class="itf-tree-editor_disabled">
64
+ <div class="itf-tree-editor_disabled-text">
65
+ <template v-if="isNestingLimited">
66
+ {{ textDisabledNested }}
67
+ </template>
68
+ <template v-else>
69
+ {{ textDisabled }}
70
+ </template>
71
+ </div>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </template>
77
+ <style lang="scss">
78
+ :root {
79
+ --itf-tree-hover-bg: rgba(0 0 0 / 5%);
80
+ }
81
+ [data-theme="dark"] {
82
+ --itf-tree-hover-bg: rgba(255 255 255 / 5%);
83
+ }
84
+
85
+ .itf-tree-editor {
86
+ &_inside:after,
87
+ &_disabled:after,
88
+ &_border-top:after,
89
+ &_border-bottom:after {
90
+ content: " ";
91
+ display: block;
92
+ position: absolute;
93
+ top: -5px;
94
+ left: -5px;
95
+ border-left: 7px solid var(--bs-primary);
96
+ border-top: 7px solid transparent;
97
+ border-bottom: 7px solid transparent;
98
+ border-right: 7px solid transparent;
99
+ }
100
+ &_border-top {
101
+ display:inline-block;
102
+ width: var(--itf-tree-editor-tip-width);
103
+ height: var(--itf-tree-editor-tip-height);
104
+ /*background-color: var(--itf-tree-editor-shift-block-color);*/
105
+ border-top: 3px solid var(--bs-primary);
106
+ }
107
+ &_border-bottom {
108
+ display:inline-block;
109
+ width: var(--itf-tree-editor-tip-width);
110
+ height: var(--itf-tree-editor-tip-height);
111
+ /*background-color: var(--itf-tree-editor-shift-block-color);*/
112
+ border-bottom: 3px solid var(--bs-primary);
113
+
114
+ &:after {
115
+ top: auto;
116
+ bottom: 1px
117
+ }
118
+ }
119
+ &_inside {
120
+ display:inline-block;
121
+ border-radius: .5rem;
122
+ border: 1px solid var(--bs-primary);
123
+ width: var(--itf-tree-editor-tip-width);
124
+ height: var(--itf-tree-editor-tip-height);
125
+ background-color: var(--itf-tree-editor-shift-block-color);
126
+
127
+ &:after {
128
+ top: 50%;
129
+ transform: translateY(-100%);
130
+ left: -7px;
131
+ }
132
+ }
133
+ &_node {
134
+ display: flex;
135
+ position: relative;
136
+ }
137
+ &_node.hidden {
138
+ display: none;
139
+ }
140
+ &_node .selected,
141
+ &_node:hover {
142
+ background-color: var(--itf-tree-hover-bg);
143
+ }
144
+ &_node_toggle {
145
+ margin-left: 0;
146
+ width: 45px;
147
+ display: flex;
148
+ align-items: center;
149
+ }
150
+ &_node_content {
151
+ flex-grow: 1;
152
+ align-items: start;
153
+ }
154
+ &_disabled {
155
+ display:inline-flex;
156
+ width: var(--itf-tree-editor-tip-width);
157
+ height: var(--itf-tree-editor-tip-height);
158
+ background-color: var(--itf-tree-editor-disabled-background-color);
159
+ color: var(--itf-tree-editor-disabled-color);
160
+ line-height: var(--itf-tree-editor-tip-height);
161
+ vertical-align: middle;
162
+
163
+ &-text {
164
+ font-size: var(--itf-tree-editor-disabled-font-size);
165
+ padding-left: var(--itf-tree-editor-disabled-padding-left);
166
+ }
167
+
168
+ &:after {
169
+ content: '';
170
+ display: none;
171
+ }
172
+ }
173
+ }
174
+ </style>
175
+ <script>
176
+ import Vue from 'vue';
177
+ import pullAt from 'lodash/pullAt';
178
+ import size from 'lodash/size';
179
+ import dropRight from 'lodash/dropRight';
180
+ import takeRight from 'lodash/takeRight';
181
+ import cloneDeep from 'lodash/cloneDeep';
182
+ import get from 'lodash/get';
183
+ import set from 'lodash/set';
184
+ import min from 'lodash/min';
185
+ import take from 'lodash/take';
186
+ import isEqual from 'lodash/isEqual';
187
+ import domDrag from '../../helpers/tree/domDrag';
188
+ import cint from '../../helpers/tree/cint';
189
+ import itfButton from '../button/Button';
190
+ import itfIcon from '../icon/Icon';
191
+ import color2hex from '../../helpers/vuetifyColor';
192
+ import {buildTree, flattenTree} from '../../helpers/tree';
193
+
194
+ export default {
195
+ components: {
196
+ itfIcon,
197
+ itfButton
198
+ },
199
+ filters: {
200
+ color2hex
201
+ },
202
+ props: {
203
+ items: {
204
+ type: Array,
205
+ default: () => []
206
+ },
207
+ selectedItem: {
208
+ type: Object,
209
+ default: () => null
210
+ },
211
+ itemKey: {
212
+ type: String,
213
+ default: 'Id'
214
+ },
215
+ itemChildren: {
216
+ type: String,
217
+ default: 'Children'
218
+ },
219
+ indent: {
220
+ type: Number,
221
+ default: 10
222
+ },
223
+ textDisabled: {
224
+ type: String,
225
+ default: 'Can not drop here'
226
+ },
227
+ textDisabledNested: {
228
+ type: String,
229
+ default: 'Tree has a limitation in nesting, can not drop here'
230
+ },
231
+ textDisabledColor: {
232
+ type: String,
233
+ default: '#812'
234
+ },
235
+ textDisabledPaddingLeft: {
236
+ type: Number,
237
+ default: 15
238
+ },
239
+ textDisabledFontSize: {
240
+ type: String,
241
+ default: '0.9rem'
242
+ },
243
+ textDisabledBackgroundColor: {
244
+ type: String,
245
+ default: 'rgba(255,220,240,0.6)'
246
+ },
247
+ shiftLineColor: {
248
+ type: String,
249
+ default: '#29f'
250
+ },
251
+ shiftBlockColor: {
252
+ type: String,
253
+ default: 'rgba(80,150,255,0.15)'
254
+ },
255
+ joinBlockColor: {
256
+ type: String,
257
+ default: 'rgba(80,150,255,0.3)'
258
+ },
259
+ maxNestingLevels: {
260
+ type: Number,
261
+ default: null
262
+ },
263
+ allowDrop: {
264
+ type: Function,
265
+ default: null
266
+ },
267
+ handle: {
268
+ type: String,
269
+ default: null
270
+ },
271
+ readOnly: {
272
+ type: Boolean,
273
+ default: false
274
+ },
275
+ flat: {
276
+ type: Boolean,
277
+ default: false
278
+ },
279
+ autoToggleTree: {
280
+ type: Boolean,
281
+ default: false
282
+ },
283
+ toggleStartLevel: {
284
+ type: Number,
285
+ default: 1
286
+ },
287
+ parentKey: {
288
+ type: String,
289
+ default: 'ParentId'
290
+ }
291
+ },
292
+ data () {
293
+ return {
294
+ get,
295
+ dd: null,
296
+ dgTipMode: '',
297
+ dgTipLeft: 0,
298
+ dgTipTop: 0,
299
+ dgTipWidth: 0,
300
+ dgTipHeight: 0,
301
+ isNestingLimited: false,
302
+ toggledItems: this.toggledItems || {},
303
+ hiddenItems: this.hiddenItems || {}
304
+ };
305
+ },
306
+ computed: {
307
+ itemsTrans () {
308
+ let items = cloneDeep(this.items);
309
+ if (this.flat) {
310
+ items = buildTree(items, this.itemKey, this.parentKey, this.itemChildren);
311
+ }
312
+ return items;
313
+ },
314
+ nodes () {
315
+ let items = this.itemsTrans;
316
+ const list = flattenTree(items, 4, 0, null, [], this.itemChildren).map((item) => {
317
+ const [, ...nk] = item.path;
318
+ return { ...item, nk };
319
+ });
320
+ return list;
321
+ }
322
+ },
323
+ watch: {
324
+ selectedItem () {
325
+ if (this.selectedItem && this.firstInited && this.items.length) {
326
+ const node = this.nodes.find(nd => nd[this.itemKey] === this.selectedItem[this.itemKey]);
327
+ if (node) {
328
+ this.firstInited = false;
329
+ this.toggleParentHidden(node, false);
330
+ }
331
+ }
332
+ },
333
+ items () {
334
+ const draggable = get(this, 'dd.draggable');
335
+ if (draggable) {
336
+ draggable.destroy();
337
+ }
338
+ this.$nextTick(() => this.init());
339
+ }
340
+ },
341
+ mounted () {
342
+ this.init();
343
+ },
344
+ beforeDestroy () {
345
+ const draggable = get(this, 'dd.draggable');
346
+ if (draggable) {
347
+ draggable.destroy();
348
+ }
349
+ },
350
+ methods: {
351
+ init () {
352
+ this.firstInited = true;
353
+ // domDrag
354
+ const dd = domDrag(this.$el, {
355
+ attIndex: 'dragindex',
356
+ attGroup: 'draggroup',
357
+ selectors: '[dragtag]',
358
+ handle: this.handle,
359
+ previewBackground: 'rgba(255,255,255,.75)',
360
+ previewBorderColor: color2hex('blue-grey')
361
+ });
362
+ // change
363
+ dd.on('change', (msg) => {
364
+ // console.log('change', msg)
365
+ });
366
+ dd.on('start', (msg) => {
367
+ // console.log('start', msg)
368
+ });
369
+ dd.on('move', (msg) => {
370
+ // console.info('move');
371
+ // belong
372
+ const nodeSelf = this.nodes[msg.startInd];
373
+ const nodeEnter = this.nodes[msg.endInd];
374
+ const belong = this.isNkBelong(nodeEnter.nk, nodeSelf.nk);
375
+ // location
376
+ this.dgTipTop = msg.endEle.offsetTop;
377
+ this.dgTipLeft = msg.endEle.offsetLeft;
378
+ this.dgTipWidth = msg.endEle.offsetWidth;
379
+ this.dgTipHeight = msg.endEle.offsetHeight;
380
+ // dgTipMode
381
+ if (belong) {
382
+ this.dgTipMode = 'disabled';
383
+ } else if (msg.ry <= 0.3) {
384
+ this.dgTipMode = 'lineTop';
385
+ } else if (msg.ry >= 0.7) {
386
+ this.dgTipMode = 'lineBottom';
387
+ } else if (msg.ry > 0.3 && msg.ry < 0.7) {
388
+ this.dgTipMode = 'block';
389
+ } else {
390
+ // 不會有此狀況
391
+ this.dgTipMode = '';
392
+ }
393
+
394
+ this.isNestingLimited = false;
395
+ // limit nesting level
396
+ const level = Math.floor(nodeEnter.nk.length / 2);
397
+ if (typeof this.maxNestingLevels !== 'undefined' && ((level > this.maxNestingLevels) || (level >= this.maxNestingLevels && this.dgTipMode === 'block'))) {
398
+ this.dgTipMode = 'disabled';
399
+ this.isNestingLimited = true;
400
+ }
401
+ if (!nodeEnter.isGroup && this.dgTipMode === 'block') {
402
+ this.dgTipMode = 'disabled';
403
+ }
404
+ if (this.dgTipMode !== 'disabled' && this.allowDrop && !this.allowDrop(nodeSelf, nodeEnter, this.dgTipMode)) {
405
+ this.dgTipMode = 'disabled';
406
+ }
407
+ });
408
+ dd.on('enter', (msg) => {
409
+ // console.log('enter', msg)
410
+ });
411
+ dd.on('leave', (msg) => {
412
+ // console.log('leave', msg)
413
+ this.dgTipMode = '';
414
+ });
415
+ dd.on('drop', (msg) => {
416
+ // console.log('drop', msg)
417
+ // check
418
+ if (this.dgTipMode === '') {
419
+ // console.log('純點擊時無move故無有效拖曳模式')
420
+ return;
421
+ }
422
+ // modeDir
423
+ let modeDir = '';
424
+ if (cint(msg.startInd) < cint(msg.endInd)) {
425
+ modeDir = 'backward';
426
+ } else if (cint(msg.startInd) > cint(msg.endInd)) {
427
+ modeDir = 'forward';
428
+ }
429
+ // check
430
+ if (modeDir === '') {
431
+ this.dgTipMode = '';
432
+ return;
433
+ }
434
+ // modeInsert
435
+ let modeInsert;
436
+ if (this.dgTipMode === 'disabled') {
437
+ this.dgTipMode = '';
438
+ return;
439
+ } else if (this.dgTipMode === 'lineTop') {
440
+ modeInsert = 'before';
441
+ } else if (this.dgTipMode === 'lineBottom') {
442
+ modeInsert = 'after';
443
+ } else if (this.dgTipMode === 'block') {
444
+ modeInsert = 'belongto';
445
+ } else {
446
+ // console.log('invalid dgTipMode', this.dgTipMode)
447
+ }
448
+ // nkFrom
449
+ const nodeFrom = this.nodes[msg.startInd];
450
+ const nkFrom = cloneDeep(nodeFrom.nk);
451
+ // nkTo
452
+ const nodeTo = this.nodes[msg.endInd];
453
+ const nkTo = cloneDeep(nodeTo.nk);
454
+
455
+ // clear
456
+ this.dgTipMode = '';
457
+
458
+ let newItems = this.moveItem(this.itemsTrans, nkFrom, nkTo, modeDir, modeInsert);
459
+ if (this.flat) {
460
+ newItems = flattenTree(newItems, 4, 0, null, [], this.itemChildren).map(node => {
461
+ node.parentId = node.parentNode ? node.parentNode[this.itemKey] : null;
462
+ return node;
463
+ });
464
+ }
465
+ this.$emit('update:items', newItems);
466
+ });
467
+ // save
468
+ this.dd = dd;
469
+ },
470
+ isNodeHidden (node) {
471
+ if (!this.autoToggleTree) {
472
+ return false;
473
+ }
474
+ if (node.parentNode && this.toggledItems[node.parentNode[this.itemKey]] !== undefined) {
475
+ return this.toggledItems[node.parentNode[this.itemKey]];
476
+ }
477
+ // if (this.hiddenItems[node.Id] !== undefined) {
478
+ // return this.hiddenItems[node.Id];
479
+ // }
480
+ return node.level > 1;
481
+ },
482
+ isNodeToggled (node) {
483
+ if (this.toggledItems[node[this.itemKey]] !== undefined) {
484
+ return this.toggledItems[node[this.itemKey]];
485
+ }
486
+ return node.level > 0;
487
+ },
488
+ toggleNode ($event, node, knode) {
489
+ if (this.toggledItems[node[this.itemKey]] === undefined) {
490
+ Vue.set(this.toggledItems, node[this.itemKey], true);
491
+ }
492
+ Vue.set(this.toggledItems, node[this.itemKey], !this.toggledItems[node[this.itemKey]]);
493
+ if (this.toggledItems[node[this.itemKey]]) { // show only 1st level
494
+ this.toggleChildrenHidden(node[this.itemKey], true);
495
+ } else if (node.Children) {
496
+ for (const subNode of node.Children) {
497
+ this.$set(this.hiddenItems, subNode[this.itemKey], this.toggledItems[node[this.itemKey]]);
498
+ }
499
+ }
500
+ },
501
+ toggleChildrenHidden (id, hide) {
502
+ const subNodes = this.nodes.filter(nd => nd[this.parentKey] === id);
503
+ if (subNodes) {
504
+ for (const subNode of subNodes) {
505
+ this.$set(this.hiddenItems, subNode[this.itemKey], hide);
506
+ this.$set(this.toggledItems, subNode[this.itemKey], hide);
507
+ this.toggleChildrenHidden(subNode[this.itemKey], hide);
508
+ }
509
+ }
510
+ },
511
+ toggleParentHidden (node, hide) {
512
+ this.$set(this.hiddenItems, node[this.itemKey], hide);
513
+ this.$set(this.toggledItems, node[this.itemKey], hide);
514
+ if (node.Children) {
515
+ for (const subNode of node.Children) {
516
+ this.$set(this.hiddenItems, subNode[this.itemKey], hide);
517
+ }
518
+ }
519
+ if (node[this.parentKey]) {
520
+ const parent = this.nodes.find(nd => nd[this.itemKey] === node[this.parentKey]);
521
+ if (parent) {
522
+ this.toggleParentHidden(parent, hide);
523
+ }
524
+ }
525
+ },
526
+ isNkBelong (arEnter, arSelf) {
527
+ function isArrayOverlap (ar1, ar2) {
528
+ // n
529
+ const n = min([size(ar1), size(ar2)]);
530
+ const tr1 = take(ar1, n);
531
+ const tr2 = take(ar2, n);
532
+ // isEqual
533
+ return isEqual(tr1, tr2);
534
+ }
535
+ if (size(arEnter) >= size(arSelf)) {
536
+ return isArrayOverlap(arEnter, arSelf);
537
+ }
538
+ return false;
539
+ },
540
+ deleteItem (items, nkFrom) {
541
+ // console.log('methods deleteItem', items, nkFrom)
542
+ // cloneDeep
543
+ items = cloneDeep(items);
544
+ let ks;
545
+ let ind = null;
546
+ // eslint-disable-next-line no-empty
547
+ if (size(nkFrom) === 0) {
548
+ } else if (size(nkFrom) === 1) {
549
+ ks = nkFrom;
550
+ } else {
551
+ ks = dropRight(nkFrom);
552
+ ind = takeRight(nkFrom);
553
+ }
554
+ if (!ind) {
555
+ // pullAt
556
+ pullAt(items, nkFrom);
557
+ } else {
558
+ const src = get(items, ks, []);
559
+ // pullAt
560
+ pullAt(src, [ind]);
561
+ }
562
+ return items;
563
+ },
564
+ moveItem (items, nkFrom, nkTo, modeDir, modeInsert) {
565
+ // console.log('methods moveItem', items, nkFrom, nkTo, modeDir, modeInsert)
566
+ // check
567
+ if (modeDir !== 'forward' && modeDir !== 'backward') {
568
+ // console.log('invalid modeDir', modeDir);
569
+ }
570
+ if (size(nkFrom) === 0) {
571
+ // console.log('invalid nkFrom', nkTo);
572
+ }
573
+ if (size(nkTo) === 0) {
574
+ // console.log('invalid nkTo', nkTo);
575
+ }
576
+ // cloneDeep
577
+ items = cloneDeep(items);
578
+ const src = get(items, nkFrom);
579
+ // modeDir
580
+ if (modeDir === 'forward') {
581
+ items = this.deleteItem(items, nkFrom);
582
+ }
583
+ let ind = takeRight(nkTo)[0];
584
+ if (modeInsert === 'before' || modeInsert === 'after') {
585
+ let tar;
586
+ if (size(nkTo) === 1) {
587
+ tar = items;
588
+ } else {
589
+ const ks = dropRight(nkTo);
590
+ tar = get(items, ks, []);
591
+ }
592
+ if (modeInsert === 'before') {
593
+ // ind = ind
594
+ } else if (modeInsert === 'after') {
595
+ ind += 1;
596
+ }
597
+ tar.splice(ind, 0, src);
598
+ } else if (modeInsert === 'belongto') {
599
+ const tar = get(items, [...nkTo, this.itemChildren], []);
600
+ // push
601
+ tar.push(src);
602
+ // set
603
+ set(items, [...nkTo, this.itemChildren], tar);
604
+ } else {
605
+ // console.log('invalid modeInsert', modeInsert);
606
+ }
607
+ // modeDir
608
+ if (modeDir === 'backward') {
609
+ items = this.deleteItem(items, nkFrom);
610
+ }
611
+ return items;
612
+ }
613
+ }
614
+ };
615
+ </script>