@itwin/grouping-mapping-widget 0.23.0 → 0.24.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 (211) hide show
  1. package/lib/cjs/WidgetShell/GroupingMappingContent.js +2 -2
  2. package/lib/cjs/WidgetShell/GroupingMappingContent.js.map +1 -1
  3. package/lib/cjs/components/Constants.d.ts +3 -0
  4. package/lib/cjs/components/Constants.js +5 -2
  5. package/lib/cjs/components/Constants.js.map +1 -1
  6. package/lib/cjs/components/GroupingMappingContext.js +12 -14
  7. package/lib/cjs/components/GroupingMappingContext.js.map +1 -1
  8. package/lib/cjs/components/Groups/Editing/GroupAction.js +5 -1
  9. package/lib/cjs/components/Groups/Editing/GroupAction.js.map +1 -1
  10. package/lib/cjs/components/Groups/GroupsVisualization.js +44 -12
  11. package/lib/cjs/components/Groups/GroupsVisualization.js.map +1 -1
  12. package/lib/cjs/components/Groups/groupsHelpers.d.ts +2 -1
  13. package/lib/cjs/components/Groups/groupsHelpers.js +8 -5
  14. package/lib/cjs/components/Groups/groupsHelpers.js.map +1 -1
  15. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.d.ts +2 -2
  16. package/lib/cjs/components/Groups/hooks/useKeySetHiliteQueries.js.map +1 -1
  17. package/lib/cjs/components/Mappings/Extraction/ExtractionMessageModal.js +27 -18
  18. package/lib/cjs/components/Mappings/Extraction/ExtractionMessageModal.js.map +1 -1
  19. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.d.ts +3 -0
  20. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js +17 -0
  21. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js.map +1 -0
  22. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.d.ts +3 -0
  23. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js +16 -0
  24. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js.map +1 -0
  25. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.d.ts +3 -0
  26. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js +17 -0
  27. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js.map +1 -0
  28. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.d.ts +9 -0
  29. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js +21 -0
  30. package/lib/cjs/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js.map +1 -0
  31. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.d.ts +17 -0
  32. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.js +79 -0
  33. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.js.map +1 -0
  34. package/lib/cjs/components/Mappings/Extraction/ExtractionStatus.scss +40 -0
  35. package/lib/cjs/components/Mappings/Import/SelectIModel.js +1 -2
  36. package/lib/cjs/components/Mappings/Import/SelectIModel.js.map +1 -1
  37. package/lib/cjs/components/Mappings/MappingListItem.d.ts +20 -0
  38. package/lib/cjs/components/Mappings/MappingListItem.js +96 -0
  39. package/lib/cjs/components/Mappings/MappingListItem.js.map +1 -0
  40. package/lib/cjs/components/Mappings/MappingListItem.scss +25 -0
  41. package/lib/cjs/components/Mappings/MappingsView.d.ts +2 -0
  42. package/lib/cjs/components/Mappings/MappingsView.js +28 -4
  43. package/lib/cjs/components/Mappings/MappingsView.js.map +1 -1
  44. package/lib/cjs/components/Mappings/hooks/useFetchExtractionStatus.d.ts +3 -1
  45. package/lib/cjs/components/Mappings/hooks/useFetchExtractionStatus.js +7 -4
  46. package/lib/cjs/components/Mappings/hooks/useFetchExtractionStatus.js.map +1 -1
  47. package/lib/cjs/components/Mappings/hooks/useFetchMappingExtractionStatus.d.ts +20 -0
  48. package/lib/cjs/components/Mappings/hooks/useFetchMappingExtractionStatus.js +55 -0
  49. package/lib/cjs/components/Mappings/hooks/useFetchMappingExtractionStatus.js.map +1 -0
  50. package/lib/cjs/components/Mappings/hooks/useMappingsOperations.d.ts +8 -0
  51. package/lib/cjs/components/Mappings/hooks/useMappingsOperations.js +29 -5
  52. package/lib/cjs/components/Mappings/hooks/useMappingsOperations.js.map +1 -1
  53. package/lib/cjs/components/Mappings/hooks/useRunExtraction.d.ts +14 -0
  54. package/lib/cjs/components/Mappings/hooks/useRunExtraction.js +42 -0
  55. package/lib/cjs/components/Mappings/hooks/useRunExtraction.js.map +1 -0
  56. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyAction.js +17 -25
  57. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyAction.js.map +1 -1
  58. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +18 -25
  59. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  60. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyTable.js +35 -38
  61. package/lib/cjs/components/Properties/CalculatedProperties/CalculatedPropertyTable.js.map +1 -1
  62. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationAction.js +28 -59
  63. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationAction.js.map +1 -1
  64. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationTable.js +37 -40
  65. package/lib/cjs/components/Properties/CustomCalculations/CustomCalculationTable.js.map +1 -1
  66. package/lib/cjs/components/Properties/GroupColorToggle.js +30 -26
  67. package/lib/cjs/components/Properties/GroupColorToggle.js.map +1 -1
  68. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.js +61 -166
  69. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  70. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyAction.scss +1 -46
  71. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyTable.js +34 -37
  72. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyTable.js.map +1 -1
  73. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyUtils.js +65 -51
  74. package/lib/cjs/components/Properties/GroupProperties/GroupPropertyUtils.js.map +1 -1
  75. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.d.ts +12 -0
  76. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js +147 -0
  77. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js.map +1 -0
  78. package/lib/cjs/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.scss +49 -0
  79. package/lib/cjs/components/Properties/PropertyMenu.js +11 -15
  80. package/lib/cjs/components/Properties/PropertyMenu.js.map +1 -1
  81. package/lib/cjs/components/Properties/PropertyTable.js +1 -1
  82. package/lib/cjs/components/Properties/PropertyTable.js.map +1 -1
  83. package/lib/cjs/components/Properties/hooks/useCalculatedPropertiesQuery.d.ts +4 -0
  84. package/lib/cjs/components/Properties/hooks/useCalculatedPropertiesQuery.js +12 -0
  85. package/lib/cjs/components/Properties/hooks/useCalculatedPropertiesQuery.js.map +1 -0
  86. package/lib/cjs/components/Properties/hooks/useCustomCalculationsQuery.d.ts +4 -0
  87. package/lib/cjs/components/Properties/hooks/useCustomCalculationsQuery.js +12 -0
  88. package/lib/cjs/components/Properties/hooks/useCustomCalculationsQuery.js.map +1 -0
  89. package/lib/cjs/components/Properties/hooks/useGroupPropertiesQuery.d.ts +4 -0
  90. package/lib/cjs/components/Properties/hooks/useGroupPropertiesQuery.js +12 -0
  91. package/lib/cjs/components/Properties/hooks/useGroupPropertiesQuery.js.map +1 -0
  92. package/lib/cjs/components/SharedComponents/DeleteModal.d.ts +1 -2
  93. package/lib/cjs/components/SharedComponents/DeleteModal.js +1 -2
  94. package/lib/cjs/components/SharedComponents/DeleteModal.js.map +1 -1
  95. package/lib/cjs/components/context/ExtractionStateJobContext.d.ts +8 -0
  96. package/lib/cjs/components/context/ExtractionStateJobContext.js +44 -0
  97. package/lib/cjs/components/context/ExtractionStateJobContext.js.map +1 -0
  98. package/lib/cjs/components/context/PropertiesGroupColorContext.d.ts +8 -0
  99. package/lib/cjs/components/context/{PropertiesContext.js → PropertiesGroupColorContext.js} +7 -10
  100. package/lib/cjs/components/context/PropertiesGroupColorContext.js.map +1 -0
  101. package/lib/esm/WidgetShell/GroupingMappingContent.js +2 -2
  102. package/lib/esm/WidgetShell/GroupingMappingContent.js.map +1 -1
  103. package/lib/esm/components/Constants.d.ts +3 -0
  104. package/lib/esm/components/Constants.js +3 -0
  105. package/lib/esm/components/Constants.js.map +1 -1
  106. package/lib/esm/components/GroupingMappingContext.js +12 -14
  107. package/lib/esm/components/GroupingMappingContext.js.map +1 -1
  108. package/lib/esm/components/Groups/Editing/GroupAction.js +5 -1
  109. package/lib/esm/components/Groups/Editing/GroupAction.js.map +1 -1
  110. package/lib/esm/components/Groups/GroupsVisualization.js +45 -13
  111. package/lib/esm/components/Groups/GroupsVisualization.js.map +1 -1
  112. package/lib/esm/components/Groups/groupsHelpers.d.ts +2 -1
  113. package/lib/esm/components/Groups/groupsHelpers.js +6 -4
  114. package/lib/esm/components/Groups/groupsHelpers.js.map +1 -1
  115. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.d.ts +2 -2
  116. package/lib/esm/components/Groups/hooks/useKeySetHiliteQueries.js.map +1 -1
  117. package/lib/esm/components/Mappings/Extraction/ExtractionMessageModal.js +27 -18
  118. package/lib/esm/components/Mappings/Extraction/ExtractionMessageModal.js.map +1 -1
  119. package/lib/esm/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.d.ts +3 -0
  120. package/lib/esm/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js +10 -0
  121. package/lib/esm/components/Mappings/Extraction/ExtractionStates/QueuedExtractionState.js.map +1 -0
  122. package/lib/esm/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.d.ts +3 -0
  123. package/lib/esm/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js +9 -0
  124. package/lib/esm/components/Mappings/Extraction/ExtractionStates/RunningExtractionState.js.map +1 -0
  125. package/lib/esm/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.d.ts +3 -0
  126. package/lib/esm/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js +10 -0
  127. package/lib/esm/components/Mappings/Extraction/ExtractionStates/StartingExtractionState.js.map +1 -0
  128. package/lib/esm/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.d.ts +9 -0
  129. package/lib/esm/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js +14 -0
  130. package/lib/esm/components/Mappings/Extraction/ExtractionStates/TerminalExtractionState.js.map +1 -0
  131. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.d.ts +17 -0
  132. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.js +52 -0
  133. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.js.map +1 -0
  134. package/lib/esm/components/Mappings/Extraction/ExtractionStatus.scss +40 -0
  135. package/lib/esm/components/Mappings/Import/SelectIModel.js +1 -2
  136. package/lib/esm/components/Mappings/Import/SelectIModel.js.map +1 -1
  137. package/lib/esm/components/Mappings/MappingListItem.d.ts +20 -0
  138. package/lib/esm/components/Mappings/MappingListItem.js +69 -0
  139. package/lib/esm/components/Mappings/MappingListItem.js.map +1 -0
  140. package/lib/esm/components/Mappings/MappingListItem.scss +25 -0
  141. package/lib/esm/components/Mappings/MappingsView.d.ts +2 -0
  142. package/lib/esm/components/Mappings/MappingsView.js +30 -6
  143. package/lib/esm/components/Mappings/MappingsView.js.map +1 -1
  144. package/lib/esm/components/Mappings/hooks/useFetchExtractionStatus.d.ts +3 -1
  145. package/lib/esm/components/Mappings/hooks/useFetchExtractionStatus.js +7 -4
  146. package/lib/esm/components/Mappings/hooks/useFetchExtractionStatus.js.map +1 -1
  147. package/lib/esm/components/Mappings/hooks/useFetchMappingExtractionStatus.d.ts +20 -0
  148. package/lib/esm/components/Mappings/hooks/useFetchMappingExtractionStatus.js +49 -0
  149. package/lib/esm/components/Mappings/hooks/useFetchMappingExtractionStatus.js.map +1 -0
  150. package/lib/esm/components/Mappings/hooks/useMappingsOperations.d.ts +8 -0
  151. package/lib/esm/components/Mappings/hooks/useMappingsOperations.js +30 -6
  152. package/lib/esm/components/Mappings/hooks/useMappingsOperations.js.map +1 -1
  153. package/lib/esm/components/Mappings/hooks/useRunExtraction.d.ts +14 -0
  154. package/lib/esm/components/Mappings/hooks/useRunExtraction.js +38 -0
  155. package/lib/esm/components/Mappings/hooks/useRunExtraction.js.map +1 -0
  156. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyAction.js +17 -25
  157. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyAction.js.map +1 -1
  158. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js +18 -25
  159. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyActionWithVisuals.js.map +1 -1
  160. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyTable.js +35 -38
  161. package/lib/esm/components/Properties/CalculatedProperties/CalculatedPropertyTable.js.map +1 -1
  162. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationAction.js +29 -60
  163. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationAction.js.map +1 -1
  164. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationTable.js +37 -40
  165. package/lib/esm/components/Properties/CustomCalculations/CustomCalculationTable.js.map +1 -1
  166. package/lib/esm/components/Properties/GroupColorToggle.js +32 -28
  167. package/lib/esm/components/Properties/GroupColorToggle.js.map +1 -1
  168. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js +63 -168
  169. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.js.map +1 -1
  170. package/lib/esm/components/Properties/GroupProperties/GroupPropertyAction.scss +1 -46
  171. package/lib/esm/components/Properties/GroupProperties/GroupPropertyTable.js +34 -37
  172. package/lib/esm/components/Properties/GroupProperties/GroupPropertyTable.js.map +1 -1
  173. package/lib/esm/components/Properties/GroupProperties/GroupPropertyUtils.js +65 -51
  174. package/lib/esm/components/Properties/GroupProperties/GroupPropertyUtils.js.map +1 -1
  175. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.d.ts +12 -0
  176. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js +117 -0
  177. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.js.map +1 -0
  178. package/lib/esm/components/Properties/GroupProperties/GroupsPropertiesSelectionModal.scss +49 -0
  179. package/lib/esm/components/Properties/PropertyMenu.js +12 -16
  180. package/lib/esm/components/Properties/PropertyMenu.js.map +1 -1
  181. package/lib/esm/components/Properties/PropertyTable.js +1 -1
  182. package/lib/esm/components/Properties/PropertyTable.js.map +1 -1
  183. package/lib/esm/components/Properties/hooks/useCalculatedPropertiesQuery.d.ts +4 -0
  184. package/lib/esm/components/Properties/hooks/useCalculatedPropertiesQuery.js +8 -0
  185. package/lib/esm/components/Properties/hooks/useCalculatedPropertiesQuery.js.map +1 -0
  186. package/lib/esm/components/Properties/hooks/useCustomCalculationsQuery.d.ts +4 -0
  187. package/lib/esm/components/Properties/hooks/useCustomCalculationsQuery.js +8 -0
  188. package/lib/esm/components/Properties/hooks/useCustomCalculationsQuery.js.map +1 -0
  189. package/lib/esm/components/Properties/hooks/useGroupPropertiesQuery.d.ts +4 -0
  190. package/lib/esm/components/Properties/hooks/useGroupPropertiesQuery.js +8 -0
  191. package/lib/esm/components/Properties/hooks/useGroupPropertiesQuery.js.map +1 -0
  192. package/lib/esm/components/SharedComponents/DeleteModal.d.ts +1 -2
  193. package/lib/esm/components/SharedComponents/DeleteModal.js +1 -2
  194. package/lib/esm/components/SharedComponents/DeleteModal.js.map +1 -1
  195. package/lib/esm/components/context/ExtractionStateJobContext.d.ts +8 -0
  196. package/lib/esm/components/context/ExtractionStateJobContext.js +17 -0
  197. package/lib/esm/components/context/ExtractionStateJobContext.js.map +1 -0
  198. package/lib/esm/components/context/PropertiesGroupColorContext.d.ts +8 -0
  199. package/lib/esm/components/context/{PropertiesContext.js → PropertiesGroupColorContext.js} +5 -8
  200. package/lib/esm/components/context/PropertiesGroupColorContext.js.map +1 -0
  201. package/package.json +3 -2
  202. package/lib/cjs/components/Properties/hooks/useFetchData.d.ts +0 -7
  203. package/lib/cjs/components/Properties/hooks/useFetchData.js +0 -43
  204. package/lib/cjs/components/Properties/hooks/useFetchData.js.map +0 -1
  205. package/lib/cjs/components/context/PropertiesContext.d.ts +0 -15
  206. package/lib/cjs/components/context/PropertiesContext.js.map +0 -1
  207. package/lib/esm/components/Properties/hooks/useFetchData.d.ts +0 -7
  208. package/lib/esm/components/Properties/hooks/useFetchData.js +0 -37
  209. package/lib/esm/components/Properties/hooks/useFetchData.js.map +0 -1
  210. package/lib/esm/components/context/PropertiesContext.d.ts +0 -15
  211. package/lib/esm/components/context/PropertiesContext.js.map +0 -1
@@ -0,0 +1,69 @@
1
+ import React, { useCallback, useEffect, useState } from "react";
2
+ import { MappingUIActionGroup } from "./MappingViewActionGroup";
3
+ import { Anchor, ListItem, Text } from "@itwin/itwinui-react";
4
+ import { ExtractionStates } from "./Extraction/ExtractionStatus";
5
+ import { ExtractionStatus } from "./Extraction/ExtractionStatus";
6
+ import { useExtractionStateJobContext } from "../context/ExtractionStateJobContext";
7
+ import { useFetchMappingExtractionStatus } from "./hooks/useFetchMappingExtractionStatus";
8
+ import "./MappingListItem.scss";
9
+ import { useGroupingMappingApiConfig } from "../context/GroupingApiConfigContext";
10
+ import { useQueryClient } from "@tanstack/react-query";
11
+ export const MappingListItem = ({ selected, onSelectionChange, mapping, jobId, jobStartEvent, onClickMappingModify, onClickMappingTitle, onRefreshMappings, onToggleExtraction, setShowDeleteModal, }) => {
12
+ const [extractionState, setExtractionState] = useState(ExtractionStates.None);
13
+ const { mappingIdJobInfo, setMappingIdJobInfo } = useExtractionStateJobContext();
14
+ const groupingMappingApiConfig = useGroupingMappingApiConfig();
15
+ const [isJobStarted, setIsJobStarted] = useState(false);
16
+ const statusQuery = useFetchMappingExtractionStatus({ ...groupingMappingApiConfig, mapping, enabled: isJobStarted });
17
+ const queryClient = useQueryClient();
18
+ const onClickTile = () => {
19
+ onSelectionChange(mapping);
20
+ };
21
+ // Check whether the job is still running when users refresh the mapping list
22
+ // or modify any mappings
23
+ useEffect(() => {
24
+ if (mappingIdJobInfo.get(mapping.id)) {
25
+ setIsJobStarted(true);
26
+ }
27
+ }, [mappingIdJobInfo, mapping.id]);
28
+ const resolveTerminalExtractionStatus = useCallback(async () => {
29
+ const state = statusQuery.data.finalExtractionStateValue;
30
+ if (state === ExtractionStates.Failed || state === ExtractionStates.Succeeded) {
31
+ setIsJobStarted(false);
32
+ setMappingIdJobInfo((prevMap) => {
33
+ const newMap = new Map(prevMap);
34
+ newMap.delete(mapping.id);
35
+ return newMap;
36
+ });
37
+ await queryClient.invalidateQueries({ queryKey: ["iModelExtractionStatus"] });
38
+ }
39
+ }, [mapping.id, queryClient, setMappingIdJobInfo, statusQuery.data]);
40
+ useEffect(() => {
41
+ const listener = (startedMappingId) => {
42
+ if (startedMappingId === mapping.id) {
43
+ setExtractionState(ExtractionStates.Starting);
44
+ setIsJobStarted(true);
45
+ }
46
+ };
47
+ jobStartEvent.addListener(listener);
48
+ return () => {
49
+ jobStartEvent.removeListener(listener);
50
+ };
51
+ }, [jobStartEvent, mapping.id, jobId]);
52
+ useEffect(() => {
53
+ const isStatusReady = statusQuery.data && statusQuery.isFetched;
54
+ if (isStatusReady) {
55
+ setExtractionState(statusQuery.data.finalExtractionStateValue);
56
+ // No need to await. We don't need to wait for the status to be resolved in invalidation.
57
+ void resolveTerminalExtractionStatus();
58
+ }
59
+ }, [resolveTerminalExtractionStatus, statusQuery]);
60
+ return (React.createElement(ListItem, { actionable: true, className: "gmw-list-item-container", active: selected, key: mapping.id, onClick: onClickTile, title: mapping.mappingName },
61
+ React.createElement(ListItem.Content, null,
62
+ React.createElement(Anchor, { onClick: onClickMappingTitle ? () => onClickMappingTitle?.(mapping) : undefined }, mapping.mappingName ? mapping.mappingName : "Untitled"),
63
+ mapping.description && React.createElement(Text, { className: "gmw-body-text", isMuted: true, title: mapping.description, variant: "small" }, mapping.description)),
64
+ React.createElement(ExtractionStatus, { state: extractionState, clearExtractionState: () => {
65
+ setExtractionState(ExtractionStates.None);
66
+ } }),
67
+ React.createElement(MappingUIActionGroup, { mapping: mapping, onToggleExtraction: onToggleExtraction, onRefresh: onRefreshMappings, onClickMappingModify: onClickMappingModify, setShowDeleteModal: setShowDeleteModal })));
68
+ };
69
+ //# sourceMappingURL=MappingListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MappingListItem.js","sourceRoot":"","sources":["../../../../src/components/Mappings/MappingListItem.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { Mapping } from \"@itwin/insights-client\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport { MappingUIActionGroup } from \"./MappingViewActionGroup\";\nimport { Anchor, ListItem, Text } from \"@itwin/itwinui-react\";\nimport { ExtractionStates } from \"./Extraction/ExtractionStatus\";\nimport { ExtractionStatus } from \"./Extraction/ExtractionStatus\";\nimport { useExtractionStateJobContext } from \"../context/ExtractionStateJobContext\";\nimport { useFetchMappingExtractionStatus } from \"./hooks/useFetchMappingExtractionStatus\";\nimport \"./MappingListItem.scss\";\nimport { useGroupingMappingApiConfig } from \"../context/GroupingApiConfigContext\";\nimport { useQueryClient } from \"@tanstack/react-query\";\n\nexport interface MappingListItemProps {\n selected: boolean;\n onSelectionChange: (mapping: Mapping) => void;\n mapping: Mapping;\n jobId: string;\n jobStartEvent: BeEvent<(mappingId: string) => void>;\n onClickMappingTitle?: (mapping: Mapping) => void;\n onClickMappingModify?: (mapping: Mapping) => void;\n onRefreshMappings: () => Promise<void>;\n onToggleExtraction: (mapping: Mapping) => Promise<void>;\n setShowDeleteModal: (mapping?: Mapping) => void;\n initialStateExtractionFlag?: boolean;\n setInitialExtractionStateFlag?: (initialStateExtractionFlag: boolean) => void;\n}\n\nexport const MappingListItem = ({\n selected,\n onSelectionChange,\n mapping,\n jobId,\n jobStartEvent,\n onClickMappingModify,\n onClickMappingTitle,\n onRefreshMappings,\n onToggleExtraction,\n setShowDeleteModal,\n}: MappingListItemProps) => {\n const [extractionState, setExtractionState] = useState<ExtractionStates | undefined>(ExtractionStates.None);\n const { mappingIdJobInfo, setMappingIdJobInfo } = useExtractionStateJobContext();\n const groupingMappingApiConfig = useGroupingMappingApiConfig();\n const [isJobStarted, setIsJobStarted] = useState<boolean>(false);\n const statusQuery = useFetchMappingExtractionStatus({ ...groupingMappingApiConfig, mapping, enabled: isJobStarted });\n const queryClient = useQueryClient();\n\n const onClickTile = () => {\n onSelectionChange(mapping);\n };\n\n // Check whether the job is still running when users refresh the mapping list\n // or modify any mappings\n useEffect(() => {\n if(mappingIdJobInfo.get(mapping.id)){\n setIsJobStarted(true);\n }\n }, [mappingIdJobInfo, mapping.id]);\n\n const resolveTerminalExtractionStatus = useCallback(async () => {\n const state = statusQuery.data!.finalExtractionStateValue;\n if (state === ExtractionStates.Failed || state === ExtractionStates.Succeeded) {\n setIsJobStarted(false);\n setMappingIdJobInfo((prevMap: Map<string, string>) => {\n const newMap = new Map(prevMap);\n newMap.delete(mapping.id);\n return newMap;\n });\n await queryClient.invalidateQueries({ queryKey: [\"iModelExtractionStatus\"] });\n }\n }, [mapping.id, queryClient, setMappingIdJobInfo, statusQuery.data]);\n\n useEffect(() => {\n const listener = (startedMappingId: string) => {\n if (startedMappingId === mapping.id) {\n setExtractionState(ExtractionStates.Starting);\n setIsJobStarted(true);\n }\n };\n jobStartEvent.addListener(listener);\n\n return () => {\n jobStartEvent.removeListener(listener);\n };\n }, [jobStartEvent, mapping.id, jobId]);\n\n useEffect(() => {\n const isStatusReady = statusQuery.data && statusQuery.isFetched;\n if (isStatusReady) {\n setExtractionState(statusQuery.data.finalExtractionStateValue);\n // No need to await. We don't need to wait for the status to be resolved in invalidation.\n void resolveTerminalExtractionStatus();\n }\n }, [resolveTerminalExtractionStatus, statusQuery]);\n\n return (\n <ListItem actionable\n className=\"gmw-list-item-container\"\n active={selected}\n key={mapping.id}\n onClick={onClickTile}\n title={mapping.mappingName}>\n <ListItem.Content>\n <Anchor onClick={onClickMappingTitle ? () => onClickMappingTitle?.(mapping) : undefined}>{mapping.mappingName ? mapping.mappingName : \"Untitled\"}</Anchor>\n {mapping.description && <Text className=\"gmw-body-text\" isMuted={true} title={mapping.description} variant=\"small\">{mapping.description}</Text>}\n </ListItem.Content>\n <ExtractionStatus\n state={extractionState}\n clearExtractionState={() => {\n setExtractionState(ExtractionStates.None);\n }}\n ></ExtractionStatus >\n <MappingUIActionGroup\n mapping={mapping}\n onToggleExtraction={onToggleExtraction}\n onRefresh={onRefreshMappings}\n onClickMappingModify={onClickMappingModify}\n setShowDeleteModal={setShowDeleteModal}\n />\n </ListItem>\n );\n};\n"]}
@@ -0,0 +1,25 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ .gmw-list-item-container{
6
+ display: flex;
7
+ justify-content: space-between;
8
+ border-radius: 5px;
9
+ min-height: calc(var(--iui-size-s) * 5);
10
+ padding: 5.5px var(--iui-size-xs);
11
+ padding-bottom: 2px var(--iui-size-xs);
12
+ padding-top: 2px var(--iui-size-xs);
13
+ }
14
+
15
+ .gmw-body {
16
+ display: flex;
17
+ flex-direction: column;
18
+ min-width: 0;
19
+ justify-content: center;
20
+ &-text {
21
+ overflow: hidden;
22
+ white-space: nowrap;
23
+ text-overflow: ellipsis;
24
+ }
25
+ }
@@ -35,6 +35,8 @@ export interface MappingsViewProps {
35
35
  onClickMappingTitle?: (mapping: Mapping) => void;
36
36
  onClickMappingModify?: (mapping: Mapping) => void;
37
37
  alert?: React.ReactElement<typeof Alert>;
38
+ initialStateExtractionFlag?: boolean;
39
+ setInitialExtractionStateFlag?: (initialStateExtractionFlag: boolean) => void;
38
40
  }
39
41
  export declare const MappingsView: ({ mappings, isLoading, extractionStatusData, showExtractionMessageModal, extractionMessageData, setShowExtractionMessageModal, isTogglingExtraction, onRefreshMappings, onRefreshExtractionStatus, onToggleExtraction, onDelete, showDeleteModal, setShowDeleteModal, displayStrings: userDisplayStrings, showImportModal, setShowImportModal, onClickAddMapping, onClickMappingTitle, onClickMappingModify, alert, }: MappingsViewProps) => JSX.Element;
40
42
  //# sourceMappingURL=MappingsView.d.ts.map
@@ -2,19 +2,22 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import React, { useCallback } from "react";
5
+ import React, { useCallback, useMemo, useState } from "react";
6
6
  import { Button, IconButton, } from "@itwin/itwinui-react";
7
- import { SvgAdd, SvgImport, SvgRefresh, } from "@itwin/itwinui-icons-react";
7
+ import { SvgAdd, SvgImport, SvgPlay, SvgRefresh, } from "@itwin/itwinui-icons-react";
8
8
  import { EmptyMessage } from "../SharedComponents/EmptyMessage";
9
9
  import { LoadingOverlay } from "../SharedComponents/LoadingOverlay";
10
10
  import "./MappingsView.scss";
11
11
  import DeleteModal from "../SharedComponents/DeleteModal";
12
12
  import { MappingImportWizardModal } from "./Import/MappingImportWizardModal";
13
- import { HorizontalTile } from "../SharedComponents/HorizontalTile";
14
13
  import { BlockingOverlay } from "./BlockingOverlay";
15
- import { MappingUIActionGroup } from "./MappingViewActionGroup";
16
14
  import { ExtractionStatusIcon } from "./Extraction/ExtractionStatusIcon";
15
+ import { MappingListItem } from "./MappingListItem";
17
16
  import { ExtractionMessageModal } from "./Extraction/ExtractionMessageModal";
17
+ import { BeEvent } from "@itwin/core-bentley";
18
+ import { useExtractionStateJobContext } from "../context/ExtractionStateJobContext";
19
+ import { useGroupingMappingApiConfig } from "../context/GroupingApiConfigContext";
20
+ import { useRunExtraction } from "./hooks/useRunExtraction";
18
21
  export const mappingViewDefaultDisplayStrings = {
19
22
  mappings: "Mappings",
20
23
  iTwins: "iTwins",
@@ -27,9 +30,28 @@ export const mappingViewDefaultDisplayStrings = {
27
30
  };
28
31
  export const MappingsView = ({ mappings, isLoading, extractionStatusData, showExtractionMessageModal, extractionMessageData, setShowExtractionMessageModal, isTogglingExtraction, onRefreshMappings, onRefreshExtractionStatus, onToggleExtraction, onDelete, showDeleteModal, setShowDeleteModal, displayStrings: userDisplayStrings, showImportModal, setShowImportModal, onClickAddMapping, onClickMappingTitle, onClickMappingModify, alert, }) => {
29
32
  const displayStrings = React.useMemo(() => ({ ...mappingViewDefaultDisplayStrings, ...userDisplayStrings }), [userDisplayStrings]);
33
+ const [selectedMappings, setSelectedMappings] = useState([]);
34
+ const groupingMappingApiConfig = useGroupingMappingApiConfig();
35
+ const { mappingIdJobInfo } = useExtractionStateJobContext();
36
+ const { runExtraction } = useRunExtraction(groupingMappingApiConfig);
37
+ const jobStartEvent = useMemo(() => new BeEvent(), []);
30
38
  const refreshAll = useCallback(async () => {
31
39
  await Promise.all([onRefreshMappings(), onRefreshExtractionStatus()]);
32
40
  }, [onRefreshMappings, onRefreshExtractionStatus]);
41
+ const onSelectionChange = (mapping) => {
42
+ setSelectedMappings((mappingIdList) => {
43
+ return mappingIdList.some((eachId) => mapping.id === eachId.id)
44
+ ? mappingIdList.filter((eachId) => mapping.id !== eachId.id)
45
+ : [...mappingIdList, mapping];
46
+ });
47
+ };
48
+ const onRunExtraction = useCallback(async () => {
49
+ await runExtraction(selectedMappings);
50
+ selectedMappings.map((mapping) => {
51
+ jobStartEvent.raiseEvent(mapping.id);
52
+ });
53
+ setSelectedMappings([]);
54
+ }, [selectedMappings, jobStartEvent, runExtraction]);
33
55
  return (React.createElement(React.Fragment, null,
34
56
  React.createElement(BlockingOverlay, { isVisible: isTogglingExtraction }),
35
57
  React.createElement("div", { className: "gmw-mappings-view-container" },
@@ -38,7 +60,9 @@ export const MappingsView = ({ mappings, isLoading, extractionStatusData, showEx
38
60
  onClickAddMapping &&
39
61
  React.createElement(Button, { startIcon: React.createElement(SvgAdd, null), onClick: onClickAddMapping, styleType: "high-visibility", title: "New Mapping" }, "New"),
40
62
  showImportModal !== undefined && setShowImportModal && React.createElement(IconButton, { title: `Import ${displayStrings.mappings}`, onClick: () => setShowImportModal(true) },
41
- React.createElement(SvgImport, null))),
63
+ React.createElement(SvgImport, null)),
64
+ React.createElement(IconButton, { title: "Run extraction", onClick: onRunExtraction, disabled: selectedMappings.length === 0 },
65
+ React.createElement(SvgPlay, null))),
42
66
  React.createElement("div", { className: "gmw-button-spacing" },
43
67
  React.createElement(ExtractionStatusIcon, { iconStatus: extractionStatusData.iconStatus, onClick: () => {
44
68
  if (extractionStatusData.iconStatus === "negative") {
@@ -49,7 +73,7 @@ export const MappingsView = ({ mappings, isLoading, extractionStatusData, showEx
49
73
  React.createElement(SvgRefresh, null)))),
50
74
  alert,
51
75
  React.createElement("div", { className: 'gmw-mappings-border' }),
52
- isLoading ? (React.createElement(LoadingOverlay, null)) : mappings.length === 0 ? (React.createElement(EmptyMessage, { message: `No ${displayStrings.mappings} available.` })) : (React.createElement("div", { className: "gmw-mappings-list" }, mappings.map((mapping) => (React.createElement(HorizontalTile, { key: mapping.id, title: mapping.mappingName ? mapping.mappingName : "Untitled", subText: mapping.description ?? "", subtextToolTip: mapping.description ?? "", titleTooltip: mapping.mappingName, onClickTitle: onClickMappingTitle ? () => onClickMappingTitle(mapping) : undefined, actionGroup: React.createElement(MappingUIActionGroup, { mapping: mapping, onToggleExtraction: onToggleExtraction, onRefresh: onRefreshMappings, onClickMappingModify: onClickMappingModify, setShowDeleteModal: setShowDeleteModal }) })))))),
76
+ isLoading ? (React.createElement(LoadingOverlay, null)) : mappings.length === 0 ? (React.createElement(EmptyMessage, { message: `No ${displayStrings.mappings} available.` })) : (React.createElement("div", { className: "gmw-mappings-list" }, mappings.map((mapping) => (React.createElement(MappingListItem, { key: mapping.id, mapping: mapping, jobId: mappingIdJobInfo?.get(mapping.id) ?? "", jobStartEvent: jobStartEvent, onClickMappingTitle: onClickMappingTitle, onSelectionChange: onSelectionChange, selected: selectedMappings.some((eachMapping) => mapping.id === eachMapping.id), onToggleExtraction: onToggleExtraction, onRefreshMappings: onRefreshMappings, onClickMappingModify: onClickMappingModify, setShowDeleteModal: setShowDeleteModal })))))),
53
77
  showExtractionMessageModal && React.createElement(ExtractionMessageModal, { isOpen: showExtractionMessageModal, onClose: () => setShowExtractionMessageModal(false), extractionMessageData: extractionMessageData, timestamp: extractionMessageData.length === 0 ? "" : extractionMessageData[0].date }),
54
78
  showDeleteModal &&
55
79
  React.createElement(DeleteModal, { entityName: showDeleteModal?.mappingName, onClose: () => setShowDeleteModal(undefined), onDelete: async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"MappingsView.js","sourceRoot":"","sources":["../../../../src/components/Mappings/MappingsView.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useCallback } from \"react\";\nimport type {\n Alert,\n} from \"@itwin/itwinui-react\";\nimport {\n Button,\n IconButton,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgAdd,\n SvgImport,\n SvgRefresh,\n} from \"@itwin/itwinui-icons-react\";\nimport { EmptyMessage } from \"../SharedComponents/EmptyMessage\";\nimport { LoadingOverlay } from \"../SharedComponents/LoadingOverlay\";\nimport \"./MappingsView.scss\";\nimport DeleteModal from \"../SharedComponents/DeleteModal\";\nimport { MappingImportWizardModal } from \"./Import/MappingImportWizardModal\";\nimport { HorizontalTile } from \"../SharedComponents/HorizontalTile\";\nimport type { Mapping } from \"@itwin/insights-client\";\nimport { BlockingOverlay } from \"./BlockingOverlay\";\nimport { MappingUIActionGroup } from \"./MappingViewActionGroup\";\nimport type { ExtractionStatusData } from \"./Extraction/ExtractionStatusIcon\";\nimport { ExtractionStatusIcon } from \"./Extraction/ExtractionStatusIcon\";\nimport type { ExtractionMessageData } from \"./Extraction/ExtractionMessageModal\";\nimport { ExtractionMessageModal } from \"./Extraction/ExtractionMessageModal\";\n\nexport const mappingViewDefaultDisplayStrings = {\n mappings: \"Mappings\",\n iTwins: \"iTwins\",\n iTwinNumber: \"Number\",\n iTwinName: \"Name\",\n iTwinStatus: \"Status\",\n iModels: \"iModels\",\n iModelName: \"Name\",\n iModelDescription: \"Description\",\n};\n\nexport interface MappingsViewProps {\n mappings: Mapping[];\n isLoading: boolean;\n extractionStatusData: ExtractionStatusData;\n showExtractionMessageModal: boolean;\n extractionMessageData: ExtractionMessageData[];\n setShowExtractionMessageModal: (show: boolean) => void;\n isTogglingExtraction: boolean;\n onRefreshMappings: () => Promise<void>;\n onRefreshExtractionStatus: () => Promise<void>;\n onToggleExtraction: (mapping: Mapping) => Promise<void>;\n onDelete: (mapping: Mapping) => Promise<void>;\n showDeleteModal: Mapping | undefined;\n setShowDeleteModal: (mapping?: Mapping) => void;\n displayStrings?: Partial<typeof mappingViewDefaultDisplayStrings>;\n showImportModal?: boolean;\n setShowImportModal?: (show: boolean) => void;\n onClickAddMapping?: () => void;\n onClickMappingTitle?: (mapping: Mapping) => void;\n onClickMappingModify?: (mapping: Mapping) => void;\n alert?: React.ReactElement<typeof Alert>;\n}\n\nexport const MappingsView = ({\n mappings,\n isLoading,\n extractionStatusData,\n showExtractionMessageModal,\n extractionMessageData,\n setShowExtractionMessageModal,\n isTogglingExtraction,\n onRefreshMappings,\n onRefreshExtractionStatus,\n onToggleExtraction,\n onDelete,\n showDeleteModal,\n setShowDeleteModal,\n displayStrings: userDisplayStrings,\n showImportModal,\n setShowImportModal,\n onClickAddMapping,\n onClickMappingTitle,\n onClickMappingModify,\n alert,\n}: MappingsViewProps) => {\n const displayStrings = React.useMemo(\n () => ({ ...mappingViewDefaultDisplayStrings, ...userDisplayStrings }),\n [userDisplayStrings]\n );\n\n const refreshAll = useCallback(async () => {\n await Promise.all([onRefreshMappings(), onRefreshExtractionStatus()]);\n }, [onRefreshMappings, onRefreshExtractionStatus]);\n\n return (\n <>\n <BlockingOverlay isVisible={isTogglingExtraction} />\n <div className=\"gmw-mappings-view-container\">\n <div className=\"gmw-table-toolbar\">\n <div className=\"gmw-button-spacing\">\n {onClickAddMapping &&\n <Button\n startIcon={<SvgAdd />}\n onClick={onClickAddMapping}\n styleType=\"high-visibility\"\n title=\"New Mapping\"\n >\n New\n </Button>\n }\n {showImportModal !== undefined && setShowImportModal && <IconButton\n title={`Import ${displayStrings.mappings}`}\n onClick={() => setShowImportModal(true)}\n >\n <SvgImport />\n </IconButton>\n }\n </div>\n <div className=\"gmw-button-spacing\">\n <ExtractionStatusIcon\n iconStatus={extractionStatusData.iconStatus}\n onClick={() => {\n if (extractionStatusData.iconStatus === \"negative\") {\n setShowExtractionMessageModal(true);\n }\n }}\n iconMessage={extractionStatusData.iconMessage}\n />\n <IconButton\n title=\"Refresh\"\n onClick={refreshAll}\n disabled={isLoading}\n styleType='borderless'\n >\n <SvgRefresh />\n </IconButton>\n </div>\n </div>\n {alert}\n <div className='gmw-mappings-border' />\n {isLoading ? (\n <LoadingOverlay />\n ) : mappings.length === 0 ? (\n <EmptyMessage message={`No ${displayStrings.mappings} available.`} />\n ) : (\n <div className=\"gmw-mappings-list\">\n {mappings.map((mapping) => (\n <HorizontalTile\n key={mapping.id}\n title={mapping.mappingName ? mapping.mappingName : \"Untitled\"}\n subText={mapping.description ?? \"\"}\n subtextToolTip={mapping.description ?? \"\"}\n titleTooltip={mapping.mappingName}\n onClickTitle={onClickMappingTitle ? () => onClickMappingTitle(mapping) : undefined}\n actionGroup={\n <MappingUIActionGroup\n mapping={mapping}\n onToggleExtraction={onToggleExtraction}\n onRefresh={onRefreshMappings}\n onClickMappingModify={onClickMappingModify}\n setShowDeleteModal={setShowDeleteModal}\n />\n }\n />\n ))}\n </div>\n )}\n </div>\n {showExtractionMessageModal && <ExtractionMessageModal\n isOpen={showExtractionMessageModal}\n onClose={() => setShowExtractionMessageModal(false)}\n extractionMessageData={extractionMessageData}\n timestamp={extractionMessageData.length === 0 ? \"\" : extractionMessageData[0].date}\n />}\n {showDeleteModal &&\n <DeleteModal\n entityName={showDeleteModal?.mappingName}\n onClose={() => setShowDeleteModal(undefined)}\n onDelete={async () => {\n await onDelete(showDeleteModal);\n }}\n />\n }\n {showImportModal && setShowImportModal && <MappingImportWizardModal\n show={showImportModal}\n setShow={setShowImportModal}\n onFinish={onRefreshMappings}\n displayStrings={displayStrings}\n />}\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"MappingsView.js","sourceRoot":"","sources":["../../../../src/components/Mappings/MappingsView.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAI9D,OAAO,EACL,MAAM,EACN,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,MAAM,EACN,SAAS,EACT,OAAO,EACP,UAAU,GACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,qBAAqB,CAAC;AAC7B,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,QAAQ;IACrB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,QAAQ;IACrB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,MAAM;IAClB,iBAAiB,EAAE,aAAa;CACjC,CAAC;AA2BF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,6BAA6B,EAC7B,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,cAAc,EAAE,kBAAkB,EAClC,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,GACa,EAAE,EAAE;IACtB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,gCAAgC,EAAE,GAAG,kBAAkB,EAAE,CAAC,EACtE,CAAC,kBAAkB,CAAC,CACrB,CAAC;IACF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxE,MAAM,wBAAwB,GAAG,2BAA2B,EAAE,CAAC;IAC/D,MAAM,EAAE,gBAAgB,EAAE,GAAG,4BAA4B,EAAE,CAAC;IAC5D,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,IAAI,OAAO,EAA+B,EAChD,EAAE,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACxC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC,EAAE,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAEnD,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,EAAE;QAC7C,mBAAmB,CAAC,CAAC,aAAa,EAAE,EAAE;YACpC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;gBAC7D,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC;gBAC5D,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC,CACA,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC7C,MAAM,aAAa,CAAC,gBAAgB,CAAC,CAAC;QACtC,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,EAAE,CAAC,gBAAgB,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IAErD,OAAO,CACL;QACE,oBAAC,eAAe,IAAC,SAAS,EAAE,oBAAoB,GAAI;QACpD,6BAAK,SAAS,EAAC,6BAA6B;YAC1C,6BAAK,SAAS,EAAC,mBAAmB;gBAChC,6BAAK,SAAS,EAAC,oBAAoB;oBAChC,iBAAiB;wBAChB,oBAAC,MAAM,IACL,SAAS,EAAE,oBAAC,MAAM,OAAG,EACrB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAC,iBAAiB,EAC3B,KAAK,EAAC,aAAa,UAGZ;oBAEV,eAAe,KAAK,SAAS,IAAI,kBAAkB,IAAI,oBAAC,UAAU,IACjE,KAAK,EAAE,UAAU,cAAc,CAAC,QAAQ,EAAE,EAC1C,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;wBAEvC,oBAAC,SAAS,OAAG,CACF;oBAEb,oBAAC,UAAU,IACT,KAAK,EAAC,gBAAgB,EACtB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,gBAAgB,CAAC,MAAM,KAAK,CAAC;wBAEvC,oBAAC,OAAO,OAAG,CACA,CACT;gBACN,6BAAK,SAAS,EAAC,oBAAoB;oBACjC,oBAAC,oBAAoB,IACnB,UAAU,EAAE,oBAAoB,CAAC,UAAU,EAC3C,OAAO,EAAE,GAAG,EAAE;4BACZ,IAAI,oBAAoB,CAAC,UAAU,KAAK,UAAU,EAAE;gCAClD,6BAA6B,CAAC,IAAI,CAAC,CAAC;6BACrC;wBACH,CAAC,EACD,WAAW,EAAE,oBAAoB,CAAC,WAAW,GAC7C;oBACF,oBAAC,UAAU,IACT,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAC,YAAY;wBAEtB,oBAAC,UAAU,OAAG,CACH,CACT,CACF;YACL,KAAK;YACN,6BAAK,SAAS,EAAC,qBAAqB,GAAG;YACtC,SAAS,CAAC,CAAC,CAAC,CACX,oBAAC,cAAc,OAAG,CACnB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1B,oBAAC,YAAY,IAAC,OAAO,EAAE,MAAM,cAAc,CAAC,QAAQ,aAAa,GAAI,CACtE,CAAC,CAAC,CAAC,CACF,6BAAK,SAAS,EAAC,mBAAmB,IAC/B,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACzB,oBAAC,eAAe,IACd,GAAG,EAAE,OAAO,CAAC,EAAE,EACf,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAC9C,aAAa,EAAE,aAAa,EAC5B,mBAAmB,EAAE,mBAAmB,EACxC,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,gBAAgB,CAAC,IAAI,CAC7B,CAAC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAC/C,EACD,kBAAkB,EAAE,kBAAkB,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,oBAAoB,EAAE,oBAAoB,EAC1C,kBAAkB,EAAE,kBAAkB,GACtC,CACH,CAAC,CACE,CACP,CACG;QACL,0BAA0B,IAAI,oBAAC,sBAAsB,IACpD,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,6BAA6B,CAAC,KAAK,CAAC,EACnD,qBAAqB,EAAE,qBAAqB,EAC5C,SAAS,EAAE,qBAAqB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,IAAI,GAClF;QACD,eAAe;YACd,oBAAC,WAAW,IACV,UAAU,EAAE,eAAe,EAAE,WAAW,EACxC,OAAO,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAC5C,QAAQ,EAAE,KAAK,IAAI,EAAE;oBACnB,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAClC,CAAC,GACD;QAEH,eAAe,IAAI,kBAAkB,IAAI,oBAAC,wBAAwB,IACjE,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,iBAAiB,EAC3B,cAAc,EAAE,cAAc,GAC9B,CACD,CACJ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport type {\n Alert,\n} from \"@itwin/itwinui-react\";\nimport {\n Button,\n IconButton,\n} from \"@itwin/itwinui-react\";\nimport {\n SvgAdd,\n SvgImport,\n SvgPlay,\n SvgRefresh,\n} from \"@itwin/itwinui-icons-react\";\nimport { EmptyMessage } from \"../SharedComponents/EmptyMessage\";\nimport { LoadingOverlay } from \"../SharedComponents/LoadingOverlay\";\nimport \"./MappingsView.scss\";\nimport DeleteModal from \"../SharedComponents/DeleteModal\";\nimport { MappingImportWizardModal } from \"./Import/MappingImportWizardModal\";\nimport type { Mapping } from \"@itwin/insights-client\";\nimport { BlockingOverlay } from \"./BlockingOverlay\";\nimport type { ExtractionStatusData } from \"./Extraction/ExtractionStatusIcon\";\nimport { ExtractionStatusIcon } from \"./Extraction/ExtractionStatusIcon\";\nimport { MappingListItem } from \"./MappingListItem\";\nimport type { ExtractionMessageData } from \"./Extraction/ExtractionMessageModal\";\nimport { ExtractionMessageModal } from \"./Extraction/ExtractionMessageModal\";\nimport { BeEvent } from \"@itwin/core-bentley\";\nimport { useExtractionStateJobContext } from \"../context/ExtractionStateJobContext\";\nimport { useGroupingMappingApiConfig } from \"../context/GroupingApiConfigContext\";\nimport { useRunExtraction } from \"./hooks/useRunExtraction\";\n\nexport const mappingViewDefaultDisplayStrings = {\n mappings: \"Mappings\",\n iTwins: \"iTwins\",\n iTwinNumber: \"Number\",\n iTwinName: \"Name\",\n iTwinStatus: \"Status\",\n iModels: \"iModels\",\n iModelName: \"Name\",\n iModelDescription: \"Description\",\n};\n\nexport interface MappingsViewProps {\n mappings: Mapping[];\n isLoading: boolean;\n extractionStatusData: ExtractionStatusData;\n showExtractionMessageModal: boolean;\n extractionMessageData: ExtractionMessageData[];\n setShowExtractionMessageModal: (show: boolean) => void;\n isTogglingExtraction: boolean;\n onRefreshMappings: () => Promise<void>;\n onRefreshExtractionStatus: () => Promise<void>;\n onToggleExtraction: (mapping: Mapping) => Promise<void>;\n onDelete: (mapping: Mapping) => Promise<void>;\n showDeleteModal: Mapping | undefined;\n setShowDeleteModal: (mapping?: Mapping) => void;\n displayStrings?: Partial<typeof mappingViewDefaultDisplayStrings>;\n showImportModal?: boolean;\n setShowImportModal?: (show: boolean) => void;\n onClickAddMapping?: () => void;\n onClickMappingTitle?: (mapping: Mapping) => void;\n onClickMappingModify?: (mapping: Mapping) => void;\n alert?: React.ReactElement<typeof Alert>;\n initialStateExtractionFlag?: boolean;\n setInitialExtractionStateFlag?: (initialStateExtractionFlag: boolean) => void;\n}\n\nexport const MappingsView = ({\n mappings,\n isLoading,\n extractionStatusData,\n showExtractionMessageModal,\n extractionMessageData,\n setShowExtractionMessageModal,\n isTogglingExtraction,\n onRefreshMappings,\n onRefreshExtractionStatus,\n onToggleExtraction,\n onDelete,\n showDeleteModal,\n setShowDeleteModal,\n displayStrings: userDisplayStrings,\n showImportModal,\n setShowImportModal,\n onClickAddMapping,\n onClickMappingTitle,\n onClickMappingModify,\n alert,\n}: MappingsViewProps) => {\n const displayStrings = React.useMemo(\n () => ({ ...mappingViewDefaultDisplayStrings, ...userDisplayStrings }),\n [userDisplayStrings]\n );\n const [selectedMappings, setSelectedMappings] = useState<Mapping[]>([]);\n const groupingMappingApiConfig = useGroupingMappingApiConfig();\n const { mappingIdJobInfo } = useExtractionStateJobContext();\n const { runExtraction } = useRunExtraction(groupingMappingApiConfig);\n\n const jobStartEvent = useMemo(\n () => new BeEvent<(mappingId: string) => void>(),\n []\n );\n\n const refreshAll = useCallback(async () => {\n await Promise.all([onRefreshMappings(), onRefreshExtractionStatus()]);\n }, [onRefreshMappings, onRefreshExtractionStatus]);\n\n const onSelectionChange = (mapping: Mapping) => {\n setSelectedMappings((mappingIdList) => {\n return mappingIdList.some((eachId) => mapping.id === eachId.id)\n ? mappingIdList.filter((eachId) => mapping.id !== eachId.id)\n : [...mappingIdList, mapping];\n }\n );\n };\n\n const onRunExtraction = useCallback(async () => {\n await runExtraction(selectedMappings);\n selectedMappings.map((mapping) => {\n jobStartEvent.raiseEvent(mapping.id);\n });\n setSelectedMappings([]);\n }, [selectedMappings, jobStartEvent, runExtraction]);\n\n return (\n <>\n <BlockingOverlay isVisible={isTogglingExtraction} />\n <div className=\"gmw-mappings-view-container\">\n <div className=\"gmw-table-toolbar\">\n <div className=\"gmw-button-spacing\">\n {onClickAddMapping &&\n <Button\n startIcon={<SvgAdd />}\n onClick={onClickAddMapping}\n styleType=\"high-visibility\"\n title=\"New Mapping\"\n >\n New\n </Button>\n }\n {showImportModal !== undefined && setShowImportModal && <IconButton\n title={`Import ${displayStrings.mappings}`}\n onClick={() => setShowImportModal(true)}\n >\n <SvgImport />\n </IconButton>\n }\n <IconButton\n title=\"Run extraction\"\n onClick={onRunExtraction}\n disabled={selectedMappings.length === 0}\n >\n <SvgPlay />\n </IconButton>\n </div>\n <div className=\"gmw-button-spacing\">\n <ExtractionStatusIcon\n iconStatus={extractionStatusData.iconStatus}\n onClick={() => {\n if (extractionStatusData.iconStatus === \"negative\") {\n setShowExtractionMessageModal(true);\n }\n }}\n iconMessage={extractionStatusData.iconMessage}\n />\n <IconButton\n title=\"Refresh\"\n onClick={refreshAll}\n disabled={isLoading}\n styleType='borderless'\n >\n <SvgRefresh />\n </IconButton>\n </div>\n </div>\n {alert}\n <div className='gmw-mappings-border' />\n {isLoading ? (\n <LoadingOverlay />\n ) : mappings.length === 0 ? (\n <EmptyMessage message={`No ${displayStrings.mappings} available.`} />\n ) : (\n <div className=\"gmw-mappings-list\">\n {mappings.map((mapping) => (\n <MappingListItem\n key={mapping.id}\n mapping={mapping}\n jobId={mappingIdJobInfo?.get(mapping.id) ?? \"\"}\n jobStartEvent={jobStartEvent}\n onClickMappingTitle={onClickMappingTitle}\n onSelectionChange={onSelectionChange}\n selected={selectedMappings.some(\n (eachMapping) => mapping.id === eachMapping.id\n )}\n onToggleExtraction={onToggleExtraction}\n onRefreshMappings={onRefreshMappings}\n onClickMappingModify={onClickMappingModify}\n setShowDeleteModal={setShowDeleteModal}\n />\n ))}\n </div>\n )}\n </div>\n {showExtractionMessageModal && <ExtractionMessageModal\n isOpen={showExtractionMessageModal}\n onClose={() => setShowExtractionMessageModal(false)}\n extractionMessageData={extractionMessageData}\n timestamp={extractionMessageData.length === 0 ? \"\" : extractionMessageData[0].date}\n />}\n {showDeleteModal &&\n <DeleteModal\n entityName={showDeleteModal?.mappingName}\n onClose={() => setShowDeleteModal(undefined)}\n onDelete={async () => {\n await onDelete(showDeleteModal);\n }}\n />\n }\n {showImportModal && setShowImportModal && <MappingImportWizardModal\n show={showImportModal}\n setShow={setShowImportModal}\n onFinish={onRefreshMappings}\n displayStrings={displayStrings}\n />}\n </>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { IExtractionClient } from "@itwin/insights-client";
1
+ import type { ExtractionStatus, IExtractionClient } from "@itwin/insights-client";
2
2
  import type { GetAccessTokenFn } from "../../context/GroupingApiConfigContext";
3
3
  import type { ExtractionMessageData } from "../Extraction/ExtractionMessageModal";
4
4
  import type { ExtractionStatusData } from "../Extraction/ExtractionStatusIcon";
@@ -9,5 +9,7 @@ export declare const useFetchExtractionStatus: ({ iModelId, getAccessToken, extr
9
9
  }) => import("@tanstack/react-query").UseQueryResult<{
10
10
  extractionStatusIcon: ExtractionStatusData;
11
11
  extractionMessageData: ExtractionMessageData[];
12
+ latestExtractionResult: IteratorResult<import("@itwin/insights-client").Extraction, any>;
13
+ latestJobStatus: ExtractionStatus | undefined;
12
14
  }, unknown>;
13
15
  //# sourceMappingURL=useFetchExtractionStatus.d.ts.map
@@ -10,6 +10,11 @@ export const useFetchExtractionStatus = ({ iModelId, getAccessToken, extractionC
10
10
  const latestExtractionResult = await extraction.next();
11
11
  let extractionStatusIcon;
12
12
  let extractionMessageData = [];
13
+ const jobId = latestExtractionResult.value?.jobId;
14
+ let latestJobStatus;
15
+ if (jobId) {
16
+ latestJobStatus = await extractionClient.getExtractionStatus(accessToken, jobId);
17
+ }
13
18
  if (latestExtractionResult.done) {
14
19
  extractionStatusIcon = {
15
20
  iconStatus: "negative",
@@ -17,9 +22,7 @@ export const useFetchExtractionStatus = ({ iModelId, getAccessToken, extractionC
17
22
  };
18
23
  }
19
24
  else {
20
- const jobId = latestExtractionResult.value.jobId;
21
- const status = await extractionClient.getExtractionStatus(accessToken, jobId);
22
- if (status.containsIssues) {
25
+ if (latestJobStatus?.containsIssues) {
23
26
  const logs = await extractionClient.getExtractionLogs(accessToken, jobId);
24
27
  extractionMessageData = logs.filter((log) => log.message !== null).map((log) => ({
25
28
  date: log.dateTime,
@@ -39,7 +42,7 @@ export const useFetchExtractionStatus = ({ iModelId, getAccessToken, extractionC
39
42
  };
40
43
  }
41
44
  }
42
- return { extractionStatusIcon, extractionMessageData };
45
+ return { extractionStatusIcon, extractionMessageData, latestExtractionResult, latestJobStatus };
43
46
  },
44
47
  });
45
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useFetchExtractionStatus.js","sourceRoot":"","sources":["../../../../../src/components/Mappings/hooks/useFetchExtractionStatus.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,QAAQ,EACR,cAAc,EACd,gBAAgB,GAKjB,EAAE,EAAE;IACH,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,CAAC,wBAAwB,EAAE,QAAQ,CAAC;QAC9C,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,SAAS;QAC1B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3F,MAAM,sBAAsB,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAEvD,IAAI,oBAA0C,CAAC;YAC/C,IAAI,qBAAqB,GAA4B,EAAE,CAAC;YAExD,IAAI,sBAAsB,CAAC,IAAI,EAAE;gBAC/B,oBAAoB,GAAG;oBACrB,UAAU,EAAE,UAAU;oBACtB,WAAW,EAAE,sBAAsB;iBACpC,CAAC;aACH;iBAAM;gBACL,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC;gBACjD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAE9E,IAAI,MAAM,CAAC,cAAc,EAAE;oBACzB,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC1E,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBAC/E,IAAI,EAAE,GAAG,CAAC,QAAQ;wBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;qBAC3B,CAAC,CAAC,CAAC;oBACJ,oBAAoB,GAAG;wBACrB,UAAU,EAAE,UAAU;wBACtB,WAAW,EAAE,4DAA4D;qBAC1E,CAAC;iBACH;qBAAM;oBACL,oBAAoB,GAAG;wBACrB,UAAU,EAAE,UAAU;wBACtB,WAAW,EAAE,wBAAwB;qBACtC,CAAC;iBACH;aACF;YAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,CAAC;QACzD,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { IExtractionClient } from \"@itwin/insights-client\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { GetAccessTokenFn } from \"../../context/GroupingApiConfigContext\";\nimport type { ExtractionMessageData } from \"../Extraction/ExtractionMessageModal\";\nimport type { ExtractionStatusData } from \"../Extraction/ExtractionStatusIcon\";\n\nexport const useFetchExtractionStatus = ({\n iModelId,\n getAccessToken,\n extractionClient,\n}: {\n iModelId: string;\n getAccessToken: GetAccessTokenFn;\n extractionClient: IExtractionClient;\n}) => {\n return useQuery({\n queryKey: [\"iModelExtractionStatus\", iModelId],\n staleTime: Infinity,\n placeholderData: undefined,\n queryFn: async () => {\n const accessToken = await getAccessToken();\n const extraction = extractionClient.getExtractionHistoryIterator(accessToken, iModelId, 1);\n const latestExtractionResult = await extraction.next();\n\n let extractionStatusIcon: ExtractionStatusData;\n let extractionMessageData: ExtractionMessageData[] = [];\n\n if (latestExtractionResult.done) {\n extractionStatusIcon = {\n iconStatus: \"negative\",\n iconMessage: \"No extraction found.\",\n };\n } else {\n const jobId = latestExtractionResult.value.jobId;\n const status = await extractionClient.getExtractionStatus(accessToken, jobId);\n\n if (status.containsIssues) {\n const logs = await extractionClient.getExtractionLogs(accessToken, jobId);\n extractionMessageData = logs.filter((log) => log.message !== null).map((log) => ({\n date: log.dateTime,\n category: log.category,\n level: log.level,\n message: log.message ?? \"\",\n }));\n extractionStatusIcon = {\n iconStatus: \"negative\",\n iconMessage: \"Extraction contains issues. Click to view extraction logs.\",\n };\n } else {\n extractionStatusIcon = {\n iconStatus: \"positive\",\n iconMessage: \"Extraction successful.\",\n };\n }\n }\n\n return { extractionStatusIcon, extractionMessageData };\n },\n });\n};\n"]}
1
+ {"version":3,"file":"useFetchExtractionStatus.js","sourceRoot":"","sources":["../../../../../src/components/Mappings/hooks/useFetchExtractionStatus.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,QAAQ,EACR,cAAc,EACd,gBAAgB,GAKjB,EAAE,EAAE;IACH,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,CAAC,wBAAwB,EAAE,QAAQ,CAAC;QAC9C,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,SAAS;QAC1B,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3F,MAAM,sBAAsB,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;YAEvD,IAAI,oBAA0C,CAAC;YAC/C,IAAI,qBAAqB,GAA4B,EAAE,CAAC;YAExD,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC;YAClD,IAAI,eAA2C,CAAC;YAChD,IAAI,KAAK,EAAE;gBACT,eAAe,GAAG,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;aAClF;YAED,IAAI,sBAAsB,CAAC,IAAI,EAAE;gBAC/B,oBAAoB,GAAG;oBACrB,UAAU,EAAE,UAAU;oBACtB,WAAW,EAAE,sBAAsB;iBACpC,CAAC;aACH;iBAAM;gBACL,IAAI,eAAe,EAAE,cAAc,EAAE;oBACnC,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC1E,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBAC/E,IAAI,EAAE,GAAG,CAAC,QAAQ;wBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;qBAC3B,CAAC,CAAC,CAAC;oBACJ,oBAAoB,GAAG;wBACrB,UAAU,EAAE,UAAU;wBACtB,WAAW,EAAE,4DAA4D;qBAC1E,CAAC;iBACH;qBAAM;oBACL,oBAAoB,GAAG;wBACrB,UAAU,EAAE,UAAU;wBACtB,WAAW,EAAE,wBAAwB;qBACtC,CAAC;iBACH;aACF;YAED,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,eAAe,EAAE,CAAC;QAClG,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { ExtractionStatus, IExtractionClient } from \"@itwin/insights-client\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { GetAccessTokenFn } from \"../../context/GroupingApiConfigContext\";\nimport type { ExtractionMessageData } from \"../Extraction/ExtractionMessageModal\";\nimport type { ExtractionStatusData } from \"../Extraction/ExtractionStatusIcon\";\n\nexport const useFetchExtractionStatus = ({\n iModelId,\n getAccessToken,\n extractionClient,\n}: {\n iModelId: string;\n getAccessToken: GetAccessTokenFn;\n extractionClient: IExtractionClient;\n}) => {\n return useQuery({\n queryKey: [\"iModelExtractionStatus\", iModelId],\n staleTime: Infinity,\n placeholderData: undefined,\n queryFn: async () => {\n const accessToken = await getAccessToken();\n const extraction = extractionClient.getExtractionHistoryIterator(accessToken, iModelId, 1);\n const latestExtractionResult = await extraction.next();\n\n let extractionStatusIcon: ExtractionStatusData;\n let extractionMessageData: ExtractionMessageData[] = [];\n\n const jobId = latestExtractionResult.value?.jobId;\n let latestJobStatus: ExtractionStatus|undefined;\n if (jobId) {\n latestJobStatus = await extractionClient.getExtractionStatus(accessToken, jobId);\n }\n\n if (latestExtractionResult.done) {\n extractionStatusIcon = {\n iconStatus: \"negative\",\n iconMessage: \"No extraction found.\",\n };\n } else {\n if (latestJobStatus?.containsIssues) {\n const logs = await extractionClient.getExtractionLogs(accessToken, jobId);\n extractionMessageData = logs.filter((log) => log.message !== null).map((log) => ({\n date: log.dateTime,\n category: log.category,\n level: log.level,\n message: log.message ?? \"\",\n }));\n extractionStatusIcon = {\n iconStatus: \"negative\",\n iconMessage: \"Extraction contains issues. Click to view extraction logs.\",\n };\n } else {\n extractionStatusIcon = {\n iconStatus: \"positive\",\n iconMessage: \"Extraction successful.\",\n };\n }\n }\n\n return { extractionStatusIcon, extractionMessageData, latestExtractionResult, latestJobStatus };\n },\n });\n};\n"]}
@@ -0,0 +1,20 @@
1
+ import type { QueryClient } from "@tanstack/react-query";
2
+ import type { IExtractionClient } from "@itwin/insights-client";
3
+ import type { Mapping } from "@itwin/insights-client";
4
+ import { ExtractionStates } from "../Extraction/ExtractionStatus";
5
+ import type { GetAccessTokenFn, GroupingMappingApiConfig } from "../../context/GroupingApiConfigContext";
6
+ export interface MappingExtractionStatusProps extends GroupingMappingApiConfig {
7
+ mapping: Mapping;
8
+ enabled: boolean;
9
+ }
10
+ export interface MappingQueryResult {
11
+ mappingId: string;
12
+ finalExtractionStateValue: ExtractionStates;
13
+ }
14
+ export declare const fetchMappingStatus: (mappingId: string, jobId: string, getAccessToken: GetAccessTokenFn, extractionClient: IExtractionClient) => Promise<{
15
+ mappingId: string;
16
+ finalExtractionStateValue: ExtractionStates;
17
+ }>;
18
+ export declare const resetMappingExtractionStatus: (queryClient: QueryClient) => Promise<void>;
19
+ export declare const useFetchMappingExtractionStatus: ({ getAccessToken, mapping, enabled, }: MappingExtractionStatusProps) => import("@tanstack/react-query").UseQueryResult<MappingQueryResult, unknown>;
20
+ //# sourceMappingURL=useFetchMappingExtractionStatus.d.ts.map
@@ -0,0 +1,49 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { ExtractorState } from "@itwin/insights-client";
3
+ import { STATUS_CHECK_INTERVAL } from "../../Constants";
4
+ import { ExtractionStates } from "../Extraction/ExtractionStatus";
5
+ import { useExtractionClient } from "../../context/ExtractionClientContext";
6
+ import { useExtractionStateJobContext } from "../../context/ExtractionStateJobContext";
7
+ export const fetchMappingStatus = async (mappingId, jobId, getAccessToken, extractionClient) => {
8
+ const accessToken = await getAccessToken();
9
+ const getFinalExtractionStatus = ((extractionStatusResponse) => {
10
+ switch (extractionStatusResponse.state) {
11
+ case undefined:
12
+ return { mappingId, finalExtractionStateValue: ExtractionStates.Starting };
13
+ case ExtractorState.Running:
14
+ return { mappingId, finalExtractionStateValue: ExtractionStates.Running };
15
+ case ExtractorState.Failed:
16
+ return { mappingId, finalExtractionStateValue: ExtractionStates.Failed };
17
+ case ExtractorState.Queued:
18
+ return { mappingId, finalExtractionStateValue: ExtractionStates.Queued };
19
+ case ExtractorState.Succeeded:
20
+ return { mappingId, finalExtractionStateValue: ExtractionStates.Succeeded };
21
+ default:
22
+ return { mappingId, finalExtractionStateValue: ExtractionStates.None };
23
+ }
24
+ });
25
+ const extractionStatusResponse = await extractionClient.getExtractionStatus(accessToken, jobId);
26
+ return getFinalExtractionStatus(extractionStatusResponse);
27
+ };
28
+ export const resetMappingExtractionStatus = async (queryClient) => {
29
+ await queryClient.invalidateQueries({ queryKey: ["extractionState"] });
30
+ };
31
+ export const useFetchMappingExtractionStatus = ({ getAccessToken, mapping, enabled, }) => {
32
+ const extractionClient = useExtractionClient();
33
+ const { mappingIdJobInfo } = useExtractionStateJobContext();
34
+ const jobId = mappingIdJobInfo.get(mapping.id);
35
+ const statusQuery = useQuery({
36
+ queryKey: ["extractionState", jobId],
37
+ queryFn: async () => {
38
+ if (jobId) {
39
+ return fetchMappingStatus(mapping.id, jobId, getAccessToken, extractionClient);
40
+ }
41
+ // This should not happen as jobId should be defined if enabled is true
42
+ throw new Error("Job ID is undefined");
43
+ },
44
+ enabled: enabled && Boolean(jobId),
45
+ refetchInterval: STATUS_CHECK_INTERVAL,
46
+ });
47
+ return statusQuery;
48
+ };
49
+ //# sourceMappingURL=useFetchMappingExtractionStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFetchMappingExtractionStatus.js","sourceRoot":"","sources":["../../../../../src/components/Mappings/hooks/useFetchMappingExtractionStatus.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAYvF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,SAAiB,EACjB,KAAa,EACb,cAAgC,EAChC,gBAAmC,EACnC,EAAE;IACF,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAE3C,MAAM,wBAAwB,GAAG,CAAC,CAAC,wBAA0C,EAAE,EAAE;QAC/E,QAAO,wBAAwB,CAAC,KAAK,EAAE;YACrC,KAAK,SAAS;gBACZ,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,QAAQ,EAAC,CAAC;YAC5E,KAAK,cAAc,CAAC,OAAO;gBACzB,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,OAAO,EAAC,CAAC;YAC3E,KAAK,cAAc,CAAC,MAAM;gBACxB,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,MAAM,EAAC,CAAC;YAC1E,KAAK,cAAc,CAAC,MAAM;gBACxB,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,MAAM,EAAC,CAAC;YAC1E,KAAK,cAAc,CAAC,SAAS;gBAC3B,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,SAAS,EAAC,CAAC;YAC7E;gBACE,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,gBAAgB,CAAC,IAAI,EAAC,CAAC;SACzE;IACH,CAAC,CAAC,CAAC;IACH,MAAM,wBAAwB,GAAG,MAAM,gBAAgB,CAAC,mBAAmB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChG,OAAO,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,EAAE,WAAwB,EAAE,EAAE;IAC7E,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAC,QAAQ,EAAE,CAAC,iBAAiB,CAAC,EAAC,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,EAC9C,cAAc,EACd,OAAO,EACP,OAAO,GACsB,EAAE,EAAE;IACjC,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;IAC/C,MAAM,EAAE,gBAAgB,EAAE,GAAG,4BAA4B,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,QAAQ,CAAqB;QAC/C,QAAQ,EAAE,CAAC,iBAAiB,EAAE,KAAK,CAAC;QACpC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,KAAK,EAAE;gBACT,OAAO,kBAAkB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;aAChF;YACD,uEAAuE;YACvE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;QAClC,eAAe,EAAE,qBAAqB;KACvC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport type { QueryClient } from \"@tanstack/react-query\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ExtractionStatus, IExtractionClient } from \"@itwin/insights-client\";\nimport { ExtractorState } from \"@itwin/insights-client\";\nimport type { Mapping } from \"@itwin/insights-client\";\nimport { STATUS_CHECK_INTERVAL } from \"../../Constants\";\nimport { ExtractionStates } from \"../Extraction/ExtractionStatus\";\nimport type { GetAccessTokenFn, GroupingMappingApiConfig } from \"../../context/GroupingApiConfigContext\";\nimport { useExtractionClient } from \"../../context/ExtractionClientContext\";\nimport { useExtractionStateJobContext } from \"../../context/ExtractionStateJobContext\";\n\nexport interface MappingExtractionStatusProps extends GroupingMappingApiConfig {\n mapping: Mapping;\n enabled: boolean;\n}\n\nexport interface MappingQueryResult {\n mappingId: string;\n finalExtractionStateValue: ExtractionStates;\n}\n\nexport const fetchMappingStatus = async (\n mappingId: string,\n jobId: string,\n getAccessToken: GetAccessTokenFn,\n extractionClient: IExtractionClient,\n) => {\n const accessToken = await getAccessToken();\n\n const getFinalExtractionStatus = ((extractionStatusResponse: ExtractionStatus) => {\n switch(extractionStatusResponse.state) {\n case undefined:\n return { mappingId, finalExtractionStateValue: ExtractionStates.Starting};\n case ExtractorState.Running:\n return { mappingId, finalExtractionStateValue: ExtractionStates.Running};\n case ExtractorState.Failed:\n return { mappingId, finalExtractionStateValue: ExtractionStates.Failed};\n case ExtractorState.Queued:\n return { mappingId, finalExtractionStateValue: ExtractionStates.Queued};\n case ExtractorState.Succeeded:\n return { mappingId, finalExtractionStateValue: ExtractionStates.Succeeded};\n default:\n return { mappingId, finalExtractionStateValue: ExtractionStates.None};\n }\n });\n const extractionStatusResponse = await extractionClient.getExtractionStatus(accessToken, jobId);\n return getFinalExtractionStatus(extractionStatusResponse);\n};\n\nexport const resetMappingExtractionStatus = async (queryClient: QueryClient) => {\n await queryClient.invalidateQueries({queryKey: [\"extractionState\"]});\n};\n\nexport const useFetchMappingExtractionStatus = ({\n getAccessToken,\n mapping,\n enabled,\n}: MappingExtractionStatusProps) => {\n const extractionClient = useExtractionClient();\n const { mappingIdJobInfo } = useExtractionStateJobContext();\n const jobId = mappingIdJobInfo.get(mapping.id);\n\n const statusQuery = useQuery<MappingQueryResult>({\n queryKey: [\"extractionState\", jobId],\n queryFn: async () => {\n if (jobId) {\n return fetchMappingStatus(mapping.id, jobId, getAccessToken, extractionClient);\n }\n // This should not happen as jobId should be defined if enabled is true\n throw new Error(\"Job ID is undefined\");\n },\n enabled: enabled && Boolean(jobId), // Only enable the query if enabled is true and jobId is defined\n refetchInterval: STATUS_CHECK_INTERVAL,\n });\n\n return statusQuery;\n};\n"]}
@@ -11,6 +11,14 @@ export declare const useMappingsOperations: ({ iModelId, getAccessToken, mapping
11
11
  extractionStatus: {
12
12
  extractionStatusIcon: import("../Extraction/ExtractionStatusIcon").ExtractionStatusData;
13
13
  extractionMessageData: import("../Extraction/ExtractionMessageModal").ExtractionMessageData[];
14
+ latestExtractionResult: IteratorResult<import("@itwin/insights-client").Extraction, any>;
15
+ latestJobStatus: import("@itwin/insights-client").ExtractionStatus | undefined;
16
+ } | {
17
+ extractionStatusIcon: {
18
+ iconStatus: undefined;
19
+ iconMessage: string;
20
+ };
21
+ extractionMessageData: never[];
14
22
  };
15
23
  setShowExtractionMessageModal: import("react").Dispatch<import("react").SetStateAction<boolean>>;
16
24
  refreshMappings: () => Promise<void>;
@@ -2,22 +2,43 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
- import { useCallback, useState } from "react";
5
+ import { useCallback, useEffect, useState } from "react";
6
+ import { ExtractorState } from "@itwin/insights-client";
6
7
  import { useExtractionClient } from "../../context/ExtractionClientContext";
7
8
  import { useMutation, useQueryClient } from "@tanstack/react-query";
8
9
  import { useFetchMappings } from "./useFetchMappings";
9
10
  import { useFetchExtractionStatus } from "./useFetchExtractionStatus";
11
+ import { useExtractionStateJobContext } from "../../context/ExtractionStateJobContext";
10
12
  export const useMappingsOperations = ({ iModelId, getAccessToken, mappingClient }) => {
11
13
  const [showImportModal, setShowImportModal] = useState(false);
12
14
  const [showDeleteModal, setShowDeleteModal] = useState(undefined);
13
15
  const extractionClient = useExtractionClient();
14
16
  const [showExtractionMessageModal, setShowExtractionMessageModal] = useState(false);
15
17
  const queryClient = useQueryClient();
16
- const { data: mappings, isFetching: isLoadingMappings, } = useFetchMappings(iModelId, getAccessToken, mappingClient);
17
- const { data: extractionStatus, isFetching: isLoadingExtractionStatus, } = useFetchExtractionStatus({ iModelId, getAccessToken, extractionClient });
18
+ const [initialStateExtractionFlag, setInitialExtractionStateFlag] = useState(true);
19
+ const { mappingIdJobInfo, setMappingIdJobInfo } = useExtractionStateJobContext();
20
+ const { data: mappings, isFetched: isMappingsFetched, isFetching: isLoadingMappings, } = useFetchMappings(iModelId, getAccessToken, mappingClient);
21
+ const { data: extractionStatus, isFetched: isExtractionStatusFetched, isFetching: isLoadingExtractionStatus, } = useFetchExtractionStatus({ iModelId, getAccessToken, extractionClient });
18
22
  const refreshExtractionStatus = useCallback(async () => {
19
23
  await queryClient.invalidateQueries({ queryKey: ["iModelExtractionStatus"] });
24
+ setInitialExtractionStateFlag(false);
20
25
  }, [queryClient]);
26
+ useEffect(() => {
27
+ if (initialStateExtractionFlag && isMappingsFetched && isExtractionStatusFetched && mappings && extractionStatus && !mappingIdJobInfo.size) {
28
+ const newMappingIdJobInfo = new Map();
29
+ const jobId = extractionStatus.latestExtractionResult.value?.jobId;
30
+ const state = extractionStatus.latestJobStatus?.state;
31
+ if ((state === ExtractorState.Failed || state === ExtractorState.Succeeded))
32
+ return;
33
+ !!jobId && mappings.forEach((mapping) => {
34
+ const mappingId = mapping.id;
35
+ const jobId = extractionStatus.latestExtractionResult.value.jobId;
36
+ newMappingIdJobInfo.set(mappingId, jobId);
37
+ });
38
+ setMappingIdJobInfo(newMappingIdJobInfo);
39
+ setInitialExtractionStateFlag(false);
40
+ }
41
+ }, [extractionStatus, initialStateExtractionFlag, isExtractionStatusFetched, isMappingsFetched, mappingIdJobInfo.size, mappings, setMappingIdJobInfo]);
21
42
  const refreshMappings = useCallback(async () => {
22
43
  await queryClient.invalidateQueries({ queryKey: ["mappings"] });
23
44
  }, [queryClient]);
@@ -40,11 +61,14 @@ export const useMappingsOperations = ({ iModelId, getAccessToken, mappingClient
40
61
  await refreshMappings();
41
62
  },
42
63
  });
43
- const isLoading = isLoadingMappings || isLoadingExtractionStatus || isTogglingExtraction || isDeletingMapping;
44
- const extractionStatusGated = extractionStatus ?? { extractionStatusIcon: {
64
+ const isLoading = isLoadingMappings || isTogglingExtraction || isDeletingMapping;
65
+ const extractionStatusGated = (!extractionStatus || isLoadingExtractionStatus) ? {
66
+ extractionStatusIcon: {
45
67
  iconStatus: undefined,
46
68
  iconMessage: "Loading...",
47
- }, extractionMessageData: [] };
69
+ },
70
+ extractionMessageData: [],
71
+ } : extractionStatus;
48
72
  return { mappings, isLoading, showExtractionMessageModal, extractionStatus: extractionStatusGated, setShowExtractionMessageModal, refreshMappings, refreshExtractionStatus, toggleExtraction, onDelete, setShowImportModal, showImportModal, setShowDeleteModal, showDeleteModal, isTogglingExtraction };
49
73
  };
50
74
  //# sourceMappingURL=useMappingsOperations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMappingsOperations.js","sourceRoot":"","sources":["../../../../../src/components/Mappings/hooks/useMappingsOperations.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { useCallback, useState } from \"react\";\nimport type { IMappingsClient, Mapping } from \"@itwin/insights-client\";\nimport type { GroupingMappingApiConfig } from \"../../context/GroupingApiConfigContext\";\nimport { useExtractionClient } from \"../../context/ExtractionClientContext\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useFetchMappings } from \"./useFetchMappings\";\nimport { useFetchExtractionStatus } from \"./useFetchExtractionStatus\";\n\nexport interface MappingsOperationsProps extends GroupingMappingApiConfig {\n mappingClient: IMappingsClient;\n}\n\nexport const useMappingsOperations = ({ iModelId, getAccessToken, mappingClient }: MappingsOperationsProps) => {\n const [showImportModal, setShowImportModal] = useState<boolean | undefined>(false);\n const [showDeleteModal, setShowDeleteModal] = useState<Mapping | undefined>(undefined);\n const extractionClient = useExtractionClient();\n const [showExtractionMessageModal, setShowExtractionMessageModal] = useState<boolean>(false);\n const queryClient = useQueryClient();\n\n const {\n data: mappings,\n isFetching: isLoadingMappings,\n } = useFetchMappings(iModelId, getAccessToken, mappingClient);\n\n const {\n data: extractionStatus,\n isFetching: isLoadingExtractionStatus,\n } = useFetchExtractionStatus({ iModelId, getAccessToken, extractionClient });\n\n const refreshExtractionStatus = useCallback(async () => {\n await queryClient.invalidateQueries({queryKey: [\"iModelExtractionStatus\"]});\n }, [queryClient]);\n\n const refreshMappings = useCallback(async () => {\n await queryClient.invalidateQueries({queryKey: [\"mappings\"]});\n }, [queryClient]);\n\n const { mutateAsync: toggleExtraction, isLoading: isTogglingExtraction } = useMutation({\n mutationFn: async (mapping: Mapping) => {\n const accessToken = await getAccessToken();\n const newState = !mapping.extractionEnabled;\n await mappingClient.updateMapping(accessToken, iModelId, mapping.id, { extractionEnabled: newState });\n },\n onSuccess: async () => {\n await refreshMappings();\n },\n });\n\n const { mutateAsync: onDelete, isLoading: isDeletingMapping} = useMutation({\n mutationFn: async (mapping: Mapping) => {\n const accessToken = await getAccessToken();\n await mappingClient.deleteMapping(accessToken, iModelId, mapping.id);\n },\n onSuccess: async () => {\n await refreshMappings();\n },\n });\n\n const isLoading = isLoadingMappings || isLoadingExtractionStatus || isTogglingExtraction || isDeletingMapping;\n const extractionStatusGated = extractionStatus ?? {extractionStatusIcon: {\n iconStatus: undefined,\n iconMessage: \"Loading...\",\n }, extractionMessageData : []};\n\n return { mappings, isLoading, showExtractionMessageModal, extractionStatus: extractionStatusGated, setShowExtractionMessageModal, refreshMappings, refreshExtractionStatus, toggleExtraction, onDelete, setShowImportModal, showImportModal, setShowDeleteModal, showDeleteModal, isTogglingExtraction};\n};\n"]}
1
+ {"version":3,"file":"useMappingsOperations.js","sourceRoot":"","sources":["../../../../../src/components/Mappings/hooks/useMappingsOperations.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { useCallback, useEffect, useState } from \"react\";\nimport { ExtractorState } from \"@itwin/insights-client\";\nimport type { IMappingsClient, Mapping } from \"@itwin/insights-client\";\nimport type { GroupingMappingApiConfig } from \"../../context/GroupingApiConfigContext\";\nimport { useExtractionClient } from \"../../context/ExtractionClientContext\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useFetchMappings } from \"./useFetchMappings\";\nimport { useFetchExtractionStatus } from \"./useFetchExtractionStatus\";\nimport { useExtractionStateJobContext } from \"../../context/ExtractionStateJobContext\";\n\nexport interface MappingsOperationsProps extends GroupingMappingApiConfig {\n mappingClient: IMappingsClient;\n}\n\nexport const useMappingsOperations = ({ iModelId, getAccessToken, mappingClient }: MappingsOperationsProps) => {\n const [showImportModal, setShowImportModal] = useState<boolean | undefined>(false);\n const [showDeleteModal, setShowDeleteModal] = useState<Mapping | undefined>(undefined);\n const extractionClient = useExtractionClient();\n const [showExtractionMessageModal, setShowExtractionMessageModal] = useState<boolean>(false);\n const queryClient = useQueryClient();\n const [initialStateExtractionFlag, setInitialExtractionStateFlag] = useState<boolean>(true);\n const { mappingIdJobInfo, setMappingIdJobInfo } = useExtractionStateJobContext();\n\n const {\n data: mappings,\n isFetched: isMappingsFetched,\n isFetching: isLoadingMappings,\n } = useFetchMappings(iModelId, getAccessToken, mappingClient);\n\n const {\n data: extractionStatus,\n isFetched: isExtractionStatusFetched,\n isFetching: isLoadingExtractionStatus,\n } = useFetchExtractionStatus({ iModelId, getAccessToken, extractionClient });\n\n const refreshExtractionStatus = useCallback(async () => {\n await queryClient.invalidateQueries({queryKey: [\"iModelExtractionStatus\"]});\n setInitialExtractionStateFlag(false);\n }, [queryClient]);\n\n useEffect(() => {\n if(initialStateExtractionFlag && isMappingsFetched && isExtractionStatusFetched && mappings && extractionStatus && !mappingIdJobInfo.size){\n const newMappingIdJobInfo = new Map<string, string>();\n const jobId = extractionStatus.latestExtractionResult.value?.jobId;\n const state = extractionStatus.latestJobStatus?.state;\n if((state === ExtractorState.Failed || state === ExtractorState.Succeeded)) return;\n !!jobId && mappings.forEach((mapping) => {\n const mappingId = mapping.id;\n const jobId = extractionStatus.latestExtractionResult.value.jobId;\n newMappingIdJobInfo.set(mappingId, jobId);\n });\n setMappingIdJobInfo(newMappingIdJobInfo);\n setInitialExtractionStateFlag(false);\n }\n }, [extractionStatus, initialStateExtractionFlag, isExtractionStatusFetched, isMappingsFetched, mappingIdJobInfo.size, mappings, setMappingIdJobInfo]);\n\n const refreshMappings = useCallback(async () => {\n await queryClient.invalidateQueries({queryKey: [\"mappings\"]});\n }, [queryClient]);\n\n const { mutateAsync: toggleExtraction, isLoading: isTogglingExtraction } = useMutation({\n mutationFn: async (mapping: Mapping) => {\n const accessToken = await getAccessToken();\n const newState = !mapping.extractionEnabled;\n await mappingClient.updateMapping(accessToken, iModelId, mapping.id, { extractionEnabled: newState });\n },\n onSuccess: async () => {\n await refreshMappings();\n },\n });\n\n const { mutateAsync: onDelete, isLoading: isDeletingMapping} = useMutation({\n mutationFn: async (mapping: Mapping) => {\n const accessToken = await getAccessToken();\n await mappingClient.deleteMapping(accessToken, iModelId, mapping.id);\n },\n onSuccess: async () => {\n await refreshMappings();\n },\n });\n\n const isLoading = isLoadingMappings || isTogglingExtraction || isDeletingMapping;\n const extractionStatusGated = (!extractionStatus || isLoadingExtractionStatus) ? {\n extractionStatusIcon: {\n iconStatus: undefined,\n iconMessage: \"Loading...\",\n },\n extractionMessageData: [],\n } : extractionStatus;\n\n return { mappings, isLoading, showExtractionMessageModal, extractionStatus: extractionStatusGated, setShowExtractionMessageModal, refreshMappings, refreshExtractionStatus, toggleExtraction, onDelete, setShowImportModal, showImportModal, setShowDeleteModal, showDeleteModal, isTogglingExtraction};\n};\n"]}
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ import type { GroupingMappingApiConfig } from "../../context/GroupingApiConfigContext";
3
+ import type { Mapping } from "@itwin/insights-client";
4
+ export interface FetchExtractionStatesProps extends GroupingMappingApiConfig {
5
+ jobId?: string;
6
+ }
7
+ export declare const useRunExtraction: ({ iModelId, getAccessToken, }: FetchExtractionStatesProps) => {
8
+ isRunExtractionLoading: boolean;
9
+ isRunExtractionSuccess: boolean;
10
+ isJobStarted: boolean;
11
+ setIsJobStarted: import("react").Dispatch<import("react").SetStateAction<boolean>>;
12
+ runExtraction: import("@tanstack/react-query").UseMutateAsyncFunction<import("@itwin/insights-client").ExtractionRun, unknown, Mapping[], unknown>;
13
+ };
14
+ //# sourceMappingURL=useRunExtraction.d.ts.map
@@ -0,0 +1,38 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { useExtractionClient } from "../../context/ExtractionClientContext";
6
+ import { useMutation } from "@tanstack/react-query";
7
+ import { useState } from "react";
8
+ import { useExtractionStateJobContext } from "../../context/ExtractionStateJobContext";
9
+ export const useRunExtraction = ({ iModelId, getAccessToken, }) => {
10
+ const extractionClient = useExtractionClient();
11
+ const [isJobStarted, setIsJobStarted] = useState(false);
12
+ const { mappingIdJobInfo, setMappingIdJobInfo } = useExtractionStateJobContext();
13
+ const { mutateAsync: runExtraction, isLoading: isRunExtractionLoading, isSuccess: isRunExtractionSuccess } = useMutation({
14
+ mutationKey: ["runExtraction"],
15
+ mutationFn: async (mappings) => {
16
+ const accessToken = await getAccessToken();
17
+ const mappingIds = mappings.length > 0 ? mappings.map((mapping) => { return { id: mapping.id }; }) : [];
18
+ const extractionRequest = {
19
+ mappings: mappingIds,
20
+ };
21
+ const runExtractionResponse = await extractionClient.runExtraction(accessToken, iModelId, extractionRequest);
22
+ return runExtractionResponse;
23
+ },
24
+ onSuccess: async (runExtractionResponse, mappings) => {
25
+ for (const mapping of mappings) {
26
+ if (mappingIdJobInfo?.get(mapping.id) === undefined) {
27
+ setMappingIdJobInfo((prevMap) => {
28
+ const newMap = new Map(prevMap);
29
+ newMap.set(mapping.id, runExtractionResponse.id);
30
+ return newMap;
31
+ });
32
+ }
33
+ }
34
+ },
35
+ });
36
+ return { isRunExtractionLoading, isRunExtractionSuccess, isJobStarted, setIsJobStarted, runExtraction };
37
+ };
38
+ //# sourceMappingURL=useRunExtraction.js.map