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.
- package/dist/cjs/components/AiInput.js +1 -1
- package/dist/cjs/components/AudioIcon.js +1 -1
- package/dist/cjs/components/ChatInput.js +1 -1
- package/dist/cjs/components/ChatMessage.js +1 -1
- package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
- package/dist/cjs/components/Footer.js +1 -1
- package/dist/cjs/components/Header.js +1 -1
- package/dist/cjs/components/HtmlView.js +1 -1
- package/dist/cjs/components/MessageInput.js +1 -1
- package/dist/cjs/components/MessageItem.js +1 -1
- package/dist/cjs/components/Profile.js +1 -1
- package/dist/cjs/components/Prompt.js +1 -1
- package/dist/cjs/components/SnapFooter.js +1 -1
- package/dist/cjs/components/TextHeader.js +1 -1
- package/dist/cjs/components/TypingIndicator.js +1 -1
- package/dist/cjs/components/UploadFile.js +1 -1
- package/dist/cjs/components/UrlProcessor.js +1 -1
- package/dist/cjs/components/VoiceIcon.js +1 -1
- package/dist/cjs/components/audit/AuditAnswerCell.d.ts +15 -0
- package/dist/cjs/components/audit/AuditAnswerCell.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditAnswerCell.js +1 -0
- package/dist/cjs/components/audit/AuditBulkExportDialog.d.ts +16 -0
- package/dist/cjs/components/audit/AuditBulkExportDialog.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditBulkExportDialog.js +1 -0
- package/dist/cjs/components/audit/AuditBulkUploadDialog.d.ts +15 -0
- package/dist/cjs/components/audit/AuditBulkUploadDialog.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditBulkUploadDialog.js +1 -0
- package/dist/cjs/components/audit/AuditCircularProgress.d.ts +15 -0
- package/dist/cjs/components/audit/AuditCircularProgress.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditCircularProgress.js +1 -0
- package/dist/cjs/components/audit/AuditFilterBar.d.ts +15 -0
- package/dist/cjs/components/audit/AuditFilterBar.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditFilterBar.js +1 -0
- package/dist/cjs/components/audit/AuditFilterChips.d.ts +17 -0
- package/dist/cjs/components/audit/AuditFilterChips.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditFilterChips.js +1 -0
- package/dist/cjs/components/audit/AuditGroupsProgress.d.ts +12 -0
- package/dist/cjs/components/audit/AuditGroupsProgress.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditGroupsProgress.js +1 -0
- package/dist/cjs/components/audit/AuditHorizontalProgress.d.ts +16 -0
- package/dist/cjs/components/audit/AuditHorizontalProgress.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditHorizontalProgress.js +1 -0
- package/dist/cjs/components/audit/AuditRequirementDialog.d.ts +16 -0
- package/dist/cjs/components/audit/AuditRequirementDialog.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditRequirementDialog.js +1 -0
- package/dist/cjs/components/audit/AuditRoleIndicator.d.ts +13 -0
- package/dist/cjs/components/audit/AuditRoleIndicator.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditRoleIndicator.js +1 -0
- package/dist/cjs/components/audit/AuditSearchBar.d.ts +13 -0
- package/dist/cjs/components/audit/AuditSearchBar.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditSearchBar.js +1 -0
- package/dist/cjs/components/audit/AuditSortPresets.d.ts +12 -0
- package/dist/cjs/components/audit/AuditSortPresets.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditSortPresets.js +1 -0
- package/dist/cjs/components/audit/AuditSummaryDashboard.d.ts +13 -0
- package/dist/cjs/components/audit/AuditSummaryDashboard.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditSummaryDashboard.js +1 -0
- package/dist/cjs/components/audit/AuditUnitExportDialog.d.ts +18 -0
- package/dist/cjs/components/audit/AuditUnitExportDialog.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditUnitExportDialog.js +1 -0
- package/dist/cjs/components/audit/AuditUnitImportDialog.d.ts +13 -0
- package/dist/cjs/components/audit/AuditUnitImportDialog.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditUnitImportDialog.js +1 -0
- package/dist/cjs/components/audit/AuditUnitSwitcher.d.ts +20 -0
- package/dist/cjs/components/audit/AuditUnitSwitcher.d.ts.map +1 -0
- package/dist/cjs/components/audit/AuditUnitSwitcher.js +1 -0
- package/dist/cjs/components/audit/index.d.ts +20 -0
- package/dist/cjs/components/audit/index.d.ts.map +1 -0
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/index.d.ts.map +1 -1
- package/dist/cjs/hooks/index.d.ts +12 -0
- package/dist/cjs/hooks/index.d.ts.map +1 -1
- package/dist/cjs/hooks/useAuditFilters.d.ts +17 -0
- package/dist/cjs/hooks/useAuditFilters.d.ts.map +1 -0
- package/dist/cjs/hooks/useAuditFilters.js +1 -0
- package/dist/cjs/hooks/useAuditManagerData.d.ts +25 -0
- package/dist/cjs/hooks/useAuditManagerData.d.ts.map +1 -0
- package/dist/cjs/hooks/useAuditManagerData.js +1 -0
- package/dist/cjs/hooks/useAuditManagerFilters.d.ts +16 -0
- package/dist/cjs/hooks/useAuditManagerFilters.d.ts.map +1 -0
- package/dist/cjs/hooks/useAuditManagerFilters.js +1 -0
- package/dist/cjs/hooks/useAuditRequirementsFilters.d.ts +17 -0
- package/dist/cjs/hooks/useAuditRequirementsFilters.d.ts.map +1 -0
- package/dist/cjs/hooks/useAuditRequirementsFilters.js +1 -0
- package/dist/cjs/hooks/useAuditRoleCheck.d.ts +26 -0
- package/dist/cjs/hooks/useAuditRoleCheck.d.ts.map +1 -0
- package/dist/cjs/hooks/useAuditRoleCheck.js +1 -0
- package/dist/cjs/hooks/useAuditState.d.ts +34 -0
- package/dist/cjs/hooks/useAuditState.d.ts.map +1 -0
- package/dist/cjs/hooks/useAuditState.js +1 -0
- package/dist/cjs/hooks/useAuthState.js +1 -1
- package/dist/cjs/hooks/useCodicentState.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/pages/AppFrame.js +1 -1
- package/dist/cjs/pages/Chat.js +1 -1
- package/dist/cjs/pages/Compose.js +1 -1
- package/dist/cjs/pages/CrmPage.js +1 -1
- package/dist/cjs/pages/CrmPagePersistent.js +1 -1
- package/dist/cjs/pages/FormAccept.js +1 -1
- package/dist/cjs/pages/FormInvite.js +1 -1
- package/dist/cjs/pages/Home.js +1 -1
- package/dist/cjs/pages/HtmlViewer.js +1 -1
- package/dist/cjs/pages/ListPage.js +1 -1
- package/dist/cjs/pages/Login.js +1 -1
- package/dist/cjs/pages/Menu.js +1 -1
- package/dist/cjs/pages/Purchase.js +1 -1
- package/dist/cjs/pages/Sales.js +1 -1
- package/dist/cjs/pages/Search.js +1 -1
- package/dist/cjs/pages/Snap.js +1 -1
- package/dist/cjs/types/audit.d.ts +358 -0
- package/dist/cjs/types/audit.d.ts.map +1 -0
- package/dist/cjs/types/index.d.ts +1 -0
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/utils/auditExport.d.ts +37 -0
- package/dist/cjs/utils/auditExport.d.ts.map +1 -0
- package/dist/cjs/utils/auditExport.js +1 -0
- package/dist/cjs/utils/auditUtils.d.ts +59 -0
- package/dist/cjs/utils/auditUtils.d.ts.map +1 -0
- package/dist/cjs/utils/auditUtils.js +1 -0
- package/dist/cjs/utils/index.d.ts +2 -0
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/esm/components/AiInput.js +1 -1
- package/dist/esm/components/AudioIcon.js +1 -1
- package/dist/esm/components/ChatInput.js +1 -1
- package/dist/esm/components/ChatMessage.js +1 -1
- package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
- package/dist/esm/components/Footer.js +1 -1
- package/dist/esm/components/Header.js +1 -1
- package/dist/esm/components/HtmlView.js +1 -1
- package/dist/esm/components/MessageInput.js +1 -1
- package/dist/esm/components/MessageItem.js +1 -1
- package/dist/esm/components/Profile.js +1 -1
- package/dist/esm/components/Prompt.js +1 -1
- package/dist/esm/components/SnapFooter.js +1 -1
- package/dist/esm/components/TextHeader.js +1 -1
- package/dist/esm/components/TypingIndicator.js +1 -1
- package/dist/esm/components/UploadFile.js +1 -1
- package/dist/esm/components/UrlProcessor.js +1 -1
- package/dist/esm/components/VoiceIcon.js +1 -1
- package/dist/esm/components/audit/AuditAnswerCell.d.ts +15 -0
- package/dist/esm/components/audit/AuditAnswerCell.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditAnswerCell.js +1 -0
- package/dist/esm/components/audit/AuditBulkExportDialog.d.ts +16 -0
- package/dist/esm/components/audit/AuditBulkExportDialog.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditBulkExportDialog.js +1 -0
- package/dist/esm/components/audit/AuditBulkUploadDialog.d.ts +15 -0
- package/dist/esm/components/audit/AuditBulkUploadDialog.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditBulkUploadDialog.js +1 -0
- package/dist/esm/components/audit/AuditCircularProgress.d.ts +15 -0
- package/dist/esm/components/audit/AuditCircularProgress.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditCircularProgress.js +1 -0
- package/dist/esm/components/audit/AuditFilterBar.d.ts +15 -0
- package/dist/esm/components/audit/AuditFilterBar.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditFilterBar.js +1 -0
- package/dist/esm/components/audit/AuditFilterChips.d.ts +17 -0
- package/dist/esm/components/audit/AuditFilterChips.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditFilterChips.js +1 -0
- package/dist/esm/components/audit/AuditGroupsProgress.d.ts +12 -0
- package/dist/esm/components/audit/AuditGroupsProgress.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditGroupsProgress.js +1 -0
- package/dist/esm/components/audit/AuditHorizontalProgress.d.ts +16 -0
- package/dist/esm/components/audit/AuditHorizontalProgress.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditHorizontalProgress.js +1 -0
- package/dist/esm/components/audit/AuditRequirementDialog.d.ts +16 -0
- package/dist/esm/components/audit/AuditRequirementDialog.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditRequirementDialog.js +1 -0
- package/dist/esm/components/audit/AuditRoleIndicator.d.ts +13 -0
- package/dist/esm/components/audit/AuditRoleIndicator.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditRoleIndicator.js +1 -0
- package/dist/esm/components/audit/AuditSearchBar.d.ts +13 -0
- package/dist/esm/components/audit/AuditSearchBar.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditSearchBar.js +1 -0
- package/dist/esm/components/audit/AuditSortPresets.d.ts +12 -0
- package/dist/esm/components/audit/AuditSortPresets.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditSortPresets.js +1 -0
- package/dist/esm/components/audit/AuditSummaryDashboard.d.ts +13 -0
- package/dist/esm/components/audit/AuditSummaryDashboard.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditSummaryDashboard.js +1 -0
- package/dist/esm/components/audit/AuditUnitExportDialog.d.ts +18 -0
- package/dist/esm/components/audit/AuditUnitExportDialog.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditUnitExportDialog.js +1 -0
- package/dist/esm/components/audit/AuditUnitImportDialog.d.ts +13 -0
- package/dist/esm/components/audit/AuditUnitImportDialog.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditUnitImportDialog.js +1 -0
- package/dist/esm/components/audit/AuditUnitSwitcher.d.ts +20 -0
- package/dist/esm/components/audit/AuditUnitSwitcher.d.ts.map +1 -0
- package/dist/esm/components/audit/AuditUnitSwitcher.js +1 -0
- package/dist/esm/components/audit/index.d.ts +20 -0
- package/dist/esm/components/audit/index.d.ts.map +1 -0
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/hooks/index.d.ts +12 -0
- package/dist/esm/hooks/index.d.ts.map +1 -1
- package/dist/esm/hooks/useAuditFilters.d.ts +17 -0
- package/dist/esm/hooks/useAuditFilters.d.ts.map +1 -0
- package/dist/esm/hooks/useAuditFilters.js +1 -0
- package/dist/esm/hooks/useAuditManagerData.d.ts +25 -0
- package/dist/esm/hooks/useAuditManagerData.d.ts.map +1 -0
- package/dist/esm/hooks/useAuditManagerData.js +1 -0
- package/dist/esm/hooks/useAuditManagerFilters.d.ts +16 -0
- package/dist/esm/hooks/useAuditManagerFilters.d.ts.map +1 -0
- package/dist/esm/hooks/useAuditManagerFilters.js +1 -0
- package/dist/esm/hooks/useAuditRequirementsFilters.d.ts +17 -0
- package/dist/esm/hooks/useAuditRequirementsFilters.d.ts.map +1 -0
- package/dist/esm/hooks/useAuditRequirementsFilters.js +1 -0
- package/dist/esm/hooks/useAuditRoleCheck.d.ts +26 -0
- package/dist/esm/hooks/useAuditRoleCheck.d.ts.map +1 -0
- package/dist/esm/hooks/useAuditRoleCheck.js +1 -0
- package/dist/esm/hooks/useAuditState.d.ts +34 -0
- package/dist/esm/hooks/useAuditState.d.ts.map +1 -0
- package/dist/esm/hooks/useAuditState.js +1 -0
- package/dist/esm/hooks/useAuthState.js +1 -1
- package/dist/esm/hooks/useCodicentState.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/pages/AppFrame.js +1 -1
- package/dist/esm/pages/Chat.js +1 -1
- package/dist/esm/pages/Compose.js +1 -1
- package/dist/esm/pages/CrmPage.js +1 -1
- package/dist/esm/pages/CrmPagePersistent.js +1 -1
- package/dist/esm/pages/FormAccept.js +1 -1
- package/dist/esm/pages/FormInvite.js +1 -1
- package/dist/esm/pages/Home.js +1 -1
- package/dist/esm/pages/HtmlViewer.js +1 -1
- package/dist/esm/pages/ListPage.js +1 -1
- package/dist/esm/pages/Login.js +1 -1
- package/dist/esm/pages/Menu.js +1 -1
- package/dist/esm/pages/Purchase.js +1 -1
- package/dist/esm/pages/Sales.js +1 -1
- package/dist/esm/pages/Search.js +1 -1
- package/dist/esm/pages/Snap.js +1 -1
- package/dist/esm/types/audit.d.ts +358 -0
- package/dist/esm/types/audit.d.ts.map +1 -0
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/index.d.ts.map +1 -1
- package/dist/esm/utils/auditExport.d.ts +37 -0
- package/dist/esm/utils/auditExport.d.ts.map +1 -0
- package/dist/esm/utils/auditExport.js +1 -0
- package/dist/esm/utils/auditUtils.d.ts +59 -0
- package/dist/esm/utils/auditUtils.d.ts.map +1 -0
- package/dist/esm/utils/auditUtils.js +1 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/index.d.ts +799 -1
- 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
|
|
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
|
|
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
|
|
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};
|
package/dist/esm/pages/Chat.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as e,jsx as
|
|
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
|
|
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
|
|
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};
|