@kenyaemr/esm-etims-app 5.4.5-pre.1109

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 (321) hide show
  1. package/.turbo/turbo-build.log +6 -0
  2. package/README.md +3 -0
  3. package/dist/1067.js +1 -0
  4. package/dist/1067.js.map +1 -0
  5. package/dist/1072.js +1 -0
  6. package/dist/1072.js.map +1 -0
  7. package/dist/1148.js +1 -0
  8. package/dist/1148.js.map +1 -0
  9. package/dist/1278.js +1 -0
  10. package/dist/1278.js.map +1 -0
  11. package/dist/1442.js +1 -0
  12. package/dist/1442.js.map +1 -0
  13. package/dist/15.js +1 -0
  14. package/dist/15.js.map +1 -0
  15. package/dist/1620.js +1 -0
  16. package/dist/1620.js.map +1 -0
  17. package/dist/1638.js +1 -0
  18. package/dist/1638.js.map +1 -0
  19. package/dist/1789.js +1 -0
  20. package/dist/1789.js.map +1 -0
  21. package/dist/1831.js +1 -0
  22. package/dist/1831.js.map +1 -0
  23. package/dist/1844.js +1 -0
  24. package/dist/1844.js.map +1 -0
  25. package/dist/1946.js +1 -0
  26. package/dist/1946.js.map +1 -0
  27. package/dist/2007.js +1 -0
  28. package/dist/2007.js.map +1 -0
  29. package/dist/2115.js +1 -0
  30. package/dist/2115.js.map +1 -0
  31. package/dist/2131.js +1 -0
  32. package/dist/2131.js.map +1 -0
  33. package/dist/2152.js +1 -0
  34. package/dist/2152.js.map +1 -0
  35. package/dist/2202.js +1 -0
  36. package/dist/2202.js.map +1 -0
  37. package/dist/2394.js +1 -0
  38. package/dist/2394.js.map +1 -0
  39. package/dist/2534.js +1 -0
  40. package/dist/2534.js.map +1 -0
  41. package/dist/2537.js +1 -0
  42. package/dist/2537.js.map +1 -0
  43. package/dist/2556.js +1 -0
  44. package/dist/2556.js.map +1 -0
  45. package/dist/2621.js +1 -0
  46. package/dist/2621.js.map +1 -0
  47. package/dist/2648.js +1 -0
  48. package/dist/2648.js.map +1 -0
  49. package/dist/2795.js +1 -0
  50. package/dist/2795.js.map +1 -0
  51. package/dist/2842.js +1 -0
  52. package/dist/2842.js.map +1 -0
  53. package/dist/2916.js +1 -0
  54. package/dist/2916.js.map +1 -0
  55. package/dist/2924.js +1 -0
  56. package/dist/2924.js.map +1 -0
  57. package/dist/2929.js +1 -0
  58. package/dist/2929.js.map +1 -0
  59. package/dist/2947.js +1 -0
  60. package/dist/2947.js.map +1 -0
  61. package/dist/2971.js +1 -0
  62. package/dist/2971.js.map +1 -0
  63. package/dist/3284.js +1 -0
  64. package/dist/3284.js.map +1 -0
  65. package/dist/3285.js +1 -0
  66. package/dist/3285.js.map +1 -0
  67. package/dist/3335.js +1 -0
  68. package/dist/3335.js.map +1 -0
  69. package/dist/335.js +1 -0
  70. package/dist/335.js.map +1 -0
  71. package/dist/3378.js +1 -0
  72. package/dist/3378.js.map +1 -0
  73. package/dist/338.js +1 -0
  74. package/dist/338.js.map +1 -0
  75. package/dist/3504.js +1 -0
  76. package/dist/3504.js.map +1 -0
  77. package/dist/3544.js +1 -0
  78. package/dist/3544.js.map +1 -0
  79. package/dist/356.js +1 -0
  80. package/dist/356.js.map +1 -0
  81. package/dist/3569.js +1 -0
  82. package/dist/3569.js.map +1 -0
  83. package/dist/3723.js +1 -0
  84. package/dist/3723.js.map +1 -0
  85. package/dist/3745.js +1 -0
  86. package/dist/3745.js.map +1 -0
  87. package/dist/3813.js +1 -0
  88. package/dist/3813.js.map +1 -0
  89. package/dist/393.js +6 -0
  90. package/dist/393.js.map +1 -0
  91. package/dist/3949.js +1 -0
  92. package/dist/3949.js.map +1 -0
  93. package/dist/3953.js +1 -0
  94. package/dist/3953.js.map +1 -0
  95. package/dist/3989.js +1 -0
  96. package/dist/3989.js.map +1 -0
  97. package/dist/4178.js +1 -0
  98. package/dist/4178.js.map +1 -0
  99. package/dist/4303.js +1 -0
  100. package/dist/4303.js.map +1 -0
  101. package/dist/4308.js +1 -0
  102. package/dist/4308.js.map +1 -0
  103. package/dist/4487.js +11 -0
  104. package/dist/4487.js.map +1 -0
  105. package/dist/4588.js +1 -0
  106. package/dist/4588.js.map +1 -0
  107. package/dist/4637.js +1 -0
  108. package/dist/4637.js.map +1 -0
  109. package/dist/466.js +1 -0
  110. package/dist/466.js.map +1 -0
  111. package/dist/4817.js +1 -0
  112. package/dist/4817.js.map +1 -0
  113. package/dist/4818.js +1 -0
  114. package/dist/4818.js.map +1 -0
  115. package/dist/500.js +1 -0
  116. package/dist/500.js.map +1 -0
  117. package/dist/5086.js +1 -0
  118. package/dist/5086.js.map +1 -0
  119. package/dist/5117.js +1 -0
  120. package/dist/5117.js.map +1 -0
  121. package/dist/5159.js +1 -0
  122. package/dist/5159.js.map +1 -0
  123. package/dist/5285.js +1 -0
  124. package/dist/5285.js.map +1 -0
  125. package/dist/5361.js +1 -0
  126. package/dist/5361.js.map +1 -0
  127. package/dist/5366.js +1 -0
  128. package/dist/5366.js.map +1 -0
  129. package/dist/5484.js +1 -0
  130. package/dist/5484.js.map +1 -0
  131. package/dist/5598.js +1 -0
  132. package/dist/5598.js.map +1 -0
  133. package/dist/5676.js +1 -0
  134. package/dist/5676.js.map +1 -0
  135. package/dist/5694.js +1 -0
  136. package/dist/5694.js.map +1 -0
  137. package/dist/5731.js +5 -0
  138. package/dist/5731.js.map +1 -0
  139. package/dist/5743.js +1 -0
  140. package/dist/5743.js.map +1 -0
  141. package/dist/5825.js +1 -0
  142. package/dist/5825.js.map +1 -0
  143. package/dist/5932.js +1 -0
  144. package/dist/5932.js.map +1 -0
  145. package/dist/5941.js +1 -0
  146. package/dist/5941.js.map +1 -0
  147. package/dist/5967.js +1 -0
  148. package/dist/5967.js.map +1 -0
  149. package/dist/6104.js +1 -0
  150. package/dist/6104.js.map +1 -0
  151. package/dist/624.js +1 -0
  152. package/dist/624.js.map +1 -0
  153. package/dist/6259.js +1 -0
  154. package/dist/6259.js.map +1 -0
  155. package/dist/6273.js +1 -0
  156. package/dist/6273.js.map +1 -0
  157. package/dist/6337.js +1 -0
  158. package/dist/6337.js.map +1 -0
  159. package/dist/6427.js +1 -0
  160. package/dist/6427.js.map +1 -0
  161. package/dist/647.js +1 -0
  162. package/dist/647.js.map +1 -0
  163. package/dist/6478.js +7 -0
  164. package/dist/6478.js.map +1 -0
  165. package/dist/6508.js +1 -0
  166. package/dist/6508.js.map +1 -0
  167. package/dist/6567.js +1 -0
  168. package/dist/6567.js.map +1 -0
  169. package/dist/6634.js +1 -0
  170. package/dist/6634.js.map +1 -0
  171. package/dist/6868.js +1 -0
  172. package/dist/6868.js.map +1 -0
  173. package/dist/689.js +1 -0
  174. package/dist/689.js.map +1 -0
  175. package/dist/7022.js +1 -0
  176. package/dist/7022.js.map +1 -0
  177. package/dist/7101.js +1 -0
  178. package/dist/7101.js.map +1 -0
  179. package/dist/7209.js +1 -0
  180. package/dist/7209.js.map +1 -0
  181. package/dist/7293.js +1 -0
  182. package/dist/7293.js.map +1 -0
  183. package/dist/7360.js +1 -0
  184. package/dist/7360.js.map +1 -0
  185. package/dist/7453.js +1 -0
  186. package/dist/7453.js.map +1 -0
  187. package/dist/7478.js +1 -0
  188. package/dist/7478.js.map +1 -0
  189. package/dist/7782.js +1 -0
  190. package/dist/7782.js.map +1 -0
  191. package/dist/7808.js +1 -0
  192. package/dist/7808.js.map +1 -0
  193. package/dist/7876.js +1 -0
  194. package/dist/7876.js.map +1 -0
  195. package/dist/8028.js +1 -0
  196. package/dist/8028.js.map +1 -0
  197. package/dist/8196.js +1 -0
  198. package/dist/8196.js.map +1 -0
  199. package/dist/820.js +1 -0
  200. package/dist/820.js.map +1 -0
  201. package/dist/8240.js +1 -0
  202. package/dist/8240.js.map +1 -0
  203. package/dist/8458.js +1 -0
  204. package/dist/8458.js.map +1 -0
  205. package/dist/8472.js +1 -0
  206. package/dist/8472.js.map +1 -0
  207. package/dist/8602.js +1 -0
  208. package/dist/8602.js.map +1 -0
  209. package/dist/8607.js +1 -0
  210. package/dist/8607.js.map +1 -0
  211. package/dist/8640.js +1 -0
  212. package/dist/8640.js.map +1 -0
  213. package/dist/8762.js +1 -0
  214. package/dist/8762.js.map +1 -0
  215. package/dist/9060.js +1 -0
  216. package/dist/9060.js.map +1 -0
  217. package/dist/9061.js +1 -0
  218. package/dist/9061.js.map +1 -0
  219. package/dist/9087.js +1 -0
  220. package/dist/9087.js.map +1 -0
  221. package/dist/9168.js +1 -0
  222. package/dist/9168.js.map +1 -0
  223. package/dist/9213.js +1 -0
  224. package/dist/9213.js.map +1 -0
  225. package/dist/9286.js +1 -0
  226. package/dist/9286.js.map +1 -0
  227. package/dist/9425.js +1 -0
  228. package/dist/9520.js +1 -0
  229. package/dist/9520.js.map +1 -0
  230. package/dist/9547.js +1 -0
  231. package/dist/9547.js.map +1 -0
  232. package/dist/9612.js +1 -0
  233. package/dist/9612.js.map +1 -0
  234. package/dist/9632.js +1 -0
  235. package/dist/9632.js.map +1 -0
  236. package/dist/9771.js +1 -0
  237. package/dist/9771.js.map +1 -0
  238. package/dist/9774.js +1 -0
  239. package/dist/9774.js.map +1 -0
  240. package/dist/9806.js +1 -0
  241. package/dist/9806.js.map +1 -0
  242. package/dist/9885.js +1 -0
  243. package/dist/9885.js.map +1 -0
  244. package/dist/992.js +1 -0
  245. package/dist/992.js.map +1 -0
  246. package/dist/kenyaemr-esm-etims-app.js +3 -0
  247. package/dist/kenyaemr-esm-etims-app.js.buildmanifest.json +3354 -0
  248. package/dist/kenyaemr-esm-etims-app.js.map +1 -0
  249. package/dist/main.js +3 -0
  250. package/dist/main.js.map +1 -0
  251. package/dist/routes.json +1 -0
  252. package/package.json +48 -0
  253. package/rspack.config.js +1 -0
  254. package/src/components/header/header.component.tsx +22 -0
  255. package/src/components/header/header.scss +6 -0
  256. package/src/components/side-menu/left-panel.component.tsx +22 -0
  257. package/src/components/side-menu/left-panel.scss +34 -0
  258. package/src/components/user-menu-link/etims-nav-link.scss +29 -0
  259. package/src/components/user-menu-link/user-menu-link.component.tsx +25 -0
  260. package/src/config-schema.ts +1 -0
  261. package/src/credit-note/etims-credit-note-dashboard.component.tsx +23 -0
  262. package/src/credit-note/etims-credit-note-dashboard.scss +8 -0
  263. package/src/credit-note/etims-credit-note-table.component.tsx +284 -0
  264. package/src/credit-note/etims-credit-note-table.scss +16 -0
  265. package/src/credit-note/etims-credit-note.resource.ts +96 -0
  266. package/src/credit-note/etims-credit-note.types.ts +56 -0
  267. package/src/credit-note/etims-credit-note.workspace.scss +76 -0
  268. package/src/credit-note/etims-credit-note.workspace.tsx +267 -0
  269. package/src/declarations.d.ts +2 -0
  270. package/src/global-properties/etims-global-properties-dashboard.component.tsx +141 -0
  271. package/src/global-properties/etims-global-properties-dashboard.scss +62 -0
  272. package/src/global-properties/etims-global-properties-form.workspace.scss +74 -0
  273. package/src/global-properties/etims-global-properties-form.workspace.tsx +244 -0
  274. package/src/global-properties/etims-global-properties.resource.ts +60 -0
  275. package/src/index.ts +100 -0
  276. package/src/item-mapping/etims-item-mapping-dashboard.component.tsx +29 -0
  277. package/src/item-mapping/etims-item-mapping-dashboard.scss +42 -0
  278. package/src/item-mapping/etims-item-mapping-form.fields.tsx +136 -0
  279. package/src/item-mapping/etims-item-mapping-form.schema.ts +35 -0
  280. package/src/item-mapping/etims-item-mapping-form.workspace.scss +54 -0
  281. package/src/item-mapping/etims-item-mapping-form.workspace.tsx +555 -0
  282. package/src/item-mapping/etims-item-mapping-table.component.tsx +398 -0
  283. package/src/item-mapping/etims-item-mapping-table.scss +20 -0
  284. package/src/item-mapping/etims-item-mapping.resource.ts +318 -0
  285. package/src/item-mapping/etims-item-mapping.types.ts +92 -0
  286. package/src/item-mapping/register-item-mapping.modal.tsx +113 -0
  287. package/src/item-mapping/void-item-mapping.modal.tsx +80 -0
  288. package/src/left-panel-link.component.tsx +39 -0
  289. package/src/left-panel-link.scss +12 -0
  290. package/src/reference-data/etims-catalog-table.component.tsx +178 -0
  291. package/src/reference-data/etims-catalog-table.scss +16 -0
  292. package/src/reference-data/etims-code-table.component.tsx +87 -0
  293. package/src/reference-data/etims-item-class-table.component.tsx +86 -0
  294. package/src/reference-data/etims-reference-data-dashboard.component.tsx +38 -0
  295. package/src/reference-data/etims-reference-data-dashboard.scss +11 -0
  296. package/src/reference-data/etims-reference-data.resource.ts +40 -0
  297. package/src/reference-data/etims-reference-data.types.ts +38 -0
  298. package/src/reference-data/etims-sync-meta.modal.tsx +62 -0
  299. package/src/root.component.tsx +38 -0
  300. package/src/root.scss +11 -0
  301. package/src/routes.json +117 -0
  302. package/src/status/etims-status-dashboard.component.tsx +212 -0
  303. package/src/status/etims-status-dashboard.scss +116 -0
  304. package/src/status/etims-status.resource.ts +20 -0
  305. package/src/status/etims-status.types.ts +30 -0
  306. package/src/transaction/confirm-transaction-action.modal.tsx +113 -0
  307. package/src/transaction/etims-transaction-dashboard.component.tsx +23 -0
  308. package/src/transaction/etims-transaction-dashboard.scss +8 -0
  309. package/src/transaction/etims-transaction-details.workspace.scss +76 -0
  310. package/src/transaction/etims-transaction-details.workspace.tsx +201 -0
  311. package/src/transaction/etims-transaction-table.component.tsx +450 -0
  312. package/src/transaction/etims-transaction-table.scss +20 -0
  313. package/src/transaction/etims-transaction.resource.ts +180 -0
  314. package/src/transaction/etims-transaction.types.ts +78 -0
  315. package/src/transaction/override-reconciliation.modal.scss +7 -0
  316. package/src/transaction/override-reconciliation.modal.tsx +203 -0
  317. package/translations/am.json +129 -0
  318. package/translations/en.json +129 -0
  319. package/translations/fr.json +130 -0
  320. package/translations/sw.json +129 -0
  321. package/tsconfig.json +5 -0
@@ -0,0 +1,76 @@
1
+ @use '@carbon/colors';
2
+ @use '@carbon/layout';
3
+ @use '@carbon/type';
4
+
5
+ .form {
6
+ display: flex;
7
+ flex-direction: column;
8
+ justify-content: space-between;
9
+ height: 100%;
10
+ }
11
+
12
+ .formContainer {
13
+ margin: layout.$spacing-05;
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: layout.$spacing-05;
17
+ }
18
+
19
+ .section {
20
+ display: flex;
21
+ flex-direction: column;
22
+ gap: layout.$spacing-03;
23
+ }
24
+
25
+ .sectionTitle {
26
+ @include type.type-style('heading-compact-01');
27
+ margin: 0;
28
+ }
29
+
30
+ .detailList {
31
+ display: flex;
32
+ flex-direction: column;
33
+ gap: layout.$spacing-03;
34
+ }
35
+
36
+ .detailRow {
37
+ display: grid;
38
+ grid-template-columns: 12rem 1fr;
39
+ gap: layout.$spacing-03;
40
+ align-items: start;
41
+ }
42
+
43
+ .detailLabel {
44
+ @include type.type-style('label-01');
45
+ color: colors.$gray-70;
46
+ }
47
+
48
+ .detailValue {
49
+ @include type.type-style('body-compact-01');
50
+ overflow-wrap: anywhere;
51
+ }
52
+
53
+ .tablet {
54
+ padding: layout.$spacing-06 layout.$spacing-05;
55
+ background-color: colors.$white;
56
+
57
+ & button {
58
+ max-width: 50% !important;
59
+ }
60
+ }
61
+
62
+ .desktop {
63
+ padding: 0;
64
+
65
+ & button {
66
+ max-width: 50% !important;
67
+ }
68
+ }
69
+
70
+ .buttonContainer {
71
+ max-width: 50%;
72
+ }
73
+
74
+ .qrLink {
75
+ word-break: break-all;
76
+ }
@@ -0,0 +1,201 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Button, ButtonSet, InlineLoading, Tag } from '@carbon/react';
3
+ import {
4
+ ErrorCard,
5
+ formatDatetime,
6
+ parseDate,
7
+ useLayoutType,
8
+ Workspace2,
9
+ type Workspace2DefinitionProps,
10
+ } from '@openmrs/esm-framework';
11
+ import classNames from 'classnames';
12
+ import { useTranslation } from 'react-i18next';
13
+ import { useEtimsReconciliationOverrides, useEtimsTransaction } from './etims-transaction.resource';
14
+ import type { EtimsTransaction } from './etims-transaction.types';
15
+ import styles from './etims-transaction-details.workspace.scss';
16
+
17
+ type EtimsTransactionDetailsWorkspaceProps = {
18
+ transaction?: EtimsTransaction | null;
19
+ };
20
+
21
+ const displayValue = (value?: string | number | boolean | null) => {
22
+ if (value === null || value === undefined || value === '') {
23
+ return '--';
24
+ }
25
+
26
+ return String(value);
27
+ };
28
+
29
+ const formatNullableDatetime = (value?: string | null) => {
30
+ if (!value) {
31
+ return '--';
32
+ }
33
+
34
+ try {
35
+ return formatDatetime(parseDate(value), { mode: 'standard', noToday: true });
36
+ } catch {
37
+ return value;
38
+ }
39
+ };
40
+
41
+ const statusTagType = (status?: string | null): 'green' | 'red' | 'blue' | 'cyan' | 'magenta' | 'purple' | 'gray' => {
42
+ if (status === 'CONFIRMED') {
43
+ return 'green';
44
+ }
45
+ if (status === 'PERMANENTLY_FAILED' || status === 'ACTION_REQUIRED') {
46
+ return 'red';
47
+ }
48
+ if (status === 'RECONCILIATION_REQUIRED') {
49
+ return 'magenta';
50
+ }
51
+ if (status === 'RETRY') {
52
+ return 'purple';
53
+ }
54
+ if (status === 'SUBMITTED' || status === 'PROCESSING') {
55
+ return 'cyan';
56
+ }
57
+ if (status === 'PENDING') {
58
+ return 'blue';
59
+ }
60
+ return 'gray';
61
+ };
62
+
63
+ const DetailRow: React.FC<{ label: string; value: React.ReactNode }> = ({ label, value }) => (
64
+ <div className={styles.detailRow}>
65
+ <span className={styles.detailLabel}>{label}</span>
66
+ <span className={styles.detailValue}>{value}</span>
67
+ </div>
68
+ );
69
+
70
+ const EtimsTransactionDetailsWorkspace: React.FC<
71
+ Workspace2DefinitionProps<EtimsTransactionDetailsWorkspaceProps, {}, {}>
72
+ > = ({ closeWorkspace, workspaceProps }) => {
73
+ const { t } = useTranslation();
74
+ const isTablet = useLayoutType() === 'tablet';
75
+ const listedTransaction = workspaceProps?.transaction;
76
+ const { transaction, error, isLoading } = useEtimsTransaction(listedTransaction?.uuid);
77
+ const { overrides, isLoading: isLoadingOverrides } = useEtimsReconciliationOverrides(listedTransaction?.uuid);
78
+ const details = transaction ?? listedTransaction ?? null;
79
+
80
+ const title = t('transactionDetails', 'Transaction details');
81
+
82
+ const rows = useMemo(() => {
83
+ if (!details) {
84
+ return [];
85
+ }
86
+
87
+ return [
88
+ { label: t('billId', 'Bill ID'), value: displayValue(details.billId) },
89
+ { label: t('transactionType', 'Type'), value: displayValue(details.transactionType) },
90
+ {
91
+ label: t('status', 'Status'),
92
+ value: (
93
+ <Tag type={statusTagType(details.status)} size="sm">
94
+ {displayValue(details.status)}
95
+ </Tag>
96
+ ),
97
+ },
98
+ { label: t('revisionNumber', 'Revision'), value: displayValue(details.revisionNumber) },
99
+ { label: t('traderInvoiceNumber', 'Trader invoice'), value: displayValue(details.traderInvoiceNumber) },
100
+ { label: t('kraInvoiceNumber', 'KRA invoice'), value: displayValue(details.kraInvoiceNumber) },
101
+ { label: t('cuInvoiceNumber', 'CU invoice'), value: displayValue(details.cuInvoiceNumber) },
102
+ { label: t('kraReceiptNumber', 'KRA receipt'), value: displayValue(details.kraReceiptNumber) },
103
+ { label: t('resultCode', 'Result code'), value: displayValue(details.resultCode) },
104
+ { label: t('resultMessage', 'Last result'), value: displayValue(details.resultMessage) },
105
+ { label: t('failureCategory', 'Failure category'), value: displayValue(details.failureCategory) },
106
+ { label: t('attemptCount', 'Attempts'), value: displayValue(details.attemptCount) },
107
+ { label: t('sdcId', 'SDC ID'), value: displayValue(details.sdcId) },
108
+ { label: t('mrcNumber', 'MRC number'), value: displayValue(details.mrcNumber) },
109
+ {
110
+ label: t('qrUrl', 'QR URL'),
111
+ value: details.qrUrl ? (
112
+ <a className={styles.qrLink} href={details.qrUrl} rel="noreferrer" target="_blank">
113
+ {details.qrUrl}
114
+ </a>
115
+ ) : (
116
+ '--'
117
+ ),
118
+ },
119
+ { label: t('receiptSignature', 'Receipt signature'), value: displayValue(details.receiptSignature) },
120
+ { label: t('publicationDate', 'Publication date'), value: formatNullableDatetime(details.publicationDate) },
121
+ { label: t('originalTransactionId', 'Original transaction'), value: displayValue(details.originalTransactionId) },
122
+ { label: t('dateCreated', 'Date created'), value: formatNullableDatetime(details.dateCreated) },
123
+ { label: t('confirmedAt', 'Confirmed at'), value: formatNullableDatetime(details.confirmedAt) },
124
+ { label: t('nextAttemptAt', 'Next attempt'), value: formatNullableDatetime(details.nextAttemptAt) },
125
+ ];
126
+ }, [details, t]);
127
+
128
+ if (isLoading && !details) {
129
+ return (
130
+ <Workspace2 title={title}>
131
+ <div className={styles.formContainer}>
132
+ <InlineLoading description={t('loadingTransaction', 'Loading transaction...')} />
133
+ </div>
134
+ </Workspace2>
135
+ );
136
+ }
137
+
138
+ if (error && !details) {
139
+ return (
140
+ <Workspace2 title={title}>
141
+ <div className={styles.formContainer}>
142
+ <ErrorCard error={error} headerTitle={t('transactionDetailsError', 'Transaction details')} />
143
+ </div>
144
+ </Workspace2>
145
+ );
146
+ }
147
+
148
+ return (
149
+ <Workspace2 title={title}>
150
+ <div className={styles.form}>
151
+ <div className={styles.formContainer}>
152
+ <section className={styles.section}>
153
+ <h3 className={styles.sectionTitle}>{t('fiscalOutbox', 'Fiscal outbox')}</h3>
154
+ <div className={styles.detailList}>
155
+ {rows.map((row) => (
156
+ <DetailRow key={row.label} label={row.label} value={row.value} />
157
+ ))}
158
+ </div>
159
+ </section>
160
+
161
+ <section className={styles.section}>
162
+ <h3 className={styles.sectionTitle}>{t('reconciliationOverrides', 'Reconciliation overrides')}</h3>
163
+ {isLoadingOverrides ? (
164
+ <InlineLoading description={t('loadingOverrides', 'Loading overrides...')} />
165
+ ) : overrides.length === 0 ? (
166
+ <p className={styles.detailValue}>{t('noReconciliationOverrides', 'No reconciliation overrides')}</p>
167
+ ) : (
168
+ overrides.map((override) => (
169
+ <div className={styles.detailList} key={override.uuid}>
170
+ <DetailRow label={t('overrideAction', 'Action')} value={displayValue(override.action)} />
171
+ <DetailRow
172
+ label={t('previousStatus', 'Previous status')}
173
+ value={displayValue(override.previousStatus)}
174
+ />
175
+ <DetailRow label={t('newStatus', 'New status')} value={displayValue(override.newStatus)} />
176
+ <DetailRow label={t('reason', 'Reason')} value={displayValue(override.reason)} />
177
+ <DetailRow
178
+ label={t('evidenceReference', 'Evidence')}
179
+ value={displayValue(override.evidenceReference)}
180
+ />
181
+ <DetailRow
182
+ label={t('dateCreated', 'Date created')}
183
+ value={formatNullableDatetime(override.dateCreated)}
184
+ />
185
+ </div>
186
+ ))
187
+ )}
188
+ </section>
189
+ </div>
190
+
191
+ <ButtonSet className={classNames({ [styles.tablet]: isTablet, [styles.desktop]: !isTablet })}>
192
+ <Button className={styles.buttonContainer} kind="secondary" onClick={() => closeWorkspace()}>
193
+ {t('close', 'Close')}
194
+ </Button>
195
+ </ButtonSet>
196
+ </div>
197
+ </Workspace2>
198
+ );
199
+ };
200
+
201
+ export default EtimsTransactionDetailsWorkspace;