aloha-vue 2.59.0 → 2.60.1

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.
@@ -1,268 +1,305 @@
1
- import {
2
- computed,
3
- nextTick,
4
- ref,
5
- toRef,
6
- } from "vue";
7
-
8
- import {
9
- setFocusToElement,
10
- } from "../../utils/utilsDOM";
11
-
12
- export default function DragAndDropAPI(props, { emit }, {
13
- isDndDisabled = computed(() => false),
14
- } = {}) {
15
- const focusAfterMove = toRef(props, "focusAfterMove");
16
- const id = toRef(props, "id");
17
- const isDragAndDrop = toRef(props, "isDragAndDrop");
18
- const rows = toRef(props, "rows");
19
-
20
- const draggedRowIndex = ref(undefined);
21
- const dragOverRowIndex = ref(undefined);
22
- const dragOverPosition = ref(undefined);
23
- const dragPreviewElement = ref(undefined);
24
-
25
- const removeDragPreview = () => {
26
- dragPreviewElement.value?.remove();
27
- dragPreviewElement.value = undefined;
28
- };
29
-
30
- const createDragPreview = $event => {
31
- const rowElement = $event.target?.closest?.("tr");
32
-
33
- if (!rowElement) {
34
- return undefined;
35
- }
36
-
37
- const rowRect = rowElement.getBoundingClientRect();
38
- const previewTable = document.createElement("table");
39
- const previewBody = document.createElement("tbody");
40
- const previewRow = rowElement.cloneNode(true);
41
-
42
- previewTable.className = "a_table_form__table";
43
- previewTable.style.borderCollapse = "collapse";
44
- previewTable.style.borderSpacing = "0";
45
- previewTable.style.width = `${ rowRect.width }px`;
46
- previewTable.style.tableLayout = "fixed";
47
-
48
- Array.from(rowElement.children).forEach((cell, index) => {
49
- const previewCell = previewRow.children[index];
50
-
51
- if (previewCell) {
52
- const cellStyles = window.getComputedStyle(cell);
53
-
54
- previewCell.style.width = `${ cell.getBoundingClientRect().width }px`;
55
- previewCell.style.backgroundColor = cellStyles.backgroundColor;
56
- previewCell.style.borderTop = cellStyles.borderTop;
57
- previewCell.style.borderRight = cellStyles.borderRight;
58
- previewCell.style.borderBottom = cellStyles.borderBottom;
59
- previewCell.style.borderLeft = cellStyles.borderLeft;
60
- previewCell.style.color = cellStyles.color;
61
- }
62
- });
63
-
64
- previewBody.appendChild(previewRow);
65
- previewTable.appendChild(previewBody);
66
-
67
- const previewWrapper = document.createElement("div");
68
- previewWrapper.className = "a_table_form a_table_form__drag_preview";
69
- previewWrapper.style.position = "fixed";
70
- previewWrapper.style.top = "-10000px";
71
- previewWrapper.style.left = "-10000px";
72
- previewWrapper.style.pointerEvents = "none";
73
- previewWrapper.style.zIndex = "9999";
74
- previewWrapper.appendChild(previewTable);
75
-
76
- document.body.appendChild(previewWrapper);
77
- dragPreviewElement.value = previewWrapper;
78
-
79
- return {
80
- element: previewWrapper,
81
- offsetX: Math.min($event.offsetX || 0, rowRect.width / 2),
82
- offsetY: Math.min($event.offsetY || 0, rowRect.height / 2),
83
- };
84
- };
85
-
86
- const moveRow = ({ focusId, fromIndex, toIndex, trigger }) => {
87
- if (!isDragAndDrop.value ||
88
- isDndDisabled.value ||
89
- fromIndex === toIndex ||
90
- fromIndex < 0 ||
91
- toIndex < 0 ||
92
- fromIndex >= rows.value.length ||
93
- toIndex >= rows.value.length) {
94
- return;
95
- }
96
-
97
- const ROWS_LOCAL = [...rows.value];
98
- const [movedRow] = ROWS_LOCAL.splice(fromIndex, 1);
99
- ROWS_LOCAL.splice(toIndex, 0, movedRow);
100
-
101
- emit("updateRows", { focusId, rows: ROWS_LOCAL, trigger, fromIndex, toIndex });
102
- emit("moveRow", {
103
- focusId,
104
- fromIndex,
105
- row: movedRow,
106
- toIndex,
107
- });
108
- };
109
-
110
- const moveRowToPosition = ({ fromIndex, rowIndex, position = "before" }) => {
111
- if (!isDragAndDrop.value ||
112
- isDndDisabled.value ||
113
- fromIndex < 0 ||
114
- rowIndex < 0 ||
115
- fromIndex >= rows.value.length ||
116
- rowIndex >= rows.value.length) {
117
- return;
118
- }
119
-
120
- let insertIndex = position === "after" ? rowIndex + 1 : rowIndex;
121
-
122
- if (fromIndex < insertIndex) {
123
- insertIndex -= 1;
124
- }
125
-
126
- moveRow({
127
- fromIndex,
128
- toIndex: insertIndex,
129
- trigger: "dnd",
130
- });
131
- };
132
-
133
- const setFocusAfterMoveLocal = ({ focusId }) => {
134
- if (!focusAfterMove.value) {
135
- return;
136
- }
137
-
138
- nextTick().then(
139
- () => {
140
- setFocusToElement({ selector: `#${ focusId }` });
141
- },
142
- );
143
- };
144
-
145
- const moveRowUp = rowIndex => {
146
- const focusIndex = Math.max(1, rowIndex - 1);
147
- const focusId = `${ id.value }_${ focusIndex }_up`;
148
- moveRow({
149
- focusId,
150
- fromIndex: rowIndex,
151
- toIndex: rowIndex - 1,
152
- trigger: "moveRowUp",
153
- });
154
-
155
- setFocusAfterMoveLocal({ focusId });
156
- };
157
-
158
- const moveRowDown = rowIndex => {
159
- const focusIndex = Math.min(rows.value.length - 2, rowIndex + 1);
160
- const focusId = `${ id.value }_${ focusIndex }_down`;
161
- moveRow({
162
- focusId,
163
- fromIndex: rowIndex,
164
- toIndex: rowIndex + 1,
165
- trigger: "moveRowDown",
166
- });
167
-
168
- setFocusAfterMoveLocal({ focusId });
169
- };
170
-
171
- const onDragstart = ($event, rowIndex) => {
172
- if (!isDragAndDrop.value || isDndDisabled.value) {
173
- return;
174
- }
175
-
176
- if ($event?.dataTransfer) {
177
- $event.dataTransfer.effectAllowed = "move";
178
- $event.dataTransfer.setData("text/plain", `${ rowIndex }`);
179
- removeDragPreview();
180
-
181
- const preview = createDragPreview($event);
182
- if (preview) {
183
- $event.dataTransfer.setDragImage(preview.element, preview.offsetX, preview.offsetY);
184
- }
185
- }
186
-
187
- draggedRowIndex.value = rowIndex;
188
- };
189
-
190
- const onDragover = ($event, rowIndex) => {
191
- if (!isDragAndDrop.value || isDndDisabled.value) {
192
- return;
193
- }
194
-
195
- $event.preventDefault();
196
-
197
- const rect = $event.currentTarget?.getBoundingClientRect?.();
198
- if (rect) {
199
- const middleY = rect.top + rect.height / 2;
200
- dragOverPosition.value = $event.clientY < middleY ? "before" : "after";
201
- } else {
202
- dragOverPosition.value = "after";
203
- }
204
-
205
- dragOverRowIndex.value = rowIndex;
206
- };
207
-
208
- const onDragleave = ($event, rowIndex) => {
209
- if (!isDragAndDrop.value || isDndDisabled.value) {
210
- return;
211
- }
212
-
213
- const relatedTarget = $event.relatedTarget;
214
- if ($event.currentTarget?.contains?.(relatedTarget)) {
215
- return;
216
- }
217
-
218
- if (dragOverRowIndex.value === rowIndex) {
219
- dragOverRowIndex.value = undefined;
220
- dragOverPosition.value = undefined;
221
- }
222
- };
223
-
224
- const onDrop = ($event, rowIndex) => {
225
- if (!isDragAndDrop.value || isDndDisabled.value) {
226
- return;
227
- }
228
-
229
- $event.preventDefault();
230
-
231
- if (draggedRowIndex.value === undefined) {
232
- return;
233
- }
234
-
235
- moveRowToPosition({
236
- fromIndex: draggedRowIndex.value,
237
- position: dragOverPosition.value || "after",
238
- rowIndex,
239
- });
240
-
241
- removeDragPreview();
242
- draggedRowIndex.value = undefined;
243
- dragOverRowIndex.value = undefined;
244
- dragOverPosition.value = undefined;
245
- };
246
-
247
- const onDragend = () => {
248
- removeDragPreview();
249
- draggedRowIndex.value = undefined;
250
- dragOverRowIndex.value = undefined;
251
- dragOverPosition.value = undefined;
252
- };
253
-
254
- return {
255
- canMoveRowDown: computed(() => rowIndex => rowIndex < rows.value.length - 1),
256
- canMoveRowUp: computed(() => rowIndex => rowIndex > 0),
257
- dragOverPosition,
258
- dragOverRowIndex,
259
- draggedRowIndex,
260
- onDragleave,
261
- moveRowDown,
262
- moveRowUp,
263
- onDragend,
264
- onDragover,
265
- onDragstart,
266
- onDrop,
267
- };
268
- }
1
+ import {
2
+ computed,
3
+ nextTick,
4
+ ref,
5
+ toRef,
6
+ } from "vue";
7
+
8
+ import {
9
+ setFocusToElement,
10
+ } from "../../utils/utilsDOM";
11
+ import {
12
+ get,
13
+ isFunction,
14
+ } from "lodash-es";
15
+
16
+ export default function DragAndDropAPI(props, { emit }, {
17
+ isDndDisabled = computed(() => false),
18
+ } = {}) {
19
+ const actionsDisabledCallback = toRef(props, "actionsDisabledCallback");
20
+ const focusAfterMove = toRef(props, "focusAfterMove");
21
+ const id = toRef(props, "id");
22
+ const isDragAndDrop = toRef(props, "isDragAndDrop");
23
+ const rows = toRef(props, "rows");
24
+
25
+ const draggedRowIndex = ref(undefined);
26
+ const dragOverRowIndex = ref(undefined);
27
+ const dragOverPosition = ref(undefined);
28
+ const dragPreviewElement = ref(undefined);
29
+
30
+ const isDndDisabledForRow = rowIndex => {
31
+ if (isDndDisabled.value) {
32
+ return true;
33
+ }
34
+
35
+ const dndCallback = get(actionsDisabledCallback.value, "dnd");
36
+
37
+ if (isFunction(dndCallback)) {
38
+ return !!dndCallback({
39
+ row: rows.value[rowIndex],
40
+ rowIndex,
41
+ });
42
+ }
43
+
44
+ return false;
45
+ };
46
+
47
+ const hasDisabledRowBetween = (fromIndex, toIndex) => {
48
+ const indexFrom = Math.min(fromIndex, toIndex);
49
+ const indexTo = Math.max(fromIndex, toIndex);
50
+
51
+ for (let rowIndex = indexFrom; rowIndex <= indexTo; rowIndex++) {
52
+ if (isDndDisabledForRow(rowIndex)) {
53
+ return true;
54
+ }
55
+ }
56
+
57
+ return false;
58
+ };
59
+
60
+ const removeDragPreview = () => {
61
+ dragPreviewElement.value?.remove();
62
+ dragPreviewElement.value = undefined;
63
+ };
64
+
65
+ const createDragPreview = $event => {
66
+ const rowElement = $event.target?.closest?.("tr");
67
+
68
+ if (!rowElement) {
69
+ return undefined;
70
+ }
71
+
72
+ const rowRect = rowElement.getBoundingClientRect();
73
+ const previewTable = document.createElement("table");
74
+ const previewBody = document.createElement("tbody");
75
+ const previewRow = rowElement.cloneNode(true);
76
+
77
+ previewTable.className = "a_table_form__table";
78
+ previewTable.style.borderCollapse = "collapse";
79
+ previewTable.style.borderSpacing = "0";
80
+ previewTable.style.width = `${ rowRect.width }px`;
81
+ previewTable.style.tableLayout = "fixed";
82
+
83
+ Array.from(rowElement.children).forEach((cell, index) => {
84
+ const previewCell = previewRow.children[index];
85
+
86
+ if (previewCell) {
87
+ const cellStyles = window.getComputedStyle(cell);
88
+
89
+ previewCell.style.width = `${ cell.getBoundingClientRect().width }px`;
90
+ previewCell.style.backgroundColor = cellStyles.backgroundColor;
91
+ previewCell.style.borderTop = cellStyles.borderTop;
92
+ previewCell.style.borderRight = cellStyles.borderRight;
93
+ previewCell.style.borderBottom = cellStyles.borderBottom;
94
+ previewCell.style.borderLeft = cellStyles.borderLeft;
95
+ previewCell.style.color = cellStyles.color;
96
+ }
97
+ });
98
+
99
+ previewBody.appendChild(previewRow);
100
+ previewTable.appendChild(previewBody);
101
+
102
+ const previewWrapper = document.createElement("div");
103
+ previewWrapper.className = "a_table_form a_table_form__drag_preview";
104
+ previewWrapper.style.position = "fixed";
105
+ previewWrapper.style.top = "-10000px";
106
+ previewWrapper.style.left = "-10000px";
107
+ previewWrapper.style.pointerEvents = "none";
108
+ previewWrapper.style.zIndex = "9999";
109
+ previewWrapper.appendChild(previewTable);
110
+
111
+ document.body.appendChild(previewWrapper);
112
+ dragPreviewElement.value = previewWrapper;
113
+
114
+ return {
115
+ element: previewWrapper,
116
+ offsetX: Math.min($event.offsetX || 0, rowRect.width / 2),
117
+ offsetY: Math.min($event.offsetY || 0, rowRect.height / 2),
118
+ };
119
+ };
120
+
121
+ const moveRow = ({ focusId, fromIndex, toIndex, trigger }) => {
122
+ if (!isDragAndDrop.value ||
123
+ isDndDisabled.value ||
124
+ fromIndex === toIndex ||
125
+ fromIndex < 0 ||
126
+ toIndex < 0 ||
127
+ fromIndex >= rows.value.length ||
128
+ toIndex >= rows.value.length ||
129
+ hasDisabledRowBetween(fromIndex, toIndex)) {
130
+ return;
131
+ }
132
+
133
+ const ROWS_LOCAL = [...rows.value];
134
+ const [movedRow] = ROWS_LOCAL.splice(fromIndex, 1);
135
+ ROWS_LOCAL.splice(toIndex, 0, movedRow);
136
+
137
+ emit("updateRows", { focusId, rows: ROWS_LOCAL, trigger, fromIndex, toIndex });
138
+ emit("moveRow", {
139
+ focusId,
140
+ fromIndex,
141
+ row: movedRow,
142
+ toIndex,
143
+ });
144
+ };
145
+
146
+ const moveRowToPosition = ({ fromIndex, rowIndex, position = "before" }) => {
147
+ if (!isDragAndDrop.value ||
148
+ isDndDisabled.value ||
149
+ fromIndex < 0 ||
150
+ rowIndex < 0 ||
151
+ fromIndex >= rows.value.length ||
152
+ rowIndex >= rows.value.length) {
153
+ return;
154
+ }
155
+
156
+ let insertIndex = position === "after" ? rowIndex + 1 : rowIndex;
157
+
158
+ if (fromIndex < insertIndex) {
159
+ insertIndex -= 1;
160
+ }
161
+
162
+ moveRow({
163
+ fromIndex,
164
+ toIndex: insertIndex,
165
+ trigger: "dnd",
166
+ });
167
+ };
168
+
169
+ const setFocusAfterMoveLocal = ({ focusId }) => {
170
+ if (!focusAfterMove.value) {
171
+ return;
172
+ }
173
+
174
+ nextTick().then(
175
+ () => {
176
+ setFocusToElement({ selector: `#${ focusId }` });
177
+ },
178
+ );
179
+ };
180
+
181
+ const moveRowUp = rowIndex => {
182
+ const focusIndex = Math.max(1, rowIndex - 1);
183
+ const focusId = `${ id.value }_${ focusIndex }_up`;
184
+ moveRow({
185
+ focusId,
186
+ fromIndex: rowIndex,
187
+ toIndex: rowIndex - 1,
188
+ trigger: "moveRowUp",
189
+ });
190
+
191
+ setFocusAfterMoveLocal({ focusId });
192
+ };
193
+
194
+ const moveRowDown = rowIndex => {
195
+ const focusIndex = Math.min(rows.value.length - 2, rowIndex + 1);
196
+ const focusId = `${ id.value }_${ focusIndex }_down`;
197
+ moveRow({
198
+ focusId,
199
+ fromIndex: rowIndex,
200
+ toIndex: rowIndex + 1,
201
+ trigger: "moveRowDown",
202
+ });
203
+
204
+ setFocusAfterMoveLocal({ focusId });
205
+ };
206
+
207
+ const onDragstart = ($event, rowIndex) => {
208
+ if (!isDragAndDrop.value || isDndDisabledForRow(rowIndex)) {
209
+ return;
210
+ }
211
+
212
+ if ($event?.dataTransfer) {
213
+ $event.dataTransfer.effectAllowed = "move";
214
+ $event.dataTransfer.setData("text/plain", `${ rowIndex }`);
215
+ removeDragPreview();
216
+
217
+ const preview = createDragPreview($event);
218
+ if (preview) {
219
+ $event.dataTransfer.setDragImage(preview.element, preview.offsetX, preview.offsetY);
220
+ }
221
+ }
222
+
223
+ draggedRowIndex.value = rowIndex;
224
+ };
225
+
226
+ const onDragover = ($event, rowIndex) => {
227
+ if (!isDragAndDrop.value || isDndDisabledForRow(rowIndex)) {
228
+ return;
229
+ }
230
+
231
+ $event.preventDefault();
232
+
233
+ const rect = $event.currentTarget?.getBoundingClientRect?.();
234
+ if (rect) {
235
+ const middleY = rect.top + rect.height / 2;
236
+ dragOverPosition.value = $event.clientY < middleY ? "before" : "after";
237
+ } else {
238
+ dragOverPosition.value = "after";
239
+ }
240
+
241
+ dragOverRowIndex.value = rowIndex;
242
+ };
243
+
244
+ const onDragleave = ($event, rowIndex) => {
245
+ if (!isDragAndDrop.value || isDndDisabledForRow(rowIndex)) {
246
+ return;
247
+ }
248
+
249
+ const relatedTarget = $event.relatedTarget;
250
+ if ($event.currentTarget?.contains?.(relatedTarget)) {
251
+ return;
252
+ }
253
+
254
+ if (dragOverRowIndex.value === rowIndex) {
255
+ dragOverRowIndex.value = undefined;
256
+ dragOverPosition.value = undefined;
257
+ }
258
+ };
259
+
260
+ const onDrop = ($event, rowIndex) => {
261
+ if (!isDragAndDrop.value || isDndDisabledForRow(rowIndex)) {
262
+ return;
263
+ }
264
+
265
+ $event.preventDefault();
266
+
267
+ if (draggedRowIndex.value === undefined) {
268
+ return;
269
+ }
270
+
271
+ moveRowToPosition({
272
+ fromIndex: draggedRowIndex.value,
273
+ position: dragOverPosition.value || "after",
274
+ rowIndex,
275
+ });
276
+
277
+ removeDragPreview();
278
+ draggedRowIndex.value = undefined;
279
+ dragOverRowIndex.value = undefined;
280
+ dragOverPosition.value = undefined;
281
+ };
282
+
283
+ const onDragend = () => {
284
+ removeDragPreview();
285
+ draggedRowIndex.value = undefined;
286
+ dragOverRowIndex.value = undefined;
287
+ dragOverPosition.value = undefined;
288
+ };
289
+
290
+ return {
291
+ canMoveRowDown: computed(() => rowIndex => rowIndex < rows.value.length - 1),
292
+ canMoveRowUp: computed(() => rowIndex => rowIndex > 0),
293
+ dragOverPosition,
294
+ dragOverRowIndex,
295
+ draggedRowIndex,
296
+ isDndDisabledForRow,
297
+ onDragleave,
298
+ moveRowDown,
299
+ moveRowUp,
300
+ onDragend,
301
+ onDragover,
302
+ onDragstart,
303
+ onDrop,
304
+ };
305
+ }
@@ -1,34 +1,35 @@
1
- import {
2
- computed,
3
- toRef,
4
- } from "vue";
5
-
6
- export default function TextsAPI(props) {
7
- const texts = toRef(props, "texts");
8
-
9
- const textsLocal = computed(() => {
10
- return {
11
- actionsColumn: "_A_TABLE_FORM_ACTIONS_",
12
- actionAddRow: "_A_TABLE_FORM_ADD_ROW_",
13
- actionDelete: "_A_TABLE_FORM_DELETE_",
14
- actionDeleteConfirmBody: "_A_TABLE_FORM_DELETE_CONFIRM_BODY_",
15
- actionDeleteConfirmClose: "_A_TABLE_FORM_DELETE_CONFIRM_CLOSE_",
16
- actionDeleteConfirmHeader: "_A_TABLE_FORM_DELETE_CONFIRM_HEADER_",
17
- actionDeleteConfirmSave: "_A_TABLE_FORM_DELETE_CONFIRM_SAVE_",
18
- actionEdit: "_A_TABLE_FORM_EDIT_",
19
- actionEditCancel: "_A_TABLE_FORM_EDIT_CANCEL_",
20
- actionEditSave: "_A_TABLE_FORM_EDIT_SAVE_",
21
- editInfoText: undefined,
22
- emptyText: "_A_TABLE_FORM_EMPTY_",
23
- reorderColumn: "_A_TABLE_FORM_REORDER_COLUMN_",
24
- reorderDown: "_A_TABLE_FORM_MOVE_DOWN_",
25
- reorderHandle: "_A_TABLE_FORM_REORDER_",
26
- reorderUp: "_A_TABLE_FORM_MOVE_UP_",
27
- ...texts.value,
28
- };
29
- });
30
-
31
- return {
32
- textsLocal,
33
- };
34
- }
1
+ import {
2
+ computed,
3
+ toRef,
4
+ } from "vue";
5
+
6
+ export default function TextsAPI(props) {
7
+ const texts = toRef(props, "texts");
8
+
9
+ const textsLocal = computed(() => {
10
+ return {
11
+ actionsColumn: "_A_TABLE_FORM_ACTIONS_",
12
+ actionAddRow: "_A_TABLE_FORM_ADD_ROW_",
13
+ actionDelete: "_A_TABLE_FORM_DELETE_",
14
+ actionDeleteConfirmBody: "_A_TABLE_FORM_DELETE_CONFIRM_BODY_",
15
+ actionDeleteConfirmClose: "_A_TABLE_FORM_DELETE_CONFIRM_CLOSE_",
16
+ actionDeleteConfirmHeader: "_A_TABLE_FORM_DELETE_CONFIRM_HEADER_",
17
+ actionDeleteConfirmSave: "_A_TABLE_FORM_DELETE_CONFIRM_SAVE_",
18
+ actionEdit: "_A_TABLE_FORM_EDIT_",
19
+ actionEditCancel: "_A_TABLE_FORM_EDIT_CANCEL_",
20
+ actionEditSave: "_A_TABLE_FORM_EDIT_SAVE_",
21
+ editInfoText: undefined,
22
+ emptyText: "_A_TABLE_FORM_EMPTY_",
23
+ reorderColumn: "_A_TABLE_FORM_REORDER_COLUMN_",
24
+ reorderDisabled: "_A_TABLE_FORM_REORDER_DISABLED_",
25
+ reorderDown: "_A_TABLE_FORM_MOVE_DOWN_",
26
+ reorderHandle: "_A_TABLE_FORM_REORDER_",
27
+ reorderUp: "_A_TABLE_FORM_MOVE_UP_",
28
+ ...texts.value,
29
+ };
30
+ });
31
+
32
+ return {
33
+ textsLocal,
34
+ };
35
+ }