aloha-vue 2.60.0 → 2.61.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.
- package/CHANGELOG.md +8 -0
- package/dist/aloha-vue.css +9 -0
- package/dist/aloha-vue.css.map +1 -1
- package/dist/aloha-vue.es.js +9553 -9379
- package/dist/aloha-vue.umd.js +49 -49
- package/package.json +1 -1
- package/scss/components/ATableForm.scss +13 -0
- package/src/ATableForm/ATableForm.js +18 -6
- package/src/ATableForm/ATableFormCellList/ATableFormCellList.js +122 -0
- package/src/ATableForm/ATableFormCellList/compositionAPI/DataAPI.js +60 -0
- package/src/ATableForm/ATableFormRow/ATableFormRow.js +463 -443
- package/src/ATableForm/ATableFormRow/compositionAPI/EditAPI.js +102 -98
- package/src/ATableForm/__tests__/ATableForm.DragAndDropAPI.test.js +3 -1
- package/src/ATableForm/__tests__/ATableForm.ListView.test.js +255 -0
- package/src/ATableForm/compositionAPI/ColumnsAPI.js +40 -39
- package/src/ATableForm/compositionAPI/DragAndDropAPI.js +6 -3
- package/src/ATableForm/compositionAPI/EditAPI.js +127 -119
- package/src/ui/AForm/AForm.js +14 -9
|
@@ -1,98 +1,102 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ref,
|
|
3
|
-
toRef,
|
|
4
|
-
} from "vue";
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
cloneDeep,
|
|
8
|
-
set,
|
|
9
|
-
unset,
|
|
10
|
-
} from "lodash-es";
|
|
11
|
-
|
|
12
|
-
export default function EditAPI(props, {
|
|
13
|
-
errorsLocal = ref(undefined),
|
|
14
|
-
}) {
|
|
15
|
-
const changeModel = toRef(props, "changeModel");
|
|
16
|
-
const onCancelEditRow = toRef(props, "onCancelEditRow");
|
|
17
|
-
const row = toRef(props, "row");
|
|
18
|
-
const rows = toRef(props, "rows");
|
|
19
|
-
const rowIndex = toRef(props, "rowIndex");
|
|
20
|
-
const saveRow = toRef(props, "saveRow");
|
|
21
|
-
|
|
22
|
-
const isSaving = ref(false);
|
|
23
|
-
const modelLocal = ref(undefined);
|
|
24
|
-
|
|
25
|
-
const updateModelLocal = ({
|
|
26
|
-
column,
|
|
27
|
-
columnId,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
1
|
+
import {
|
|
2
|
+
ref,
|
|
3
|
+
toRef,
|
|
4
|
+
} from "vue";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
cloneDeep,
|
|
8
|
+
set,
|
|
9
|
+
unset,
|
|
10
|
+
} from "lodash-es";
|
|
11
|
+
|
|
12
|
+
export default function EditAPI(props, {
|
|
13
|
+
errorsLocal = ref(undefined),
|
|
14
|
+
}) {
|
|
15
|
+
const changeModel = toRef(props, "changeModel");
|
|
16
|
+
const onCancelEditRow = toRef(props, "onCancelEditRow");
|
|
17
|
+
const row = toRef(props, "row");
|
|
18
|
+
const rows = toRef(props, "rows");
|
|
19
|
+
const rowIndex = toRef(props, "rowIndex");
|
|
20
|
+
const saveRow = toRef(props, "saveRow");
|
|
21
|
+
|
|
22
|
+
const isSaving = ref(false);
|
|
23
|
+
const modelLocal = ref(undefined);
|
|
24
|
+
|
|
25
|
+
const updateModelLocal = ({
|
|
26
|
+
column,
|
|
27
|
+
columnId,
|
|
28
|
+
fullModel,
|
|
29
|
+
item,
|
|
30
|
+
model,
|
|
31
|
+
}) => {
|
|
32
|
+
if (!modelLocal.value) {
|
|
33
|
+
modelLocal.value = cloneDeep(row.value) || {};
|
|
34
|
+
}
|
|
35
|
+
let changedModel;
|
|
36
|
+
|
|
37
|
+
if (changeModel.value) {
|
|
38
|
+
changedModel = changeModel.value({
|
|
39
|
+
modelAll: modelLocal.value,
|
|
40
|
+
row: row.value,
|
|
41
|
+
column,
|
|
42
|
+
fullModel,
|
|
43
|
+
model: model,
|
|
44
|
+
item,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (changedModel?.model) {
|
|
48
|
+
modelLocal.value = cloneDeep(changedModel.model);
|
|
49
|
+
} else if (fullModel !== undefined) {
|
|
50
|
+
modelLocal.value = cloneDeep(fullModel);
|
|
51
|
+
} else {
|
|
52
|
+
set(modelLocal.value, columnId, model);
|
|
53
|
+
}
|
|
54
|
+
unset(errorsLocal.value, columnId);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const cancelEditRow = ({ trigger, id } = {}) => {
|
|
58
|
+
onCancelEditRow.value({
|
|
59
|
+
row: row.value,
|
|
60
|
+
rowIndex: rowIndex.value,
|
|
61
|
+
trigger,
|
|
62
|
+
id,
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
const saveEditRow = async({ id } = {}) => {
|
|
67
|
+
if (isSaving.value) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
errorsLocal.value = {};
|
|
72
|
+
isSaving.value = true;
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const result = await saveRow.value({
|
|
76
|
+
model: cloneDeep(modelLocal.value),
|
|
77
|
+
row: row.value,
|
|
78
|
+
rowIndex: rowIndex.value,
|
|
79
|
+
rows: rows.value,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (result?.errors) {
|
|
83
|
+
errorsLocal.value = cloneDeep(result.errors);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
cancelEditRow({ trigger: "save", id });
|
|
88
|
+
} catch (error) {
|
|
89
|
+
errorsLocal.value = error;
|
|
90
|
+
} finally {
|
|
91
|
+
isSaving.value = false;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
cancelEditRow,
|
|
97
|
+
isSaving,
|
|
98
|
+
modelLocal,
|
|
99
|
+
saveEditRow,
|
|
100
|
+
updateModelLocal,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -62,7 +62,9 @@ describe("ATableForm DragAndDropAPI", () => {
|
|
|
62
62
|
it("prevents dragging, dropping on, and moving across a disabled row", () => {
|
|
63
63
|
const emit = jest.fn();
|
|
64
64
|
const props = reactive({
|
|
65
|
-
|
|
65
|
+
actionsDisabledCallback: {
|
|
66
|
+
dnd: ({ row }) => row.dndDisabled,
|
|
67
|
+
},
|
|
66
68
|
focusAfterMove: false,
|
|
67
69
|
id: "table",
|
|
68
70
|
isDragAndDrop: true,
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import {
|
|
2
|
+
reactive,
|
|
3
|
+
ref,
|
|
4
|
+
} from "vue";
|
|
5
|
+
import {
|
|
6
|
+
describe,
|
|
7
|
+
expect,
|
|
8
|
+
it,
|
|
9
|
+
jest,
|
|
10
|
+
} from "@jest/globals";
|
|
11
|
+
import {
|
|
12
|
+
mount,
|
|
13
|
+
} from "@vue/test-utils";
|
|
14
|
+
|
|
15
|
+
import AForm from "../../ui/AForm/AForm";
|
|
16
|
+
import ATableFormCellList from "../ATableFormCellList/ATableFormCellList";
|
|
17
|
+
|
|
18
|
+
import ColumnsAPI from "../compositionAPI/ColumnsAPI";
|
|
19
|
+
import DataAPI from "../ATableFormCellList/compositionAPI/DataAPI";
|
|
20
|
+
import RowEditAPI from "../ATableFormRow/compositionAPI/EditAPI";
|
|
21
|
+
import TableEditAPI from "../compositionAPI/EditAPI";
|
|
22
|
+
|
|
23
|
+
jest.mock("../../ui/AForm/AForm", () => {
|
|
24
|
+
const {
|
|
25
|
+
h,
|
|
26
|
+
} = require("vue");
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
__esModule: true,
|
|
30
|
+
default: {
|
|
31
|
+
name: "AForm",
|
|
32
|
+
props: {
|
|
33
|
+
data: Array,
|
|
34
|
+
errors: Object,
|
|
35
|
+
idPrefix: String,
|
|
36
|
+
modelValue: Object,
|
|
37
|
+
readonly: Boolean,
|
|
38
|
+
showErrors: Boolean,
|
|
39
|
+
showRequiredText: Boolean,
|
|
40
|
+
tag: String,
|
|
41
|
+
useFlatErrors: Boolean,
|
|
42
|
+
useFlatModel: Boolean,
|
|
43
|
+
},
|
|
44
|
+
emits: [
|
|
45
|
+
"change",
|
|
46
|
+
],
|
|
47
|
+
render() {
|
|
48
|
+
return h("div");
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe("ATableForm list view", () => {
|
|
55
|
+
it("uses one content column and finds required fields recursively", () => {
|
|
56
|
+
const props = reactive({
|
|
57
|
+
columns: [
|
|
58
|
+
{
|
|
59
|
+
id: "fieldset",
|
|
60
|
+
formElement: {
|
|
61
|
+
children: [
|
|
62
|
+
{
|
|
63
|
+
id: "requiredChild",
|
|
64
|
+
required: true,
|
|
65
|
+
type: "text",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
type: "fieldset",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: "secondColumn",
|
|
73
|
+
formElement: {
|
|
74
|
+
type: "text",
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
isAddable: false,
|
|
79
|
+
isDeletable: true,
|
|
80
|
+
isDeletableConfirm: false,
|
|
81
|
+
isDragAndDrop: true,
|
|
82
|
+
isEditable: true,
|
|
83
|
+
rowView: "list",
|
|
84
|
+
rows: [],
|
|
85
|
+
});
|
|
86
|
+
const {
|
|
87
|
+
allColumnsLength,
|
|
88
|
+
columnsVisible,
|
|
89
|
+
hasActionsColumn,
|
|
90
|
+
} = ColumnsAPI(props);
|
|
91
|
+
const {
|
|
92
|
+
hasRequiredEditableColumns,
|
|
93
|
+
} = TableEditAPI(props, {
|
|
94
|
+
columnsVisible,
|
|
95
|
+
getRowKey: jest.fn(),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(allColumnsLength.value).toBe(3);
|
|
99
|
+
expect(hasRequiredEditableColumns.value).toBe(true);
|
|
100
|
+
|
|
101
|
+
props.rowView = "table";
|
|
102
|
+
expect(allColumnsLength.value).toBe(4);
|
|
103
|
+
expect(hasActionsColumn.value).toBe(true);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("converts columns and nested fieldsets to AForm data", () => {
|
|
107
|
+
const props = reactive({
|
|
108
|
+
columns: [
|
|
109
|
+
{
|
|
110
|
+
id: "limits",
|
|
111
|
+
label: "Limits",
|
|
112
|
+
formElement: {
|
|
113
|
+
type: "fieldset",
|
|
114
|
+
children: [
|
|
115
|
+
{
|
|
116
|
+
id: "negative",
|
|
117
|
+
label: "Negative",
|
|
118
|
+
type: "integer",
|
|
119
|
+
useRowReadonly: true,
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
isEditable: true,
|
|
126
|
+
isEditMode: false,
|
|
127
|
+
});
|
|
128
|
+
const {
|
|
129
|
+
dataForm,
|
|
130
|
+
} = DataAPI(props);
|
|
131
|
+
|
|
132
|
+
expect(dataForm.value).toEqual([
|
|
133
|
+
{
|
|
134
|
+
children: [
|
|
135
|
+
{
|
|
136
|
+
id: "negative",
|
|
137
|
+
label: "Negative",
|
|
138
|
+
readonly: true,
|
|
139
|
+
type: "integer",
|
|
140
|
+
useRowReadonly: true,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
disabled: true,
|
|
144
|
+
id: "limits",
|
|
145
|
+
label: "Limits",
|
|
146
|
+
type: "fieldset",
|
|
147
|
+
},
|
|
148
|
+
]);
|
|
149
|
+
|
|
150
|
+
props.isEditMode = true;
|
|
151
|
+
|
|
152
|
+
expect(dataForm.value[0].disabled).toBeUndefined();
|
|
153
|
+
expect(dataForm.value[0].children[0].readonly).toBe(false);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("passes the complete errors object to AForm and emits its full model", async() => {
|
|
157
|
+
const errors = {
|
|
158
|
+
negative: ["Value is too low"],
|
|
159
|
+
};
|
|
160
|
+
const wrapper = mount(ATableFormCellList, {
|
|
161
|
+
props: {
|
|
162
|
+
columns: [
|
|
163
|
+
{
|
|
164
|
+
id: "limits",
|
|
165
|
+
formElement: {
|
|
166
|
+
type: "fieldset",
|
|
167
|
+
children: [
|
|
168
|
+
{
|
|
169
|
+
id: "negative",
|
|
170
|
+
type: "integer",
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
errors,
|
|
177
|
+
id: "table_0",
|
|
178
|
+
isEditable: true,
|
|
179
|
+
isEditMode: true,
|
|
180
|
+
row: {
|
|
181
|
+
negative: 10,
|
|
182
|
+
},
|
|
183
|
+
rowIndex: 0,
|
|
184
|
+
rows: [],
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
const form = wrapper.findComponent(AForm);
|
|
188
|
+
|
|
189
|
+
expect(form.props("errors")).toEqual(errors);
|
|
190
|
+
expect(form.props("showErrors")).toBe(true);
|
|
191
|
+
expect(form.props("showRequiredText")).toBe(false);
|
|
192
|
+
expect(form.props("useFlatErrors")).toBe(true);
|
|
193
|
+
|
|
194
|
+
form.vm.$emit("change", {
|
|
195
|
+
fullModel: {
|
|
196
|
+
negative: 20,
|
|
197
|
+
},
|
|
198
|
+
id: "negative",
|
|
199
|
+
item: {
|
|
200
|
+
id: "negative",
|
|
201
|
+
},
|
|
202
|
+
model: 20,
|
|
203
|
+
});
|
|
204
|
+
await wrapper.vm.$nextTick();
|
|
205
|
+
|
|
206
|
+
expect(wrapper.emitted("updateRowData")[0][0]).toEqual(expect.objectContaining({
|
|
207
|
+
column: wrapper.props("columns")[0],
|
|
208
|
+
columnId: "negative",
|
|
209
|
+
fullModel: {
|
|
210
|
+
negative: 20,
|
|
211
|
+
},
|
|
212
|
+
model: 20,
|
|
213
|
+
}));
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it("replaces the complete edit model and clears the changed field error", () => {
|
|
217
|
+
const errorsLocal = ref({
|
|
218
|
+
negative: ["Value is too low"],
|
|
219
|
+
positive: ["Value is too high"],
|
|
220
|
+
});
|
|
221
|
+
const {
|
|
222
|
+
modelLocal,
|
|
223
|
+
updateModelLocal,
|
|
224
|
+
} = RowEditAPI(reactive({
|
|
225
|
+
changeModel: undefined,
|
|
226
|
+
onCancelEditRow: jest.fn(),
|
|
227
|
+
row: {
|
|
228
|
+
negative: 10,
|
|
229
|
+
positive: 10,
|
|
230
|
+
},
|
|
231
|
+
rowIndex: 0,
|
|
232
|
+
rows: [],
|
|
233
|
+
saveRow: jest.fn(),
|
|
234
|
+
}), {
|
|
235
|
+
errorsLocal,
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
updateModelLocal({
|
|
239
|
+
columnId: "negative",
|
|
240
|
+
fullModel: {
|
|
241
|
+
negative: 20,
|
|
242
|
+
positive: 10,
|
|
243
|
+
},
|
|
244
|
+
model: 20,
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
expect(modelLocal.value).toEqual({
|
|
248
|
+
negative: 20,
|
|
249
|
+
positive: 10,
|
|
250
|
+
});
|
|
251
|
+
expect(errorsLocal.value).toEqual({
|
|
252
|
+
positive: ["Value is too high"],
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
@@ -1,39 +1,40 @@
|
|
|
1
|
-
import {
|
|
2
|
-
computed,
|
|
3
|
-
toRef,
|
|
4
|
-
} from "vue";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export default function ColumnsAPI(props) {
|
|
8
|
-
const columns = toRef(props, "columns");
|
|
9
|
-
const isDeletable = toRef(props, "isDeletable");
|
|
10
|
-
const isDeletableConfirm = toRef(props, "isDeletableConfirm");
|
|
11
|
-
const isDragAndDrop = toRef(props, "isDragAndDrop");
|
|
12
|
-
const isEditable = toRef(props, "isEditable");
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
computed,
|
|
3
|
+
toRef,
|
|
4
|
+
} from "vue";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export default function ColumnsAPI(props) {
|
|
8
|
+
const columns = toRef(props, "columns");
|
|
9
|
+
const isDeletable = toRef(props, "isDeletable");
|
|
10
|
+
const isDeletableConfirm = toRef(props, "isDeletableConfirm");
|
|
11
|
+
const isDragAndDrop = toRef(props, "isDragAndDrop");
|
|
12
|
+
const isEditable = toRef(props, "isEditable");
|
|
13
|
+
const rowView = toRef(props, "rowView");
|
|
14
|
+
|
|
15
|
+
const hasActionsColumn = computed(() => {
|
|
16
|
+
return !!(isEditable.value || isDeletable.value || isDeletableConfirm.value);
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const columnsVisible = computed(() => {
|
|
20
|
+
return columns.value.filter(column => column.isRender !== false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const allColumnsLength = computed(() => {
|
|
24
|
+
let length = rowView.value === "list" ? 1 : columnsVisible.value.length;
|
|
25
|
+
if (isDragAndDrop.value) {
|
|
26
|
+
length += 1;
|
|
27
|
+
}
|
|
28
|
+
if (hasActionsColumn.value) {
|
|
29
|
+
length += 1;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return length;
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
allColumnsLength,
|
|
37
|
+
columnsVisible,
|
|
38
|
+
hasActionsColumn,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -9,13 +9,14 @@ import {
|
|
|
9
9
|
setFocusToElement,
|
|
10
10
|
} from "../../utils/utilsDOM";
|
|
11
11
|
import {
|
|
12
|
+
get,
|
|
12
13
|
isFunction,
|
|
13
14
|
} from "lodash-es";
|
|
14
15
|
|
|
15
16
|
export default function DragAndDropAPI(props, { emit }, {
|
|
16
17
|
isDndDisabled = computed(() => false),
|
|
17
18
|
} = {}) {
|
|
18
|
-
const
|
|
19
|
+
const actionsDisabledCallback = toRef(props, "actionsDisabledCallback");
|
|
19
20
|
const focusAfterMove = toRef(props, "focusAfterMove");
|
|
20
21
|
const id = toRef(props, "id");
|
|
21
22
|
const isDragAndDrop = toRef(props, "isDragAndDrop");
|
|
@@ -31,8 +32,10 @@ export default function DragAndDropAPI(props, { emit }, {
|
|
|
31
32
|
return true;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
const dndCallback = get(actionsDisabledCallback.value, "dnd");
|
|
36
|
+
|
|
37
|
+
if (isFunction(dndCallback)) {
|
|
38
|
+
return !!dndCallback({
|
|
36
39
|
row: rows.value[rowIndex],
|
|
37
40
|
rowIndex,
|
|
38
41
|
});
|