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,128 +1,128 @@
1
- import {
2
- createApp,
3
- defineComponent,
4
- } from "vue";
5
- import {
6
- describe,
7
- expect,
8
- it,
9
- jest,
10
- } from "@jest/globals";
11
-
12
- import UiDataWithKeyIdAndLabelAPI from "../UiDataWithKeyIdAndLabelAPI";
13
-
14
- import {
15
- AKeyId,
16
- AKeyLabel,
17
- } from "../../../const/AKeys";
18
-
19
- jest.mock("../../../index", () => ({
20
- AKeyId: "_a_id",
21
- AKeyLabel: "_a_label",
22
- AKeyLabelSearch: "_a_label_search",
23
- extractTextFromHtml: value => value,
24
- getTranslatedText: ({ placeholder }) => placeholder,
25
- isArrayOfArrays: value => Array.isArray(value) && value.every(Array.isArray),
26
- isPlaceholderTranslate: () => false,
27
- }));
28
-
29
- const createProps = ({
30
- data,
31
- isDataSimpleArray = false,
32
- mergeData = false,
33
- }) => ({
34
- alwaysTranslate: false,
35
- data,
36
- dataExtra: [],
37
- isDataSimpleArray,
38
- keyId: "id",
39
- keyLabel: "label",
40
- keyLabelCallback: undefined,
41
- mergeData,
42
- searchTextInHtml: false,
43
- translateData: false,
44
- });
45
-
46
- const useDataAPI = props => {
47
- let result;
48
- const app = createApp(defineComponent({
49
- name: "TestUiDataWithKeyIdAndLabelAPI",
50
- setup() {
51
- result = UiDataWithKeyIdAndLabelAPI(props);
52
- return () => null;
53
- },
54
- }));
55
-
56
- app.mount(document.createElement("div"));
57
- return result;
58
- };
59
-
60
- describe("UiDataWithKeyIdAndLabelAPI", () => {
61
- it("keeps replacing prop data with internally loaded data by default", () => {
62
- const {
63
- dataFromServer,
64
- dataLocal,
65
- } = useDataAPI(createProps({
66
- data: [
67
- { id: 1, label: "Prop one" },
68
- { id: 3, label: "Prop three" },
69
- ],
70
- }));
71
-
72
- dataFromServer.value = [
73
- { id: 1, label: "Internal one" },
74
- { id: 2, label: "Internal two" },
75
- ];
76
-
77
- expect(dataLocal.value.map(item => item[AKeyLabel])).toEqual([
78
- "Internal one",
79
- "Internal two",
80
- ]);
81
- });
82
-
83
- it("merges prop and internally loaded data by ID with internal items taking precedence", () => {
84
- const {
85
- dataFromServer,
86
- dataLocal,
87
- } = useDataAPI(createProps({
88
- data: [
89
- { id: 1, label: "Prop one" },
90
- { id: 3, label: "Prop three" },
91
- ],
92
- mergeData: true,
93
- }));
94
-
95
- dataFromServer.value = [
96
- { id: 1, label: "Internal one" },
97
- { id: 2, label: "Internal two" },
98
- ];
99
-
100
- expect(dataLocal.value.map(item => ({
101
- id: item[AKeyId],
102
- label: item[AKeyLabel],
103
- }))).toEqual([
104
- { id: 1, label: "Internal one" },
105
- { id: 2, label: "Internal two" },
106
- { id: 3, label: "Prop three" },
107
- ]);
108
- });
109
-
110
- it("merges simple arrays by their values", () => {
111
- const {
112
- dataFromServer,
113
- dataLocal,
114
- } = useDataAPI(createProps({
115
- data: ["one", "three"],
116
- isDataSimpleArray: true,
117
- mergeData: true,
118
- }));
119
-
120
- dataFromServer.value = ["one", "two"];
121
-
122
- expect(dataLocal.value.map(item => item[AKeyId])).toEqual([
123
- "one",
124
- "two",
125
- "three",
126
- ]);
127
- });
128
- });
1
+ import {
2
+ createApp,
3
+ defineComponent,
4
+ } from "vue";
5
+ import {
6
+ describe,
7
+ expect,
8
+ it,
9
+ vi,
10
+ } from "vitest";
11
+
12
+ import UiDataWithKeyIdAndLabelAPI from "../UiDataWithKeyIdAndLabelAPI";
13
+
14
+ import {
15
+ AKeyId,
16
+ AKeyLabel,
17
+ } from "../../../const/AKeys";
18
+
19
+ vi.mock("../../../index", () => ({
20
+ AKeyId: "_a_id",
21
+ AKeyLabel: "_a_label",
22
+ AKeyLabelSearch: "_a_label_search",
23
+ extractTextFromHtml: value => value,
24
+ getTranslatedText: ({ placeholder }) => placeholder,
25
+ isArrayOfArrays: value => Array.isArray(value) && value.every(Array.isArray),
26
+ isPlaceholderTranslate: () => false,
27
+ }));
28
+
29
+ const createProps = ({
30
+ data,
31
+ isDataSimpleArray = false,
32
+ mergeData = false,
33
+ }) => ({
34
+ alwaysTranslate: false,
35
+ data,
36
+ dataExtra: [],
37
+ isDataSimpleArray,
38
+ keyId: "id",
39
+ keyLabel: "label",
40
+ keyLabelCallback: undefined,
41
+ mergeData,
42
+ searchTextInHtml: false,
43
+ translateData: false,
44
+ });
45
+
46
+ const useDataAPI = props => {
47
+ let result;
48
+ const app = createApp(defineComponent({
49
+ name: "TestUiDataWithKeyIdAndLabelAPI",
50
+ setup() {
51
+ result = UiDataWithKeyIdAndLabelAPI(props);
52
+ return () => null;
53
+ },
54
+ }));
55
+
56
+ app.mount(document.createElement("div"));
57
+ return result;
58
+ };
59
+
60
+ describe("UiDataWithKeyIdAndLabelAPI", () => {
61
+ it("keeps replacing prop data with internally loaded data by default", () => {
62
+ const {
63
+ dataFromServer,
64
+ dataLocal,
65
+ } = useDataAPI(createProps({
66
+ data: [
67
+ { id: 1, label: "Prop one" },
68
+ { id: 3, label: "Prop three" },
69
+ ],
70
+ }));
71
+
72
+ dataFromServer.value = [
73
+ { id: 1, label: "Internal one" },
74
+ { id: 2, label: "Internal two" },
75
+ ];
76
+
77
+ expect(dataLocal.value.map(item => item[AKeyLabel])).toEqual([
78
+ "Internal one",
79
+ "Internal two",
80
+ ]);
81
+ });
82
+
83
+ it("merges prop and internally loaded data by ID with internal items taking precedence", () => {
84
+ const {
85
+ dataFromServer,
86
+ dataLocal,
87
+ } = useDataAPI(createProps({
88
+ data: [
89
+ { id: 1, label: "Prop one" },
90
+ { id: 3, label: "Prop three" },
91
+ ],
92
+ mergeData: true,
93
+ }));
94
+
95
+ dataFromServer.value = [
96
+ { id: 1, label: "Internal one" },
97
+ { id: 2, label: "Internal two" },
98
+ ];
99
+
100
+ expect(dataLocal.value.map(item => ({
101
+ id: item[AKeyId],
102
+ label: item[AKeyLabel],
103
+ }))).toEqual([
104
+ { id: 1, label: "Internal one" },
105
+ { id: 2, label: "Internal two" },
106
+ { id: 3, label: "Prop three" },
107
+ ]);
108
+ });
109
+
110
+ it("merges simple arrays by their values", () => {
111
+ const {
112
+ dataFromServer,
113
+ dataLocal,
114
+ } = useDataAPI(createProps({
115
+ data: ["one", "three"],
116
+ isDataSimpleArray: true,
117
+ mergeData: true,
118
+ }));
119
+
120
+ dataFromServer.value = ["one", "two"];
121
+
122
+ expect(dataLocal.value.map(item => item[AKeyId])).toEqual([
123
+ "one",
124
+ "two",
125
+ "three",
126
+ ]);
127
+ });
128
+ });
@@ -1,71 +1,71 @@
1
- import {
2
- computed,
3
- } from "vue";
4
- import {
5
- describe,
6
- expect,
7
- it,
8
- } from "@jest/globals";
9
-
10
- import UIDataGroupAPI from "../UIDataGroupAPI";
11
- import UiSearchAPI from "../UiSearchAPI";
12
-
13
- import {
14
- AKeyId,
15
- AKeyLabel,
16
- } from "../../../const/AKeys";
17
-
18
- describe("UiSearchAPI", () => {
19
- it("includes grouped dataExtra in item and group search", () => {
20
- const props = {
21
- keyGroup: "group",
22
- keyGroupLabelCallback: undefined,
23
- searchInGroup: true,
24
- searchOutside: false,
25
- searchTextInHtml: false,
26
- searchTimeout: 0,
27
- sortOrderGroup: undefined,
28
- };
29
- const dataExtra = computed(() => [
30
- {
31
- [AKeyId]: "extra_1",
32
- [AKeyLabel]: "Extra 1",
33
- group: "Recommended",
34
- },
35
- {
36
- [AKeyId]: "extra_2",
37
- [AKeyLabel]: "Extra 2",
38
- group: "Other",
39
- },
40
- ]);
41
- const {
42
- groupsForLever: groupsForLeverExtra,
43
- hasKeyGroup,
44
- keyGroupArray,
45
- } = UIDataGroupAPI(props, {
46
- data: dataExtra,
47
- });
48
- const {
49
- hasNotElementsWithSearch,
50
- searchingElementsExtra,
51
- searchingGroups,
52
- searchingGroupsWithSearchInGroup,
53
- updateModelSearch,
54
- } = UiSearchAPI(props, { emit: () => {} }, {
55
- dataExtra,
56
- groupsForLeverExtra,
57
- hasKeyGroup,
58
- keyGroupArray,
59
- });
60
-
61
- updateModelSearch("Extra 1");
62
-
63
- expect(searchingElementsExtra.value).toEqual({ extra_1: true });
64
- expect(searchingGroups.value).toEqual({ Recommended: true });
65
-
66
- updateModelSearch("Recommended");
67
-
68
- expect(searchingGroupsWithSearchInGroup.value).toEqual({ Recommended: true });
69
- expect(hasNotElementsWithSearch.value).toBe(false);
70
- });
71
- });
1
+ import {
2
+ computed,
3
+ } from "vue";
4
+ import {
5
+ describe,
6
+ expect,
7
+ it,
8
+ } from "vitest";
9
+
10
+ import UIDataGroupAPI from "../UIDataGroupAPI";
11
+ import UiSearchAPI from "../UiSearchAPI";
12
+
13
+ import {
14
+ AKeyId,
15
+ AKeyLabel,
16
+ } from "../../../const/AKeys";
17
+
18
+ describe("UiSearchAPI", () => {
19
+ it("includes grouped dataExtra in item and group search", () => {
20
+ const props = {
21
+ keyGroup: "group",
22
+ keyGroupLabelCallback: undefined,
23
+ searchInGroup: true,
24
+ searchOutside: false,
25
+ searchTextInHtml: false,
26
+ searchTimeout: 0,
27
+ sortOrderGroup: undefined,
28
+ };
29
+ const dataExtra = computed(() => [
30
+ {
31
+ [AKeyId]: "extra_1",
32
+ [AKeyLabel]: "Extra 1",
33
+ group: "Recommended",
34
+ },
35
+ {
36
+ [AKeyId]: "extra_2",
37
+ [AKeyLabel]: "Extra 2",
38
+ group: "Other",
39
+ },
40
+ ]);
41
+ const {
42
+ groupsForLever: groupsForLeverExtra,
43
+ hasKeyGroup,
44
+ keyGroupArray,
45
+ } = UIDataGroupAPI(props, {
46
+ data: dataExtra,
47
+ });
48
+ const {
49
+ hasNotElementsWithSearch,
50
+ searchingElementsExtra,
51
+ searchingGroups,
52
+ searchingGroupsWithSearchInGroup,
53
+ updateModelSearch,
54
+ } = UiSearchAPI(props, { emit: () => {} }, {
55
+ dataExtra,
56
+ groupsForLeverExtra,
57
+ hasKeyGroup,
58
+ keyGroupArray,
59
+ });
60
+
61
+ updateModelSearch("Extra 1");
62
+
63
+ expect(searchingElementsExtra.value).toEqual({ extra_1: true });
64
+ expect(searchingGroups.value).toEqual({ Recommended: true });
65
+
66
+ updateModelSearch("Recommended");
67
+
68
+ expect(searchingGroupsWithSearchInGroup.value).toEqual({ Recommended: true });
69
+ expect(hasNotElementsWithSearch.value).toBe(false);
70
+ });
71
+ });
@@ -1,8 +1,51 @@
1
- import emitter from "tiny-emitter/instance";
2
-
3
- export default {
4
- $on: (...args) => emitter.on(...args),
5
- $once: (...args) => emitter.once(...args),
6
- $off: (...args) => emitter.off(...args),
7
- $emit: (...args) => emitter.emit(...args),
8
- };
1
+ const listeners = new Map();
2
+
3
+ const subscribe = (name, callback, context, originalCallback = callback) => {
4
+ const subscriptions = listeners.get(name) || [];
5
+ subscriptions.push({ callback, context, originalCallback });
6
+ listeners.set(name, subscriptions);
7
+ };
8
+
9
+ const emitter = {
10
+ on(name, callback, context) {
11
+ subscribe(name, callback, context);
12
+ return emitter;
13
+ },
14
+ once(name, callback, context) {
15
+ const onceListener = (...args) => {
16
+ emitter.off(name, onceListener);
17
+ callback.apply(context, args);
18
+ };
19
+ subscribe(name, onceListener, context, callback);
20
+ return emitter;
21
+ },
22
+ off(name, callback) {
23
+ if (!callback) {
24
+ listeners.delete(name);
25
+ return emitter;
26
+ }
27
+ const remaining = (listeners.get(name) || []).filter(subscription => {
28
+ return subscription.callback !== callback && subscription.originalCallback !== callback;
29
+ });
30
+ if (remaining.length) {
31
+ listeners.set(name, remaining);
32
+ } else {
33
+ listeners.delete(name);
34
+ }
35
+ return emitter;
36
+ },
37
+ emit(name, ...args) {
38
+ const subscriptions = [...(listeners.get(name) || [])];
39
+ for (const { callback, context } of subscriptions) {
40
+ callback.apply(context, args);
41
+ }
42
+ return emitter;
43
+ },
44
+ };
45
+
46
+ export default {
47
+ $on: (...args) => emitter.on(...args),
48
+ $once: (...args) => emitter.once(...args),
49
+ $off: (...args) => emitter.off(...args),
50
+ $emit: (...args) => emitter.emit(...args),
51
+ };
@@ -0,0 +1,138 @@
1
+ import {
2
+ afterEach,
3
+ describe,
4
+ expect,
5
+ it,
6
+ vi,
7
+ } from "vitest";
8
+
9
+ import EventBus from "../EventBus";
10
+
11
+ const EVENT = "event-bus-test";
12
+ const OTHER_EVENT = "event-bus-other-test";
13
+
14
+ afterEach(() => {
15
+ EventBus.$off(EVENT);
16
+ EventBus.$off(OTHER_EVENT);
17
+ EventBus.$off("__proto__");
18
+ });
19
+
20
+ describe("EventBus", () => {
21
+ it("passes all arguments and the supplied context in registration order", () => {
22
+ const calls = [];
23
+ const context = {};
24
+ EventBus.$on(EVENT, function(...args) {
25
+ calls.push({ context: this, args });
26
+ }, context);
27
+ EventBus.$on(EVENT, () => calls.push("second"));
28
+
29
+ EventBus.$emit(EVENT, 1, { value: 2 });
30
+
31
+ expect(calls).toEqual([{ context, args: [1, { value: 2 }] }, "second"]);
32
+ });
33
+
34
+ it("keeps duplicate subscriptions and removes every match for a callback", () => {
35
+ const callback = vi.fn();
36
+ const remaining = vi.fn();
37
+ EventBus.$on(EVENT, callback);
38
+ EventBus.$on(EVENT, callback);
39
+ EventBus.$on(EVENT, remaining);
40
+
41
+ EventBus.$emit(EVENT);
42
+ expect(callback).toHaveBeenCalledTimes(2);
43
+
44
+ EventBus.$off(EVENT, callback);
45
+ EventBus.$emit(EVENT);
46
+ expect(callback).toHaveBeenCalledTimes(2);
47
+ expect(remaining).toHaveBeenCalledTimes(2);
48
+ });
49
+
50
+ it("removes all listeners for one event without affecting other events", () => {
51
+ const callback = vi.fn();
52
+ EventBus.$on(EVENT, callback);
53
+ EventBus.$on(OTHER_EVENT, callback);
54
+
55
+ EventBus.$off(EVENT);
56
+ EventBus.$emit(EVENT);
57
+ expect(callback).not.toHaveBeenCalled();
58
+ EventBus.$emit(OTHER_EVENT);
59
+ expect(callback).toHaveBeenCalledTimes(1);
60
+ });
61
+
62
+ it("removes a once listener before a recursive emit and preserves its context", () => {
63
+ const context = {};
64
+ const callback = vi.fn(function(value) {
65
+ expect(this).toBe(context);
66
+ expect(value).toBe(42);
67
+ EventBus.$emit(EVENT, value);
68
+ });
69
+ EventBus.$once(EVENT, callback, context);
70
+
71
+ EventBus.$emit(EVENT, 42);
72
+ EventBus.$emit(EVENT, 42);
73
+
74
+ expect(callback).toHaveBeenCalledTimes(1);
75
+ });
76
+
77
+ it("can cancel once listeners using the original callback", () => {
78
+ const callback = vi.fn();
79
+ EventBus.$once(EVENT, callback);
80
+ EventBus.$on(EVENT, callback);
81
+ EventBus.$once(EVENT, callback);
82
+
83
+ EventBus.$off(EVENT, callback);
84
+ EventBus.$emit(EVENT);
85
+
86
+ expect(callback).not.toHaveBeenCalled();
87
+ });
88
+
89
+ it("uses a snapshot when subscriptions change during an emit", () => {
90
+ const removed = vi.fn();
91
+ const added = vi.fn();
92
+ EventBus.$once(EVENT, () => {
93
+ EventBus.$off(EVENT, removed);
94
+ EventBus.$on(EVENT, added);
95
+ });
96
+ EventBus.$on(EVENT, removed);
97
+
98
+ EventBus.$emit(EVENT);
99
+ expect(removed).toHaveBeenCalledTimes(1);
100
+ expect(added).not.toHaveBeenCalled();
101
+
102
+ EventBus.$emit(EVENT);
103
+ expect(removed).toHaveBeenCalledTimes(1);
104
+ expect(added).toHaveBeenCalledTimes(1);
105
+ });
106
+
107
+ it("propagates listener errors and keeps a throwing once listener removed", () => {
108
+ const error = new Error("Listener failed");
109
+ const remaining = vi.fn();
110
+ EventBus.$once(EVENT, () => {
111
+ throw error;
112
+ });
113
+ EventBus.$on(EVENT, remaining);
114
+
115
+ expect(() => EventBus.$emit(EVENT)).toThrow(error);
116
+ expect(remaining).not.toHaveBeenCalled();
117
+ EventBus.$emit(EVENT);
118
+ expect(remaining).toHaveBeenCalledTimes(1);
119
+ });
120
+
121
+ it("supports arbitrary event names and emitting without subscribers", () => {
122
+ const callback = vi.fn();
123
+ expect(() => EventBus.$emit(EVENT)).not.toThrow();
124
+ EventBus.$on("__proto__", callback);
125
+ EventBus.$emit("__proto__", "value");
126
+ expect(callback).toHaveBeenCalledWith("value");
127
+ });
128
+
129
+ it("preserves chaining through the emitter returned by the public methods", () => {
130
+ const callback = vi.fn();
131
+ const emitter = EventBus.$on(EVENT, callback);
132
+ expect(emitter.emit(EVENT).off(EVENT, callback).once(EVENT, callback)).toBe(emitter);
133
+ expect(EventBus.$emit(EVENT)).toBe(emitter);
134
+ expect(EventBus.$off(EVENT)).toBe(emitter);
135
+ expect(EventBus.$once(EVENT, callback)).toBe(emitter);
136
+ expect(callback).toHaveBeenCalledTimes(2);
137
+ });
138
+ });
@@ -2,7 +2,7 @@ import {
2
2
  describe,
3
3
  expect,
4
4
  it,
5
- } from "@jest/globals";
5
+ } from "vitest";
6
6
 
7
7
  import {
8
8
  aOrderBy,
@@ -2,7 +2,7 @@ import {
2
2
  describe,
3
3
  expect,
4
4
  it,
5
- } from "@jest/globals";
5
+ } from "vitest";
6
6
 
7
7
  import {
8
8
  aSortBy,