aloha-vue 2.74.0 → 2.75.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 (166) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +22 -21
  3. package/dist/aloha-vue.css +13594 -13594
  4. package/dist/aloha-vue.css.map +1 -1
  5. package/dist/aloha-vue.es.js +59266 -64918
  6. package/dist/aloha-vue.umd.js +338 -211
  7. package/package.json +27 -34
  8. package/scss/components/ATable.scss +2 -2
  9. package/scss/utils/button.scss +362 -362
  10. package/scss/utils/funktions.scss +162 -162
  11. package/src/AAccordion/AAccordionItem/AAccordionItem.js +235 -230
  12. package/src/ACarousel/ACarousel.js +7 -2
  13. package/src/ADropdown/ADropdown.js +4 -1
  14. package/src/AFilters/AFilterCenter/AFilterCenter.js +5 -1
  15. package/src/AFilters/AFilterCenter/AFilterCenterItem/AFilterCenterItem.js +7 -2
  16. package/src/AFilters/AFiltersHorizontal/AFiltersHorizontal.js +412 -396
  17. package/src/AFilters/AFiltersHorizontal/AFiltersHorizontalFilter/AFiltersHorizontalFilter.js +102 -99
  18. package/src/AFilters/AFiltersHorizontal/compositionAPI/FiltersSavedDeleteAPI.js +108 -108
  19. package/src/AFilters/AFiltersMain/AFiltersMain.js +114 -111
  20. package/src/AFilters/AFiltersSaveModal/compositionAPI/SaveAPI.js +65 -65
  21. package/src/ALinkCopy/ALinkCopy.js +98 -95
  22. package/src/ALinkCopy/compositionAPI/CopyAPI.js +48 -48
  23. package/src/AList/__tests__/AList.test.js +33 -33
  24. package/src/AList/compositionAPI/__tests__/TagAPI.test.js +43 -43
  25. package/src/AMenu/AMenu.js +4 -1
  26. package/src/AMenu/AMenuBreadcrumbs/AMenuBreadcrumbs.js +240 -237
  27. package/src/AMenu/AMenuPanelLink/AMenuPanelLink.js +4 -1
  28. package/src/AMenu/AMenuSearchPanelBreadcrumbs/AMenuSearchPanelBreadcrumbs.js +122 -119
  29. package/src/AModalWizard/AModalWizard.js +58 -53
  30. package/src/AModalWizard/compositionAPI/__tests__/ScrollAPI.test.js +46 -46
  31. package/src/APagination/APaginationPages/APaginationPages.js +15 -4
  32. package/src/ARate/ARate.js +254 -249
  33. package/src/ARate/ARateIcon/ADecimalIcon/ADecimalIcon.js +53 -50
  34. package/src/ARate/ARateIcon/ARateIcon.js +109 -104
  35. package/src/AResizer/AResizer.js +167 -162
  36. package/src/ATable/ATableHeaderTh/compositionAPI/SortAPI.js +172 -167
  37. package/src/ATable/ATableHeaderThAction/ATableHeaderThAction.js +14 -4
  38. package/src/ATable/ATableHeaderThAction/ATableHeaderThActionItem/ATableHeaderThActionItem.js +191 -184
  39. package/src/ATable/ATablePreviewDown/ATablePreviewDown.js +72 -69
  40. package/src/ATable/ATablePreviewRight/ATablePreviewRight.js +265 -258
  41. package/src/ATable/ATableSortingAdditional/ATableSortingAdditional.js +224 -219
  42. package/src/ATable/ATableSortingAdditional/__tests__/ATableSortingAdditional.AttributesAPI.test.js +39 -39
  43. package/src/ATable/ATableSortingAdditional/__tests__/ATableSortingAdditional.ColumnsAPI.test.js +68 -68
  44. package/src/ATable/ATableSortingAdditional/__tests__/ATableSortingAdditional.DropdownAPI.test.js +45 -45
  45. package/src/ATable/ATableSortingAdditional/__tests__/ATableSortingAdditional.FormAPI.test.js +95 -95
  46. package/src/ATable/ATableSortingAdditional/__tests__/ATableSortingAdditional.ModelAPI.test.js +1 -1
  47. package/src/ATable/ATableTd/ATableTd.js +4 -1
  48. package/src/ATable/ATableTdAction/ATableTdAction.js +19 -12
  49. package/src/ATable/ATableTopPanel/ATableTopPanel.js +11 -3
  50. package/src/ATable/ATableTr/ATableTr.js +408 -405
  51. package/src/ATable/__tests__/ATable.HeaderSlot.test.js +102 -97
  52. package/src/ATable/__tests__/ATable.RowIdsAPI.test.js +66 -66
  53. package/src/ATableForm/ATableForm.js +88 -85
  54. package/src/ATableForm/ATableFormCellAction/ATableFormCellAction.js +14 -4
  55. package/src/ATableForm/ATableFormCellDnd/ATableFormCellDnd.js +196 -187
  56. package/src/ATableForm/ATableFormRow/compositionAPI/EditAPI.js +104 -104
  57. package/src/ATableForm/__tests__/ATableForm.DragAndDropAPI.test.js +200 -212
  58. package/src/ATableForm/__tests__/ATableForm.ListView.test.js +134 -174
  59. package/src/ATableForm/compositionAPI/IconsAPI.js +24 -21
  60. package/src/AVerticalScroll/AVerticalScroll.js +182 -177
  61. package/src/AWizard/AWizard.js +26 -21
  62. package/src/AWizard/AWizardStep/AWizardStep.js +275 -270
  63. package/src/AWizard/compositionAPI/__tests__/ChangeStepAPI.test.js +32 -32
  64. package/src/AWizard/compositionAPI/__tests__/LocalAPI.test.js +55 -55
  65. package/src/PuxDatepicker/PuxDatepickerCalendarPanel/PuxDatepickerCalendarPanel.js +646 -648
  66. package/src/PuxDatepicker/panel/PanelDate/PanelDate.js +300 -301
  67. package/src/PuxDatepicker/panel/PanelMonth/PanelMonth.js +148 -149
  68. package/src/PuxDatepicker/panel/PanelTime/PanelTime.js +256 -257
  69. package/src/PuxDatepicker/panel/PanelYear/PanelYear.js +136 -137
  70. package/src/PuxDatepicker/utils/index.js +100 -100
  71. package/src/compositionAPI/AHttpAPI.js +593 -593
  72. package/src/compositionAPI/__tests__/AHttpAPI.test.js +42 -42
  73. package/src/filters/__tests__/filterBoolean.test.js +38 -38
  74. package/src/filters/__tests__/filterCapitalize.test.js +38 -38
  75. package/src/filters/__tests__/filterCurrency.test.js +21 -21
  76. package/src/filters/__tests__/filterDate.test.js +42 -42
  77. package/src/filters/__tests__/filterDefaultForEmpty.test.js +24 -24
  78. package/src/filters/__tests__/filterEmail.test.js +42 -42
  79. package/src/filters/__tests__/filterEscapeHtml.test.js +45 -45
  80. package/src/filters/__tests__/filterFileSize.test.js +45 -45
  81. package/src/filters/__tests__/filterFloat.test.js +74 -74
  82. package/src/filters/__tests__/filterJson.test.js +74 -74
  83. package/src/filters/__tests__/filterKeyValue.test.js +50 -50
  84. package/src/filters/__tests__/filterLimitTo.test.js +39 -39
  85. package/src/filters/__tests__/filterLink.test.js +41 -41
  86. package/src/filters/__tests__/filterList.test.js +149 -149
  87. package/src/filters/__tests__/filterLowerCase.test.js +38 -38
  88. package/src/filters/__tests__/filterMask.test.js +80 -80
  89. package/src/filters/__tests__/filterPropertyByValue.test.js +27 -27
  90. package/src/filters/__tests__/filterSearchHighlight.test.js +129 -129
  91. package/src/filters/__tests__/filterUpperCase.test.js +38 -38
  92. package/src/filters/__tests__/filterValueByCondition.test.js +3 -3
  93. package/src/filters/filterJson.js +39 -39
  94. package/src/filters/filterValueByCondition.js +2 -2
  95. package/src/plugins/AAlertPlugin.js +16 -5
  96. package/src/plugins/AMultiselectOrderedPlugin.js +88 -81
  97. package/src/plugins/ASelectPlugin.js +12 -10
  98. package/src/ui/ACheckbox/ACheckbox.js +82 -79
  99. package/src/ui/ADatepicker/compositionAPI/EventsAPI.js +297 -297
  100. package/src/ui/ADatepicker/utils/index.js +76 -76
  101. package/src/ui/ADatepickerAlt/ADatepicker.js +912 -912
  102. package/src/ui/ADatepickerAlt/utils/index.js +98 -98
  103. package/src/ui/AFieldset/__tests__/AFieldset.ClassColumn.test.js +113 -114
  104. package/src/ui/AFormElementBtnClear/AFormElementBtnClear.js +4 -1
  105. package/src/ui/AInputCurrency/AInputCurrency.js +20 -15
  106. package/src/ui/AInputCurrency/__tests__/AInputCurrency.ModelAPI.test.js +73 -73
  107. package/src/ui/AInputNumber/AInputNumber.js +17 -12
  108. package/src/ui/AJson/AJson.js +12 -3
  109. package/src/ui/AJson/compositionAPI/JsonAPI.js +116 -116
  110. package/src/ui/ALabel/__tests__/ALabel.IdAPI.test.js +42 -42
  111. package/src/ui/ALabel/__tests__/ALabel.LabelAPI.test.js +33 -33
  112. package/src/ui/ARadio/ARadio.js +80 -77
  113. package/src/ui/ASelect/ASelect.js +390 -383
  114. package/src/ui/ASelect/ASelectElement/ASelectElement.js +179 -176
  115. package/src/ui/ASelect/ASelectValueCloseable/ASelectValueCloseable.js +143 -141
  116. package/src/ui/ASelect/__tests__/SelectedFirstAPI.test.js +101 -101
  117. package/src/ui/ASelect/__tests__/SelectedVisibleAPI.test.js +98 -98
  118. package/src/ui/ASlider/compositionAPI/SliderAPI.js +23 -23
  119. package/src/ui/AValidatedJson/AValidatedJson.js +4 -1
  120. package/src/ui/AValidatedJson/AValidatedJsonItem/AValidatedJsonItem.js +308 -298
  121. package/src/ui/compositionApi/UiCollapseAPI.js +68 -63
  122. package/src/ui/compositionApi/UiInputAutofillAPI.js +41 -41
  123. package/src/ui/compositionApi/__tests__/UIDataGroupAPI.test.js +106 -106
  124. package/src/ui/compositionApi/__tests__/UIExcludeRenderAttributesAPI.test.js +39 -39
  125. package/src/ui/compositionApi/__tests__/UiDataWithKeyIdAndLabelAPI.test.js +128 -128
  126. package/src/ui/compositionApi/__tests__/UiSearchAPI.test.js +71 -71
  127. package/src/utils/EventBus.js +51 -8
  128. package/src/utils/__tests__/EventBus.test.js +138 -0
  129. package/src/utils/__tests__/utils.aOrderBy.test.js +1 -1
  130. package/src/utils/__tests__/utils.aSortBy.test.js +1 -1
  131. package/src/utils/__tests__/utils.getTotalNestedCount.test.js +56 -56
  132. package/src/utils/__tests__/utils.isArrayOfArrays.test.js +44 -44
  133. package/src/utils/__tests__/utils.isArrayOfStrings.test.js +36 -36
  134. package/src/utils/__tests__/utilsArray.aFirst.test.js +1 -1
  135. package/src/utils/__tests__/utilsArray.aLast.test.js +1 -1
  136. package/src/utils/__tests__/utilsLang.isArguments.test.js +1 -1
  137. package/src/utils/__tests__/utilsLang.isArray.test.js +1 -1
  138. package/src/utils/__tests__/utilsLang.isArrayBuffer.test.js +1 -1
  139. package/src/utils/__tests__/utilsLang.isBoolean.test.js +1 -1
  140. package/src/utils/__tests__/utilsLang.isBuffer.test.js +1 -1
  141. package/src/utils/__tests__/utilsLang.isDate.test.js +1 -1
  142. package/src/utils/__tests__/utilsLang.isElement.test.js +5 -3
  143. package/src/utils/__tests__/utilsLang.isError.test.js +1 -1
  144. package/src/utils/__tests__/utilsLang.isFinite.test.js +1 -1
  145. package/src/utils/__tests__/utilsLang.isFunction.test.js +1 -1
  146. package/src/utils/__tests__/utilsLang.isInteger.test.js +1 -1
  147. package/src/utils/__tests__/utilsLang.isMap.test.js +1 -1
  148. package/src/utils/__tests__/utilsLang.isNaN.test.js +1 -1
  149. package/src/utils/__tests__/utilsLang.isNil.test.js +1 -1
  150. package/src/utils/__tests__/utilsLang.isNull.test.js +1 -1
  151. package/src/utils/__tests__/utilsLang.isNumber.test.js +1 -1
  152. package/src/utils/__tests__/utilsLang.isObject.test.js +1 -1
  153. package/src/utils/__tests__/utilsLang.isObjectLike.test.js +5 -3
  154. package/src/utils/__tests__/utilsLang.isPlainObject.test.js +3 -2
  155. package/src/utils/__tests__/utilsLang.isPromise.test.js +5 -2
  156. package/src/utils/__tests__/utilsLang.isRegExp.test.js +1 -1
  157. package/src/utils/__tests__/utilsLang.isSet.test.js +1 -1
  158. package/src/utils/__tests__/utilsLang.isString.test.js +1 -1
  159. package/src/utils/__tests__/utilsLang.isSymbol.test.js +5 -3
  160. package/src/utils/__tests__/utilsLang.isUndefined.test.js +1 -1
  161. package/src/utils/__tests__/utilsLang.isWeakMap.test.js +1 -1
  162. package/src/utils/__tests__/utilsLang.isWeakSet.test.js +1 -1
  163. package/src/utils/__tests__/utilsMath.isEven.test.js +43 -43
  164. package/src/utils/__tests__/utilsMath.isOdd.test.js +43 -43
  165. package/src/utils/__tests__/utilsUi.isModelForFilterNotEmpty.test.js +65 -65
  166. package/src/utils/autosize.js +1 -1
@@ -1,212 +1,200 @@
1
- import {
2
- computed,
3
- reactive,
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 AIcon from "../../AIcon/AIcon";
16
- import ATableFormCellDnd from "../ATableFormCellDnd/ATableFormCellDnd";
17
-
18
- import DragAndDropAPI from "../compositionAPI/DragAndDropAPI";
19
-
20
- import GripVertical from "aloha-svg/dist/js/bootstrap/GripVertical";
21
- import LockFill from "aloha-svg/dist/js/bootstrap/LockFill";
22
-
23
- jest.mock("../../AButton/AButton", () => {
24
- const {
25
- h,
26
- } = require("vue");
27
-
28
- return {
29
- __esModule: true,
30
- default: {
31
- name: "AButton",
32
- inheritAttrs: false,
33
- props: {
34
- disabled: Boolean,
35
- textScreenReader: String,
36
- },
37
- render() {
38
- return h("button", {
39
- disabled: this.disabled,
40
- }, this.textScreenReader);
41
- },
42
- },
43
- };
44
- });
45
- jest.mock("aloha-svg/dist/js/bootstrap/ChevronDown", () => ({
46
- __esModule: true,
47
- default: "ChevronDown",
48
- }));
49
- jest.mock("aloha-svg/dist/js/bootstrap/ChevronUp", () => ({
50
- __esModule: true,
51
- default: "ChevronUp",
52
- }));
53
- jest.mock("aloha-svg/dist/js/bootstrap/GripVertical", () => ({
54
- __esModule: true,
55
- default: "GripVertical",
56
- }));
57
- jest.mock("aloha-svg/dist/js/bootstrap/LockFill", () => ({
58
- __esModule: true,
59
- default: "LockFill",
60
- }));
61
-
62
- describe("ATableForm DragAndDropAPI", () => {
63
- it("temporarily disables DND without marking rows as locked", () => {
64
- const props = reactive({
65
- actionsDisabledCallback: {},
66
- focusAfterMove: false,
67
- id: "table",
68
- isDragAndDrop: true,
69
- rows: [{ id: 1 }],
70
- });
71
- const {
72
- isDndDisabledForRow,
73
- isDndLockedForRow,
74
- } = DragAndDropAPI(props, { emit: jest.fn() }, {
75
- isDndDisabled: computed(() => true),
76
- });
77
-
78
- expect(isDndDisabledForRow(0)).toBe(true);
79
- expect(isDndLockedForRow(0)).toBe(false);
80
- });
81
-
82
- it("prevents dragging, dropping on, and moving across a disabled row", () => {
83
- const emit = jest.fn();
84
- const props = reactive({
85
- actionsDisabledCallback: {
86
- dnd: ({ row }) => row.dndDisabled,
87
- },
88
- focusAfterMove: false,
89
- id: "table",
90
- isDragAndDrop: true,
91
- rows: [
92
- { id: 1 },
93
- { dndDisabled: true, id: 2 },
94
- { id: 3 },
95
- { id: 4 },
96
- ],
97
- });
98
- const {
99
- draggedRowIndex,
100
- isDndDisabledForRow,
101
- isDndLockedForRow,
102
- moveRowDown,
103
- onDragover,
104
- onDragstart,
105
- onDrop,
106
- } = DragAndDropAPI(props, { emit }, {
107
- isDndDisabled: computed(() => false),
108
- });
109
-
110
- expect(isDndDisabledForRow(0)).toBe(false);
111
- expect(isDndDisabledForRow(1)).toBe(true);
112
- expect(isDndLockedForRow(0)).toBe(false);
113
- expect(isDndLockedForRow(1)).toBe(true);
114
-
115
- onDragstart({}, 1);
116
- expect(draggedRowIndex.value).toBeUndefined();
117
-
118
- onDragstart({}, 0);
119
- expect(draggedRowIndex.value).toBe(0);
120
-
121
- const preventDefaultDisabled = jest.fn();
122
- onDragover({
123
- preventDefault: preventDefaultDisabled,
124
- }, 1);
125
- onDrop({
126
- preventDefault: preventDefaultDisabled,
127
- }, 1);
128
-
129
- expect(preventDefaultDisabled).not.toHaveBeenCalled();
130
- expect(emit).not.toHaveBeenCalled();
131
-
132
- const preventDefaultAfterLock = jest.fn();
133
- onDragover({
134
- currentTarget: undefined,
135
- preventDefault: preventDefaultAfterLock,
136
- }, 2);
137
- onDrop({
138
- preventDefault: preventDefaultAfterLock,
139
- }, 2);
140
-
141
- expect(preventDefaultAfterLock).toHaveBeenCalledTimes(2);
142
- expect(emit).not.toHaveBeenCalled();
143
-
144
- moveRowDown(2);
145
-
146
- expect(emit).toHaveBeenCalledWith("updateRows", expect.objectContaining({
147
- fromIndex: 2,
148
- toIndex: 3,
149
- trigger: "moveRowDown",
150
- }));
151
- });
152
- });
153
-
154
- describe("ATableFormCellDnd", () => {
155
- it("shows a lock and disables move buttons for a disabled row", () => {
156
- const wrapper = mount(ATableFormCellDnd, {
157
- props: {
158
- canMoveRowDown: () => true,
159
- canMoveRowUp: () => true,
160
- id: "table_1",
161
- isDndDisabled: true,
162
- isDndLocked: true,
163
- isDragAndDrop: true,
164
- moveRowDown: jest.fn(),
165
- moveRowUp: jest.fn(),
166
- onDragend: jest.fn(),
167
- onDragstart: jest.fn(),
168
- rowIndex: 1,
169
- texts: {
170
- reorderDisabled: "Row reordering disabled",
171
- reorderDown: "Move row down",
172
- reorderHandle: "Drag row to reorder",
173
- reorderUp: "Move row up",
174
- },
175
- widths: {
176
- dndColumn: 56,
177
- },
178
- },
179
- });
180
-
181
- expect(wrapper.findComponent(AIcon).props("icon")).toBe(LockFill);
182
- expect(wrapper.find(".a_table_form__reorder_handle").attributes("draggable")).toBe("false");
183
- expect(wrapper.find(".a_table_form__reorder_handle_disabled").exists()).toBe(true);
184
- expect(wrapper.text()).toContain("Row reordering disabled");
185
- expect(wrapper.findAll("button")).toHaveLength(2);
186
- expect(wrapper.findAll("button").every(button => button.attributes("disabled") !== undefined)).toBe(true);
187
- });
188
-
189
- it("keeps the drag handle icon while DND is temporarily disabled", () => {
190
- const wrapper = mount(ATableFormCellDnd, {
191
- props: {
192
- canMoveRowDown: () => true,
193
- canMoveRowUp: () => true,
194
- id: "table_1",
195
- isDndDisabled: true,
196
- isDragAndDrop: true,
197
- moveRowDown: jest.fn(),
198
- moveRowUp: jest.fn(),
199
- onDragend: jest.fn(),
200
- onDragstart: jest.fn(),
201
- rowIndex: 1,
202
- widths: {
203
- dndColumn: 56,
204
- },
205
- },
206
- });
207
-
208
- expect(wrapper.findComponent(AIcon).props("icon")).toBe(GripVertical);
209
- expect(wrapper.find(".a_table_form__reorder_handle").attributes("draggable")).toBe("false");
210
- expect(wrapper.findAll("button").every(button => button.attributes("disabled") !== undefined)).toBe(true);
211
- });
212
- });
1
+ import {
2
+ computed,
3
+ reactive,
4
+ } from "vue";
5
+ import {
6
+ describe,
7
+ expect,
8
+ it,
9
+ vi,
10
+ } from "vitest";
11
+ import {
12
+ mount,
13
+ } from "@vue/test-utils";
14
+
15
+ import AIcon from "../../AIcon/AIcon";
16
+ import ATableFormCellDnd from "../ATableFormCellDnd/ATableFormCellDnd";
17
+
18
+ import DragAndDropAPI from "../compositionAPI/DragAndDropAPI";
19
+
20
+ const GripVertical = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-grip-vertical" viewBox="0 0 16 16">
21
+ <path d="M7 2a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0M7 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0M7 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0m-3 3a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0m-3 3a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0"/>
22
+ </svg>`;
23
+ const LockFill = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-lock-fill" viewBox="0 0 16 16">
24
+ <path d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2m3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2"/>
25
+ </svg>`;
26
+
27
+
28
+ vi.mock("../../AButton/AButton", async() => {
29
+ const {
30
+ h,
31
+ } = await vi.importActual("vue");
32
+
33
+ return {
34
+ default: {
35
+ name: "AButton",
36
+ inheritAttrs: false,
37
+ props: {
38
+ disabled: Boolean,
39
+ textScreenReader: String,
40
+ },
41
+ render() {
42
+ return h("button", {
43
+ disabled: this.disabled,
44
+ }, this.textScreenReader);
45
+ },
46
+ },
47
+ };
48
+ });
49
+
50
+ describe("ATableForm DragAndDropAPI", () => {
51
+ it("temporarily disables DND without marking rows as locked", () => {
52
+ const props = reactive({
53
+ actionsDisabledCallback: {},
54
+ focusAfterMove: false,
55
+ id: "table",
56
+ isDragAndDrop: true,
57
+ rows: [{ id: 1 }],
58
+ });
59
+ const {
60
+ isDndDisabledForRow,
61
+ isDndLockedForRow,
62
+ } = DragAndDropAPI(props, { emit: vi.fn() }, {
63
+ isDndDisabled: computed(() => true),
64
+ });
65
+
66
+ expect(isDndDisabledForRow(0)).toBe(true);
67
+ expect(isDndLockedForRow(0)).toBe(false);
68
+ });
69
+
70
+ it("prevents dragging, dropping on, and moving across a disabled row", () => {
71
+ const emit = vi.fn();
72
+ const props = reactive({
73
+ actionsDisabledCallback: {
74
+ dnd: ({ row }) => row.dndDisabled,
75
+ },
76
+ focusAfterMove: false,
77
+ id: "table",
78
+ isDragAndDrop: true,
79
+ rows: [
80
+ { id: 1 },
81
+ { dndDisabled: true, id: 2 },
82
+ { id: 3 },
83
+ { id: 4 },
84
+ ],
85
+ });
86
+ const {
87
+ draggedRowIndex,
88
+ isDndDisabledForRow,
89
+ isDndLockedForRow,
90
+ moveRowDown,
91
+ onDragover,
92
+ onDragstart,
93
+ onDrop,
94
+ } = DragAndDropAPI(props, { emit }, {
95
+ isDndDisabled: computed(() => false),
96
+ });
97
+
98
+ expect(isDndDisabledForRow(0)).toBe(false);
99
+ expect(isDndDisabledForRow(1)).toBe(true);
100
+ expect(isDndLockedForRow(0)).toBe(false);
101
+ expect(isDndLockedForRow(1)).toBe(true);
102
+
103
+ onDragstart({}, 1);
104
+ expect(draggedRowIndex.value).toBeUndefined();
105
+
106
+ onDragstart({}, 0);
107
+ expect(draggedRowIndex.value).toBe(0);
108
+
109
+ const preventDefaultDisabled = vi.fn();
110
+ onDragover({
111
+ preventDefault: preventDefaultDisabled,
112
+ }, 1);
113
+ onDrop({
114
+ preventDefault: preventDefaultDisabled,
115
+ }, 1);
116
+
117
+ expect(preventDefaultDisabled).not.toHaveBeenCalled();
118
+ expect(emit).not.toHaveBeenCalled();
119
+
120
+ const preventDefaultAfterLock = vi.fn();
121
+ onDragover({
122
+ currentTarget: undefined,
123
+ preventDefault: preventDefaultAfterLock,
124
+ }, 2);
125
+ onDrop({
126
+ preventDefault: preventDefaultAfterLock,
127
+ }, 2);
128
+
129
+ expect(preventDefaultAfterLock).toHaveBeenCalledTimes(2);
130
+ expect(emit).not.toHaveBeenCalled();
131
+
132
+ moveRowDown(2);
133
+
134
+ expect(emit).toHaveBeenCalledWith("updateRows", expect.objectContaining({
135
+ fromIndex: 2,
136
+ toIndex: 3,
137
+ trigger: "moveRowDown",
138
+ }));
139
+ });
140
+ });
141
+
142
+ describe("ATableFormCellDnd", () => {
143
+ it("shows a lock and disables move buttons for a disabled row", () => {
144
+ const wrapper = mount(ATableFormCellDnd, {
145
+ props: {
146
+ canMoveRowDown: () => true,
147
+ canMoveRowUp: () => true,
148
+ id: "table_1",
149
+ isDndDisabled: true,
150
+ isDndLocked: true,
151
+ isDragAndDrop: true,
152
+ moveRowDown: vi.fn(),
153
+ moveRowUp: vi.fn(),
154
+ onDragend: vi.fn(),
155
+ onDragstart: vi.fn(),
156
+ rowIndex: 1,
157
+ texts: {
158
+ reorderDisabled: "Row reordering disabled",
159
+ reorderDown: "Move row down",
160
+ reorderHandle: "Drag row to reorder",
161
+ reorderUp: "Move row up",
162
+ },
163
+ widths: {
164
+ dndColumn: 56,
165
+ },
166
+ },
167
+ });
168
+
169
+ expect(wrapper.findComponent(AIcon).props("icon")).toBe(LockFill);
170
+ expect(wrapper.find(".a_table_form__reorder_handle").attributes("draggable")).toBe("false");
171
+ expect(wrapper.find(".a_table_form__reorder_handle_disabled").exists()).toBe(true);
172
+ expect(wrapper.text()).toContain("Row reordering disabled");
173
+ expect(wrapper.findAll("button")).toHaveLength(2);
174
+ expect(wrapper.findAll("button").every(button => button.attributes("disabled") !== undefined)).toBe(true);
175
+ });
176
+
177
+ it("keeps the drag handle icon while DND is temporarily disabled", () => {
178
+ const wrapper = mount(ATableFormCellDnd, {
179
+ props: {
180
+ canMoveRowDown: () => true,
181
+ canMoveRowUp: () => true,
182
+ id: "table_1",
183
+ isDndDisabled: true,
184
+ isDragAndDrop: true,
185
+ moveRowDown: vi.fn(),
186
+ moveRowUp: vi.fn(),
187
+ onDragend: vi.fn(),
188
+ onDragstart: vi.fn(),
189
+ rowIndex: 1,
190
+ widths: {
191
+ dndColumn: 56,
192
+ },
193
+ },
194
+ });
195
+
196
+ expect(wrapper.findComponent(AIcon).props("icon")).toBe(GripVertical);
197
+ expect(wrapper.find(".a_table_form__reorder_handle").attributes("draggable")).toBe("false");
198
+ expect(wrapper.findAll("button").every(button => button.attributes("disabled") !== undefined)).toBe(true);
199
+ });
200
+ });