codicent-app-sdk 0.5.7 → 0.5.8

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 (244) hide show
  1. package/dist/cjs/components/AiInput.js +1 -1
  2. package/dist/cjs/components/AudioIcon.js +1 -1
  3. package/dist/cjs/components/ChatInput.js +1 -1
  4. package/dist/cjs/components/ChatMessage.js +1 -1
  5. package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
  6. package/dist/cjs/components/Footer.js +1 -1
  7. package/dist/cjs/components/Header.js +1 -1
  8. package/dist/cjs/components/HtmlView.js +1 -1
  9. package/dist/cjs/components/MessageInput.js +1 -1
  10. package/dist/cjs/components/MessageItem.js +1 -1
  11. package/dist/cjs/components/Profile.js +1 -1
  12. package/dist/cjs/components/Prompt.js +1 -1
  13. package/dist/cjs/components/SnapFooter.js +1 -1
  14. package/dist/cjs/components/TextHeader.js +1 -1
  15. package/dist/cjs/components/TypingIndicator.js +1 -1
  16. package/dist/cjs/components/UploadFile.js +1 -1
  17. package/dist/cjs/components/UrlProcessor.js +1 -1
  18. package/dist/cjs/components/VoiceIcon.js +1 -1
  19. package/dist/cjs/components/audit/AuditAnswerCell.d.ts +15 -0
  20. package/dist/cjs/components/audit/AuditAnswerCell.d.ts.map +1 -0
  21. package/dist/cjs/components/audit/AuditAnswerCell.js +1 -0
  22. package/dist/cjs/components/audit/AuditBulkExportDialog.d.ts +16 -0
  23. package/dist/cjs/components/audit/AuditBulkExportDialog.d.ts.map +1 -0
  24. package/dist/cjs/components/audit/AuditBulkExportDialog.js +1 -0
  25. package/dist/cjs/components/audit/AuditBulkUploadDialog.d.ts +15 -0
  26. package/dist/cjs/components/audit/AuditBulkUploadDialog.d.ts.map +1 -0
  27. package/dist/cjs/components/audit/AuditBulkUploadDialog.js +1 -0
  28. package/dist/cjs/components/audit/AuditCircularProgress.d.ts +15 -0
  29. package/dist/cjs/components/audit/AuditCircularProgress.d.ts.map +1 -0
  30. package/dist/cjs/components/audit/AuditCircularProgress.js +1 -0
  31. package/dist/cjs/components/audit/AuditFilterBar.d.ts +15 -0
  32. package/dist/cjs/components/audit/AuditFilterBar.d.ts.map +1 -0
  33. package/dist/cjs/components/audit/AuditFilterBar.js +1 -0
  34. package/dist/cjs/components/audit/AuditFilterChips.d.ts +17 -0
  35. package/dist/cjs/components/audit/AuditFilterChips.d.ts.map +1 -0
  36. package/dist/cjs/components/audit/AuditFilterChips.js +1 -0
  37. package/dist/cjs/components/audit/AuditGroupsProgress.d.ts +12 -0
  38. package/dist/cjs/components/audit/AuditGroupsProgress.d.ts.map +1 -0
  39. package/dist/cjs/components/audit/AuditGroupsProgress.js +1 -0
  40. package/dist/cjs/components/audit/AuditHorizontalProgress.d.ts +16 -0
  41. package/dist/cjs/components/audit/AuditHorizontalProgress.d.ts.map +1 -0
  42. package/dist/cjs/components/audit/AuditHorizontalProgress.js +1 -0
  43. package/dist/cjs/components/audit/AuditRequirementDialog.d.ts +16 -0
  44. package/dist/cjs/components/audit/AuditRequirementDialog.d.ts.map +1 -0
  45. package/dist/cjs/components/audit/AuditRequirementDialog.js +1 -0
  46. package/dist/cjs/components/audit/AuditRoleIndicator.d.ts +13 -0
  47. package/dist/cjs/components/audit/AuditRoleIndicator.d.ts.map +1 -0
  48. package/dist/cjs/components/audit/AuditRoleIndicator.js +1 -0
  49. package/dist/cjs/components/audit/AuditSearchBar.d.ts +13 -0
  50. package/dist/cjs/components/audit/AuditSearchBar.d.ts.map +1 -0
  51. package/dist/cjs/components/audit/AuditSearchBar.js +1 -0
  52. package/dist/cjs/components/audit/AuditSortPresets.d.ts +12 -0
  53. package/dist/cjs/components/audit/AuditSortPresets.d.ts.map +1 -0
  54. package/dist/cjs/components/audit/AuditSortPresets.js +1 -0
  55. package/dist/cjs/components/audit/AuditSummaryDashboard.d.ts +13 -0
  56. package/dist/cjs/components/audit/AuditSummaryDashboard.d.ts.map +1 -0
  57. package/dist/cjs/components/audit/AuditSummaryDashboard.js +1 -0
  58. package/dist/cjs/components/audit/AuditUnitExportDialog.d.ts +18 -0
  59. package/dist/cjs/components/audit/AuditUnitExportDialog.d.ts.map +1 -0
  60. package/dist/cjs/components/audit/AuditUnitExportDialog.js +1 -0
  61. package/dist/cjs/components/audit/AuditUnitImportDialog.d.ts +13 -0
  62. package/dist/cjs/components/audit/AuditUnitImportDialog.d.ts.map +1 -0
  63. package/dist/cjs/components/audit/AuditUnitImportDialog.js +1 -0
  64. package/dist/cjs/components/audit/AuditUnitSwitcher.d.ts +20 -0
  65. package/dist/cjs/components/audit/AuditUnitSwitcher.d.ts.map +1 -0
  66. package/dist/cjs/components/audit/AuditUnitSwitcher.js +1 -0
  67. package/dist/cjs/components/audit/index.d.ts +20 -0
  68. package/dist/cjs/components/audit/index.d.ts.map +1 -0
  69. package/dist/cjs/components/index.d.ts +1 -0
  70. package/dist/cjs/components/index.d.ts.map +1 -1
  71. package/dist/cjs/hooks/index.d.ts +12 -0
  72. package/dist/cjs/hooks/index.d.ts.map +1 -1
  73. package/dist/cjs/hooks/useAuditFilters.d.ts +17 -0
  74. package/dist/cjs/hooks/useAuditFilters.d.ts.map +1 -0
  75. package/dist/cjs/hooks/useAuditFilters.js +1 -0
  76. package/dist/cjs/hooks/useAuditManagerData.d.ts +25 -0
  77. package/dist/cjs/hooks/useAuditManagerData.d.ts.map +1 -0
  78. package/dist/cjs/hooks/useAuditManagerData.js +1 -0
  79. package/dist/cjs/hooks/useAuditManagerFilters.d.ts +16 -0
  80. package/dist/cjs/hooks/useAuditManagerFilters.d.ts.map +1 -0
  81. package/dist/cjs/hooks/useAuditManagerFilters.js +1 -0
  82. package/dist/cjs/hooks/useAuditRequirementsFilters.d.ts +17 -0
  83. package/dist/cjs/hooks/useAuditRequirementsFilters.d.ts.map +1 -0
  84. package/dist/cjs/hooks/useAuditRequirementsFilters.js +1 -0
  85. package/dist/cjs/hooks/useAuditRoleCheck.d.ts +26 -0
  86. package/dist/cjs/hooks/useAuditRoleCheck.d.ts.map +1 -0
  87. package/dist/cjs/hooks/useAuditRoleCheck.js +1 -0
  88. package/dist/cjs/hooks/useAuditState.d.ts +34 -0
  89. package/dist/cjs/hooks/useAuditState.d.ts.map +1 -0
  90. package/dist/cjs/hooks/useAuditState.js +1 -0
  91. package/dist/cjs/hooks/useAuthState.js +1 -1
  92. package/dist/cjs/hooks/useCodicentState.js +1 -1
  93. package/dist/cjs/index.js +1 -1
  94. package/dist/cjs/pages/AppFrame.js +1 -1
  95. package/dist/cjs/pages/Chat.js +1 -1
  96. package/dist/cjs/pages/Compose.js +1 -1
  97. package/dist/cjs/pages/CrmPage.js +1 -1
  98. package/dist/cjs/pages/CrmPagePersistent.js +1 -1
  99. package/dist/cjs/pages/FormAccept.js +1 -1
  100. package/dist/cjs/pages/FormInvite.js +1 -1
  101. package/dist/cjs/pages/Home.js +1 -1
  102. package/dist/cjs/pages/HtmlViewer.js +1 -1
  103. package/dist/cjs/pages/ListPage.js +1 -1
  104. package/dist/cjs/pages/Login.js +1 -1
  105. package/dist/cjs/pages/Menu.js +1 -1
  106. package/dist/cjs/pages/Purchase.js +1 -1
  107. package/dist/cjs/pages/Sales.js +1 -1
  108. package/dist/cjs/pages/Search.js +1 -1
  109. package/dist/cjs/pages/Snap.js +1 -1
  110. package/dist/cjs/types/audit.d.ts +358 -0
  111. package/dist/cjs/types/audit.d.ts.map +1 -0
  112. package/dist/cjs/types/index.d.ts +1 -0
  113. package/dist/cjs/types/index.d.ts.map +1 -1
  114. package/dist/cjs/utils/auditExport.d.ts +37 -0
  115. package/dist/cjs/utils/auditExport.d.ts.map +1 -0
  116. package/dist/cjs/utils/auditExport.js +1 -0
  117. package/dist/cjs/utils/auditUtils.d.ts +59 -0
  118. package/dist/cjs/utils/auditUtils.d.ts.map +1 -0
  119. package/dist/cjs/utils/auditUtils.js +1 -0
  120. package/dist/cjs/utils/index.d.ts +2 -0
  121. package/dist/cjs/utils/index.d.ts.map +1 -1
  122. package/dist/esm/components/AiInput.js +1 -1
  123. package/dist/esm/components/AudioIcon.js +1 -1
  124. package/dist/esm/components/ChatInput.js +1 -1
  125. package/dist/esm/components/ChatMessage.js +1 -1
  126. package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
  127. package/dist/esm/components/Footer.js +1 -1
  128. package/dist/esm/components/Header.js +1 -1
  129. package/dist/esm/components/HtmlView.js +1 -1
  130. package/dist/esm/components/MessageInput.js +1 -1
  131. package/dist/esm/components/MessageItem.js +1 -1
  132. package/dist/esm/components/Profile.js +1 -1
  133. package/dist/esm/components/Prompt.js +1 -1
  134. package/dist/esm/components/SnapFooter.js +1 -1
  135. package/dist/esm/components/TextHeader.js +1 -1
  136. package/dist/esm/components/TypingIndicator.js +1 -1
  137. package/dist/esm/components/UploadFile.js +1 -1
  138. package/dist/esm/components/UrlProcessor.js +1 -1
  139. package/dist/esm/components/VoiceIcon.js +1 -1
  140. package/dist/esm/components/audit/AuditAnswerCell.d.ts +15 -0
  141. package/dist/esm/components/audit/AuditAnswerCell.d.ts.map +1 -0
  142. package/dist/esm/components/audit/AuditAnswerCell.js +1 -0
  143. package/dist/esm/components/audit/AuditBulkExportDialog.d.ts +16 -0
  144. package/dist/esm/components/audit/AuditBulkExportDialog.d.ts.map +1 -0
  145. package/dist/esm/components/audit/AuditBulkExportDialog.js +1 -0
  146. package/dist/esm/components/audit/AuditBulkUploadDialog.d.ts +15 -0
  147. package/dist/esm/components/audit/AuditBulkUploadDialog.d.ts.map +1 -0
  148. package/dist/esm/components/audit/AuditBulkUploadDialog.js +1 -0
  149. package/dist/esm/components/audit/AuditCircularProgress.d.ts +15 -0
  150. package/dist/esm/components/audit/AuditCircularProgress.d.ts.map +1 -0
  151. package/dist/esm/components/audit/AuditCircularProgress.js +1 -0
  152. package/dist/esm/components/audit/AuditFilterBar.d.ts +15 -0
  153. package/dist/esm/components/audit/AuditFilterBar.d.ts.map +1 -0
  154. package/dist/esm/components/audit/AuditFilterBar.js +1 -0
  155. package/dist/esm/components/audit/AuditFilterChips.d.ts +17 -0
  156. package/dist/esm/components/audit/AuditFilterChips.d.ts.map +1 -0
  157. package/dist/esm/components/audit/AuditFilterChips.js +1 -0
  158. package/dist/esm/components/audit/AuditGroupsProgress.d.ts +12 -0
  159. package/dist/esm/components/audit/AuditGroupsProgress.d.ts.map +1 -0
  160. package/dist/esm/components/audit/AuditGroupsProgress.js +1 -0
  161. package/dist/esm/components/audit/AuditHorizontalProgress.d.ts +16 -0
  162. package/dist/esm/components/audit/AuditHorizontalProgress.d.ts.map +1 -0
  163. package/dist/esm/components/audit/AuditHorizontalProgress.js +1 -0
  164. package/dist/esm/components/audit/AuditRequirementDialog.d.ts +16 -0
  165. package/dist/esm/components/audit/AuditRequirementDialog.d.ts.map +1 -0
  166. package/dist/esm/components/audit/AuditRequirementDialog.js +1 -0
  167. package/dist/esm/components/audit/AuditRoleIndicator.d.ts +13 -0
  168. package/dist/esm/components/audit/AuditRoleIndicator.d.ts.map +1 -0
  169. package/dist/esm/components/audit/AuditRoleIndicator.js +1 -0
  170. package/dist/esm/components/audit/AuditSearchBar.d.ts +13 -0
  171. package/dist/esm/components/audit/AuditSearchBar.d.ts.map +1 -0
  172. package/dist/esm/components/audit/AuditSearchBar.js +1 -0
  173. package/dist/esm/components/audit/AuditSortPresets.d.ts +12 -0
  174. package/dist/esm/components/audit/AuditSortPresets.d.ts.map +1 -0
  175. package/dist/esm/components/audit/AuditSortPresets.js +1 -0
  176. package/dist/esm/components/audit/AuditSummaryDashboard.d.ts +13 -0
  177. package/dist/esm/components/audit/AuditSummaryDashboard.d.ts.map +1 -0
  178. package/dist/esm/components/audit/AuditSummaryDashboard.js +1 -0
  179. package/dist/esm/components/audit/AuditUnitExportDialog.d.ts +18 -0
  180. package/dist/esm/components/audit/AuditUnitExportDialog.d.ts.map +1 -0
  181. package/dist/esm/components/audit/AuditUnitExportDialog.js +1 -0
  182. package/dist/esm/components/audit/AuditUnitImportDialog.d.ts +13 -0
  183. package/dist/esm/components/audit/AuditUnitImportDialog.d.ts.map +1 -0
  184. package/dist/esm/components/audit/AuditUnitImportDialog.js +1 -0
  185. package/dist/esm/components/audit/AuditUnitSwitcher.d.ts +20 -0
  186. package/dist/esm/components/audit/AuditUnitSwitcher.d.ts.map +1 -0
  187. package/dist/esm/components/audit/AuditUnitSwitcher.js +1 -0
  188. package/dist/esm/components/audit/index.d.ts +20 -0
  189. package/dist/esm/components/audit/index.d.ts.map +1 -0
  190. package/dist/esm/components/index.d.ts +1 -0
  191. package/dist/esm/components/index.d.ts.map +1 -1
  192. package/dist/esm/hooks/index.d.ts +12 -0
  193. package/dist/esm/hooks/index.d.ts.map +1 -1
  194. package/dist/esm/hooks/useAuditFilters.d.ts +17 -0
  195. package/dist/esm/hooks/useAuditFilters.d.ts.map +1 -0
  196. package/dist/esm/hooks/useAuditFilters.js +1 -0
  197. package/dist/esm/hooks/useAuditManagerData.d.ts +25 -0
  198. package/dist/esm/hooks/useAuditManagerData.d.ts.map +1 -0
  199. package/dist/esm/hooks/useAuditManagerData.js +1 -0
  200. package/dist/esm/hooks/useAuditManagerFilters.d.ts +16 -0
  201. package/dist/esm/hooks/useAuditManagerFilters.d.ts.map +1 -0
  202. package/dist/esm/hooks/useAuditManagerFilters.js +1 -0
  203. package/dist/esm/hooks/useAuditRequirementsFilters.d.ts +17 -0
  204. package/dist/esm/hooks/useAuditRequirementsFilters.d.ts.map +1 -0
  205. package/dist/esm/hooks/useAuditRequirementsFilters.js +1 -0
  206. package/dist/esm/hooks/useAuditRoleCheck.d.ts +26 -0
  207. package/dist/esm/hooks/useAuditRoleCheck.d.ts.map +1 -0
  208. package/dist/esm/hooks/useAuditRoleCheck.js +1 -0
  209. package/dist/esm/hooks/useAuditState.d.ts +34 -0
  210. package/dist/esm/hooks/useAuditState.d.ts.map +1 -0
  211. package/dist/esm/hooks/useAuditState.js +1 -0
  212. package/dist/esm/hooks/useAuthState.js +1 -1
  213. package/dist/esm/hooks/useCodicentState.js +1 -1
  214. package/dist/esm/index.js +1 -1
  215. package/dist/esm/pages/AppFrame.js +1 -1
  216. package/dist/esm/pages/Chat.js +1 -1
  217. package/dist/esm/pages/Compose.js +1 -1
  218. package/dist/esm/pages/CrmPage.js +1 -1
  219. package/dist/esm/pages/CrmPagePersistent.js +1 -1
  220. package/dist/esm/pages/FormAccept.js +1 -1
  221. package/dist/esm/pages/FormInvite.js +1 -1
  222. package/dist/esm/pages/Home.js +1 -1
  223. package/dist/esm/pages/HtmlViewer.js +1 -1
  224. package/dist/esm/pages/ListPage.js +1 -1
  225. package/dist/esm/pages/Login.js +1 -1
  226. package/dist/esm/pages/Menu.js +1 -1
  227. package/dist/esm/pages/Purchase.js +1 -1
  228. package/dist/esm/pages/Sales.js +1 -1
  229. package/dist/esm/pages/Search.js +1 -1
  230. package/dist/esm/pages/Snap.js +1 -1
  231. package/dist/esm/types/audit.d.ts +358 -0
  232. package/dist/esm/types/audit.d.ts.map +1 -0
  233. package/dist/esm/types/index.d.ts +1 -0
  234. package/dist/esm/types/index.d.ts.map +1 -1
  235. package/dist/esm/utils/auditExport.d.ts +37 -0
  236. package/dist/esm/utils/auditExport.d.ts.map +1 -0
  237. package/dist/esm/utils/auditExport.js +1 -0
  238. package/dist/esm/utils/auditUtils.d.ts +59 -0
  239. package/dist/esm/utils/auditUtils.d.ts.map +1 -0
  240. package/dist/esm/utils/auditUtils.js +1 -0
  241. package/dist/esm/utils/index.d.ts +2 -0
  242. package/dist/esm/utils/index.d.ts.map +1 -1
  243. package/dist/index.d.ts +799 -1
  244. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @fileoverview Filter state hook for the main audit page (per-unit requirement list).
3
+ * @module codicent-app-sdk/hooks/useAuditFilters
4
+ * @public
5
+ */
6
+ import type { AuditAnswer, AuditFilterState, ResolvedAuditConfig } from "../types/audit";
7
+ export interface UseAuditFiltersResult {
8
+ filters: AuditFilterState;
9
+ filteredAnswers: AuditAnswer[];
10
+ availableGroups: string[];
11
+ availableCategories: string[];
12
+ availableComplianceStatuses: string[];
13
+ updateFilters: (patch: Partial<AuditFilterState>) => void;
14
+ clearFilters: () => void;
15
+ }
16
+ export declare function useAuditFilters(answers: AuditAnswer[], config: ResolvedAuditConfig): UseAuditFiltersResult;
17
+ //# sourceMappingURL=useAuditFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuditFilters.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuditFilters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,EAAE,WAAW,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,2BAA2B,EAAE,MAAM,EAAE,CAAC;IACtC,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAYD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,mBAAmB,GAC1B,qBAAqB,CAuFvB"}
@@ -0,0 +1 @@
1
+ import{useState as e,useMemo as t}from"react";import{isAnswerCompliant as i,calculateAuditTimeRemaining as r}from"../utils/auditUtils.js";const s={groups:[],categories:[],complianceStatuses:[],validityStatuses:[],withComments:!1,withPhotos:!1,search:""};function o(o,n){const[a,l]=e(s),u=t((()=>[...new Set(o.map((e=>e.group)).filter(Boolean))].sort()),[o]),c=t((()=>{const e=o.filter((e=>0===a.groups.length||a.groups.includes(e.group)));return[...new Set(e.map((e=>e.category)).filter(Boolean))].sort()}),[o,a.groups]),p=t((()=>"checkbox"===n.answerMode?["compliant","non-compliant"]:n.answerOptions.map((e=>e.value))),[n]),g=t((()=>{const e=a.search.toLowerCase();return o.filter((t=>{if(a.groups.length>0&&!a.groups.includes(t.group))return!1;if(a.categories.length>0&&!a.categories.includes(t.category))return!1;if(a.complianceStatuses.length>0){const e=i(t.answer,n);if(!(a.complianceStatuses.includes(t.answer)||a.complianceStatuses.includes("compliant")&&e||a.complianceStatuses.includes("non-compliant")&&!e))return!1}if(a.validityStatuses.length>0){const e=r(t.validUntil),i=null!=t.validUntil;if(!a.validityStatuses.some((t=>"expired"===t?e?.isExpired??!1:"urgent"===t?e?.isUrgent??!1:"expiring-soon"===t?(e?.isExpiringSoon&&!e?.isUrgent)??!1:"valid"===t&&(!i||!e?.isExpired&&!e?.isExpiringSoon))))return!1}if(a.withComments&&!t.comment)return!1;if(a.withPhotos&&!t.photos)return!1;if(e){if(!`${t.title} ${t.group} ${t.category} ${t.description}`.toLowerCase().includes(e))return!1}return!0}))}),[o,a,n]);return{filters:a,filteredAnswers:g,availableGroups:u,availableCategories:c,availableComplianceStatuses:p,updateFilters:e=>{l((t=>({...t,...e})))},clearFilters:()=>l(s)}}export{o as useAuditFilters};
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @fileoverview Multi-unit statistics aggregator hook for the manager overview dashboard.
3
+ * Fetches all units and their answers, calculates per-unit and market-level compliance stats.
4
+ * @module codicent-app-sdk/hooks/useAuditManagerData
5
+ * @public
6
+ */
7
+ import type { CodicentService } from "../services/codicent";
8
+ import type { AuditConfig, AuditManagerStats, AuditUnitStats, ResolvedAuditConfig } from "../types/audit";
9
+ export interface UseAuditManagerDataParams {
10
+ service: CodicentService;
11
+ config: AuditConfig;
12
+ /** When provided, only fetch units in this market area (Manager role scoping) */
13
+ marketArea?: string;
14
+ enabled?: boolean;
15
+ }
16
+ export interface UseAuditManagerDataResult {
17
+ managerStats: AuditManagerStats;
18
+ unitStats: AuditUnitStats[];
19
+ loading: boolean;
20
+ error: string | null;
21
+ reload: () => Promise<void>;
22
+ resolved: ResolvedAuditConfig;
23
+ }
24
+ export declare function useAuditManagerData({ service, config, marketArea, enabled, }: UseAuditManagerDataParams): UseAuditManagerDataResult;
25
+ //# sourceMappingURL=useAuditManagerData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuditManagerData.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuditManagerData.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,iBAAiB,CAAC;IAChC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAYD,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,MAAM,EACN,UAAU,EACV,OAAc,GACf,EAAE,yBAAyB,GAAG,yBAAyB,CAmJvD"}
@@ -0,0 +1 @@
1
+ import{useState as t,useCallback as e,useEffect as a}from"react";import{resolveAuditConfig as i,isAnswerCompliant as n,calculateAuditTimeRemaining as r}from"../utils/auditUtils.js";const l={totalUnits:0,totalRequirements:0,overallComplianceRate:0,unitsFullyCompliant:0,unitsNeedingAttention:0,totalExpiringSoon:0,totalExpired:0};function o({service:o,config:s,marketArea:d,enabled:c=!0}){const u=i(s),[g,m]=t([]),[p,f]=t(l),[F,S]=t(!1),[R,h]=t(null),q=e((async()=>{if(!c)return;const t=u;try{S(!0),h(null);const{nameField:e,idField:a,marketAreaField:i,tagsField:l}=t.unitFieldMapping,{groupField:s,categoryField:c,titleField:u,descriptionField:g,levelField:p,validityField:F,statusField:R}=t.requirementFieldMapping,q=await o.readDataMessages(t.tags.unit),A=d?q.filter((t=>String(t.data?.[i]??"")===d)):q,v=(await o.readDataMessages(t.tags.requirement)).filter((t=>"Active"===String(t.data?.[R]??"Active"))),x=await o.readDataMessages(t.tags.answer),y=A.map((o=>{const s=String(o.data?.[a]??o.id),d=String(o.data?.[e]??s),c=o.data?.[i],u=o.data?.[l],g=u?String(u).split(",").map((t=>t.trim())).filter(Boolean):[],m=v.filter((t=>{const e=Array.isArray(t.data?.tags)?t.data?.tags:[];return!e||0===e.length||e.some((t=>t.every((t=>g.includes(t)))))})),p=x.filter((t=>t.data?.unitId===s||t.data?.UnitId===s)),f=new Map;for(const t of p){const e=String(t.data?.requirementId??t.data?.RequirementId??"");e&&!f.has(e)&&f.set(e,t)}let F=0,S=0,R=0;for(const e of m){const a=f.get(String(e.id)),i=String(a?.data?.answer??a?.data?.Answer??"");if(n(i,t)){F++;const t=a?.data?.validUntil??a?.data?.ValidUntil;if(t){const e=r(String(t));e?.isExpired?S++:e?.isUrgent&&R++}}}const h=m.length;return{unitId:s,unitName:d,marketArea:c,totalRequirements:h,compliantRequirements:F,nonCompliantRequirements:h-F,complianceRate:h>0?Math.round(F/h*100):0,expiringSoon:R,expired:S}}));m(y);const M=y.reduce(((t,e)=>t+e.totalRequirements),0),w=y.reduce(((t,e)=>t+e.compliantRequirements),0),U=M>0?Math.round(w/M*100):0;f({totalUnits:y.length,totalRequirements:M,overallComplianceRate:U,unitsFullyCompliant:y.filter((t=>100===t.complianceRate)).length,unitsNeedingAttention:y.filter((t=>t.complianceRate<100)).length,totalExpiringSoon:y.reduce(((t,e)=>t+e.expiringSoon),0),totalExpired:y.reduce(((t,e)=>t+e.expired),0)})}catch(t){console.error("[useAuditManagerData] Failed to fetch manager data:",t),h(t instanceof Error?t.message:"Failed to fetch manager data")}finally{S(!1)}}),[o,u,d,c]);return a((()=>{c&&q()}),[c,q]),{managerStats:p,unitStats:g,loading:F,error:R,reload:q,resolved:u}}export{o as useAuditManagerData};
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Filter state hook for the manager/oversight dashboard.
3
+ * State is persisted to sessionStorage so filters survive page navigation.
4
+ * @module codicent-app-sdk/hooks/useAuditManagerFilters
5
+ * @public
6
+ */
7
+ import type { AuditManagerFilterState, AuditUnitStats } from "../types/audit";
8
+ export interface UseAuditManagerFiltersResult {
9
+ filters: AuditManagerFilterState;
10
+ filteredUnits: AuditUnitStats[];
11
+ availableMarketAreas: string[];
12
+ updateFilters: (patch: Partial<AuditManagerFilterState>) => void;
13
+ clearFilters: () => void;
14
+ }
15
+ export declare function useAuditManagerFilters(units: AuditUnitStats[]): UseAuditManagerFiltersResult;
16
+ //# sourceMappingURL=useAuditManagerFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuditManagerFilters.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuditManagerFilters.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAI9E,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,uBAAuB,CAAC;IACjC,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC,KAAK,IAAI,CAAC;IACjE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAmBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EAAE,GACtB,4BAA4B,CA+D9B"}
@@ -0,0 +1 @@
1
+ import{useState as e,useEffect as t,useMemo as r}from"react";const a="codicent_audit_manager_filters",s={complianceRates:[],statuses:[],marketAreas:[],search:""};function n(){try{const e=sessionStorage.getItem(a);if(e)return{...s,...JSON.parse(e)}}catch{}return s}function i(i){const[c,o]=e(n);t((()=>{try{sessionStorage.setItem(a,JSON.stringify(c))}catch{}}),[c]);const l=r((()=>[...new Set(i.map((e=>e.marketArea)).filter((e=>Boolean(e))))].sort()),[i]),u=r((()=>{const e=c.search.toLowerCase();return i.filter((t=>{if(c.complianceRates.length>0){const e=t.complianceRate;if(!c.complianceRates.some((t=>"100"===t?100===e:"75-99"===t?e>=75&&e<100:"50-74"===t?e>=50&&e<75:"0-49"===t&&e<50)))return!1}if(c.statuses.length>0){const e=100===t.complianceRate;if(!(c.statuses.includes("fully-compliant")&&e||c.statuses.includes("needing-attention")&&!e))return!1}return!(c.marketAreas.length>0&&(!t.marketArea||!c.marketAreas.includes(t.marketArea)))&&!(e&&!t.unitName.toLowerCase().includes(e))}))}),[i,c]);return{filters:c,filteredUnits:u,availableMarketAreas:l,updateFilters:e=>o((t=>({...t,...e}))),clearFilters:()=>o(s)}}export{i as useAuditManagerFilters};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @fileoverview Filter state hook for the requirements editor (admin).
3
+ * @module codicent-app-sdk/hooks/useAuditRequirementsFilters
4
+ * @public
5
+ */
6
+ import type { AuditRequirement, AuditRequirementsFilterState } from "../types/audit";
7
+ export interface UseAuditRequirementsFiltersResult {
8
+ filters: AuditRequirementsFilterState;
9
+ filteredRequirements: AuditRequirement[];
10
+ availableGroups: string[];
11
+ availableCategories: string[];
12
+ availableTags: string[];
13
+ updateFilters: (patch: Partial<AuditRequirementsFilterState>) => void;
14
+ clearFilters: () => void;
15
+ }
16
+ export declare function useAuditRequirementsFilters(requirements: AuditRequirement[]): UseAuditRequirementsFiltersResult;
17
+ //# sourceMappingURL=useAuditRequirementsFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuditRequirementsFilters.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuditRequirementsFilters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,gBAAgB,EAEhB,4BAA4B,EAC7B,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,iCAAiC;IAChD,OAAO,EAAE,4BAA4B,CAAC;IACtC,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;IACzC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,4BAA4B,CAAC,KAAK,IAAI,CAAC;IACtE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAUD,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,gBAAgB,EAAE,GAC/B,iCAAiC,CA2DnC"}
@@ -0,0 +1 @@
1
+ import{useState as e,useMemo as t}from"react";const r={groups:[],categories:[],tags:[],statuses:[],search:""};function s(s){const[a,o]=e(r),n=t((()=>[...new Set(s.map((e=>e.group)).filter(Boolean))].sort()),[s]),i=t((()=>{const e=a.groups.length>0?s.filter((e=>a.groups.includes(e.group))):s;return[...new Set(e.map((e=>e.category)).filter(Boolean))].sort()}),[s,a.groups]),u=t((()=>{const e=s.flatMap((e=>e.tags.flat()));return[...new Set(e)].sort()}),[s]),l=t((()=>{const e=a.search.toLowerCase();return s.filter((t=>{if(a.groups.length>0&&!a.groups.includes(t.group))return!1;if(a.categories.length>0&&!a.categories.includes(t.category))return!1;if(a.tags.length>0){const e=t.tags.flat();if(!a.tags.some((t=>e.includes(t))))return!1}if(a.statuses.length>0&&!a.statuses.includes(t.status))return!1;if(e){if(!`${t.title} ${t.group} ${t.category} ${t.description}`.toLowerCase().includes(e))return!1}return!0}))}),[s,a]);return{filters:a,filteredRequirements:l,availableGroups:n,availableCategories:i,availableTags:u,updateFilters:e=>o((t=>({...t,...e}))),clearFilters:()=>o(r)}}export{s as useAuditRequirementsFilters};
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @fileoverview Role-check hook for the generic audit feature.
3
+ * Wraps useUserRoles and maps raw role strings to typed AuditRole tiers.
4
+ * @module codicent-app-sdk/hooks/useAuditRoleCheck
5
+ * @public
6
+ */
7
+ import type { CodicentService } from "../services/codicent";
8
+ import type { AuditConfig, AuditRole, AuditRoleCapabilities } from "../types/audit";
9
+ export interface UseAuditRoleCheckParams {
10
+ service: CodicentService;
11
+ /** The current user's nickname / display name */
12
+ nickname: string | null | undefined;
13
+ config: AuditConfig;
14
+ }
15
+ export interface UseAuditRoleCheckResult {
16
+ role: AuditRole;
17
+ capabilities: AuditRoleCapabilities;
18
+ /** Assigned manager area (relevant for Manager role) */
19
+ managerArea?: string;
20
+ /** Assigned unit ID (relevant for Auditor role) */
21
+ unitId?: string;
22
+ loading: boolean;
23
+ error: string | null;
24
+ }
25
+ export declare function useAuditRoleCheck({ service, nickname, config, }: UseAuditRoleCheckParams): UseAuditRoleCheckResult;
26
+ //# sourceMappingURL=useAuditRoleCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuditRoleCheck.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuditRoleCheck.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGpF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,qBAAqB,CAAC;IACpC,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAeD,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,QAAQ,EACR,MAAM,GACP,EAAE,uBAAuB,GAAG,uBAAuB,CAyEnD"}
@@ -0,0 +1 @@
1
+ import{useState as e,useCallback as t,useEffect as r}from"react";import{resolveAuditConfig as i,getAuditRoleCapabilities as n}from"../utils/auditUtils.js";function o({service:o,nickname:a,config:s}){const l=i(s).tags.role,[c,u]=e("Auditor"),[d,m]=e(),[g,f]=e(),[A,k]=e(!0),[p,w]=e(null),C=t((async()=>{if(a)try{k(!0),w(null);const e=await o.getMessagesFast([l],void 0,200),t=a.toLowerCase(),r=e.find((e=>{const r=e.data;if(!r)return!1;const i=String(r.username??r.email??r.user??"").toLowerCase(),n=String(r.nicknames??"").toLowerCase().split(",").map((e=>e.trim()));return i===t||n.includes(t)}));if(r){const e=r.data,t=function(e){const t=e.trim().toLowerCase();return"admin"===t?"Admin":"manager"===t||"marketingunit"===t||"marketing_unit"===t?"Manager":"Auditor"}(String(e.role??""));u(t),m(e.marketArea),f(e.unitId??e.dealerId)}else u("Auditor"),m(void 0),f(void 0)}catch(e){console.error("[useAuditRoleCheck] Failed to fetch roles:",e),w(e instanceof Error?e.message:"Failed to fetch roles"),u("Auditor")}finally{k(!1)}else k(!1)}),[o,a,l]);return r((()=>{C()}),[C]),{role:c,capabilities:n(c),managerArea:d,unitId:g,loading:A,error:p}}export{o as useAuditRoleCheck};
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview Central state hook for the generic audit feature.
3
+ * Generic equivalent of penta_audit's usePentaState.
4
+ * @module codicent-app-sdk/hooks/useAuditState
5
+ * @public
6
+ */
7
+ import type { CodicentService } from "../services/codicent";
8
+ import type { AuditAnswer, AuditRequirement, ResolvedAuditConfig } from "../types/audit";
9
+ import type { AuditConfig } from "../types/audit";
10
+ export interface UseAuditStateParams {
11
+ service: CodicentService;
12
+ /** The ID/handle of the unit the current user is auditing */
13
+ unitId: string | null | undefined;
14
+ /** Full audit config (will be resolved internally) */
15
+ config: AuditConfig;
16
+ /** Set false to skip fetching (e.g., while not yet authenticated) */
17
+ enabled?: boolean;
18
+ }
19
+ export interface UseAuditStateResult {
20
+ unitId: string | null;
21
+ /** Raw unit record data */
22
+ unit: Record<string, unknown> | null;
23
+ requirements: AuditRequirement[];
24
+ answers: AuditAnswer[];
25
+ loading: boolean;
26
+ error: string | null;
27
+ resolved: ResolvedAuditConfig;
28
+ /** Reload all data from the backend */
29
+ loadAuditData: () => Promise<void>;
30
+ /** Save an updated answer for one requirement */
31
+ updateAnswer: (requirementId: string, answerValue: string, comment?: string, photos?: string, complianceDate?: string) => Promise<void>;
32
+ }
33
+ export declare function useAuditState({ service, unitId, config, enabled, }: UseAuditStateParams): UseAuditStateResult;
34
+ //# sourceMappingURL=useAuditState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuditState.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAuditState.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAEhB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,eAAe,CAAC;IACzB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAClC,sDAAsD;IACtD,MAAM,EAAE,WAAW,CAAC;IACpB,qEAAqE;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,uCAAuC;IACvC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iDAAiD;IACjD,YAAY,EAAE,CACZ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,KACpB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAMD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAc,GACf,EAAE,mBAAmB,GAAG,mBAAmB,CA+N3C"}
@@ -0,0 +1 @@
1
+ import{useState as t,useRef as e,useCallback as i,useEffect as a}from"react";import{resolveAuditConfig as n,parseValidityPeriod as r,isAnswerCompliant as d,calcValidUntil as o,formatValidityPeriod as l}from"../utils/auditUtils.js";function s({service:s,unitId:u,config:c,enabled:g=!0}){const p=n(c),[m,v]=t(null),[F,M]=t([]),[y,f]=t([]),[w,S]=t(!1),[h,q]=t(null),I=e(p);I.current=p;const A=i((async()=>{if(!u||!g)return;const t=I.current;try{S(!0),q(null);const e=await s.readDataMessages(t.tags.unit),i=t.unitFieldMapping.nameField,a=t.unitFieldMapping.idField,n=(t.unitFieldMapping.marketAreaField,t.unitFieldMapping.tagsField),c=e.find((t=>String(t.data?.[a]??"")===u||String(t.data?.[i]??"")===u));v(c?.data??null);const g=await s.readDataMessages(t.tags.requirement),p=t.requirementFieldMapping.groupField,m=t.requirementFieldMapping.categoryField,F=t.requirementFieldMapping.titleField,y=t.requirementFieldMapping.descriptionField,w=t.requirementFieldMapping.levelField,h=t.requirementFieldMapping.validityField,I=t.requirementFieldMapping.statusField,A=g.filter((t=>"Active"===String(t.data?.[I]??"Active"))).map((e=>{const i=e.data?.[h];return{id:String(e.id),originalMessageId:String(e.id),title:String(e.data?.[F]??""),group:String(e.data?.[p]??""),category:String(e.data?.[m]??""),description:String(e.data?.[y]??""),level:Number(e.data?.[w]??1),validityPeriodMonths:r(null!=i?String(i):void 0,t.defaultValidityPeriodMonths),status:"Active",tags:Array.isArray(e.data?.tags)?e.data?.tags:[]}}));M(A);const D=c?.data?.[n]?String(c.data[n]).split(",").map((t=>t.trim())).filter(Boolean):[],P=(await s.readDataMessages(t.tags.answer)).filter((t=>t.data?.unitId===u||t.data?.UnitId===u)),U=new Map;for(const t of P){const e=String(t.data?.requirementId??t.data?.RequirementId??"");e&&(U.has(e)||U.set(e,t))}const $=A.filter((t=>!t.tags||0===t.tags.length||t.tags.some((t=>t.every((t=>D.includes(t))))))).map((e=>{const i=U.get(e.id),a=i?.data??{},n=String(a.answer??a.Answer??""),r=a.complianceDate??a.ComplianceDate;let s=a.validUntil??a.ValidUntil;return!s&&n&&d(n,t)&&r&&(s=o(r,e.validityPeriodMonths)??void 0),{id:String(i?.id??`new_${e.id}`),requirementId:e.id,title:e.title,group:e.group,category:e.category,description:e.description,level:e.level,validFor:l(e.validityPeriodMonths),answer:n,comment:a.comment,photos:a.photos,complianceDate:r,validUntil:s,validityPeriodMonths:e.validityPeriodMonths??void 0}}));f($)}catch(t){console.error("[useAuditState] Failed to load audit data:",t),q(t instanceof Error?t.message:"Failed to load audit data")}finally{S(!1)}}),[s,u,g]);a((()=>{u&&g&&A()}),[u,g,A]);const D=i((async(t,e,i,a,n)=>{const r=I.current;if(!u)return;const l=F.find((e=>e.id===t));if(!l)return;const c=d(e,r),g=n??(c?(new Date).toISOString():void 0),p=g?o(g,l.validityPeriodMonths)??void 0:void 0,m={requirementId:t,unitId:u,answer:e,comment:i,photos:a,complianceDate:g,validUntil:p,validityPeriodMonths:l.validityPeriodMonths};f((n=>n.map((n=>n.requirementId===t?{...n,answer:e,comment:i,photos:a,complianceDate:g,validUntil:p}:n))));try{const e=`#${r.tags.answer}\n${JSON.stringify(m)}`;await s.sendMessage(e,t)}catch(t){throw console.error("[useAuditState] Failed to save answer:",t),await A(),t}}),[s,u,F,A]);return{unitId:u??null,unit:m,requirements:F,answers:y,loading:w,error:h,resolved:p,loadAuditData:A,updateAnswer:D}}export{s as useAuditState};
@@ -1 +1 @@
1
- import{useState as o,useMemo as e,useEffect as t,useCallback as s}from"react";import{CodicentService as n}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"@fluentui/react-components";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import{getConfigValue as i}from"../config/index.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../pages/AppFrame.js";import"../pages/Canvas.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Menu.js";import"../pages/Log.js";import"../pages/Login.js";import"../pages/Home.js";import"../pages/ListPage.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"react-router-dom";import"../pages/Purchase.js";import"../pages/QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";const r=(r,p)=>{const{isAuthenticated:a,getAccessTokenSilently:m,user:c,isLoading:l,logout:g,getAccessTokenWithPopup:u,loginWithRedirect:j,loginWithPopup:P}=r,[E,d]=o(null),[_,T]=o(void 0),[S,C]=o(null),[A,I]=o(""),h=e((()=>new n({API_BASE_URL:i("API_BASE_URL"),PUBSUB_URL:i("PUBSUB_URL"),APP_LOG_CODICENT:i("APP_LOG_CODICENT"),APP_LOG_TOKEN:i("APP_LOG_TOKEN"),APP_NAME:i("APP_NAME"),APP_PREFIX:i("APP_PREFIX"),APP_TEMPLATE:i("APP_TEMPLATE"),BUTTON_TAG:i("BUTTON_TAG"),STRIPE_PUBLIC_KEY:i("STRIPE_PUBLIC_KEY"),STRIPE_SOURCE:i("STRIPE_SOURCE"),STRIPE_TRIAL_PERIOD_DAYS:i("STRIPE_TRIAL_PERIOD_DAYS"),SUBSCRIPTION_NEEDED:i("SUBSCRIPTION_NEEDED"),USER_PREFIX:i("USER_PREFIX"),ANONYMOUS_TOKEN:i("ANONYMOUS_TOKEN")})),[]);t((()=>{!l&&a&&(async()=>{try{const o=await m({});console.debug("CODICENT: ACCESS TOKEN",o),d(o)}catch(o){console.debug("CODICENT: Failed to get access token",o);const e=o;if(e&&"object"==typeof e&&"error"in e&&"login_required"===e.error)console.warn("CODICENT: Session expired (login_required)"),d(null);else if(e&&"object"==typeof e&&"error"in e&&"consent_required"===e.error)try{const o=await u();if(!o)return void C("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),d(o)}catch(o){console.warn("CODICENT: Failed to get access token with popup",o),C("Samtycke krävs för inloggning. Tillåt popup-fönster och försök igen."),d(null)}else C("Failed to get access token: "+(e.message?.toString()||e.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",e)}})().then((()=>{}))}),[a,u,m,j,l]),t((()=>{if(c&&c.sub&&E&&void 0===_){let o=!0;return(p?.loginFn?p.loginFn(h,c.sub,E):h.loginUser(c.sub,E)).then((e=>{o&&(null===e?T(!1):""===e?C("Kontrollera internetanslutningen och försök igen."):(h.setToken(e),h.getNickname().then(I),T(!0)))})).catch((()=>{o&&(C("Ett fel uppstod. Försök igen senare."),T(!1))})),()=>{o=!1}}}),[c,E,_,h]);const O=s((()=>{h.logout(),d(null),C(null),T(void 0),I(""),g({logoutParams:{returnTo:i("AUTH_REDIRECT_URL")}})}),[h,g]),R=s((async o=>{const e=p?.registerFn?await p.registerFn(h,o,c.email,c.sub,E):await h.registerUser(o,c.email,c.sub,E);return e&&(h.setToken(e),T(!0)),e}),[h,c,E]);t((()=>{h.onUnauthorized=O}),[h]);const N=s((async o=>{try{await P({authorizationParams:{connection:"email",login_hint:o}})}catch(o){console.error("Passwordless login failed:",o),C(`Passwordless login failed: ${o}`)}}),[P]);return e((()=>({isAuthenticated:a,isRegistered:_,accessToken:E,authError:S,isLoading:l,user:c,nickname:A,logout:O,registerUser:R,codicentService:h,loginWithRedirect:j,loginPasswordless:N})),[a,_,E,S,l,c,A,O,R,h,j,N])};export{r as default};
1
+ import{useState as o,useMemo as t,useEffect as e,useCallback as s}from"react";import{CodicentService as i}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"@fluentui/react-components";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import{getConfigValue as n}from"../config/index.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import"../pages/AppFrame.js";import"../pages/Canvas.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Menu.js";import"../pages/Log.js";import"../pages/Login.js";import"../pages/Home.js";import"../pages/ListPage.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"react-router-dom";import"../pages/Purchase.js";import"../pages/QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";const r=(r,p)=>{const{isAuthenticated:a,getAccessTokenSilently:m,user:c,isLoading:l,logout:u,getAccessTokenWithPopup:g,loginWithRedirect:d,loginWithPopup:j}=r,[P,E]=o(null),[A,_]=o(void 0),[T,S]=o(null),[C,I]=o(""),h=t((()=>new i({API_BASE_URL:n("API_BASE_URL"),PUBSUB_URL:n("PUBSUB_URL"),APP_LOG_CODICENT:n("APP_LOG_CODICENT"),APP_LOG_TOKEN:n("APP_LOG_TOKEN"),APP_NAME:n("APP_NAME"),APP_PREFIX:n("APP_PREFIX"),APP_TEMPLATE:n("APP_TEMPLATE"),BUTTON_TAG:n("BUTTON_TAG"),STRIPE_PUBLIC_KEY:n("STRIPE_PUBLIC_KEY"),STRIPE_SOURCE:n("STRIPE_SOURCE"),STRIPE_TRIAL_PERIOD_DAYS:n("STRIPE_TRIAL_PERIOD_DAYS"),SUBSCRIPTION_NEEDED:n("SUBSCRIPTION_NEEDED"),USER_PREFIX:n("USER_PREFIX"),ANONYMOUS_TOKEN:n("ANONYMOUS_TOKEN")})),[]);e((()=>{!l&&a&&(async()=>{try{const o=await m({});console.debug("CODICENT: ACCESS TOKEN",o),E(o)}catch(o){console.debug("CODICENT: Failed to get access token",o);const t=o;if(t&&"object"==typeof t&&"error"in t&&"login_required"===t.error)console.warn("CODICENT: Session expired (login_required)"),E(null);else if(t&&"object"==typeof t&&"error"in t&&"consent_required"===t.error)try{const o=await g();if(!o)return void S("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),E(o)}catch(o){console.warn("CODICENT: Failed to get access token with popup",o),S("Samtycke krävs för inloggning. Tillåt popup-fönster och försök igen."),E(null)}else S("Failed to get access token: "+(t.message?.toString()||t.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",t)}})().then((()=>{}))}),[a,g,m,d,l]),e((()=>{if(c&&c.sub&&P&&void 0===A){let o=!0;return(p?.loginFn?p.loginFn(h,c.sub,P):h.loginUser(c.sub,P)).then((t=>{o&&(null===t?_(!1):""===t?S("Kontrollera internetanslutningen och försök igen."):(h.setToken(t),h.getNickname().then(I),_(!0)))})).catch((()=>{o&&(S("Ett fel uppstod. Försök igen senare."),_(!1))})),()=>{o=!1}}}),[c,P,A,h]);const R=s((()=>{h.logout(),E(null),S(null),_(void 0),I(""),u({logoutParams:{returnTo:n("AUTH_REDIRECT_URL")}})}),[h,u]),O=s((async o=>{const t=p?.registerFn?await p.registerFn(h,o,c.email,c.sub,P):await h.registerUser(o,c.email,c.sub,P);return t&&(h.setToken(t),_(!0)),t}),[h,c,P]);e((()=>{h.onUnauthorized=R}),[h]);const U=s((async o=>{try{await j({authorizationParams:{connection:"email",login_hint:o}})}catch(o){console.error("Passwordless login failed:",o),S(`Passwordless login failed: ${o}`)}}),[j]);return t((()=>({isAuthenticated:a,isRegistered:A,accessToken:P,authError:T,isLoading:l,user:c,nickname:C,logout:R,registerUser:O,codicentService:h,loginWithRedirect:d,loginPasswordless:U})),[a,A,P,T,l,c,C,R,O,h,d,U])};export{r as default};
@@ -1 +1 @@
1
- import{useState as o,useRef as t,useCallback as e,useEffect as s}from"react";import p from"./useStateWithLocalStorage.js";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"@fluentui/react-components";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import{getConfigValue as r}from"../config/index.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../pages/AppFrame.js";import"../pages/Canvas.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Menu.js";import"../pages/Log.js";import"../pages/Login.js";import"../pages/Home.js";import"../pages/ListPage.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"react-router-dom";import"../pages/Purchase.js";import"../pages/QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";const i=i=>{const[m,n]=p("APP_WELCOME_STATE_TEXT_"+i.context.selectedApp,""),[a,c]=p("CODICENT_STATE_LAST_TIMESTAMP_"+i.context.selectedApp,0),{service:j,current:l}=i,[g,u]=o(!1),d=t(!1),T=e((async()=>{if(!d.current){d.current=!0;try{const o=await j.getMessagesFast(r("LOGBOOK_TAGS").split(",").filter((o=>"chat"!==o))),t=o.length>0?o[0].createdAt.getTime():a;if(t>a){c(t),u(!0);const o=await j.chat(r("WELCOME_STATUS_PROMPT"));n(o.content)}}finally{u(!1),d.current=!1}}}),[j,a,c,n]),S=e((()=>{j&&r("CHAT_INSTRUCTIONS")}),[j]);return s((()=>{l===i.allStates.hasAccess&&r("WELCOME_STATUS_PROMPT")?(T(),S()):r("WELCOME_STATUS_PROMPT")||n("")}),[l,i,T,S,n]),{welcomeStatusText:m,updating:g}};export{i as default};
1
+ import{useState as t,useRef as o,useCallback as s,useEffect as e}from"react";import i from"./useStateWithLocalStorage.js";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"@fluentui/react-components";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import{getConfigValue as p}from"../config/index.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import"../pages/AppFrame.js";import"../pages/Canvas.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Menu.js";import"../pages/Log.js";import"../pages/Login.js";import"../pages/Home.js";import"../pages/ListPage.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"react-router-dom";import"../pages/Purchase.js";import"../pages/QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";const r=r=>{const[n,m]=i("APP_WELCOME_STATE_TEXT_"+r.context.selectedApp,""),[a,c]=i("CODICENT_STATE_LAST_TIMESTAMP_"+r.context.selectedApp,0),{service:j,current:u}=r,[l,d]=t(!1),g=o(!1),A=s((async()=>{if(!g.current){g.current=!0;try{const t=await j.getMessagesFast(p("LOGBOOK_TAGS").split(",").filter((t=>"chat"!==t))),o=t.length>0?t[0].createdAt.getTime():a;if(o>a){c(o),d(!0);const t=await j.chat(p("WELCOME_STATUS_PROMPT"));m(t.content)}}finally{d(!1),g.current=!1}}}),[j,a,c,m]),S=s((()=>{j&&p("CHAT_INSTRUCTIONS")}),[j]);return e((()=>{u===r.allStates.hasAccess&&p("WELCOME_STATUS_PROMPT")?(A(),S()):p("WELCOME_STATUS_PROMPT")||m("")}),[u,r,A,S,m]),{welcomeStatusText:n,updating:l}};export{r as default};
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- export{CodicentService,setBaseUrl,setSignalRHost}from"./services/codicent.js";export{dataCache}from"./services/dataCache.js";export{default as Markdown}from"./components/Markdown.js";export{Textarea}from"./components/Textarea.js";export{Button}from"./components/Button.js";export{CompoundButton}from"./components/CompoundButton.js";export{Title}from"./components/Title.js";export{Text}from"./components/Text.js";export{Spinner}from"./components/Spinner.js";export{Label}from"./components/Label.js";export{Input}from"./components/Input.js";export{default as TextHeader}from"./components/TextHeader.js";export{default as TypingIndicator}from"./components/TypingIndicator.js";export{default as Prompt}from"./components/Prompt.js";export{default as ChatInput}from"./components/ChatInput.js";export{CombinedPlaceholderDialog}from"./components/CombinedPlaceholderDialog.js";export{default as ChatMessage}from"./components/ChatMessage.js";export{Header}from"./components/Header.js";export{default as VoiceIcon}from"./components/VoiceIcon.js";export{default as AudioIcon}from"./components/AudioIcon.js";export{FileThumbnail}from"./components/FileThumbnail.js";export{default as MessageInput}from"./components/MessageInput.js";export{default as UploadFile}from"./components/UploadFile.js";export{default as SnapFooter}from"./components/SnapFooter.js";export{default as Profile}from"./components/Profile.js";export{default as MessageItem}from"./components/MessageItem.js";export{default as Content}from"./components/Content.js";export{default as AiInput}from"./components/AiInput.js";export{default as SearchBox}from"./components/SearchBox.js";export{default as DataMessagePicker}from"./components/DataMessagePicker.js";export{default as HtmlView}from"./components/HtmlView.js";export{Footer}from"./components/Footer.js";export{Page}from"./components/Page.js";export{UrlProcessor}from"./components/UrlProcessor.js";export{DatePicker}from"./components/DatePicker.js";export{ColorPicker}from"./components/ColorPicker.js";export{TimePicker}from"./components/TimePicker.js";export{QrCodeDialog}from"./components/QrCodeDialog.js";export{default as QrScanner}from"./components/QrScanner.js";export{default as GenericJsonRenderer}from"./components/GenericJsonRenderer.js";export{default as ErrorBoundary}from"./components/ErrorBoundary.js";export{default as OfflineMessage}from"./components/OfflineMessage.js";export{LanguageSelector}from"./components/LanguageSelector.js";export{default as ListView}from"./components/ListView.js";export{RecordModal}from"./components/RecordModal.js";export{default as BulkUploadDialog}from"./components/BulkUploadDialog.js";export{CookieBanner}from"./components/CookieBanner.js";export{default as useStateWithLocalStorage}from"./hooks/useStateWithLocalStorage.js";export{default as useAuthState}from"./hooks/useAuthState.js";export{useChat}from"./hooks/useChat.js";export{default as useCodicentState}from"./hooks/useCodicentState.js";export{useAudioRecorder}from"./hooks/useAudioRecorder.js";export{default as useTools}from"./hooks/useTools.js";export{default as useRealtimeVoiceAI}from"./hooks/useRealtimeVoiceAI.js";export{default as useLocalization}from"./hooks/useLocalization.js";export{useTemplateVariables}from"./hooks/useTemplateVariables.js";export{useCodicentApp}from"./hooks/useCodicentApp.js";export{default as useAppStyles}from"./hooks/useAppStyles.js";export{default as useToaster}from"./hooks/useToaster.js";export{default as useDebugLogs}from"./hooks/useDebugLogs.js";export{useObserveDataSchemas}from"./hooks/useObserveDataSchemas.js";export{useOnlineStatus}from"./hooks/useOnlineStatus.js";export{useUserRoles}from"./hooks/useUserRoles.js";export{default as MessageContent}from"./utils/MessageContent.js";export{default as generateBrandVariants}from"./utils/theme.js";export{default as log}from"./utils/logging.js";export{default as withWakeLock}from"./utils/withWakeLock.js";export{AppStateMachine,createAppStateMachine}from"./utils/appState.js";import{d as e}from"./_virtual/index.js";import"./lib/wavtools/lib/wav_packer.js";import"./lib/wavtools/lib/analysis/audio_analysis.js";export{WavStreamPlayer}from"./lib/wavtools/lib/wav_stream_player.js";export{WavRecorder}from"./lib/wavtools/lib/wav_recorder.js";export{getGpsLocation,isMobileDevice}from"./utils/device.js";export{exportToExcel}from"./utils/excelExport.js";export{getTimeString}from"./utils/helpers.js";export{CacheManager,stateMachineCacheManager}from"./utils/cacheManager.js";export{AppConfig,getConfigValue,initCodicentApp}from"./config/index.js";export{default as AppFrame}from"./pages/AppFrame.js";export{default as Canvas}from"./pages/Canvas.js";export{default as Chat}from"./pages/Chat.js";export{Compose}from"./pages/Compose.js";export{default as Snap}from"./pages/Snap.js";export{default as Search}from"./pages/Search.js";export{Menu}from"./pages/Menu.js";export{Log}from"./pages/Log.js";export{default as Login}from"./pages/Login.js";export{Logout}from"./pages/Logout.js";export{Home}from"./pages/Home.js";export{ListPage}from"./pages/ListPage.js";export{CrmPage}from"./pages/CrmPage.js";export{CrmPagePersistent}from"./pages/CrmPagePersistent.js";export{default as ImageView}from"./pages/ImageView.js";export{default as FormInvite}from"./pages/FormInvite.js";export{default as FormAccept}from"./pages/FormAccept.js";export{Sales}from"./pages/Sales.js";export{default as HtmlViewer}from"./pages/HtmlViewer.js";export{Purchase}from"./pages/Purchase.js";export{default as Help}from"./pages/Help.js";export{default as Debug}from"./pages/Debug.js";export{default as SchemaEditor}from"./pages/SchemaEditor.js";export{default as QrScan}from"./pages/QrScan.js";export{default as FormPage}from"./pages/FormPage.js";export{createCodicentApp}from"./bootstrap.js";var o=e.StateMachine;export{o as StateMachine};
1
+ export{CodicentService,setBaseUrl,setSignalRHost}from"./services/codicent.js";export{dataCache}from"./services/dataCache.js";export{default as Markdown}from"./components/Markdown.js";export{Textarea}from"./components/Textarea.js";export{Button}from"./components/Button.js";export{CompoundButton}from"./components/CompoundButton.js";export{Title}from"./components/Title.js";export{Text}from"./components/Text.js";export{Spinner}from"./components/Spinner.js";export{Label}from"./components/Label.js";export{Input}from"./components/Input.js";export{default as TextHeader}from"./components/TextHeader.js";export{default as TypingIndicator}from"./components/TypingIndicator.js";export{default as Prompt}from"./components/Prompt.js";export{default as ChatInput}from"./components/ChatInput.js";export{CombinedPlaceholderDialog}from"./components/CombinedPlaceholderDialog.js";export{default as ChatMessage}from"./components/ChatMessage.js";export{Header}from"./components/Header.js";export{default as VoiceIcon}from"./components/VoiceIcon.js";export{default as AudioIcon}from"./components/AudioIcon.js";export{FileThumbnail}from"./components/FileThumbnail.js";export{default as MessageInput}from"./components/MessageInput.js";export{default as UploadFile}from"./components/UploadFile.js";export{default as SnapFooter}from"./components/SnapFooter.js";export{default as Profile}from"./components/Profile.js";export{default as MessageItem}from"./components/MessageItem.js";export{default as Content}from"./components/Content.js";export{default as AiInput}from"./components/AiInput.js";export{default as SearchBox}from"./components/SearchBox.js";export{default as DataMessagePicker}from"./components/DataMessagePicker.js";export{default as HtmlView}from"./components/HtmlView.js";export{Footer}from"./components/Footer.js";export{Page}from"./components/Page.js";export{UrlProcessor}from"./components/UrlProcessor.js";export{DatePicker}from"./components/DatePicker.js";export{ColorPicker}from"./components/ColorPicker.js";export{TimePicker}from"./components/TimePicker.js";export{QrCodeDialog}from"./components/QrCodeDialog.js";export{default as QrScanner}from"./components/QrScanner.js";export{default as GenericJsonRenderer}from"./components/GenericJsonRenderer.js";export{default as ErrorBoundary}from"./components/ErrorBoundary.js";export{default as OfflineMessage}from"./components/OfflineMessage.js";export{LanguageSelector}from"./components/LanguageSelector.js";export{default as ListView}from"./components/ListView.js";export{RecordModal}from"./components/RecordModal.js";export{default as BulkUploadDialog}from"./components/BulkUploadDialog.js";export{CookieBanner}from"./components/CookieBanner.js";export{AuditCircularProgress}from"./components/audit/AuditCircularProgress.js";export{AuditHorizontalProgress}from"./components/audit/AuditHorizontalProgress.js";export{AuditRoleIndicator}from"./components/audit/AuditRoleIndicator.js";export{AuditUnitSwitcher}from"./components/audit/AuditUnitSwitcher.js";export{AuditAnswerCell}from"./components/audit/AuditAnswerCell.js";export{AuditSearchBar}from"./components/audit/AuditSearchBar.js";export{AuditFilterChips}from"./components/audit/AuditFilterChips.js";export{AuditFilterBar}from"./components/audit/AuditFilterBar.js";export{AuditGroupsProgress}from"./components/audit/AuditGroupsProgress.js";export{AuditSummaryDashboard}from"./components/audit/AuditSummaryDashboard.js";export{AuditRequirementDialog}from"./components/audit/AuditRequirementDialog.js";export{AuditUnitExportDialog}from"./components/audit/AuditUnitExportDialog.js";export{AuditUnitImportDialog}from"./components/audit/AuditUnitImportDialog.js";export{AuditBulkExportDialog}from"./components/audit/AuditBulkExportDialog.js";export{AuditBulkUploadDialog}from"./components/audit/AuditBulkUploadDialog.js";export{AuditSortPresets}from"./components/audit/AuditSortPresets.js";export{default as useStateWithLocalStorage}from"./hooks/useStateWithLocalStorage.js";export{default as useAuthState}from"./hooks/useAuthState.js";export{useChat}from"./hooks/useChat.js";export{default as useCodicentState}from"./hooks/useCodicentState.js";export{useAudioRecorder}from"./hooks/useAudioRecorder.js";export{default as useTools}from"./hooks/useTools.js";export{default as useRealtimeVoiceAI}from"./hooks/useRealtimeVoiceAI.js";export{default as useLocalization}from"./hooks/useLocalization.js";export{useTemplateVariables}from"./hooks/useTemplateVariables.js";export{useCodicentApp}from"./hooks/useCodicentApp.js";export{default as useAppStyles}from"./hooks/useAppStyles.js";export{default as useToaster}from"./hooks/useToaster.js";export{default as useDebugLogs}from"./hooks/useDebugLogs.js";export{useObserveDataSchemas}from"./hooks/useObserveDataSchemas.js";export{useOnlineStatus}from"./hooks/useOnlineStatus.js";export{useUserRoles}from"./hooks/useUserRoles.js";export{useAuditState}from"./hooks/useAuditState.js";export{useAuditRoleCheck}from"./hooks/useAuditRoleCheck.js";export{useAuditFilters}from"./hooks/useAuditFilters.js";export{useAuditRequirementsFilters}from"./hooks/useAuditRequirementsFilters.js";export{useAuditManagerFilters}from"./hooks/useAuditManagerFilters.js";export{useAuditManagerData}from"./hooks/useAuditManagerData.js";export{default as MessageContent}from"./utils/MessageContent.js";export{default as generateBrandVariants}from"./utils/theme.js";export{default as log}from"./utils/logging.js";export{default as withWakeLock}from"./utils/withWakeLock.js";export{AppStateMachine,createAppStateMachine}from"./utils/appState.js";import{d as e}from"./_virtual/index.js";import"./lib/wavtools/lib/wav_packer.js";import"./lib/wavtools/lib/analysis/audio_analysis.js";export{WavStreamPlayer}from"./lib/wavtools/lib/wav_stream_player.js";export{WavRecorder}from"./lib/wavtools/lib/wav_recorder.js";export{getGpsLocation,isMobileDevice}from"./utils/device.js";export{exportToExcel}from"./utils/excelExport.js";export{getTimeString}from"./utils/helpers.js";export{CacheManager,stateMachineCacheManager}from"./utils/cacheManager.js";export{AUDIT_CHECKBOX_OPTIONS,DEFAULT_AUDIT_VALIDITY_PERIOD_MONTHS,calcValidUntil,calculateAuditTimeRemaining,formatValidityPeriod,getAuditComplianceRate,getAuditRoleCapabilities,getAuditUrgencyColor,getEffectiveAnswerOptions,isAnswerCompliant,parseValidityPeriod,resolveAuditConfig}from"./utils/auditUtils.js";export{buildAuditPackage,exportAuditPackageAsHtml,exportAuditPackageAsJson,importAuditPackageFromHtml,importAuditPackageFromJson}from"./utils/auditExport.js";export{AppConfig,getConfigValue,initCodicentApp}from"./config/index.js";export{default as AppFrame}from"./pages/AppFrame.js";export{default as Canvas}from"./pages/Canvas.js";export{default as Chat}from"./pages/Chat.js";export{Compose}from"./pages/Compose.js";export{default as Snap}from"./pages/Snap.js";export{default as Search}from"./pages/Search.js";export{Menu}from"./pages/Menu.js";export{Log}from"./pages/Log.js";export{default as Login}from"./pages/Login.js";export{Logout}from"./pages/Logout.js";export{Home}from"./pages/Home.js";export{ListPage}from"./pages/ListPage.js";export{CrmPage}from"./pages/CrmPage.js";export{CrmPagePersistent}from"./pages/CrmPagePersistent.js";export{default as ImageView}from"./pages/ImageView.js";export{default as FormInvite}from"./pages/FormInvite.js";export{default as FormAccept}from"./pages/FormAccept.js";export{Sales}from"./pages/Sales.js";export{default as HtmlViewer}from"./pages/HtmlViewer.js";export{Purchase}from"./pages/Purchase.js";export{default as Help}from"./pages/Help.js";export{default as Debug}from"./pages/Debug.js";export{default as SchemaEditor}from"./pages/SchemaEditor.js";export{default as QrScan}from"./pages/QrScan.js";export{default as FormPage}from"./pages/FormPage.js";export{createCodicentApp}from"./bootstrap.js";var o=e.StateMachine;export{o as StateMachine};
@@ -1 +1 @@
1
- import{jsx as o}from"react/jsx-runtime";import{makeStyles as t}from"@fluentui/react-components";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"react";import"@fluentui/react-icons";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as e}from"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const s=t({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:t,showFooter:r,title:i})=>{const m=s();return r?o(e,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:t,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:t,className:m.iframe})};export{r as default};
1
+ import{jsx as o}from"react/jsx-runtime";import{makeStyles as t}from"@fluentui/react-components";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"react";import"@fluentui/react-icons";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"react-router-dom";import"./Purchase.js";import"../components/Content.js";import{Page as i}from"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";const s=t({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),e=({src:t,showFooter:e,title:r})=>{const m=s();return e?o(i,{hideFooter:!e,hideHeader:!0,children:o("iframe",{title:r,src:t,className:`${m.iframe} ${e?m.fixFrameHeight:""}`})}):o("iframe",{title:r,src:t,className:m.iframe})};export{e as default};
@@ -1 +1 @@
1
- import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{makeStyles as s}from"@fluentui/react-components";import{useNavigate as i,useSearchParams as a}from"react-router-dom";import{CalendarWeekStart24Regular as m}from"@fluentui/react-icons";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import c from"../components/TextHeader.js";import p from"../components/TypingIndicator.js";import l from"../components/Prompt.js";import d from"../components/ChatInput.js";import{CombinedPlaceholderDialog as g}from"../components/CombinedPlaceholderDialog.js";import h from"../components/ChatMessage.js";import"../components/Header.js";import u from"../hooks/useStateWithLocalStorage.js";import{CodicentService as j}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as f}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./AppFrame.js";import"./Canvas.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../components/Content.js";import{Page as b}from"../components/Page.js";import"./QrScan.js";import C from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import{useChat as x}from"../hooks/useChat.js";import{useTemplateVariables as w}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const S=s({chatContainer:{width:"100%",flex:1,maxWidth:"1600px",height:"100%",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},"@media (max-width: 480px)":{},backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"}}),v=({state:s,hideFooter:v,codicent:y,title:P,welcomeMessage:k})=>{const I=S(),{t:_,tAsync:F,getLanguageInfo:T}=C(),A=i(),M=t(null),[L,H]=a(),[V]=n((()=>{const e=L.get("codicent");return e?(sessionStorage.setItem("chat_codicent",e),e):y?(sessionStorage.removeItem("chat_codicent"),null):sessionStorage.getItem("chat_codicent")})),B=V||y,{messages:R,isBotTyping:N,handleSend:U,newChat:D,openChat:O}=x(s.stateMachine,B||void 0),[W,E]=n(null),[z,Q]=n(!1),[G,Y]=n(!1),{service:$,currentStateName:K}=s,[q,J]=n([]),[X,Z]=n([]),[ee,oe]=n(!1),[te,ne]=n(),[re,se]=u(s.context.selectedApp+"_prompts",[]),[ie,ae]=n(!1),{extractTemplateVariables:me,replaceTemplateVariables:ce,extractFilePlaceholders:pe,replaceFilePlaceholders:le,handleSelectFiles:de}=w($.uploadFile),ge=t(!1),he=t(null);r((()=>{const e=window.history.length>1,o=Boolean(document.referrer&&document.referrer!==window.location.href);Y(e||o)}),[]);r((()=>{f("SHOW_CHAT_PROMPTS")&&0===R.length&&s.service.getAppPrompts(B||void 0).then(se).catch((e=>{console.error("Failed to get prompts",e)}))}),[s.service,se,R.length,B]),r((()=>{setTimeout((()=>{M.current?.scrollIntoView({behavior:"smooth"})}),10)}),[R]),r((()=>{if(ge.current)return;ge.current=!0;const e=L.get("text"),o=L.get("id"),t=L.get("fid");if(V){console.log("Using temporary codicent from URL param:",V);const e=new URLSearchParams(L);e.delete("codicent"),H(e,{replace:!0})}if(e){(async()=>{const o=pe(e),t=me(e);D(),o.length>0||t.length>0?(Z(o),J(t),oe(!0),E(_(e))):E(_(e))})()}else o?O(o):t&&ne(t)}),[]),r((()=>{te&&"anonymous"===K&&he.current!==te&&(he.current=te,$.getFormById(te).then((async e=>{D();const o=T().language,t=e.prompt.replace("{{fid}}",te).replace("{{fname}}",e.name).replace("{{language}}",o);ae(!0);const n=await F(t);ae(!1),E(n),Y(!1)})))}),[te,D,$,E,K,F,T,ae]),r((()=>{if(W&&!ee){let e=W;X.length>0&&(e=le(e,X)),q.length>0&&(e=ce(e,q)),U(e),H({},{replace:!0}),E(null),J([]),Z([])}}),[W,ee,U,H,le,ce,X,q]);const ue=e=>{const o=L.get("append");o&&(e+="\n---\n"+o),U(e)};return e(b,{hideHeader:!0,hideFooter:!!te||v,children:[e("div",{id:"chat-container",className:I.chatContainer,style:{backgroundImage:`url(${f("CHAT_BACKGROUND_IMAGE_URL")})`},children:[G&&o("button",{onClick:()=>{G&&A(-1)},"aria-label":_("Tillbaka"),style:{position:"absolute",top:12,left:12,zIndex:100,background:"var(--colorNeutralBackground1)",border:"none",cursor:"pointer",padding:8,borderRadius:8,boxShadow:"0 2px 8px rgba(0,0,0,0.08)",display:"flex",alignItems:"center",justifyContent:"center"},children:o(m,{style:{transform:"rotate(180deg)"}})}),o("div",{style:{marginLeft:G?40:0},children:o(c,{title:P||_(f("APP_CHAT_TITLE")||"Chatt"),onNewChat:te?void 0:()=>Q(!0)})}),e("div",{className:I.chatMessages,children:[k&&o(h,{sender:"bot",content:k}),f("SHOW_CHAT_PROMPTS")&&re.length>0&&0===R.length&&o(h,{sender:"bot",content:_(f("CHAT_WELCOME")||_("Välkommen!")),children:re.map(((t,n)=>e("div",{children:["> ",o("a",{href:"./#/chat",onClick:()=>{ue(t.title+"\n---\n"+t.prompt)},children:_(t.title)}),o("br",{})]},`prompt-${n}`)))}),R.map(((t,n)=>e("div",{children:[(N&&n===R.length-1||!N&&n===R.length-2)&&o("div",{ref:M}),o(h,{sender:t.sender,content:t.content,isNew:t.isNew,showSuggestions:n===R.length-1,onSuggestionClicked:U},t.id)]},t.id))),ie&&o(h,{sender:"user",content:_("Översätter...")}),N&&o(p,{})]}),o(d,{codicent:B||s.context.selectedApp,disableSend:N,onSend:ue,onSelectFiles:de,getImageUrl:j.getImageUrl,getFileInfo:e=>$.getFileInfo(e)})]}),o(l,{open:z,title:_("Vill du rensa chatten?"),content:_("En ny startas, men chatten kommer först sparas."),onYes:()=>{Q(!1),D()},onNo:()=>Q(!1)}),o(g,{open:ee,templateVariables:q,filePlaceholders:X,onTemplateVariablesChange:J,onFilePlaceholdersChange:Z,onConfirm:()=>oe(!1),onCancel:()=>{oe(!1),E(null),J([]),Z([])},uploadFile:$.uploadFile})]})};export{v as default};
1
+ import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useRef as o,useState as n,useEffect as r}from"react";import{makeStyles as i}from"@fluentui/react-components";import{useNavigate as s,useSearchParams as a}from"react-router-dom";import{CalendarWeekStart24Regular as m}from"@fluentui/react-icons";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import p from"../components/TextHeader.js";import c from"../components/TypingIndicator.js";import l from"../components/Prompt.js";import d from"../components/ChatInput.js";import{CombinedPlaceholderDialog as u}from"../components/CombinedPlaceholderDialog.js";import g from"../components/ChatMessage.js";import"../components/Header.js";import h from"../hooks/useStateWithLocalStorage.js";import{CodicentService as j}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as f}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"./AppFrame.js";import"./Canvas.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../components/Content.js";import{Page as C}from"../components/Page.js";import"./QrScan.js";import b from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import{useChat as A}from"../hooks/useChat.js";import{useTemplateVariables as x}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";const S=i({chatContainer:{width:"100%",flex:1,maxWidth:"1600px",height:"100%",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},"@media (max-width: 480px)":{},backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"}}),w=({state:i,hideFooter:w,codicent:v,title:y,welcomeMessage:P})=>{const k=S(),{t:I,tAsync:F,getLanguageInfo:_}=b(),T=s(),M=o(null),[B,L]=a(),[D]=n((()=>{const e=B.get("codicent");return e?(sessionStorage.setItem("chat_codicent",e),e):v?(sessionStorage.removeItem("chat_codicent"),null):sessionStorage.getItem("chat_codicent")})),H=D||v,{messages:U,isBotTyping:R,handleSend:V,newChat:N,openChat:E}=A(i.stateMachine,H||void 0),[O,W]=n(null),[z,G]=n(!1),[Q,Y]=n(!1),{service:$,currentStateName:q}=i,[K,J]=n([]),[X,Z]=n([]),[ee,te]=n(!1),[oe,ne]=n(),[re,ie]=h(i.context.selectedApp+"_prompts",[]),[se,ae]=n(!1),{extractTemplateVariables:me,replaceTemplateVariables:pe,extractFilePlaceholders:ce,replaceFilePlaceholders:le,handleSelectFiles:de}=x($.uploadFile),ue=o(!1),ge=o(null);r((()=>{const e=window.history.length>1,t=Boolean(document.referrer&&document.referrer!==window.location.href);Y(e||t)}),[]);r((()=>{f("SHOW_CHAT_PROMPTS")&&0===U.length&&i.service.getAppPrompts(H||void 0).then(ie).catch((e=>{console.error("Failed to get prompts",e)}))}),[i.service,ie,U.length,H]),r((()=>{setTimeout((()=>{M.current?.scrollIntoView({behavior:"smooth"})}),10)}),[U]),r((()=>{if(ue.current)return;ue.current=!0;const e=B.get("text"),t=B.get("id"),o=B.get("fid");if(D){console.log("Using temporary codicent from URL param:",D);const e=new URLSearchParams(B);e.delete("codicent"),L(e,{replace:!0})}if(e){(async()=>{const t=ce(e),o=me(e);N(),t.length>0||o.length>0?(Z(t),J(o),te(!0),W(I(e))):W(I(e))})()}else t?E(t):o&&ne(o)}),[]),r((()=>{oe&&"anonymous"===q&&ge.current!==oe&&(ge.current=oe,$.getFormById(oe).then((async e=>{N();const t=_().language,o=e.prompt.replace("{{fid}}",oe).replace("{{fname}}",e.name).replace("{{language}}",t);ae(!0);const n=await F(o);ae(!1),W(n),Y(!1)})))}),[oe,N,$,W,q,F,_,ae]),r((()=>{if(O&&!ee){let e=O;X.length>0&&(e=le(e,X)),K.length>0&&(e=pe(e,K)),V(e),L({},{replace:!0}),W(null),J([]),Z([])}}),[O,ee,V,L,le,pe,X,K]);const he=e=>{const t=B.get("append");t&&(e+="\n---\n"+t),V(e)};return e(C,{hideHeader:!0,hideFooter:!!oe||w,children:[e("div",{id:"chat-container",className:k.chatContainer,style:{backgroundImage:`url(${f("CHAT_BACKGROUND_IMAGE_URL")})`},children:[Q&&t("button",{onClick:()=>{Q&&T(-1)},"aria-label":I("Tillbaka"),style:{position:"absolute",top:12,left:12,zIndex:100,background:"var(--colorNeutralBackground1)",border:"none",cursor:"pointer",padding:8,borderRadius:8,boxShadow:"0 2px 8px rgba(0,0,0,0.08)",display:"flex",alignItems:"center",justifyContent:"center"},children:t(m,{style:{transform:"rotate(180deg)"}})}),t("div",{style:{marginLeft:Q?40:0},children:t(p,{title:y||I(f("APP_CHAT_TITLE")||"Chatt"),onNewChat:oe?void 0:()=>G(!0)})}),e("div",{className:k.chatMessages,children:[P&&t(g,{sender:"bot",content:P}),f("SHOW_CHAT_PROMPTS")&&re.length>0&&0===U.length&&t(g,{sender:"bot",content:I(f("CHAT_WELCOME")||I("Välkommen!")),children:re.map(((o,n)=>e("div",{children:["> ",t("a",{href:"./#/chat",onClick:()=>{he(o.title+"\n---\n"+o.prompt)},children:I(o.title)}),t("br",{})]},`prompt-${n}`)))}),U.map(((o,n)=>e("div",{children:[(R&&n===U.length-1||!R&&n===U.length-2)&&t("div",{ref:M}),t(g,{sender:o.sender,content:o.content,isNew:o.isNew,showSuggestions:n===U.length-1,onSuggestionClicked:V},o.id)]},o.id))),se&&t(g,{sender:"user",content:I("Översätter...")}),R&&t(c,{})]}),t(d,{codicent:H||i.context.selectedApp,disableSend:R,onSend:he,onSelectFiles:de,getImageUrl:j.getImageUrl,getFileInfo:e=>$.getFileInfo(e)})]}),t(l,{open:z,title:I("Vill du rensa chatten?"),content:I("En ny startas, men chatten kommer först sparas."),onYes:()=>{G(!1),N()},onNo:()=>G(!1)}),t(u,{open:ee,templateVariables:K,filePlaceholders:X,onTemplateVariablesChange:J,onFilePlaceholdersChange:Z,onConfirm:()=>te(!1),onCancel:()=>{te(!1),W(null),J([]),Z([])},uploadFile:$.uploadFile})]})};export{w as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as i,useCallback as n,useEffect as r}from"react";import{makeStyles as s,shorthands as a,tokens as m}from"@fluentui/react-components";import{useSearchParams as p,useNavigate as l}from"react-router-dom";import{getConfigValue as c}from"../config/index.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import d from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import{CodicentService as g}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{getGpsLocation as j}from"../utils/device.js";import"exceljs";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../components/Content.js";import{Page as u}from"../components/Page.js";import"./QrScan.js";import h from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import S from"../components/MessageInput.js";import C from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const P=s({main:{flexGrow:1,...a.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:m.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),v=({state:s})=>{const a=P(),{t:m}=h(),[v,I]=t(!1),_=i(null),x=i(null),b=i(null),[M,U]=t(null),[w,F]=t([]),{service:A}=s,[L,E]=p(),[O,T]=t(void 0),[y,k]=t(),$=f(),B=l(),D=n((o=>{for(const e of o)A.getFileInfo(e).then((o=>{F((e=>[...e,o]))}))}),[A,F]),H=n((o=>{const e=new FormData;e.append("file",o),A.uploadFile(o.name,e).then((o=>{D([o])})).catch((()=>{$.notify(m("Error"),m("Error uploading pasted image"),"")}))}),[A,D,$,m]),R=o=>{I(o)};r((()=>{const o=L.get("text"),e=L.get("url"),t=L.get("parentId");o&&(T(o),L.delete("text")),t&&(k(t),L.delete("parentId")),e&&(L.delete("url"),T(((o||"")+" "+e).trim())),E(L,{replace:!0})}),[L,E,T,A,D]),r((()=>{c("COMPOSE_AUTO_LOCATION")&&j().then((o=>{o&&U(`#gps(${o.coords.latitude},${o.coords.longitude})`)}))}),[]);return o(u,{hideHeader:!0,children:e("div",{className:a.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(d,{title:c("APP_SAVE_TITLE")?m(c("APP_SAVE_TITLE")):m("Spara")}),o(S,{disableSend:!0,defaultText:O,onSend:o=>{o=`${o}${M?" "+M:""}${w.length>0?"\n":""}${w.map((o=>`#file:${o.id}`)).join(" ")}`,A.sendMessage(o,y).then((()=>{$.notify(m("Meddelande"),m("Meddelandet är sparat."),""),y&&(k(void 0),B(-1))}))},files:w,onFilesChange:F,isUploading:v,onHandleDefaultFiles:D,onUploadFile:()=>{_.current?.triggerUpload(),console.log("attach-file")},onUploadImage:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{x.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{b.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:g.getImageUrl,onLocationChange:c("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await j();o?($.notify(m("Position"),m("Position tillagd."),""),U(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(U(null),$.notify(m("Position"),m("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!M,onImagePasted:H}),o(C,{ref:_,onFileUploaded:D,onUploading:R,multiple:!0,codicentService:A}),o(C,{codicentService:A,ref:x,onFileUploaded:D,onUploading:R,multiple:!0,accept:"image/*"}),o(C,{codicentService:A,ref:b,onFileUploaded:D,onUploading:R,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{v as Compose,v as default};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useRef as i,useCallback as n,useEffect as r}from"react";import{makeStyles as s,shorthands as a,tokens as p}from"@fluentui/react-components";import{useSearchParams as m,useNavigate as l}from"react-router-dom";import{getConfigValue as c}from"../config/index.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import d from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import{CodicentService as u}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{getGpsLocation as g}from"../utils/device.js";import"exceljs";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import h from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import A from"../components/MessageInput.js";import S from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";const P=s({main:{flexGrow:1,...a.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:p.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),C=({state:s})=>{const a=P(),{t:p}=h(),[C,I]=e(!1),v=i(null),x=i(null),_=i(null),[U,b]=e(null),[w,F]=e([]),{service:M}=s,[E,L]=m(),[O,T]=e(void 0),[k,y]=e(),D=f(),B=l(),H=n((o=>{for(const t of o)M.getFileInfo(t).then((o=>{F((t=>[...t,o]))}))}),[M,F]),$=n((o=>{const t=new FormData;t.append("file",o),M.uploadFile(o.name,t).then((o=>{H([o])})).catch((()=>{D.notify(p("Error"),p("Error uploading pasted image"),"")}))}),[M,H,D,p]),R=o=>{I(o)};r((()=>{const o=E.get("text"),t=E.get("url"),e=E.get("parentId");o&&(T(o),E.delete("text")),e&&(y(e),E.delete("parentId")),t&&(E.delete("url"),T(((o||"")+" "+t).trim())),L(E,{replace:!0})}),[E,L,T,M,H]),r((()=>{c("COMPOSE_AUTO_LOCATION")&&g().then((o=>{o&&b(`#gps(${o.coords.latitude},${o.coords.longitude})`)}))}),[]);return o(j,{hideHeader:!0,children:t("div",{className:a.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(d,{title:c("APP_SAVE_TITLE")?p(c("APP_SAVE_TITLE")):p("Spara")}),o(A,{disableSend:!0,defaultText:O,onSend:o=>{o=`${o}${U?" "+U:""}${w.length>0?"\n":""}${w.map((o=>`#file:${o.id}`)).join(" ")}`,M.sendMessage(o,k).then((()=>{D.notify(p("Meddelande"),p("Meddelandet är sparat."),""),k&&(y(void 0),B(-1))}))},files:w,onFilesChange:F,isUploading:C,onHandleDefaultFiles:H,onUploadFile:()=>{v.current?.triggerUpload(),console.log("attach-file")},onUploadImage:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{x.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{_.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:u.getImageUrl,onLocationChange:c("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await g();o?(D.notify(p("Position"),p("Position tillagd."),""),b(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(b(null),D.notify(p("Position"),p("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!U,onImagePasted:$}),o(S,{ref:v,onFileUploaded:H,onUploading:R,multiple:!0,codicentService:M}),o(S,{codicentService:M,ref:x,onFileUploaded:H,onUploading:R,multiple:!0,accept:"image/*"}),o(S,{codicentService:M,ref:_,onFileUploaded:H,onUploading:R,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{C as Compose,C as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as a}from"react";import{makeStyles as s,shorthands as m,tokens as p,Button as c,MessageBar as l,MessageBarBody as d}from"@fluentui/react-components";import{ArrowLeft24Regular as u}from"@fluentui/react-icons";import{CodicentService as j}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import g from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import h from"../components/VoiceIcon.js";import f from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as v}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"../components/FileThumbnail.js";import k from"../components/MessageInput.js";import S from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as x}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import b from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useNavigate as w,useSearchParams as C}from"react-router-dom";import"./Purchase.js";import"./QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import I from"../hooks/useToaster.js";import{l as y}from"../node_modules/lodash/lodash.js";const U=s({main:{flexGrow:1,...m.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%",position:"relative"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:p.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},backButton:{marginBottom:"10px"}}),_=({state:s,voice:m})=>{const p=U(),{t:_}=b(),M=w(),[P,A]=t(!1),B=n(null),T=n(null),F=n(null),[N]=t(null),[E,L]=t([]),{service:O}=s,[R,$]=C(),[V,D]=t(""),[H,z]=t(void 0),G=I(),[W,Q]=t(void 0),[J,K]=t("info"),X=r((e=>{for(const o of e)O.getFileInfo(o).then((e=>{L((o=>[...o,e]))}))}),[O,L]),Y=r((e=>{const o=new FormData;o.append("file",e),O.uploadFile(e.name,o).then((e=>{X([e])})).catch((()=>{G.notify(_("Error"),_("Error uploading pasted image"),"")}))}),[O,X,G,_]),q=e=>{A(e)};i((()=>{const e=R.get("text"),o=R.get("url");e&&(D(e),R.delete("text")),o&&(R.delete("url"),D(((e||"")+" "+o).trim())),$(R,{replace:!0})}),[R,$,D,O,X]);const Z=r((async e=>{if(!e||e.length<10)return;Q(_("Analyserar...")),K("info");const o=await O.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new f(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;Q(_(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{Q("Error: "+e.content),K("error")}}}),[O]),ee=a((()=>y.debounce(Z,2e3)),[Z]);return i((()=>()=>{ee.cancel()}),[ee]),e(x,{hideHeader:!0,children:o("div",{className:p.container,style:{backgroundImage:`url(${v("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[m&&v("SHOW_VOICE_BUTTON")&&e("div",{className:p.voiceIcon,children:e(h,{voice:m})}),e("div",{className:p.backButton,children:e(c,{appearance:"subtle",icon:e(u,{}),onClick:()=>M(-1),children:_("Tillbaka")})}),e(g,{title:v("APP_SAVE_TITLE")?_(v("APP_SAVE_TITLE")):_("Spara")}),e(k,{defaultText:V,onSend:e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${N?" "+N:""}${E.length>0?"\n":""}${E.map((e=>`#file:${e.id}`)).join(" ")}`,O.sendMessage(e).then((()=>{G.notify(_("Meddelande"),_("Meddelandet är sparat."),"")}))},files:E,onFilesChange:L,isUploading:P,onUploadImage:()=>{T.current?.triggerUpload()},onUploadCamera:()=>{F.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!N,disableSend:!0,rows:9,placeholder:_("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(z(e),e&&e.trim().length>0?ee(e):(Q(void 0),ee.cancel()))},onImagePasted:Y}),W&&o("div",{className:p.review,children:[e("h3",{children:_("Analys")}),e(l,{intent:J,layout:"multiline",children:e(d,{children:_(W)})})]}),e(S,{ref:B,onFileUploaded:X,onUploading:q,multiple:!0,codicentService:O}),e(S,{codicentService:O,ref:T,onFileUploaded:X,onUploading:q,multiple:!0,accept:"image/*"}),e(S,{codicentService:O,ref:F,onFileUploaded:X,onUploading:q,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{_ as CrmPage,_ as default};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useRef as n,useCallback as r,useEffect as i,useMemo as s}from"react";import{makeStyles as a,shorthands as m,tokens as p,Button as c,MessageBar as l,MessageBarBody as d}from"@fluentui/react-components";import{ArrowLeft24Regular as u}from"@fluentui/react-icons";import{CodicentService as j}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import g from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import h from"../components/VoiceIcon.js";import f from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as v}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"exceljs";import"../components/FileThumbnail.js";import k from"../components/MessageInput.js";import S from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as x}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import A from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useNavigate as w,useSearchParams as b}from"react-router-dom";import"./Purchase.js";import"./QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import C from"../hooks/useToaster.js";import{l as I}from"../node_modules/lodash/lodash.js";const U=a({main:{flexGrow:1,...m.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%",position:"relative"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:p.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},backButton:{marginBottom:"10px"}}),y=({state:a,voice:m})=>{const p=U(),{t:y}=A(),P=w(),[B,_]=e(!1),M=n(null),F=n(null),E=n(null),[T]=e(null),[N,D]=e([]),{service:L}=a,[R,O]=b(),[$,V]=e(""),[H,z]=e(void 0),G=C(),[W,Q]=e(void 0),[J,q]=e("info"),K=r((o=>{for(const t of o)L.getFileInfo(t).then((o=>{D((t=>[...t,o]))}))}),[L,D]),X=r((o=>{const t=new FormData;t.append("file",o),L.uploadFile(o.name,t).then((o=>{K([o])})).catch((()=>{G.notify(y("Error"),y("Error uploading pasted image"),"")}))}),[L,K,G,y]),Y=o=>{_(o)};i((()=>{const o=R.get("text"),t=R.get("url");o&&(V(o),R.delete("text")),t&&(R.delete("url"),V(((o||"")+" "+t).trim())),O(R,{replace:!0})}),[R,O,V,L,K]);const Z=r((async o=>{if(!o||o.length<10)return;Q(y("Analyserar...")),q("info");const t=await L.chat((o=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${o}`)(o));if(t){const o=new f(t.content);try{const t=JSON.parse(o.content);console.log("json",t);let e=0;for(const o in t)"true"===t[o]&&e++;Q(y(4===e?"Allt är med":t.shortSummary||"Något saknas")),q(4===e?"success":"warning")}catch{Q("Error: "+o.content),q("error")}}}),[L]),oo=s((()=>I.debounce(Z,2e3)),[Z]);return i((()=>()=>{oo.cancel()}),[oo]),o(x,{hideHeader:!0,children:t("div",{className:p.container,style:{backgroundImage:`url(${v("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[m&&v("SHOW_VOICE_BUTTON")&&o("div",{className:p.voiceIcon,children:o(h,{voice:m})}),o("div",{className:p.backButton,children:o(c,{appearance:"subtle",icon:o(u,{}),onClick:()=>P(-1),children:y("Tillbaka")})}),o(g,{title:v("APP_SAVE_TITLE")?y(v("APP_SAVE_TITLE")):y("Spara")}),o(k,{defaultText:$,onSend:o=>{o=`${o=`#crm\n${o.replace("#log ","")}\nSALESPERSON: ${a.context.name||a.context.user?.email||a.context.nickname||"-"}`}${T?" "+T:""}${N.length>0?"\n":""}${N.map((o=>`#file:${o.id}`)).join(" ")}`,L.sendMessage(o).then((()=>{G.notify(y("Meddelande"),y("Meddelandet är sparat."),"")}))},files:N,onFilesChange:D,isUploading:B,onUploadImage:()=>{F.current?.triggerUpload()},onUploadCamera:()=>{E.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!T,disableSend:!0,rows:9,placeholder:y("Beskriv CRM-aktivitet här..."),onChange:o=>{o!==H&&(z(o),o&&o.trim().length>0?oo(o):(Q(void 0),oo.cancel()))},onImagePasted:X}),W&&t("div",{className:p.review,children:[o("h3",{children:y("Analys")}),o(l,{intent:J,layout:"multiline",children:o(d,{children:y(W)})})]}),o(S,{ref:M,onFileUploaded:K,onUploading:Y,multiple:!0,codicentService:L}),o(S,{codicentService:L,ref:F,onFileUploaded:K,onUploading:Y,multiple:!0,accept:"image/*"}),o(S,{codicentService:L,ref:E,onFileUploaded:K,onUploading:Y,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{y as CrmPage,y as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as a}from"react";import{makeStyles as s,shorthands as l,tokens as m,Text as p,Spinner as c,Card as d,Button as u,MessageBar as g,MessageBarBody as h}from"@fluentui/react-components";import{ArrowLeft24Regular as f}from"@fluentui/react-icons";import{CodicentService as j}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import x from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import v from"../components/VoiceIcon.js";import S from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as y}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as k}from"../utils/device.js";import"exceljs";import"../components/FileThumbnail.js";import w from"../components/MessageInput.js";import b from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as C}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import M from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useNavigate as N,useSearchParams as I}from"react-router-dom";import"./Purchase.js";import"./QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import T from"../hooks/useToaster.js";import{l as B}from"../node_modules/lodash/lodash.js";const D=s({main:{flexGrow:1,...l.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...l.gap("16px"),...l.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...l.gap("16px"),...l.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...l.gap("8px"),overflowY:"auto",...l.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...l.gap("8px"),overflowY:"auto",...l.padding("8px"),maxHeight:"300px"},historyCard:{...l.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:m.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...l.gap("4px")},historyDate:{fontSize:m.fontSizeBase200,color:m.colorNeutralForeground3},historyText:{fontSize:m.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:m.fontSizeBase400,fontWeight:m.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:m.colorNeutralForeground3,padding:"20px"},backButton:{marginBottom:"10px"}}),U=({state:s,voice:l})=>{const m=D(),{t:U}=M(),_=N(),[A,E]=t(!1),F=n(null),P=n(null),$=n(null),[L]=t(null),[O,z]=t([]),{service:R}=s,[H,V]=I(),[W,G]=t(""),[J,Q]=t(void 0),Y=T(),[K,X]=t(void 0),[q,Z]=t("info"),[ee,oe]=t([]),[te,ne]=t(!1),re=k(),ie=r((e=>{for(const o of e)R.getFileInfo(o).then((e=>{z((o=>[...o,e]))}))}),[R,z]),ae=r((e=>{const o=new FormData;o.append("file",e),R.uploadFile(e.name,o).then((e=>{ie([e])})).catch((()=>{Y.notify(U("Error"),U("Error uploading pasted image"),"")}))}),[R,ie,Y,U]),se=e=>{E(e)},le=r((async()=>{ne(!0);try{const e=await R.getMessages(["crm"]);oe(e)}catch(e){console.error("Error loading CRM messages:",e),Y.notify(U("Error"),U("Failed to load CRM messages"),"","error")}finally{ne(!1)}}),[R,Y,U]);i((()=>{le()}),[le]),i((()=>{const e=H.get("text"),o=H.get("url");e&&(G(e),H.delete("text")),o&&(H.delete("url"),G(((e||"")+" "+o).trim())),V(H,{replace:!0})}),[H,V,G,R,ie]);const me=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${L?" "+L:""}${O.length>0?"\n":""}${O.map((e=>`#file:${e.id}`)).join(" ")}`,R.sendMessage(e).then((()=>{Y.notify(U("Meddelande"),U("Meddelandet är sparat."),""),le(),Q(""),X(void 0)}))},pe=r((async e=>{if(!e||e.length<10)return;X(U("Analyserar...")),Z("info");const o=await R.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new S(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;X(U(4===t?"Allt är med":o.shortSummary||"Något saknas")),Z(4===t?"success":"warning")}catch{X("Error: "+e.content),Z("error")}}}),[R,U]),ce=a((()=>B.debounce(pe,2e3)),[pe]);i((()=>()=>{ce.cancel()}),[ce]);const de=e=>{const o=new Date,t=new Date(e),n=o.getTime()-t.getTime(),r=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return r<1?U("Just now"):r<60?`${r} ${U("minutes ago")}`:i<24?`${i} ${U("hours ago")}`:a<7?`${a} ${U("days ago")}`:t.toLocaleDateString()},ue=e=>{const o=e.split("\n").filter((e=>!e.startsWith("#")&&!e.startsWith("SALESPERSON:")&&e.trim().length>0)).join("\n");return o.substring(0,150)+(o.length>150?"...":"")},ge=()=>o("div",{className:re?m.historySectionMobile:m.historySection,children:[e(p,{className:m.historyTitle,children:U("Tidigare sparade")}),te?e("div",{className:m.emptyState,children:e(c,{size:"small"})}):0===ee.length?e("div",{className:m.emptyState,children:e(p,{children:U("Inga sparade meddelanden än")})}):ee.map((t=>e(d,{className:m.historyCard,onClick:()=>(e=>{const o=ue(e.content);Q(o)})(t),children:o("div",{className:m.historyCardContent,children:[e(p,{className:m.historyDate,children:de(t.createdAt)}),e(p,{className:m.historyText,children:ue(t.content)})]})},t.id)))]});return e(C,{hideHeader:!0,children:o("div",{className:re?m.containerMobile:m.container,children:[!re&&ge(),o("div",{className:re?m.inputSectionMobile:m.inputSection,style:re?void 0:{backgroundImage:`url(${y("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[l&&y("SHOW_VOICE_BUTTON")&&e("div",{className:m.voiceIcon,children:e(v,{voice:l})}),e("div",{className:m.backButton,children:e(u,{appearance:"subtle",icon:e(f,{}),onClick:()=>_(-1),children:U("Tillbaka")})}),e(x,{title:y("APP_SAVE_TITLE")?U(y("APP_SAVE_TITLE")):U("Spara")}),e(w,{defaultText:W,onSend:me,files:O,onFilesChange:z,isUploading:A,onUploadImage:()=>{P.current?.triggerUpload()},onUploadCamera:()=>{$.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!L,disableSend:!0,rows:9,placeholder:U("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==J&&(Q(e),e&&e.trim().length>0?ce(e):(X(void 0),ce.cancel()))},onImagePasted:ae}),K&&o("div",{className:m.review,children:[e("h3",{children:U("Analys")}),e(g,{intent:q,layout:"multiline",children:e(h,{children:U(K)})})]}),e(b,{ref:F,onFileUploaded:ie,onUploading:se,multiple:!0,codicentService:R}),e(b,{codicentService:R,ref:P,onFileUploaded:ie,onUploading:se,multiple:!0,accept:"image/*"}),e(b,{codicentService:R,ref:$,onFileUploaded:ie,onUploading:se,multiple:!0,accept:"image/*",capture:"environment"})]}),re&&ge()]})})};export{U as CrmPagePersistent,U as default};
1
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as i,useEffect as r,useMemo as a}from"react";import{makeStyles as s,shorthands as m,tokens as p,Text as l,Spinner as c,Card as d,Button as u,MessageBar as g,MessageBarBody as h}from"@fluentui/react-components";import{ArrowLeft24Regular as j}from"@fluentui/react-icons";import{CodicentService as f}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import x from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import S from"../components/VoiceIcon.js";import v from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as y}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as k}from"../utils/device.js";import"exceljs";import"../components/FileThumbnail.js";import w from"../components/MessageInput.js";import b from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as A}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import C from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";import"../components/audit/AuditCircularProgress.js";import"../components/audit/AuditHorizontalProgress.js";import"../components/audit/AuditRoleIndicator.js";import"../components/audit/AuditUnitSwitcher.js";import"../components/audit/AuditAnswerCell.js";import"../components/audit/AuditSearchBar.js";import"../components/audit/AuditFilterChips.js";import"../components/audit/AuditFilterBar.js";import"../components/audit/AuditGroupsProgress.js";import"../components/audit/AuditSummaryDashboard.js";import"../components/audit/AuditRequirementDialog.js";import"../components/audit/AuditUnitExportDialog.js";import"../components/audit/AuditUnitImportDialog.js";import"../components/audit/AuditBulkExportDialog.js";import"../components/audit/AuditBulkUploadDialog.js";import"../components/audit/AuditSortPresets.js";import"./AppFrame.js";import"./Canvas.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Menu.js";import"./Log.js";import"./Login.js";import"./Home.js";import"./ListPage.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import{useNavigate as M,useSearchParams as N}from"react-router-dom";import"./Purchase.js";import"./QrScan.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import D from"../hooks/useToaster.js";import{l as I}from"../node_modules/lodash/lodash.js";const B=s({main:{flexGrow:1,...m.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...m.gap("16px"),...m.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...m.gap("16px"),...m.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...m.gap("8px"),overflowY:"auto",...m.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...m.gap("8px"),overflowY:"auto",...m.padding("8px"),maxHeight:"300px"},historyCard:{...m.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:p.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...m.gap("4px")},historyDate:{fontSize:p.fontSizeBase200,color:p.colorNeutralForeground3},historyText:{fontSize:p.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:p.fontSizeBase400,fontWeight:p.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:p.colorNeutralForeground3,padding:"20px"},backButton:{marginBottom:"10px"}}),T=({state:s,voice:m})=>{const p=B(),{t:T}=C(),U=M(),[P,E]=t(!1),F=n(null),_=n(null),$=n(null),[L]=t(null),[O,R]=t([]),{service:z}=s,[H,V]=N(),[W,G]=t(""),[J,Q]=t(void 0),Y=D(),[q,K]=t(void 0),[X,Z]=t("info"),[oo,eo]=t([]),[to,no]=t(!1),io=k(),ro=i((o=>{for(const e of o)z.getFileInfo(e).then((o=>{R((e=>[...e,o]))}))}),[z,R]),ao=i((o=>{const e=new FormData;e.append("file",o),z.uploadFile(o.name,e).then((o=>{ro([o])})).catch((()=>{Y.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[z,ro,Y,T]),so=o=>{E(o)},mo=i((async()=>{no(!0);try{const o=await z.getMessages(["crm"]);eo(o)}catch(o){console.error("Error loading CRM messages:",o),Y.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{no(!1)}}),[z,Y,T]);r((()=>{mo()}),[mo]),r((()=>{const o=H.get("text"),e=H.get("url");o&&(G(o),H.delete("text")),e&&(H.delete("url"),G(((o||"")+" "+e).trim())),V(H,{replace:!0})}),[H,V,G,z,ro]);const po=o=>{o=`${o=`#crm\n${o.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${L?" "+L:""}${O.length>0?"\n":""}${O.map((o=>`#file:${o.id}`)).join(" ")}`,z.sendMessage(o).then((()=>{Y.notify(T("Meddelande"),T("Meddelandet är sparat."),""),mo(),Q(""),K(void 0)}))},lo=i((async o=>{if(!o||o.length<10)return;K(T("Analyserar...")),Z("info");const e=await z.chat((o=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${o}`)(o));if(e){const o=new v(e.content);try{const e=JSON.parse(o.content);console.log("json",e);let t=0;for(const o in e)"true"===e[o]&&t++;K(T(4===t?"Allt är med":e.shortSummary||"Något saknas")),Z(4===t?"success":"warning")}catch{K("Error: "+o.content),Z("error")}}}),[z,T]),co=a((()=>I.debounce(lo,2e3)),[lo]);r((()=>()=>{co.cancel()}),[co]);const uo=o=>{const e=new Date,t=new Date(o),n=e.getTime()-t.getTime(),i=Math.floor(n/6e4),r=Math.floor(n/36e5),a=Math.floor(n/864e5);return i<1?T("Just now"):i<60?`${i} ${T("minutes ago")}`:r<24?`${r} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},go=o=>{const e=o.split("\n").filter((o=>!o.startsWith("#")&&!o.startsWith("SALESPERSON:")&&o.trim().length>0)).join("\n");return e.substring(0,150)+(e.length>150?"...":"")},ho=()=>e("div",{className:io?p.historySectionMobile:p.historySection,children:[o(l,{className:p.historyTitle,children:T("Tidigare sparade")}),to?o("div",{className:p.emptyState,children:o(c,{size:"small"})}):0===oo.length?o("div",{className:p.emptyState,children:o(l,{children:T("Inga sparade meddelanden än")})}):oo.map((t=>o(d,{className:p.historyCard,onClick:()=>(o=>{const e=go(o.content);Q(e)})(t),children:e("div",{className:p.historyCardContent,children:[o(l,{className:p.historyDate,children:uo(t.createdAt)}),o(l,{className:p.historyText,children:go(t.content)})]})},t.id)))]});return o(A,{hideHeader:!0,children:e("div",{className:io?p.containerMobile:p.container,children:[!io&&ho(),e("div",{className:io?p.inputSectionMobile:p.inputSection,style:io?void 0:{backgroundImage:`url(${y("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[m&&y("SHOW_VOICE_BUTTON")&&o("div",{className:p.voiceIcon,children:o(S,{voice:m})}),o("div",{className:p.backButton,children:o(u,{appearance:"subtle",icon:o(j,{}),onClick:()=>U(-1),children:T("Tillbaka")})}),o(x,{title:y("APP_SAVE_TITLE")?T(y("APP_SAVE_TITLE")):T("Spara")}),o(w,{defaultText:W,onSend:po,files:O,onFilesChange:R,isUploading:P,onUploadImage:()=>{_.current?.triggerUpload()},onUploadCamera:()=>{$.current?.triggerUpload()},getImageUrl:f.getImageUrl,hasLocation:!!L,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:o=>{o!==J&&(Q(o),o&&o.trim().length>0?co(o):(K(void 0),co.cancel()))},onImagePasted:ao}),q&&e("div",{className:p.review,children:[o("h3",{children:T("Analys")}),o(g,{intent:X,layout:"multiline",children:o(h,{children:T(q)})})]}),o(b,{ref:F,onFileUploaded:ro,onUploading:so,multiple:!0,codicentService:z}),o(b,{codicentService:z,ref:_,onFileUploaded:ro,onUploading:so,multiple:!0,accept:"image/*"}),o(b,{codicentService:z,ref:$,onFileUploaded:ro,onUploading:so,multiple:!0,accept:"image/*",capture:"environment"})]}),io&&ho()]})})};export{T as CrmPagePersistent,T as default};