@centreon/ui 24.4.1-sync-release-34022.0 → 24.4.1-test-code-coverage.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 (220) hide show
  1. package/package.json +48 -40
  2. package/src/ActionsList/ActionsList.styles.ts +40 -71
  3. package/src/Button/Icon/index.stories.tsx +1 -1
  4. package/src/Button/Icon/index.tsx +1 -1
  5. package/src/Dashboard/Dashboard.styles.ts +6 -5
  6. package/src/Dialog/Confirm/index.tsx +10 -2
  7. package/src/Dialog/UnsavedChanges/index.tsx +21 -20
  8. package/src/Dialog/UnsavedChanges/translatedLabels.ts +4 -6
  9. package/src/Dialog/index.tsx +8 -1
  10. package/src/Form/Inputs/CheckboxGroup.tsx +4 -1
  11. package/src/Form/Inputs/Text.tsx +3 -1
  12. package/src/Form/Inputs/models.ts +1 -0
  13. package/src/Graph/BarStack/BarStack.cypress.spec.tsx +139 -0
  14. package/src/Graph/BarStack/BarStack.stories.tsx +123 -0
  15. package/src/Graph/BarStack/BarStack.styles.ts +37 -0
  16. package/src/Graph/BarStack/BarStack.tsx +14 -0
  17. package/src/Graph/BarStack/ResponsiveBarStack.tsx +209 -0
  18. package/src/Graph/BarStack/index.ts +1 -0
  19. package/src/Graph/BarStack/models.ts +19 -0
  20. package/src/Graph/BarStack/useResponsiveBarStack.ts +131 -0
  21. package/src/Graph/Gauge/Gauge.cypress.spec.tsx +102 -0
  22. package/src/Graph/Gauge/Gauge.tsx +1 -1
  23. package/src/Graph/HeatMap/HeatMap.cypress.spec.tsx +145 -0
  24. package/src/Graph/HeatMap/HeatMap.stories.tsx +0 -25
  25. package/src/Graph/HeatMap/ResponsiveHeatMap.tsx +8 -2
  26. package/src/Graph/Legend/Legend.tsx +21 -0
  27. package/src/Graph/Legend/index.ts +1 -0
  28. package/src/Graph/Legend/models.ts +11 -0
  29. package/src/Graph/LineChart/BasicComponents/Lines/Threshold/index.tsx +4 -5
  30. package/src/Graph/LineChart/BasicComponents/ThresholdLine.tsx +3 -1
  31. package/src/Graph/LineChart/Header/index.tsx +3 -31
  32. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTickGraph.ts +9 -11
  33. package/src/Graph/LineChart/InteractiveComponents/Annotations/Annotation/index.tsx +3 -2
  34. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/GraphValueTooltip.tsx +68 -0
  35. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltip.ts +27 -0
  36. package/src/Graph/LineChart/InteractiveComponents/GraphValueTooltip/useGraphValueTooltipStyles.ts +31 -0
  37. package/src/Graph/LineChart/InteractiveComponents/index.tsx +132 -17
  38. package/src/Graph/LineChart/InteractiveComponents/interactionWithGraphAtoms.ts +7 -27
  39. package/src/Graph/LineChart/Legend/Legend.styles.ts +5 -9
  40. package/src/Graph/LineChart/Legend/LegendHeader.tsx +10 -22
  41. package/src/Graph/LineChart/Legend/index.tsx +17 -55
  42. package/src/Graph/LineChart/LineChart.cypress.spec.tsx +91 -0
  43. package/src/Graph/LineChart/LineChart.styles.ts +8 -0
  44. package/src/Graph/LineChart/LineChart.tsx +106 -116
  45. package/src/Graph/LineChart/LoadingSkeleton.tsx +2 -2
  46. package/src/Graph/LineChart/index.tsx +6 -7
  47. package/src/Graph/LineChart/mockedData/lastDayWithIncompleteValues.json +1320 -0
  48. package/src/Graph/LineChart/mockedData/lastDayWithNullValues.json +1314 -0
  49. package/src/Graph/LineChart/models.ts +12 -1
  50. package/src/Graph/PieChart/PieChart.cypress.spec.tsx +154 -0
  51. package/src/Graph/PieChart/PieChart.stories.tsx +194 -0
  52. package/src/Graph/PieChart/PieChart.styles.ts +39 -0
  53. package/src/Graph/PieChart/PieChart.tsx +14 -0
  54. package/src/Graph/PieChart/ResponsivePie.tsx +243 -0
  55. package/src/Graph/PieChart/index.ts +1 -0
  56. package/src/Graph/PieChart/models.ts +19 -0
  57. package/src/Graph/PieChart/useResponsivePie.ts +81 -0
  58. package/src/Graph/SingleBar/SingleBar.cypress.spec.tsx +121 -0
  59. package/src/Graph/Text/Text.cypress.spec.tsx +101 -0
  60. package/src/Graph/Text/Text.styles.ts +12 -1
  61. package/src/Graph/Text/Text.tsx +17 -12
  62. package/src/Graph/Tree/DescendantNodes.tsx +89 -0
  63. package/src/Graph/Tree/Links.tsx +77 -0
  64. package/src/Graph/Tree/StandaloneTree.tsx +32 -0
  65. package/src/Graph/Tree/Tree.cypress.spec.tsx +195 -0
  66. package/src/Graph/Tree/Tree.stories.tsx +160 -0
  67. package/src/Graph/Tree/Tree.tsx +116 -0
  68. package/src/Graph/Tree/constants.ts +2 -0
  69. package/src/Graph/Tree/index.ts +4 -0
  70. package/src/Graph/Tree/models.ts +55 -0
  71. package/src/Graph/Tree/stories/contents.tsx +164 -0
  72. package/src/Graph/Tree/stories/datas.ts +305 -0
  73. package/src/Graph/Tree/utils.ts +49 -0
  74. package/src/Graph/common/testUtils.ts +71 -0
  75. package/src/Graph/common/timeSeries/index.ts +50 -12
  76. package/src/Graph/common/utils.ts +19 -0
  77. package/src/Graph/index.ts +4 -0
  78. package/src/InputField/Number/Number.cypress.spec.tsx +85 -0
  79. package/src/InputField/Number/Number.stories.tsx +66 -0
  80. package/src/InputField/Number/Number.tsx +74 -0
  81. package/src/InputField/Search/index.tsx +2 -2
  82. package/src/InputField/Select/Autocomplete/Multi/index.tsx +4 -2
  83. package/src/InputField/Select/Autocomplete/index.tsx +10 -3
  84. package/src/InputField/Select/IconPopover/index.tsx +1 -1
  85. package/src/InputField/Select/index.tsx +14 -1
  86. package/src/InputField/Text/index.tsx +38 -38
  87. package/src/Listing/ActionBar/index.tsx +10 -10
  88. package/src/Listing/Cell/DataCell.styles.ts +3 -0
  89. package/src/Listing/Cell/DataCell.tsx +8 -4
  90. package/src/Listing/Listing.cypress.spec.tsx +217 -33
  91. package/src/Listing/Listing.styles.ts +3 -5
  92. package/src/Listing/Row/Row.tsx +7 -3
  93. package/src/Listing/index.stories.tsx +25 -2
  94. package/src/Listing/index.test.tsx +1 -1
  95. package/src/Listing/index.tsx +202 -143
  96. package/src/Listing/models.ts +1 -0
  97. package/src/Listing/useStyleTable.ts +1 -0
  98. package/src/Panel/index.tsx +1 -1
  99. package/src/PopoverMenu/index.tsx +6 -5
  100. package/src/ThemeProvider/index.tsx +3 -0
  101. package/src/TimePeriods/CustomTimePeriod/CompactCustomTimePeriod.styles.ts +6 -7
  102. package/src/TimePeriods/ResolutionTimePeriod.cypress.spec.tsx +12 -9
  103. package/src/Typography/FluidTypography/FluidTypography.cypress.spec.tsx +27 -0
  104. package/src/Typography/FluidTypography/index.stories.tsx +2 -2
  105. package/src/Typography/FluidTypography/index.tsx +21 -28
  106. package/src/api/index.ts +3 -3
  107. package/src/api/useGraphQuery/index.ts +26 -5
  108. package/src/api/useGraphQuery/models.ts +5 -0
  109. package/src/api/useMutationQuery/index.test.ts +4 -4
  110. package/src/api/useMutationQuery/index.ts +24 -13
  111. package/src/components/CollapsibleItem/CollapsibleItem.cypress.spec.tsx +76 -0
  112. package/src/components/CollapsibleItem/CollapsibleItem.stories.tsx +26 -0
  113. package/src/components/CollapsibleItem/CollapsibleItem.tsx +43 -14
  114. package/src/components/CollapsibleItem/useCollapsibleItemStyles.ts +24 -1
  115. package/src/components/DataTable/DataTable.cypress.spec.tsx +14 -33
  116. package/src/components/DataTable/Item/DataTableItem.tsx +4 -60
  117. package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.cypress.spec.tsx +36 -13
  118. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ContactSwitch.tsx +11 -3
  119. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.styles.ts +8 -0
  120. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/ShareInput.tsx +1 -0
  121. package/src/components/Form/{AccessRightsV2 → AccessRights}/ShareInput/useShareInput.tsx +4 -0
  122. package/src/components/Form/{AccessRightsV2 → AccessRights}/models.ts +1 -0
  123. package/src/components/Form/{AccessRightsV2 → AccessRights}/storiesData.ts +23 -22
  124. package/src/components/Form/Dashboard/DashboardDuplicationForm.tsx +85 -0
  125. package/src/components/Form/Dashboard/index.ts +1 -0
  126. package/src/components/Form/FormActions.tsx +7 -2
  127. package/src/components/Form/index.ts +2 -2
  128. package/src/components/ItemComposition/Item.tsx +1 -1
  129. package/src/components/ItemComposition/ItemComposition.cypress.spec.tsx +113 -0
  130. package/src/components/ItemComposition/ItemComposition.stories.tsx +14 -0
  131. package/src/components/ItemComposition/ItemComposition.styles.ts +36 -3
  132. package/src/components/ItemComposition/ItemComposition.tsx +41 -17
  133. package/src/components/List/Item/ListItem.tsx +3 -3
  134. package/src/components/Modal/ConfirmationModal/ConfirmationModal.cypress.spec.tsx +168 -0
  135. package/src/components/Modal/ConfirmationModal/ConfirmationModal.stories.tsx +62 -0
  136. package/src/components/Modal/ConfirmationModal/ConfirmationModal.tsx +87 -0
  137. package/src/components/Modal/Modal.styles.ts +8 -3
  138. package/src/components/Modal/index.ts +2 -0
  139. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.stories.tsx +3 -3
  140. package/src/components/Tooltip/ConfirmationTooltip/ConfirmationTooltip.tsx +1 -1
  141. package/src/components/Tooltip/ConfirmationTooltip/models.ts +1 -1
  142. package/src/components/Zoom/Minimap.tsx +129 -0
  143. package/src/components/Zoom/Zoom.cypress.spec.tsx +246 -0
  144. package/src/components/Zoom/Zoom.stories.tsx +115 -0
  145. package/src/components/Zoom/Zoom.styles.tsx +68 -0
  146. package/src/components/Zoom/Zoom.tsx +64 -0
  147. package/src/components/Zoom/ZoomContent.tsx +170 -0
  148. package/src/components/Zoom/constants.ts +2 -0
  149. package/src/components/Zoom/localPoint.ts +51 -0
  150. package/src/components/Zoom/models.ts +25 -0
  151. package/src/components/Zoom/useMinimap.ts +156 -0
  152. package/src/components/Zoom/useZoom.ts +70 -0
  153. package/src/components/Zoom/utils.ts +55 -0
  154. package/src/components/index.ts +1 -0
  155. package/src/index.ts +1 -0
  156. package/src/utils/index.ts +3 -0
  157. package/src/utils/resourcesStatusURL.ts +166 -0
  158. package/src/utils/useFullscreen/Fullscreen.cypress.spec.tsx +130 -0
  159. package/src/utils/useFullscreen/atoms.ts +3 -0
  160. package/src/utils/useFullscreen/index.ts +2 -0
  161. package/src/utils/useFullscreen/translatedLabels.ts +1 -0
  162. package/src/utils/useFullscreen/useFullscreen.ts +73 -0
  163. package/src/utils/useFullscreen/useFullscreenListener.ts +62 -0
  164. package/src/utils/useInfiniteScrollListing.ts +4 -1
  165. package/src/Graph/LineChart/BasicComponents/LoadingProgress.tsx +0 -46
  166. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/TooltipAnchorPoint.tsx +0 -96
  167. package/src/Graph/LineChart/InteractiveComponents/AnchorPoint/useTooltipAnchorPoint.ts +0 -107
  168. package/src/Graph/LineChart/Legend/InteractiveValue.tsx +0 -22
  169. package/src/Graph/LineChart/Legend/useInteractiveValues.ts +0 -99
  170. package/src/Typography/FluidTypography/useFluidResizeObserver.ts +0 -56
  171. package/src/components/Form/AccessRights/AccessRights.resource.ts +0 -45
  172. package/src/components/Form/AccessRights/AccessRightsForm.stories.tsx +0 -59
  173. package/src/components/Form/AccessRights/AccessRightsForm.styles.ts +0 -21
  174. package/src/components/Form/AccessRights/AccessRightsForm.tsx +0 -67
  175. package/src/components/Form/AccessRights/AccessRightsFormActions.tsx +0 -80
  176. package/src/components/Form/AccessRights/Input/AddAction.tsx +0 -31
  177. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.stories.tsx +0 -54
  178. package/src/components/Form/AccessRights/Input/ContactAccessRightInput.tsx +0 -72
  179. package/src/components/Form/AccessRights/Input/ContactAccessRightsInput.styles.ts +0 -22
  180. package/src/components/Form/AccessRights/Input/ContactInputField.tsx +0 -105
  181. package/src/components/Form/AccessRights/Input/RoleInputField.tsx +0 -29
  182. package/src/components/Form/AccessRights/List/ContactAccessRightsList.stories.tsx +0 -97
  183. package/src/components/Form/AccessRights/List/ContactAccessRightsList.styles.ts +0 -71
  184. package/src/components/Form/AccessRights/List/ContactAccessRightsList.tsx +0 -51
  185. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.stories.tsx +0 -116
  186. package/src/components/Form/AccessRights/List/ContactAccessRightsListItem.tsx +0 -118
  187. package/src/components/Form/AccessRights/List/ContactAccessRightsListItemSkeleton.tsx +0 -26
  188. package/src/components/Form/AccessRights/List/ContactAccessRightsListSkeleton.tsx +0 -28
  189. package/src/components/Form/AccessRights/Stats/AccessRightsStats.styles.ts +0 -18
  190. package/src/components/Form/AccessRights/Stats/AccessRightsStats.tsx +0 -41
  191. package/src/components/Form/AccessRights/__fixtures__/contactAccessRight.mock.ts +0 -54
  192. package/src/components/Form/AccessRights/common/GroupLabel.styles.ts +0 -18
  193. package/src/components/Form/AccessRights/common/GroupLabel.tsx +0 -15
  194. package/src/components/Form/AccessRights/common/Input.styles.ts +0 -48
  195. package/src/components/Form/AccessRights/common/RoleInputSelect.styles.ts +0 -11
  196. package/src/components/Form/AccessRights/common/RoleInputSelect.tsx +0 -57
  197. package/src/components/Form/AccessRights/index.ts +0 -3
  198. package/src/components/Form/AccessRights/useAccessRightsForm.test.tsx +0 -531
  199. package/src/components/Form/AccessRights/useAccessRightsForm.tsx +0 -282
  200. package/src/components/Form/AccessRights/useAccessRightsForm.utils.ts +0 -41
  201. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.stories.tsx +0 -0
  202. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.styles.ts +0 -0
  203. /package/src/components/Form/{AccessRightsV2 → AccessRights}/AccessRights.tsx +0 -0
  204. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/Actions.styles.ts +0 -0
  205. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/Actions.tsx +0 -0
  206. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Actions/useActions.ts +0 -0
  207. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/Item.tsx +0 -0
  208. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/List.styles.tsx +0 -0
  209. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/List.tsx +0 -0
  210. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/ListItemSkeleton.tsx +0 -0
  211. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/ListSkeleton.tsx +0 -0
  212. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/RemoveAccessRight.tsx +0 -0
  213. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/StateChip.tsx +0 -0
  214. /package/src/components/Form/{AccessRightsV2 → AccessRights}/List/useItem.ts +0 -0
  215. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Provider.tsx +0 -0
  216. /package/src/components/Form/{AccessRightsV2 → AccessRights}/Stats/Stats.tsx +0 -0
  217. /package/src/components/Form/{AccessRightsV2 → AccessRights}/atoms.ts +0 -0
  218. /package/src/components/Form/{AccessRightsV2 → AccessRights}/common/RoleSelectField.styles.tsx +0 -0
  219. /package/src/components/Form/{AccessRightsV2 → AccessRights}/common/RoleSelectField.tsx +0 -0
  220. /package/src/components/Form/{AccessRightsV2 → AccessRights}/useAccessRightsInitValues.ts +0 -0
@@ -1,282 +0,0 @@
1
- import { ReactElement, ReactNode, useEffect, useRef } from 'react';
2
-
3
- import {
4
- atom,
5
- createStore,
6
- Provider,
7
- useAtom,
8
- useAtomValue,
9
- useSetAtom,
10
- useStore
11
- } from 'jotai';
12
-
13
- import {
14
- ContactAccessRightResource,
15
- ContactAccessRightStateResource,
16
- ContactGroupResource,
17
- ContactResource,
18
- RoleResource
19
- } from './AccessRights.resource';
20
- import {
21
- createInitialState,
22
- sortOnAddedStateFirstAndContactName
23
- } from './useAccessRightsForm.utils';
24
-
25
- /** state */
26
-
27
- type loadingState = 'idle' | 'loading';
28
-
29
- const loadingStatusAtom = atom<loadingState>('idle');
30
-
31
- type formOptions = {
32
- contacts: Array<ContactResource | ContactGroupResource>;
33
- roles: Array<RoleResource>;
34
- };
35
-
36
- const formOptionsAtom = atom<formOptions>({
37
- contacts: [],
38
- roles: []
39
- });
40
-
41
- const contactAccessRightsAtom = atom<Array<ContactAccessRightStateResource>>(
42
- []
43
- );
44
-
45
- type StateStats = {
46
- added: number;
47
- removed: number;
48
- updated: number;
49
- };
50
-
51
- const contactAccessRightsStateAtom = atom<{
52
- isDirty: boolean;
53
- isLoading: boolean;
54
- stats: StateStats;
55
- }>((get) => ({
56
- isDirty: get(contactAccessRightsAtom).some(
57
- ({ state }) => state !== 'unchanged'
58
- ),
59
- isLoading: get(loadingStatusAtom) === 'loading',
60
- stats: {
61
- added: get(contactAccessRightsAtom).filter(({ state }) => state === 'added')
62
- .length,
63
- removed: get(contactAccessRightsAtom).filter(
64
- ({ state }) => state === 'removed'
65
- ).length,
66
- updated: get(contactAccessRightsAtom).filter(
67
- ({ state }) => state === 'updated'
68
- ).length
69
- }
70
- }));
71
-
72
- type callbacks = {
73
- onSubmit?: (values: Array<ContactAccessRightStateResource>) => void;
74
- };
75
-
76
- const callbacksAtom = atom<callbacks>({});
77
-
78
- /** provider */
79
-
80
- export type AccessRightsFormProviderProps = {
81
- children: ReactNode;
82
- initialValues?: Array<ContactAccessRightResource>;
83
- loadingStatus?: loadingState;
84
- onSubmit?: callbacks['onSubmit'];
85
- options?: formOptions;
86
- };
87
-
88
- const AccessRightsFormProvider = ({
89
- children,
90
- initialValues,
91
- options,
92
- loadingStatus = 'idle',
93
- onSubmit
94
- }: AccessRightsFormProviderProps): ReactElement => {
95
- const store = useRef(createStore()).current;
96
-
97
- const setLoadingStatus = useSetAtom(loadingStatusAtom, { store });
98
- const setFormOptions = useSetAtom(formOptionsAtom, { store });
99
- const setContactAccessRights = useSetAtom(contactAccessRightsAtom, { store });
100
- const setCallbacks = useSetAtom(callbacksAtom, { store });
101
-
102
- useEffect(() => {
103
- setLoadingStatus(loadingStatus);
104
- }, [loadingStatus]);
105
-
106
- useEffect(() => {
107
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
108
- options && setFormOptions(options);
109
- }, [options]);
110
-
111
- useEffect(() => {
112
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
113
- onSubmit && setCallbacks({ onSubmit });
114
- }, [onSubmit]);
115
-
116
- useEffect(() => {
117
- setContactAccessRights(
118
- initialValues ? createInitialState(initialValues) : []
119
- );
120
- }, [initialValues]);
121
-
122
- return <Provider store={store}>{children}</Provider>;
123
- };
124
-
125
- /** hook */
126
-
127
- type UseAccessRightsForm = {
128
- addContactAccessRight: (
129
- contactAccessRight: ContactAccessRightResource
130
- ) => void;
131
- contactAccessRights: Array<ContactAccessRightStateResource>;
132
- isDirty: boolean;
133
- isLoading: boolean;
134
- options: formOptions;
135
- removeContactAccessRight: (
136
- contactAccessRight: ContactAccessRightResource,
137
- restore?: boolean
138
- ) => void;
139
- stats: StateStats;
140
- submit: () => void;
141
- updateContactAccessRight: (
142
- contactAccessRight: ContactAccessRightResource
143
- ) => void;
144
- };
145
-
146
- const useAccessRightsForm = (): UseAccessRightsForm => {
147
- const store = useStore();
148
-
149
- const [contactAccessRights, setContactAccessRights] = useAtom(
150
- contactAccessRightsAtom,
151
- { store }
152
- );
153
- const { isLoading, isDirty, stats } = useAtomValue(
154
- contactAccessRightsStateAtom,
155
- { store }
156
- );
157
- const options = useAtomValue(formOptionsAtom, { store });
158
- const callbacks = useAtomValue(callbacksAtom, { store });
159
-
160
- const addContactAccessRight = (
161
- contactAccessRight: ContactAccessRightResource
162
- ): void =>
163
- setContactAccessRights((prev) => {
164
- const isContactAlreadyAdded = prev.some(
165
- ({ contactAccessRight: c }) =>
166
- c.contact?.id === contactAccessRight.contact?.id
167
- );
168
-
169
- return isContactAlreadyAdded
170
- ? prev
171
- : [
172
- ...prev,
173
- {
174
- contactAccessRight,
175
- state: 'added',
176
- stateHistory: []
177
- } as ContactAccessRightStateResource
178
- ].sort(sortOnAddedStateFirstAndContactName);
179
- });
180
-
181
- const removeContactAccessRight = (
182
- contactAccessRight: ContactAccessRightResource,
183
- restore = false
184
- ): void =>
185
- setContactAccessRights((prev) => {
186
- const contactAccessRightIndex = prev.findIndex(
187
- ({ contactAccessRight: prevContactAccessRight }) =>
188
- prevContactAccessRight.contact?.id === contactAccessRight.contact?.id
189
- );
190
-
191
- if (contactAccessRightIndex === -1) {
192
- return prev;
193
- }
194
-
195
- const { stateHistory } = prev[contactAccessRightIndex];
196
-
197
- if (restore) {
198
- return [
199
- ...prev.slice(0, contactAccessRightIndex),
200
- {
201
- ...prev[contactAccessRightIndex],
202
- state: stateHistory[stateHistory.length - 1],
203
- stateHistory: [...stateHistory, prev[contactAccessRightIndex].state]
204
- } as ContactAccessRightStateResource,
205
- ...prev.slice(contactAccessRightIndex + 1)
206
- ];
207
- }
208
-
209
- if (
210
- prev[contactAccessRightIndex].state === 'added' ||
211
- stateHistory[0] === 'added'
212
- ) {
213
- return [
214
- ...prev.slice(0, contactAccessRightIndex),
215
- ...prev.slice(contactAccessRightIndex + 1)
216
- ];
217
- }
218
-
219
- return [
220
- ...prev.slice(0, contactAccessRightIndex),
221
- {
222
- ...prev[contactAccessRightIndex],
223
- state: 'removed',
224
- stateHistory: [...stateHistory, prev[contactAccessRightIndex].state]
225
- } as ContactAccessRightStateResource,
226
- ...prev.slice(contactAccessRightIndex + 1)
227
- ];
228
- });
229
-
230
- const updateContactAccessRight = (
231
- contactAccessRight: ContactAccessRightResource
232
- ): void =>
233
- setContactAccessRights((prev) => {
234
- const contactAccessRightIndex = prev.findIndex(
235
- ({ contactAccessRight: prevContactAccessRight }) =>
236
- prevContactAccessRight.contact?.id === contactAccessRight.contact?.id
237
- );
238
-
239
- if (contactAccessRightIndex === -1) {
240
- return prev;
241
- }
242
-
243
- const { stateHistory } = prev[contactAccessRightIndex];
244
-
245
- const isAdded =
246
- prev[contactAccessRightIndex].state === 'added' ||
247
- stateHistory[0] === 'added';
248
- const isUpdated =
249
- prev[contactAccessRightIndex].state === 'updated' ||
250
- stateHistory.findIndex((state) => state === 'updated') <
251
- stateHistory.findIndex((state) => state === 'unchanged');
252
-
253
- // eslint-disable-next-line no-nested-ternary
254
- const state = isAdded ? 'added' : isUpdated ? 'unchanged' : 'updated';
255
-
256
- return [
257
- ...prev.slice(0, contactAccessRightIndex),
258
- {
259
- contactAccessRight,
260
- state,
261
- stateHistory: [...stateHistory, prev[contactAccessRightIndex].state]
262
- } as ContactAccessRightStateResource,
263
- ...prev.slice(contactAccessRightIndex + 1)
264
- ];
265
- });
266
-
267
- const submit = (): void => callbacks.onSubmit?.(contactAccessRights);
268
-
269
- return {
270
- addContactAccessRight,
271
- contactAccessRights,
272
- isDirty,
273
- isLoading,
274
- options,
275
- removeContactAccessRight,
276
- stats,
277
- submit,
278
- updateContactAccessRight
279
- };
280
- };
281
-
282
- export { AccessRightsFormProvider, useAccessRightsForm };
@@ -1,41 +0,0 @@
1
- import { ContactAccessRightStateResource } from './AccessRights.resource';
2
-
3
- export const sortOnContactName = (
4
- a: ContactAccessRightStateResource,
5
- b: ContactAccessRightStateResource
6
- ): number =>
7
- a.contactAccessRight.contact?.name.localeCompare(
8
- b.contactAccessRight.contact?.name ?? ''
9
- ) || 0;
10
-
11
- export const sortOnAddedStateFirstAndContactName = (
12
- a: ContactAccessRightStateResource,
13
- b: ContactAccessRightStateResource
14
- ): number => {
15
- if (a.state === 'added' && b.state !== 'added') {
16
- return -1;
17
- }
18
- if (a.state !== 'added' && b.state === 'added') {
19
- return 1;
20
- }
21
-
22
- return (
23
- a.contactAccessRight.contact?.name.localeCompare(
24
- b.contactAccessRight.contact?.name ?? ''
25
- ) || 0
26
- );
27
- };
28
-
29
- export const createInitialState = (
30
- values
31
- ): Array<ContactAccessRightStateResource> =>
32
- values
33
- ?.map(
34
- (contactAccessRight) =>
35
- ({
36
- contactAccessRight,
37
- state: 'unchanged',
38
- stateHistory: []
39
- }) as ContactAccessRightStateResource
40
- )
41
- .sort(sortOnAddedStateFirstAndContactName);