reneco-advanced-input-module 0.0.21 → 0.0.22
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/loader.cjs.js +1 -1
- package/dist/cjs/voice-input-module.cjs.entry.js +274 -62
- package/dist/cjs/voice-input-module.cjs.entry.js.map +1 -1
- package/dist/cjs/voice-input-module.cjs.js +1 -1
- package/dist/cjs/voice-input-module.entry.cjs.js.map +1 -1
- package/dist/collection/components/voice-input-module/voice-input-module.js +87 -4
- package/dist/collection/components/voice-input-module/voice-input-module.js.map +1 -1
- package/dist/collection/services/audio-recorder.service.js +61 -44
- package/dist/collection/services/audio-recorder.service.js.map +1 -1
- package/dist/collection/services/llm.service.js +137 -8
- package/dist/collection/services/llm.service.js.map +1 -1
- package/dist/collection/services/speech-to-text.service.js +39 -5
- package/dist/collection/services/speech-to-text.service.js.map +1 -1
- package/dist/collection/types/service-providers.types.js +9 -1
- package/dist/collection/types/service-providers.types.js.map +1 -1
- package/dist/components/voice-input-module.js +281 -63
- package/dist/components/voice-input-module.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/voice-input-module.entry.js +274 -62
- package/dist/esm/voice-input-module.entry.js.map +1 -1
- package/dist/esm/voice-input-module.js +1 -1
- package/dist/types/components/voice-input-module/voice-input-module.d.ts +3 -0
- package/dist/types/components.d.ts +18 -0
- package/dist/types/services/audio-recorder.service.d.ts +5 -0
- package/dist/types/services/llm.service.d.ts +22 -0
- package/dist/types/services/speech-to-text.service.d.ts +8 -0
- package/dist/types/types/service-providers.types.d.ts +6 -2
- package/dist/voice-input-module/p-0e2b9ca0.entry.js +3 -0
- package/dist/voice-input-module/p-0e2b9ca0.entry.js.map +1 -0
- package/dist/voice-input-module/voice-input-module.entry.esm.js.map +1 -1
- package/dist/voice-input-module/voice-input-module.esm.js +1 -1
- package/package.json +1 -1
- package/readme.md +81 -0
- package/www/build/p-0e2b9ca0.entry.js +3 -0
- package/www/build/p-0e2b9ca0.entry.js.map +1 -0
- package/www/build/p-812b92c7.js +2 -0
- package/www/build/voice-input-module.entry.esm.js.map +1 -1
- package/www/build/voice-input-module.esm.js +1 -1
- package/www/index.html +12 -1
- package/dist/voice-input-module/p-4e449895.entry.js +0 -3
- package/dist/voice-input-module/p-4e449895.entry.js.map +0 -1
- package/www/build/p-3a11e8d2.js +0 -2
- package/www/build/p-4e449895.entry.js +0 -3
- package/www/build/p-4e449895.entry.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { h } from "@stencil/core";
|
|
2
|
+
import { TRANSCRIPTION_MODELS, COMPLETION_MODELS } from "../../types/service-providers.types";
|
|
2
3
|
import { AudioRecorderService } from "../../services/audio-recorder.service";
|
|
3
4
|
import { SpeechToTextServiceFactory } from "../../services/speech-to-text.service";
|
|
4
5
|
import { LLMServiceFactory } from "../../services/llm.service";
|
|
@@ -23,6 +24,8 @@ export class VoiceFormRecorder {
|
|
|
23
24
|
this.apiProxyUrl = 'http://localhost:8492';
|
|
24
25
|
this.transcriptionModel = 'gpt-4o-transcribe';
|
|
25
26
|
this.completionModel = 'gpt-5-mini';
|
|
27
|
+
this.transcriptionProvider = 'openai';
|
|
28
|
+
this.completionProvider = 'openai';
|
|
26
29
|
this.context = undefined;
|
|
27
30
|
this.classificationRootUrl = 'http://localhost';
|
|
28
31
|
this.language = 'en';
|
|
@@ -70,17 +73,33 @@ export class VoiceFormRecorder {
|
|
|
70
73
|
this.updateDebugInfo(errorMessage, { error: errorMessage });
|
|
71
74
|
}
|
|
72
75
|
else {
|
|
76
|
+
// Validate transcription provider/model
|
|
77
|
+
const allowedTranscriptionModels = TRANSCRIPTION_MODELS[this.transcriptionProvider];
|
|
78
|
+
if (!allowedTranscriptionModels) {
|
|
79
|
+
throw new Error(`Unsupported transcription provider: '${this.transcriptionProvider}'. Allowed: openai, mistral`);
|
|
80
|
+
}
|
|
81
|
+
if (!allowedTranscriptionModels.includes(this.transcriptionModel)) {
|
|
82
|
+
throw new Error(`Model '${this.transcriptionModel}' is not allowed for transcription provider '${this.transcriptionProvider}'. Allowed: ${allowedTranscriptionModels.join(', ')}`);
|
|
83
|
+
}
|
|
84
|
+
// Validate completion provider/model
|
|
85
|
+
const allowedCompletionModels = COMPLETION_MODELS[this.completionProvider];
|
|
86
|
+
if (!allowedCompletionModels) {
|
|
87
|
+
throw new Error(`Unsupported completion provider: '${this.completionProvider}'. Allowed: openai, anthropic, mistral`);
|
|
88
|
+
}
|
|
89
|
+
if (!allowedCompletionModels.includes(this.completionModel)) {
|
|
90
|
+
throw new Error(`Model '${this.completionModel}' is not allowed for completion provider '${this.completionProvider}'. Allowed: ${allowedCompletionModels.join(', ')}`);
|
|
91
|
+
}
|
|
73
92
|
// Parse form schema
|
|
74
93
|
this.parsedSchema = JSON.parse(this.formJson || '{}');
|
|
75
94
|
// Parse service configuration
|
|
76
95
|
this.parsedConfig = JSON.parse(this.serviceConfig || '{}');
|
|
77
96
|
// Add API key to config if provided via prop
|
|
78
97
|
if (this.apiKey) {
|
|
79
|
-
this.parsedConfig = Object.assign(Object.assign({}, this.parsedConfig), { speechToText: Object.assign(Object.assign({}, this.parsedConfig.speechToText), { apiKey: this.apiKey, model: this.transcriptionModel }), llm: Object.assign(Object.assign({}, this.parsedConfig.llm), { apiKey: this.apiKey, model: this.completionModel }) });
|
|
98
|
+
this.parsedConfig = Object.assign(Object.assign({}, this.parsedConfig), { speechToText: Object.assign(Object.assign({}, this.parsedConfig.speechToText), { provider: this.transcriptionProvider, apiKey: this.apiKey, model: this.transcriptionModel }), llm: Object.assign(Object.assign({}, this.parsedConfig.llm), { provider: this.completionProvider, apiKey: this.apiKey, model: this.completionModel }) });
|
|
80
99
|
}
|
|
81
100
|
else {
|
|
82
101
|
// Use proxy API if no API key provided
|
|
83
|
-
this.parsedConfig = Object.assign(Object.assign({}, this.parsedConfig), { speechToText: Object.assign(Object.assign({}, this.parsedConfig.speechToText), { useProxy: true, proxyUrl: this.apiProxyUrl, model: this.transcriptionModel }), llm: Object.assign(Object.assign({}, this.parsedConfig.llm), { useProxy: true, proxyUrl: this.apiProxyUrl, model: this.completionModel }) });
|
|
102
|
+
this.parsedConfig = Object.assign(Object.assign({}, this.parsedConfig), { speechToText: Object.assign(Object.assign({}, this.parsedConfig.speechToText), { provider: this.transcriptionProvider, useProxy: true, proxyUrl: this.apiProxyUrl, model: this.transcriptionModel }), llm: Object.assign(Object.assign({}, this.parsedConfig.llm), { provider: this.completionProvider, useProxy: true, proxyUrl: this.apiProxyUrl, model: this.completionModel }) });
|
|
84
103
|
}
|
|
85
104
|
// Initialize services
|
|
86
105
|
this.speechToTextService = SpeechToTextServiceFactory.create(this.parsedConfig);
|
|
@@ -246,7 +265,7 @@ export class VoiceFormRecorder {
|
|
|
246
265
|
});
|
|
247
266
|
// Stop recording and get audio blob
|
|
248
267
|
const audioBlob = await this.audioRecorder.stopRecording();
|
|
249
|
-
const audioContent = new File([audioBlob], 'audio.
|
|
268
|
+
const audioContent = new File([audioBlob], 'audio.wav', { type: 'audio/wav' });
|
|
250
269
|
this.processAudioContent(audioContent);
|
|
251
270
|
}
|
|
252
271
|
catch (error) {
|
|
@@ -753,7 +772,7 @@ export class VoiceFormRecorder {
|
|
|
753
772
|
render() {
|
|
754
773
|
const containerStyle = this.getContainerStyle();
|
|
755
774
|
const statusStyle = this.getStatusStyle();
|
|
756
|
-
return (h("div", { key: '
|
|
775
|
+
return (h("div", { key: '8378e98f02e5b7482929d255c5ec12ff8c2731e4' }, h("div", { key: 'b8a0d873bd4e1b4c8936747c0919ac8c4c15301b', class: "voice-recorder-container" + (this.debug || this.renderForm ? "-debug" : ""), style: containerStyle }, h("div", { key: '86e7783e3686db378ee16aa91a640f33c3255923', class: "row-audio-area" }, this.renderRecordButton(), this.renderUploadRecordButton(), this.renderUploadButton()), this.displayStatus ? h("div", { class: "status-text", style: statusStyle }, this.statusMessage) : "", this.renderForm ? this.renderFormPreview() : "", this.debug ? this.renderDebugPanel() : "")));
|
|
757
776
|
}
|
|
758
777
|
static get is() { return "voice-input-module"; }
|
|
759
778
|
static get encapsulation() { return "shadow"; }
|
|
@@ -888,6 +907,58 @@ export class VoiceFormRecorder {
|
|
|
888
907
|
"reflect": false,
|
|
889
908
|
"defaultValue": "'gpt-5-mini'"
|
|
890
909
|
},
|
|
910
|
+
"transcriptionProvider": {
|
|
911
|
+
"type": "string",
|
|
912
|
+
"attribute": "transcription-provider",
|
|
913
|
+
"mutable": false,
|
|
914
|
+
"complexType": {
|
|
915
|
+
"original": "TranscriptionProvider",
|
|
916
|
+
"resolved": "\"mistral\" | \"openai\"",
|
|
917
|
+
"references": {
|
|
918
|
+
"TranscriptionProvider": {
|
|
919
|
+
"location": "import",
|
|
920
|
+
"path": "../../types/service-providers.types",
|
|
921
|
+
"id": "src/types/service-providers.types.ts::TranscriptionProvider"
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
},
|
|
925
|
+
"required": false,
|
|
926
|
+
"optional": false,
|
|
927
|
+
"docs": {
|
|
928
|
+
"tags": [],
|
|
929
|
+
"text": ""
|
|
930
|
+
},
|
|
931
|
+
"getter": false,
|
|
932
|
+
"setter": false,
|
|
933
|
+
"reflect": false,
|
|
934
|
+
"defaultValue": "'openai'"
|
|
935
|
+
},
|
|
936
|
+
"completionProvider": {
|
|
937
|
+
"type": "string",
|
|
938
|
+
"attribute": "completion-provider",
|
|
939
|
+
"mutable": false,
|
|
940
|
+
"complexType": {
|
|
941
|
+
"original": "CompletionProvider",
|
|
942
|
+
"resolved": "\"anthropic\" | \"mistral\" | \"openai\"",
|
|
943
|
+
"references": {
|
|
944
|
+
"CompletionProvider": {
|
|
945
|
+
"location": "import",
|
|
946
|
+
"path": "../../types/service-providers.types",
|
|
947
|
+
"id": "src/types/service-providers.types.ts::CompletionProvider"
|
|
948
|
+
}
|
|
949
|
+
}
|
|
950
|
+
},
|
|
951
|
+
"required": false,
|
|
952
|
+
"optional": false,
|
|
953
|
+
"docs": {
|
|
954
|
+
"tags": [],
|
|
955
|
+
"text": ""
|
|
956
|
+
},
|
|
957
|
+
"getter": false,
|
|
958
|
+
"setter": false,
|
|
959
|
+
"reflect": false,
|
|
960
|
+
"defaultValue": "'openai'"
|
|
961
|
+
},
|
|
891
962
|
"context": {
|
|
892
963
|
"type": "string",
|
|
893
964
|
"attribute": "context",
|
|
@@ -1219,6 +1290,18 @@ export class VoiceFormRecorder {
|
|
|
1219
1290
|
}, {
|
|
1220
1291
|
"propName": "theme",
|
|
1221
1292
|
"methodName": "initializeServices"
|
|
1293
|
+
}, {
|
|
1294
|
+
"propName": "transcriptionProvider",
|
|
1295
|
+
"methodName": "initializeServices"
|
|
1296
|
+
}, {
|
|
1297
|
+
"propName": "completionProvider",
|
|
1298
|
+
"methodName": "initializeServices"
|
|
1299
|
+
}, {
|
|
1300
|
+
"propName": "transcriptionModel",
|
|
1301
|
+
"methodName": "initializeServices"
|
|
1302
|
+
}, {
|
|
1303
|
+
"propName": "completionModel",
|
|
1304
|
+
"methodName": "initializeServices"
|
|
1222
1305
|
}];
|
|
1223
1306
|
}
|
|
1224
1307
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voice-input-module.js","sourceRoot":"","sources":["../../../src/components/voice-input-module/voice-input-module.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, Event, EventEmitter, State, h, Watch, Method } from '@stencil/core';\r\nimport { FormSchema, VoiceFormRecorderResult, FilledFormData, FormSchemaFieldsOnly, FormSchemaFieldsOnlyExtended } from '../../types/form-schema.types';\r\nimport { ServiceProviderConfig } from '../../types/service-providers.types';\r\nimport { AudioRecorderService } from '../../services/audio-recorder.service';\r\nimport { SpeechToTextServiceFactory } from '../../services/speech-to-text.service';\r\nimport { LLMServiceFactory } from '../../services/llm.service';\r\nimport { SchemaConverter } from '../../utils/schema-converter';\r\nimport { defineCustomElements } from 'ocr-file-uploader/loader';\r\n\r\n// Initialize OCR\r\ndefineCustomElements();\r\n\r\n@Component({\r\n tag: 'voice-input-module',\r\n styleUrl: 'voice-input-module.css',\r\n shadow: true,\r\n})\r\nexport class VoiceFormRecorder {\r\n @Prop() formJson: string = '{}';\r\n @Prop() serviceConfig: string = '{}';\r\n @Prop() apiKey: string;\r\n @Prop() apiProxyUrl: string = 'http://localhost:8492';\r\n @Prop() transcriptionModel: string = 'gpt-4o-transcribe';\r\n @Prop() completionModel: string = 'gpt-5-mini';\r\n @Prop() context: 'track'|'ng'|'ecoll-veto'|'ecoteka' = undefined;\r\n @Prop() classificationRootUrl: string = 'http://localhost';\r\n @Prop() language: 'fr'|'en' = 'en';\r\n @Prop() inputTypes: string = '';\r\n @Prop() theme: string = '';\r\n \r\n private get parsedInputTypes(): ('voice' | 'ocr' | 'audio')[] {\r\n if (!this.inputTypes) return [];\r\n try {\r\n return JSON.parse(this.inputTypes.replace(/'/g, '\"'));\r\n } catch {\r\n return this.inputTypes.split(',').map(type => type.trim() as 'voice' | 'ocr' | 'audio');\r\n }\r\n }\r\n \r\n @Prop() debug: boolean = false;\r\n @Prop() renderForm: boolean = false;\r\n @Prop() displayStatus: boolean = false;\r\n \r\n @Event() formFilled: EventEmitter<VoiceFormRecorderResult>;\r\n @Event() recordingStateChanged: EventEmitter<{ isRecording: boolean; state: string }>;\r\n\r\n @State() isRecording: boolean = false;\r\n @State() isProcessing: boolean = false;\r\n @State() statusMessage: string;\r\n @State() hasError: boolean = false;\r\n @State() transcription: string = '';\r\n @State() filledData: FilledFormData | null = null;\r\n @State() debugInfo: any = {};\r\n @State() isReadonlyMode: boolean = true; // Start in readonly preview mode\r\n\r\n private audioRecorder: AudioRecorderService;\r\n private speechToTextService: any;\r\n private llmService: any;\r\n private parsedSchema: any; // Support both simple FormSchema and complex nested schema\r\n private parsedConfig: ServiceProviderConfig;\r\n private parsedTheme: any;\r\n\r\n constructor() {\r\n this.audioRecorder = new AudioRecorderService();\r\n }\r\n\r\n componentWillLoad() {\r\n this.initializeServices();\r\n }\r\n\r\n @Watch('formJson')\r\n @Watch('serviceConfig')\r\n @Watch('theme')\r\n initializeServices() {\r\n // Parse theme\r\n try {\r\n this.parsedTheme = this.theme ? JSON.parse(this.theme) : this.getDefaultTheme();\r\n } catch {\r\n this.parsedTheme = this.getDefaultTheme();\r\n }\r\n try {\r\n if (!this.context){\r\n this.hasError = true;\r\n const errorMessage = (this.language == 'en' ? `Initialization error: context is '${this.context}'` : `Erreur d'initialisation: le contexte est '${this.context}'`);\r\n this.statusMessage = errorMessage;\r\n this.updateDebugInfo(errorMessage, { error: errorMessage });\r\n }\r\n else{\r\n // Parse form schema\r\n this.parsedSchema = JSON.parse(this.formJson || '{}');\r\n \r\n // Parse service configuration\r\n this.parsedConfig = JSON.parse(this.serviceConfig || '{}');\r\n \r\n // Add API key to config if provided via prop\r\n if (this.apiKey) {\r\n this.parsedConfig = {\r\n ...this.parsedConfig,\r\n speechToText: { ...this.parsedConfig.speechToText, apiKey: this.apiKey, model: this.transcriptionModel },\r\n llm: { ...this.parsedConfig.llm, apiKey: this.apiKey, model: this.completionModel }\r\n };\r\n } else {\r\n // Use proxy API if no API key provided\r\n this.parsedConfig = {\r\n ...this.parsedConfig,\r\n speechToText: { ...this.parsedConfig.speechToText, useProxy: true, proxyUrl: this.apiProxyUrl, model: this.transcriptionModel },\r\n llm: { ...this.parsedConfig.llm, useProxy: true, proxyUrl: this.apiProxyUrl, model: this.completionModel }\r\n };\r\n }\r\n \r\n // Initialize services\r\n this.speechToTextService = SpeechToTextServiceFactory.create(this.parsedConfig);\r\n this.llmService = LLMServiceFactory.create(this.parsedConfig);\r\n \r\n this.updateDebugInfo('Initialized', {\r\n schema: this.parsedSchema,\r\n config: this.parsedConfig\r\n });\r\n \r\n this.hasError = false;\r\n this.statusMessage = this.parsedTheme.texts?.idle || (this.language == 'en' ? 'Select an input method' : 'Sélectionner une méthode de saisie');\r\n if (this.parsedInputTypes.length === 0){\r\n this.inputTypes = 'voice';\r\n }\r\n }\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Initialization error: ${error.message}` : `Erreur d'initialisation: ${error.message}`);\r\n this.updateDebugInfo('Initialization Error', { error: error.message });\r\n }\r\n }\r\n\r\n private updateDebugInfo(action: string, data: any) {\r\n if (this.debug) {\r\n this.debugInfo = {\r\n ...this.debugInfo,\r\n [action]: {\r\n timestamp: new Date().toISOString(),\r\n data\r\n }\r\n };\r\n }\r\n }\r\n\r\n private async handleRecordClick() {\r\n if (this.isProcessing) return;\r\n\r\n if (this.isRecording) {\r\n await this.stopRecordingAndProcess();\r\n } else {\r\n await this.startRecording();\r\n }\r\n }\r\n\r\n private async startRecording() {\r\n try {\r\n this.hasError = false;\r\n this.statusMessage = (this.language == 'en' ? 'Starting recording...' : `Enregistrement ...`);\r\n this.updateDebugInfo('Start Recording Attempt', {});\r\n\r\n await this.audioRecorder.startRecording();\r\n \r\n this.isRecording = true;\r\n this.statusMessage = this.parsedTheme.texts?.recording || (this.language == 'en' ? 'Recording... Click to stop' : 'Enregistrement ... Cliquer pour stopper');\r\n this.updateDebugInfo('Recording Started', {});\r\n \r\n this.recordingStateChanged.emit({ \r\n isRecording: true, \r\n state: 'recording' \r\n });\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Recording failed: ${error.message}` : `Echec de l'enregistrement : ${error.message}`);\r\n this.updateDebugInfo('Recording Error', { error: error.message });\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n private async processJsonForm(ocrData: any){\r\n try {\r\n this.isProcessing = true;\r\n this.statusMessage = this.parsedTheme.texts?.processing || (this.language == 'en' ? 'Processing json...' : `Traitement du json ...`);\r\n\r\n // Extract content from OCR format\r\n const extractedData = ocrData?.content || ocrData;\r\n const jsonForm = JSON.stringify(extractedData);\r\n\r\n // Fill form using LLM\r\n this.statusMessage = this.parsedTheme.texts?.filling || (this.language == 'en' ? 'Filling form fields...' : 'Remplissage du formulaire ...');\r\n const trimmedSchema = await this.trimSchemaForAI(this.parsedSchema);\r\n const filledSchema = await this.llmService.fillFormFromJson(jsonForm, trimmedSchema);\r\n \r\n // Extract filled data\r\n this.filledData = this.extractFilledData(filledSchema);\r\n this.updateDebugInfo('Form Filled', { \r\n filledSchema, \r\n extractedData: this.filledData \r\n });\r\n \r\n this.parsedSchema = this.filledData;\r\n\r\n this.statusMessage = this.parsedTheme.texts?.completed || (this.language == 'en' ? 'Form completed!' : 'Formulaire remplis !');\r\n this.hasError = false;\r\n\r\n // Emit success event\r\n this.formFilled.emit({\r\n success: true,\r\n data: this.filledData,\r\n jsonForm: jsonForm\r\n });\r\n\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Processing failed: ${error.message}` : `Erreur de traitement : ${error.message}`);\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message,\r\n jsonForm: JSON.stringify(ocrData)\r\n });\r\n } finally {\r\n this.isProcessing = false;\r\n }\r\n }\r\n\r\n private async processAudioContent(audioFile) {\r\n this.updateDebugInfo('Audio Captured', { \r\n size: audioFile.size, \r\n type: audioFile.type \r\n });\r\n\r\n try {\r\n // Transcribe audio\r\n this.statusMessage = this.parsedTheme.texts?.transcribing || (this.language == 'en' ? 'Transcribing speech...' : 'Transcription du texte ...');\r\n const transcription = await this.speechToTextService.transcribe(audioFile, this.language);\r\n this.transcription = transcription;\r\n this.updateDebugInfo('Transcription Complete', { transcription });\r\n\r\n if (!transcription.trim()) {\r\n throw new Error('No speech detected in the recording');\r\n }\r\n\r\n // Fill form using LLM\r\n this.statusMessage = this.parsedTheme.texts?.filling || (this.language == 'en' ? 'Filling form fields...' : 'Remplissage du formulaire ...');\r\n const trimmedSchema = await this.trimSchemaForAI(this.parsedSchema);\r\n const filledSchema = await this.llmService.fillFormFromTranscription(transcription, trimmedSchema);\r\n \r\n // Extract filled data\r\n this.filledData = this.extractFilledData(filledSchema);\r\n this.updateDebugInfo('Form Filled', { \r\n filledSchema, \r\n extractedData: this.filledData \r\n });\r\n \r\n this.parsedSchema = this.filledData;\r\n\r\n this.statusMessage = this.parsedTheme.texts?.completed || (this.language == 'en' ? 'Form completed!' : 'Formulaire remplis !');\r\n this.hasError = false;\r\n\r\n // Emit success event\r\n this.formFilled.emit({\r\n success: true,\r\n data: this.filledData,\r\n transcription: transcription\r\n });\r\n } catch (error) {\r\n console.error('Transcription error:', error);\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? 'Audio processing failed.' : 'Échec du traitement audio.');\r\n this.updateDebugInfo('Transcription Error', { error: error.message });\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message,\r\n transcription: this.transcription\r\n });\r\n }\r\n }\r\n\r\n private async stopRecordingAndProcess() {\r\n try {\r\n this.isRecording = false;\r\n this.isProcessing = true;\r\n this.statusMessage = this.parsedTheme.texts?.processing || (this.language == 'en' ? 'Processing audio...' : `Traitement de l'audio ...`);\r\n this.updateDebugInfo('Stop Recording', {});\r\n\r\n this.recordingStateChanged.emit({ \r\n isRecording: false, \r\n state: 'processing' \r\n });\r\n\r\n // Stop recording and get audio blob\r\n const audioBlob = await this.audioRecorder.stopRecording();\r\n const audioContent = new File([audioBlob], 'audio.webm', { type: 'audio/webm' });\r\n this.processAudioContent(audioContent);\r\n\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Processing failed: ${error.message}` : `Erreur de traitement : ${error.message}`);\r\n this.updateDebugInfo('Processing Error', { error: error.message });\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message,\r\n transcription: this.transcription\r\n });\r\n } finally {\r\n this.isProcessing = false;\r\n this.recordingStateChanged.emit({ \r\n isRecording: false, \r\n state: 'idle' \r\n });\r\n }\r\n }\r\n\r\n private extractFilledData(filledData: any): any {\r\n // console.log(\"extractFilledData\", filledData);\r\n const updatedSchema = JSON.parse(JSON.stringify(this.parsedSchema));\r\n switch(this.context){\r\n case \"ecoteka\":\r\n // console.log(\"TODO extractFilledData\", filledData);\r\n case \"ng\": \r\n if (filledData?.fields) {\r\n // Map AI response back to original schema structure\r\n filledData.fields.forEach((field: any) => {\r\n const originalField = updatedSchema.Children.find((child: any) => \r\n child.System_Name === field.name || child.Settings?.Label === field.name\r\n );\r\n \r\n if (originalField && field.value !== undefined && field.value !== null && field.value !== '') {\r\n if (!originalField.Settings) originalField.Settings = {};\r\n originalField.Settings.Default_Value = field.value;\r\n }\r\n });\r\n }\r\n \r\n break;\r\n case \"ecoll-veto\":\r\n // console.log(\"TODO extractFilledData\", filledData, updatedSchema);\r\n if (filledData?.fields) {\r\n // Map AI response back to original schema structure\r\n filledData.fields.forEach((field: any) => {\r\n let originalField = updatedSchema[0].items.find((child: any) => \r\n child.label === field.name\r\n );\r\n if (!originalField)\r\n originalField = updatedSchema[1].items.find((child: any) =>\r\n child.label === field.name\r\n );\r\n \r\n if (originalField && field.value !== undefined && field.value !== null && field.value !== '') {\r\n updatedSchema[2][originalField.name] = field.value;\r\n }\r\n });\r\n }\r\n break;\r\n case \"track\":\r\n default:\r\n if (filledData?.fields) {\r\n Object.entries(filledData.fields).forEach(([fieldID, field]: [string, any]) => {\r\n if (field.value !== undefined && field.value !== null && field.value !== '') {\r\n if (field.id) {\r\n const schemaField = updatedSchema.fields[field.id];\r\n if (schemaField) {\r\n schemaField.value = field.value;\r\n schemaField.default = field.value;\r\n }\r\n } else {\r\n const fieldName = field.name;\r\n for (const key in updatedSchema.fields) {\r\n const schemaField = updatedSchema.fields[key];\r\n if (schemaField.title === fieldName) {\r\n schemaField.value = field.value;\r\n schemaField.default = field.value;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n \r\n // console.log(\"extractFilledData result\", updatedSchema);\r\n return updatedSchema;\r\n }\r\n\r\n private async trimSchemaForAI(schema: any): Promise<any> {\r\n // console.log(\"trimSchemaForAI\", schema);\r\n switch(this.context){\r\n case \"ecoteka\":\r\n // console.log(\"TODO trimSchemaForAI\", schema)\r\n case \"ng\":\r\n const trimmed = { fields: [] };\r\n schema.Children.forEach((child: any) => {\r\n if (!child.System_Name || !child.Type) return;\r\n \r\n const fieldData: any = {\r\n name: child.Label || child.Settings?.Label || child.System_Name,\r\n type: this.mapFieldType(child.Type),\r\n default: child.Settings?.Default_Value\r\n };\r\n \r\n // Add options for classification/select/multiselect fields\r\n const selectTypes = ['InputClassification', 'select', 'multiselect', 'InputMultiSelect']\r\n if (selectTypes.includes(child.Type) && child.Children && child.Children.length > 0) {\r\n fieldData.options = child.Children.map((option: any) => \r\n option.System_Name || option.Label || option.toString()\r\n );\r\n }\r\n \r\n trimmed.fields.push(fieldData);\r\n });\r\n \r\n // console.log(\"Schema apres transformation, contexte NG:\", trimmed);\r\n return trimmed;\r\n case \"ecoll-veto\":\r\n // console.log(\"TODO trimSchemaForAI\", schema)\r\n const mergedItemsSchema = (this.parsedSchema[0].items).concat(this.parsedSchema[1].items);\r\n\r\n if (mergedItemsSchema) {\r\n const trimmedSchema: FormSchema = {\r\n title: 'Form Name',\r\n description: 'Form Description',\r\n schema: {}\r\n };\r\n\r\n Object.entries(mergedItemsSchema).forEach(async ([key, field]: [string, any]) => {\r\n const fieldName = field.name;\r\n const fieldType = this.mapFieldType(field.type) as any;\r\n const fieldLabel = field.label || fieldName;\r\n const isRequired = field.required || false;\r\n const fieldValue = ''; //TODO\r\n\r\n if (['position', 'thesaurus'].includes(fieldType)) {\r\n try {\r\n const response = await fetch(`${this.classificationRootUrl}/ng/api/v1/classification/getList/${fieldType.toLowerCase() == 'position' ? \"Position\" : \"Thesaurus\"}/?StartNodeID=${field.config.options.options.startNode}`);\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\r\n\r\n const data = await response.json();\r\n if (Array.isArray(data)) {\r\n const options = data.map(item => ({\r\n value: item.ID,\r\n label: item.System_Name\r\n }));\r\n if (options.length > 0) {\r\n field.pickerOptions = options;\r\n // TODO on degage les quotes simples temporairement, a corriger\r\n field.options = options.map(option => option.label.replace(\"'\", \"\"));\r\n }\r\n } else {\r\n console.error(\"Unexpected API response format:\", data);\r\n }\r\n } catch (error) {\r\n console.error(\"Error fetching classification data:\", error);\r\n }\r\n }\r\n \r\n trimmedSchema.schema[fieldName] = {\r\n type: fieldType,\r\n title: fieldLabel,\r\n options: field.options,\r\n readonly: field.readonly === true,\r\n default: '',\r\n };\r\n });\r\n\r\n // console.log(\"Schema apres transformation, contexte Track:\", trimmedSchema);\r\n return trimmedSchema;\r\n }\r\n case \"track\":\r\n default:\r\n if (schema?.schema ?? schema?.fields) {\r\n const trimmedSchema: FormSchema = {\r\n title: schema.title,\r\n description: schema.description,\r\n schema: {}\r\n };\r\n\r\n const finalSchema = schema?.schema ?? schema?.fields;\r\n\r\n Object.entries(finalSchema).forEach(([fieldName, field]: [string, any]) => {\r\n trimmedSchema.schema[fieldName] = {\r\n id: fieldName,\r\n type: field.type,\r\n title: field.title,\r\n options: field.options,\r\n readonly: field.type === 'header' || field.Enabled === false,\r\n default: field.default || field.DefaultValue,\r\n pattern: field.Mask,\r\n min: field.ValidationMin,\r\n max: field.ValidationMax\r\n };\r\n });\r\n\r\n return trimmedSchema;\r\n }\r\n break;\r\n }\r\n \r\n return schema;\r\n }\r\n\r\n private mapFieldType(type: string): string {\r\n const typeMapping = {\r\n 'InputAutocomplete': 'string',\r\n 'InputInteger': 'number',\r\n 'InputTextArea': 'string',\r\n 'InputDateTimePicker': 'datetime',\r\n 'InputDecimal': 'number',\r\n 'InputClassification': 'classification',\r\n 'InputCheckbox': 'boolean',\r\n 'InputTextTranslation': 'string',\r\n 'InputMultiSelect': 'multiselect',\r\n 'thesaurus': 'thesaurus',\r\n 'position': 'position',\r\n 'text': 'string',\r\n 'textarea': 'string',\r\n 'number': 'number',\r\n 'date': 'date',\r\n 'datetime': 'datetime',\r\n 'select': 'select',\r\n 'multiselect': 'multiselect',\r\n 'checkbox': 'checkbox'\r\n };\r\n \r\n return typeMapping[type] || 'string';\r\n }\r\n\r\n // Utility methods exposed as public API\r\n @Method() public async convertXmlToJson(xmlForm: string): Promise<FormSchemaFieldsOnly> {\r\n return SchemaConverter.convertXmlToJson(xmlForm, this.classificationRootUrl, this.language);\r\n }\r\n\r\n @Method() public async convertJsonToXml(jsonForm: FormSchemaFieldsOnlyExtended): Promise<string> {\r\n return SchemaConverter.convertJsonToXml(jsonForm);\r\n }\r\n\r\n // Utility methods exposed as public API\r\n @Method() public async convertXmlToJsonLegacy(xmlForm: string): Promise<FormSchema> {\r\n return SchemaConverter.convertXmlToJsonLegacy(xmlForm);\r\n }\r\n\r\n @Method() public async convertJsonToXmlLegacy(jsonForm: FormSchema): Promise<string> {\r\n return SchemaConverter.convertJsonToXmlLegacy(jsonForm);\r\n }\r\n\r\n private renderUploadButton() {\r\n if (!this.parsedInputTypes.includes('ocr'))\r\n return;\r\n const ocrStyle = this.parsedTheme.buttons?.ocr || {};\r\n const size = ocrStyle.size || '50px';\r\n \r\n // Prepare OCR theme to pass to ocr-file-uploader component\r\n const ocrTheme = {\r\n button: {\r\n size: size,\r\n backgroundColor: ocrStyle.backgroundColor || '#10b981',\r\n hoverColor: ocrStyle.hoverColor || '#059669',\r\n textColor: ocrStyle.textColor || '#ffffff'\r\n }\r\n };\r\n \r\n const isDisabled = this.isProcessing || this.hasError;\r\n \r\n return(\r\n <div style={{ width: size, height: size, flexShrink: '0', opacity: isDisabled ? '0.6' : '1', pointerEvents: isDisabled ? 'none' : 'auto' }}>\r\n <ocr-file-uploader\r\n batch={false}\r\n json-schema={this.convertSchemaToOcrFormat(this.parsedSchema)}\r\n callback={(data) => {this.processJsonForm(data);}}\r\n theme={JSON.stringify(ocrTheme)}\r\n style={{ width: '100%', height: '100%' }}\r\n >\r\n </ocr-file-uploader>\r\n </div>\r\n );\r\n }\r\n\r\n private convertSchemaToOcrFormat(schema: any): string {\r\n const ocrSchema = {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {\r\n meta: {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {\r\n page: { type: \"integer\" },\r\n confiance_global: { type: \"number\" }\r\n },\r\n required: [\"page\", \"confiance_global\"]\r\n },\r\n content: {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {},\r\n required: []\r\n }\r\n },\r\n required: [\"meta\", \"content\"]\r\n };\r\n\r\n if (schema?.Children) {\r\n schema.Children.forEach((child: any) => {\r\n if (child.System_Name && child.Type) {\r\n const fieldLabel = child.Settings?.Label || child.System_Name;\r\n const fieldType = this.mapOcrFieldType(child.Type);\r\n ocrSchema.properties.content.properties[fieldLabel] = {\r\n anyOf: [{ type: fieldType }, { type: \"null\" }]\r\n };\r\n }\r\n });\r\n }\r\n\r\n return JSON.stringify(ocrSchema);\r\n }\r\n\r\n private mapOcrFieldType(type: string): string {\r\n const typeMapping = {\r\n 'InputInteger': 'number',\r\n 'InputDecimal': 'number',\r\n 'InputDateTimePicker': 'string',\r\n 'InputCheckbox': 'boolean'\r\n };\r\n return typeMapping[type] || 'string';\r\n }\r\n\r\n private fileInputAudioRecord!: HTMLInputElement;\r\n\r\n private triggerAudioRecordUpload = () => {\r\n this.fileInputAudioRecord.click();\r\n };\r\n\r\n private handleAudioRecordChange = async (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files || input.files.length === 0) return;\r\n\r\n const file = input.files[0];\r\n\r\n this.processAudioContent(file);\r\n };\r\n\r\n private renderUploadRecordButton() {\r\n if (!this.parsedInputTypes.includes('audio'))\r\n return;\r\n \r\n const audioStyle = this.parsedTheme.buttons?.audio || {};\r\n const size = audioStyle.size || '50px';\r\n const isDisabled = this.isProcessing || this.hasError;\r\n const buttonStyle = {\r\n stroke: audioStyle.backgroundColor || '#3b82f6',\r\n fill: audioStyle.backgroundColor || '#3b82f6',\r\n width: size,\r\n height: size,\r\n opacity: isDisabled ? '0.6' : '1'\r\n };\r\n \r\n return (\r\n <div class=\"upload-record-container\" onClick={isDisabled ? null : this.triggerAudioRecordUpload} style={{ width: size, height: size, cursor: isDisabled ? 'not-allowed' : 'pointer' }}>\r\n <input\r\n type=\"file\"\r\n ref={el => (this.fileInputAudioRecord = el!)}\r\n onChange={this.handleAudioRecordChange}\r\n style={{ display: 'none' }}\r\n />\r\n <div class='upload-record-button'>\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={buttonStyle}>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C12.6345 21.25 13.2534 21.1862 13.8508 21.065C14.2567 20.9826 14.6526 21.2448 14.735 21.6508C14.8174 22.0567 14.5551 22.4526 14.1492 22.535C13.4541 22.6761 12.7353 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 12.7353 22.6761 13.4541 22.535 14.1492C22.4526 14.5551 22.0567 14.8174 21.6508 14.735C21.2448 14.6526 20.9826 14.2567 21.065 13.8508C21.1862 13.2534 21.25 12.6345 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM12.7676 8.52584C12.7661 8.53409 12.7604 8.56729 12.7564 8.64336C12.7502 8.76101 12.75 8.91982 12.75 9.17082C12.75 9.27795 12.7501 9.33904 12.7518 9.38529C12.7528 9.41425 12.7542 9.42649 12.7546 9.42955C12.7662 9.48945 12.7993 9.54303 12.8477 9.58021C12.8502 9.58194 12.8606 9.58864 12.886 9.60252C12.9266 9.62468 12.9812 9.65209 13.0771 9.7L14.3938 10.3584C14.6183 10.4706 14.7604 10.5414 14.8684 10.5885C14.9382 10.6189 14.9705 10.6287 14.9785 10.631C15.0885 10.6405 15.1917 10.5767 15.2324 10.4742C15.2339 10.4659 15.2396 10.4327 15.2436 10.3566C15.2498 10.239 15.25 10.0802 15.25 9.82918C15.25 9.72205 15.2499 9.66096 15.2482 9.61471C15.2472 9.58575 15.2458 9.57351 15.2454 9.57045C15.2338 9.51055 15.2007 9.45697 15.1523 9.41979C15.1498 9.41805 15.1394 9.41136 15.114 9.39748C15.0734 9.37533 15.0188 9.34791 14.9229 9.3L13.6062 8.64164C13.3817 8.52939 13.2396 8.45859 13.1316 8.41151C13.0617 8.38107 13.0295 8.37131 13.0215 8.36896C12.9115 8.35945 12.8083 8.42327 12.7676 8.52584ZM12.75 11.2135L13.7396 11.7083C13.9425 11.8098 14.1204 11.8987 14.269 11.9635C14.4199 12.0293 14.5988 12.097 14.7972 12.1202C15.6037 12.2142 16.3689 11.7413 16.6454 10.978C16.7134 10.7901 16.7328 10.5998 16.7415 10.4355C16.75 10.2735 16.75 10.0747 16.75 9.8479V9.82918C16.75 9.81565 16.75 9.80205 16.75 9.78837C16.7503 9.62647 16.7505 9.45474 16.7188 9.28904C16.638 8.86674 16.4045 8.48898 16.0629 8.22783C15.9289 8.12535 15.7752 8.04877 15.6303 7.97658C15.618 7.97048 15.6059 7.96441 15.5938 7.95836L14.2603 7.29164C14.0575 7.19022 13.8796 7.10128 13.731 7.03647C13.5801 6.97071 13.4012 6.90297 13.2028 6.87982C12.3963 6.78575 11.6311 7.25868 11.3546 8.02203C11.2866 8.20986 11.2672 8.40019 11.2585 8.56454C11.2519 8.68919 11.2504 8.83571 11.2501 9L11.25 9.11944C11.25 9.13026 11.25 9.14115 11.25 9.1521V9.17082C11.25 9.18435 11.25 9.19795 11.25 9.21163C11.2499 9.23918 11.2499 9.26701 11.25 9.29505V12.5499C10.875 12.3581 10.4501 12.25 10 12.25C8.48122 12.25 7.25 13.4812 7.25 15C7.25 16.5188 8.48122 17.75 10 17.75C11.5188 17.75 12.75 16.5188 12.75 15V11.2135ZM11.25 15C11.25 14.3096 10.6904 13.75 10 13.75C9.30964 13.75 8.75 14.3096 8.75 15C8.75 15.6904 9.30964 16.25 10 16.25C10.6904 16.25 11.25 15.6904 11.25 15ZM17.4697 14.4697C17.7626 14.1768 18.2374 14.1768 18.5303 14.4697L21.0303 16.9697C21.3232 17.2626 21.3232 17.7374 21.0303 18.0303C20.7374 18.3232 20.2626 18.3232 19.9697 18.0303L18.75 16.8107V22C18.75 22.4142 18.4142 22.75 18 22.75C17.5858 22.75 17.25 22.4142 17.25 22V16.8107L16.0303 18.0303C15.7374 18.3232 15.2626 18.3232 14.9697 18.0303C14.6768 17.7374 14.6768 17.2626 14.9697 16.9697L17.4697 14.4697Z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n private renderRecordButton() {\r\n if (!this.parsedInputTypes.includes('voice'))\r\n return;\r\n\r\n const buttonClass = [\r\n 'record-button',\r\n this.isRecording && 'recording',\r\n this.isProcessing && 'processing'\r\n ].filter(Boolean).join(' ');\r\n\r\n const isDisabled = this.isProcessing || this.hasError;\r\n \r\n const voiceStyle = this.parsedTheme.buttons?.voice || {};\r\n const size = voiceStyle.size || '50px';\r\n const buttonStyle = {\r\n background: voiceStyle.backgroundColor || '#ee4444',\r\n width: size,\r\n height: size\r\n };\r\n\r\n return (\r\n <button \r\n class={buttonClass}\r\n style={buttonStyle}\r\n onClick={() => this.handleRecordClick()}\r\n disabled={isDisabled}\r\n aria-label={this.isRecording ? 'Stop recording' : 'Start recording'}\r\n >\r\n {this.isProcessing ? (\r\n <svg class=\"record-icon\" viewBox=\"0 0 24 24\">\r\n <circle cx=\"12\" cy=\"12\" r=\"3\">\r\n <animate attributeName=\"r\" values=\"3;6;3\" dur=\"1s\" repeatCount=\"indefinite\" />\r\n <animate attributeName=\"opacity\" values=\"1;0.3;1\" dur=\"1s\" repeatCount=\"indefinite\" />\r\n </circle>\r\n </svg>\r\n ) : this.isRecording ? (\r\n <svg class=\"record-icon\" viewBox=\"0 0 24 24\">\r\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\r\n </svg>\r\n ) : (\r\n <svg class=\"record-icon\" viewBox=\"0 0 24 24\">\r\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\r\n </svg>\r\n )}\r\n </button>\r\n );\r\n }\r\n\r\n private renderStatusMessage() {\r\n const statusClass = [\r\n 'status-text',\r\n this.hasError && 'error',\r\n this.filledData && !this.hasError && 'success'\r\n ].filter(Boolean).join(' ');\r\n\r\n return <div class={statusClass}>{this.statusMessage}</div>;\r\n }\r\n\r\n private renderFormPreview() {\r\n if (!this.parsedSchema) return null;\r\n\r\n const isPreview = this.isReadonlyMode && !this.filledData;\r\n const title = isPreview ? 'Form Preview (Voice input to fill)' : 'Voice-Filled Form:';\r\n \r\n return (\r\n <div class=\"form-preview\">\r\n <div class=\"form-preview-title\">{title}</div>\r\n <form class=\"voice-filled-form\">\r\n {this.renderFormFields()}\r\n </form>\r\n </div>\r\n );\r\n }\r\n\r\n private renderFormFields() {\r\n // console.log(\"renderFormFields\", this.parsedSchema);\r\n if (!this.parsedSchema) return null;\r\n \r\n const largeFieldTypes = ['select', 'multiselect', 'classification', 'thesaurus', 'position'];\r\n \r\n switch(this.context){\r\n case \"ecoteka\":\r\n // console.log(\"TODO renderFormFields\", this.parsedSchema);\r\n case \"ng\":\r\n return this.parsedSchema.Children.map((child: any) => {\r\n if (!child.System_Name || !child.Type) return null;\r\n \r\n const fieldName = child.System_Name;\r\n const fieldType = this.mapFieldType(child.Type);\r\n const fieldLabel = child.Settings?.Label || child.System_Name;\r\n const isRequired = child.Required || false;\r\n const fieldValue = child.Settings?.Default_Value;\r\n const isLargeField = largeFieldTypes.includes(fieldType) || (child.Children && child.Children.length > 5);\r\n \r\n return (\r\n <div class={isLargeField ? \"form-group full-width\" : \"form-group\"} key={fieldName}>\r\n <label htmlFor={fieldName} class=\"form-label\">\r\n {fieldLabel}\r\n {isRequired && <span class=\"required\">*</span>}\r\n </label>\r\n {this.renderFormField(fieldName, {\r\n type: fieldType,\r\n title: fieldLabel,\r\n required: isRequired,\r\n options: child.Children?.map((option: any) => \r\n option.System_Name || option.Label || option.toString()\r\n )\r\n }, fieldValue)}\r\n </div>\r\n );\r\n }).filter(Boolean);\r\n case \"ecoll-veto\":\r\n // NOTE STEP 2\r\n // console.log(\"TODO renderFormFields\", this.parsedSchema);\r\n const mergedItemsSchema = (this.parsedSchema[0].items).concat(this.parsedSchema[1].items);\r\n return Object.entries(mergedItemsSchema).map(([key, field]: [string, any]) => {\r\n \r\n const fieldName = field.name;\r\n field.type = this.mapFieldType(field.type);\r\n const fieldLabel = field.label || fieldName;\r\n const isRequired = field.required || false;\r\n const fieldValue = this.parsedSchema[2][fieldName];\r\n\r\n // if (['position', 'thesaurus'].includes(field.type)) {\r\n // try {\r\n // const response = await fetch(`${this.classificationRootUrl}/ng/api/v1/classification/getList/${fieldType.toLowerCase() == 'position' ? \"Position\" : \"Thesaurus\"}/?StartNodeID=${field.config.options.options.startNode}`);\r\n // if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\r\n\r\n // const data = await response.json();\r\n // if (Array.isArray(data)) {\r\n // const options = data.map(item => ({\r\n // value: item.ID,\r\n // label: item.System_Name\r\n // }));\r\n // if (options.length > 0) {\r\n // field.pickerOptions = options;\r\n // // TODO on degage les quotes simples temporairement, a corriger\r\n // field.options = options.map(option => option.label.replace(\"'\", \"\"));\r\n // }\r\n // } else {\r\n // console.error(\"Unexpected API response format:\", data);\r\n // }\r\n // } catch (error) {\r\n // console.error(\"Error fetching classification data:\", error);\r\n // }\r\n // }\r\n\r\n return (\r\n <div class=\"form-group\" key={fieldName}>\r\n <label htmlFor={fieldName} class=\"form-label\">\r\n { fieldLabel }\r\n {isRequired && <span class=\"required\">*</span>}\r\n </label>\r\n {this.renderFormField(fieldName, field, (this.filledData?.[fieldName] ?? fieldValue))}\r\n </div>\r\n );\r\n });\r\n case \"track\":\r\n default:\r\n return Object.entries(this.parsedSchema.fields).map(([fieldName, field]: [string, any]) => {\r\n if (field.type === 'header') {\r\n return (\r\n <div class=\"form-header\" key={fieldName}>\r\n {field.title || fieldName}\r\n </div>\r\n );\r\n }\r\n \r\n return (\r\n <div class=\"form-group\" key={fieldName}>\r\n <label htmlFor={fieldName} class=\"form-label\">\r\n {field.title || fieldName}\r\n {field.required && <span class=\"required\">*</span>}\r\n </label>\r\n {this.renderFormField(fieldName, field, (this.filledData?.[fieldName] ?? field.value))}\r\n </div>\r\n );\r\n });\r\n }\r\n }\r\n\r\n private renderFormField(fieldName: string, field: any, value: any) {\r\n const isReadonly = this.isReadonlyMode && !this.filledData;\r\n const commonProps = {\r\n id: fieldName,\r\n name: fieldName,\r\n class: 'form-input',\r\n required: field.required,\r\n disabled: isReadonly\r\n };\r\n\r\n switch (field.type) {\r\n case 'multiselect':\r\n if (isReadonly) {\r\n return (\r\n <div class=\"readonly-select\">\r\n <div class=\"select-placeholder\">Available options:</div>\r\n <ul class=\"select-options-list\">\r\n {field.options?.map(option => (\r\n <li class=\"select-option\">{option}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n const selectedValues = Array.isArray(value) ? value : (value ? [value] : []);\r\n return (\r\n <div class=\"multiselect-container\">\r\n {field.options?.map(option => {\r\n const isChecked = selectedValues.some(v => \r\n v?.toString().toLowerCase() === option?.toString().toLowerCase()\r\n );\r\n return (\r\n <label class=\"multiselect-option\">\r\n <input \r\n type=\"checkbox\" \r\n name={fieldName}\r\n value={option}\r\n checked={isChecked}\r\n disabled={isReadonly}\r\n />\r\n <span class=\"multiselect-label\">{option}</span>\r\n </label>\r\n );\r\n })}\r\n </div>\r\n );\r\n \r\n case 'select':\r\n if (isReadonly) {\r\n // In readonly mode, show all options as a list instead of dropdown\r\n return (\r\n <div class=\"readonly-select\">\r\n <div class=\"select-placeholder\">Available options:</div>\r\n <ul class=\"select-options-list\">\r\n {field.options?.map(option => (\r\n <li class=\"select-option\">{option}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n return (\r\n <select id={fieldName} name={fieldName} class=\"form-input\" required={field.required}>\r\n <option value=\"\">-- Select --</option>\r\n {field.options?.map(option => (\r\n <option value={option} selected={value === option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n \r\n case 'boolean':\r\n return (\r\n <input \r\n {...commonProps}\r\n type=\"checkbox\" \r\n class=\"form-checkbox\"\r\n checked={value === true || value === 'true'}\r\n />\r\n );\r\n \r\n case 'number':\r\n return (\r\n <input \r\n {...commonProps}\r\n type=\"number\" \r\n min={field.min}\r\n max={field.max}\r\n step=\"any\"\r\n value={value || ''}\r\n />\r\n );\r\n \r\n case 'date':\r\n return (\r\n <input \r\n {...commonProps}\r\n type='date'\r\n value={value ? (([d, m, y]) => `${y}-${m}-${d}`)(value.split(\"/\")) : ''}\r\n />\r\n );\r\n\r\n case 'datetime':\r\n return (\r\n <input \r\n {...commonProps}\r\n type='datetime-local'\r\n value={value || ''}\r\n />\r\n );\r\n \r\n default: // string\r\n return (\r\n <input \r\n {...commonProps}\r\n type=\"text\" \r\n pattern={field.pattern}\r\n placeholder={field.description}\r\n value={value || ''}\r\n />\r\n );\r\n }\r\n }\r\n\r\n private renderDebugPanel() {\r\n if (!this.debug) return null;\r\n\r\n return (\r\n <div class=\"debug-panel\">\r\n <div class=\"debug-title\">Debug Information:</div>\r\n <div class=\"debug-content\">\r\n {JSON.stringify(this.debugInfo, null, 2)}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private getDefaultTheme() {\r\n return {\r\n texts: {\r\n idle: this.language === 'en' ? 'Select an input method' : 'Sélectionner une méthode de saisie',\r\n recording: this.language === 'en' ? 'Recording... Click to stop' : 'Enregistrement ... Cliquer pour stopper',\r\n processing: this.language === 'en' ? 'Processing...' : 'Traitement en cours...',\r\n transcribing: this.language === 'en' ? 'Transcribing speech...' : 'Transcription du texte...',\r\n filling: this.language === 'en' ? 'Filling form fields...' : 'Remplissage du formulaire...',\r\n completed: this.language === 'en' ? 'Form completed!' : 'Formulaire rempli !'\r\n },\r\n container: {\r\n width: 'auto',\r\n height: 'auto',\r\n backgroundColor: '#ffffff',\r\n borderColor: '#e2e8f0',\r\n borderRadius: '8px',\r\n padding: '20px',\r\n gap: '8px'\r\n },\r\n buttons: {\r\n voice: { backgroundColor: '#ee4444', textColor: '#ffffff', hoverColor: '#dd3333', size: '50px' },\r\n audio: { backgroundColor: '#3b82f6', textColor: '#ffffff', hoverColor: '#2563eb', size: '50px' },\r\n ocr: { backgroundColor: '#10b981', textColor: '#ffffff', hoverColor: '#059669', size: '50px' }\r\n },\r\n statusText: { color: '#1e293b', fontSize: '14px' }\r\n };\r\n }\r\n\r\n private getContainerStyle() {\r\n const c = this.parsedTheme.container || {};\r\n return {\r\n width: c.width || 'auto',\r\n height: c.height || 'auto',\r\n backgroundColor: c.backgroundColor || '#ffffff',\r\n border: `1px solid ${c.borderColor || '#e2e8f0'}`,\r\n borderRadius: c.borderRadius || '8px',\r\n padding: c.padding || '20px',\r\n gap: c.gap || '8px'\r\n };\r\n }\r\n\r\n private getStatusStyle() {\r\n const s = this.parsedTheme.statusText || {};\r\n return {\r\n color: s.color || '#1e293b',\r\n fontSize: s.fontSize || '14px'\r\n };\r\n }\r\n\r\n render() {\r\n const containerStyle = this.getContainerStyle();\r\n const statusStyle = this.getStatusStyle();\r\n \r\n return (\r\n <div>\r\n <div \r\n class={\"voice-recorder-container\" + (this.debug || this.renderForm ? \"-debug\" : \"\")}\r\n style={containerStyle}\r\n >\r\n <div class=\"row-audio-area\">\r\n {this.renderRecordButton()}\r\n {this.renderUploadRecordButton()}\r\n {this.renderUploadButton()}\r\n </div>\r\n {this.displayStatus ? <div class=\"status-text\" style={statusStyle}>{this.statusMessage}</div> : \"\"}\r\n {this.renderForm ? this.renderFormPreview() : \"\"}\r\n {this.debug ? this.renderDebugPanel() : \"\"}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"voice-input-module.js","sourceRoot":"","sources":["../../../src/components/voice-input-module/voice-input-module.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, Event, EventEmitter, State, h, Watch, Method } from '@stencil/core';\r\nimport { FormSchema, VoiceFormRecorderResult, FilledFormData, FormSchemaFieldsOnly, FormSchemaFieldsOnlyExtended } from '../../types/form-schema.types';\r\nimport { ServiceProviderConfig, TranscriptionProvider, CompletionProvider, TRANSCRIPTION_MODELS, COMPLETION_MODELS } from '../../types/service-providers.types';\r\nimport { AudioRecorderService } from '../../services/audio-recorder.service';\r\nimport { SpeechToTextServiceFactory } from '../../services/speech-to-text.service';\r\nimport { LLMServiceFactory } from '../../services/llm.service';\r\nimport { SchemaConverter } from '../../utils/schema-converter';\r\nimport { defineCustomElements } from 'ocr-file-uploader/loader';\r\n\r\n// Initialize OCR\r\ndefineCustomElements();\r\n\r\n@Component({\r\n tag: 'voice-input-module',\r\n styleUrl: 'voice-input-module.css',\r\n shadow: true,\r\n})\r\nexport class VoiceFormRecorder {\r\n @Prop() formJson: string = '{}';\r\n @Prop() serviceConfig: string = '{}';\r\n @Prop() apiKey: string;\r\n @Prop() apiProxyUrl: string = 'http://localhost:8492';\r\n @Prop() transcriptionModel: string = 'gpt-4o-transcribe';\r\n @Prop() completionModel: string = 'gpt-5-mini';\r\n @Prop() transcriptionProvider: TranscriptionProvider = 'openai';\r\n @Prop() completionProvider: CompletionProvider = 'openai';\r\n @Prop() context: 'track'|'ng'|'ecoll-veto'|'ecoteka' = undefined;\r\n @Prop() classificationRootUrl: string = 'http://localhost';\r\n @Prop() language: 'fr'|'en' = 'en';\r\n @Prop() inputTypes: string = '';\r\n @Prop() theme: string = '';\r\n \r\n private get parsedInputTypes(): ('voice' | 'ocr' | 'audio')[] {\r\n if (!this.inputTypes) return [];\r\n try {\r\n return JSON.parse(this.inputTypes.replace(/'/g, '\"'));\r\n } catch {\r\n return this.inputTypes.split(',').map(type => type.trim() as 'voice' | 'ocr' | 'audio');\r\n }\r\n }\r\n \r\n @Prop() debug: boolean = false;\r\n @Prop() renderForm: boolean = false;\r\n @Prop() displayStatus: boolean = false;\r\n \r\n @Event() formFilled: EventEmitter<VoiceFormRecorderResult>;\r\n @Event() recordingStateChanged: EventEmitter<{ isRecording: boolean; state: string }>;\r\n\r\n @State() isRecording: boolean = false;\r\n @State() isProcessing: boolean = false;\r\n @State() statusMessage: string;\r\n @State() hasError: boolean = false;\r\n @State() transcription: string = '';\r\n @State() filledData: FilledFormData | null = null;\r\n @State() debugInfo: any = {};\r\n @State() isReadonlyMode: boolean = true; // Start in readonly preview mode\r\n\r\n private audioRecorder: AudioRecorderService;\r\n private speechToTextService: any;\r\n private llmService: any;\r\n private parsedSchema: any; // Support both simple FormSchema and complex nested schema\r\n private parsedConfig: ServiceProviderConfig;\r\n private parsedTheme: any;\r\n\r\n constructor() {\r\n this.audioRecorder = new AudioRecorderService();\r\n }\r\n\r\n componentWillLoad() {\r\n this.initializeServices();\r\n }\r\n\r\n @Watch('formJson')\r\n @Watch('serviceConfig')\r\n @Watch('theme')\r\n @Watch('transcriptionProvider')\r\n @Watch('completionProvider')\r\n @Watch('transcriptionModel')\r\n @Watch('completionModel')\r\n initializeServices() {\r\n // Parse theme\r\n try {\r\n this.parsedTheme = this.theme ? JSON.parse(this.theme) : this.getDefaultTheme();\r\n } catch {\r\n this.parsedTheme = this.getDefaultTheme();\r\n }\r\n try {\r\n if (!this.context){\r\n this.hasError = true;\r\n const errorMessage = (this.language == 'en' ? `Initialization error: context is '${this.context}'` : `Erreur d'initialisation: le contexte est '${this.context}'`);\r\n this.statusMessage = errorMessage;\r\n this.updateDebugInfo(errorMessage, { error: errorMessage });\r\n }\r\n else{\r\n // Validate transcription provider/model\r\n const allowedTranscriptionModels = TRANSCRIPTION_MODELS[this.transcriptionProvider];\r\n if (!allowedTranscriptionModels) {\r\n throw new Error(`Unsupported transcription provider: '${this.transcriptionProvider}'. Allowed: openai, mistral`);\r\n }\r\n if (!allowedTranscriptionModels.includes(this.transcriptionModel)) {\r\n throw new Error(`Model '${this.transcriptionModel}' is not allowed for transcription provider '${this.transcriptionProvider}'. Allowed: ${allowedTranscriptionModels.join(', ')}`);\r\n }\r\n\r\n // Validate completion provider/model\r\n const allowedCompletionModels = COMPLETION_MODELS[this.completionProvider];\r\n if (!allowedCompletionModels) {\r\n throw new Error(`Unsupported completion provider: '${this.completionProvider}'. Allowed: openai, anthropic, mistral`);\r\n }\r\n if (!allowedCompletionModels.includes(this.completionModel)) {\r\n throw new Error(`Model '${this.completionModel}' is not allowed for completion provider '${this.completionProvider}'. Allowed: ${allowedCompletionModels.join(', ')}`);\r\n }\r\n\r\n // Parse form schema\r\n this.parsedSchema = JSON.parse(this.formJson || '{}');\r\n \r\n // Parse service configuration\r\n this.parsedConfig = JSON.parse(this.serviceConfig || '{}');\r\n \r\n // Add API key to config if provided via prop\r\n if (this.apiKey) {\r\n this.parsedConfig = {\r\n ...this.parsedConfig,\r\n speechToText: { ...this.parsedConfig.speechToText, provider: this.transcriptionProvider, apiKey: this.apiKey, model: this.transcriptionModel },\r\n llm: { ...this.parsedConfig.llm, provider: this.completionProvider, apiKey: this.apiKey, model: this.completionModel }\r\n };\r\n } else {\r\n // Use proxy API if no API key provided\r\n this.parsedConfig = {\r\n ...this.parsedConfig,\r\n speechToText: { ...this.parsedConfig.speechToText, provider: this.transcriptionProvider, useProxy: true, proxyUrl: this.apiProxyUrl, model: this.transcriptionModel },\r\n llm: { ...this.parsedConfig.llm, provider: this.completionProvider, useProxy: true, proxyUrl: this.apiProxyUrl, model: this.completionModel }\r\n };\r\n }\r\n \r\n // Initialize services\r\n this.speechToTextService = SpeechToTextServiceFactory.create(this.parsedConfig);\r\n this.llmService = LLMServiceFactory.create(this.parsedConfig);\r\n \r\n this.updateDebugInfo('Initialized', {\r\n schema: this.parsedSchema,\r\n config: this.parsedConfig\r\n });\r\n \r\n this.hasError = false;\r\n this.statusMessage = this.parsedTheme.texts?.idle || (this.language == 'en' ? 'Select an input method' : 'Sélectionner une méthode de saisie');\r\n if (this.parsedInputTypes.length === 0){\r\n this.inputTypes = 'voice';\r\n }\r\n }\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Initialization error: ${error.message}` : `Erreur d'initialisation: ${error.message}`);\r\n this.updateDebugInfo('Initialization Error', { error: error.message });\r\n }\r\n }\r\n\r\n private updateDebugInfo(action: string, data: any) {\r\n if (this.debug) {\r\n this.debugInfo = {\r\n ...this.debugInfo,\r\n [action]: {\r\n timestamp: new Date().toISOString(),\r\n data\r\n }\r\n };\r\n }\r\n }\r\n\r\n private async handleRecordClick() {\r\n if (this.isProcessing) return;\r\n\r\n if (this.isRecording) {\r\n await this.stopRecordingAndProcess();\r\n } else {\r\n await this.startRecording();\r\n }\r\n }\r\n\r\n private async startRecording() {\r\n try {\r\n this.hasError = false;\r\n this.statusMessage = (this.language == 'en' ? 'Starting recording...' : `Enregistrement ...`);\r\n this.updateDebugInfo('Start Recording Attempt', {});\r\n\r\n await this.audioRecorder.startRecording();\r\n \r\n this.isRecording = true;\r\n this.statusMessage = this.parsedTheme.texts?.recording || (this.language == 'en' ? 'Recording... Click to stop' : 'Enregistrement ... Cliquer pour stopper');\r\n this.updateDebugInfo('Recording Started', {});\r\n \r\n this.recordingStateChanged.emit({ \r\n isRecording: true, \r\n state: 'recording' \r\n });\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Recording failed: ${error.message}` : `Echec de l'enregistrement : ${error.message}`);\r\n this.updateDebugInfo('Recording Error', { error: error.message });\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message\r\n });\r\n }\r\n }\r\n\r\n private async processJsonForm(ocrData: any){\r\n try {\r\n this.isProcessing = true;\r\n this.statusMessage = this.parsedTheme.texts?.processing || (this.language == 'en' ? 'Processing json...' : `Traitement du json ...`);\r\n\r\n // Extract content from OCR format\r\n const extractedData = ocrData?.content || ocrData;\r\n const jsonForm = JSON.stringify(extractedData);\r\n\r\n // Fill form using LLM\r\n this.statusMessage = this.parsedTheme.texts?.filling || (this.language == 'en' ? 'Filling form fields...' : 'Remplissage du formulaire ...');\r\n const trimmedSchema = await this.trimSchemaForAI(this.parsedSchema);\r\n const filledSchema = await this.llmService.fillFormFromJson(jsonForm, trimmedSchema);\r\n \r\n // Extract filled data\r\n this.filledData = this.extractFilledData(filledSchema);\r\n this.updateDebugInfo('Form Filled', { \r\n filledSchema, \r\n extractedData: this.filledData \r\n });\r\n \r\n this.parsedSchema = this.filledData;\r\n\r\n this.statusMessage = this.parsedTheme.texts?.completed || (this.language == 'en' ? 'Form completed!' : 'Formulaire remplis !');\r\n this.hasError = false;\r\n\r\n // Emit success event\r\n this.formFilled.emit({\r\n success: true,\r\n data: this.filledData,\r\n jsonForm: jsonForm\r\n });\r\n\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Processing failed: ${error.message}` : `Erreur de traitement : ${error.message}`);\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message,\r\n jsonForm: JSON.stringify(ocrData)\r\n });\r\n } finally {\r\n this.isProcessing = false;\r\n }\r\n }\r\n\r\n private async processAudioContent(audioFile) {\r\n this.updateDebugInfo('Audio Captured', { \r\n size: audioFile.size, \r\n type: audioFile.type \r\n });\r\n\r\n try {\r\n // Transcribe audio\r\n this.statusMessage = this.parsedTheme.texts?.transcribing || (this.language == 'en' ? 'Transcribing speech...' : 'Transcription du texte ...');\r\n const transcription = await this.speechToTextService.transcribe(audioFile, this.language);\r\n this.transcription = transcription;\r\n this.updateDebugInfo('Transcription Complete', { transcription });\r\n\r\n if (!transcription.trim()) {\r\n throw new Error('No speech detected in the recording');\r\n }\r\n\r\n // Fill form using LLM\r\n this.statusMessage = this.parsedTheme.texts?.filling || (this.language == 'en' ? 'Filling form fields...' : 'Remplissage du formulaire ...');\r\n const trimmedSchema = await this.trimSchemaForAI(this.parsedSchema);\r\n const filledSchema = await this.llmService.fillFormFromTranscription(transcription, trimmedSchema);\r\n \r\n // Extract filled data\r\n this.filledData = this.extractFilledData(filledSchema);\r\n this.updateDebugInfo('Form Filled', { \r\n filledSchema, \r\n extractedData: this.filledData \r\n });\r\n \r\n this.parsedSchema = this.filledData;\r\n\r\n this.statusMessage = this.parsedTheme.texts?.completed || (this.language == 'en' ? 'Form completed!' : 'Formulaire remplis !');\r\n this.hasError = false;\r\n\r\n // Emit success event\r\n this.formFilled.emit({\r\n success: true,\r\n data: this.filledData,\r\n transcription: transcription\r\n });\r\n } catch (error) {\r\n console.error('Transcription error:', error);\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? 'Audio processing failed.' : 'Échec du traitement audio.');\r\n this.updateDebugInfo('Transcription Error', { error: error.message });\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message,\r\n transcription: this.transcription\r\n });\r\n }\r\n }\r\n\r\n private async stopRecordingAndProcess() {\r\n try {\r\n this.isRecording = false;\r\n this.isProcessing = true;\r\n this.statusMessage = this.parsedTheme.texts?.processing || (this.language == 'en' ? 'Processing audio...' : `Traitement de l'audio ...`);\r\n this.updateDebugInfo('Stop Recording', {});\r\n\r\n this.recordingStateChanged.emit({ \r\n isRecording: false, \r\n state: 'processing' \r\n });\r\n\r\n // Stop recording and get audio blob\r\n const audioBlob = await this.audioRecorder.stopRecording();\r\n const audioContent = new File([audioBlob], 'audio.wav', { type: 'audio/wav' });\r\n this.processAudioContent(audioContent);\r\n\r\n } catch (error) {\r\n this.hasError = true;\r\n this.statusMessage = (this.language == 'en' ? `Processing failed: ${error.message}` : `Erreur de traitement : ${error.message}`);\r\n this.updateDebugInfo('Processing Error', { error: error.message });\r\n \r\n this.formFilled.emit({\r\n success: false,\r\n error: error.message,\r\n transcription: this.transcription\r\n });\r\n } finally {\r\n this.isProcessing = false;\r\n this.recordingStateChanged.emit({ \r\n isRecording: false, \r\n state: 'idle' \r\n });\r\n }\r\n }\r\n\r\n private extractFilledData(filledData: any): any {\r\n // console.log(\"extractFilledData\", filledData);\r\n const updatedSchema = JSON.parse(JSON.stringify(this.parsedSchema));\r\n switch(this.context){\r\n case \"ecoteka\":\r\n // console.log(\"TODO extractFilledData\", filledData);\r\n case \"ng\": \r\n if (filledData?.fields) {\r\n // Map AI response back to original schema structure\r\n filledData.fields.forEach((field: any) => {\r\n const originalField = updatedSchema.Children.find((child: any) => \r\n child.System_Name === field.name || child.Settings?.Label === field.name\r\n );\r\n \r\n if (originalField && field.value !== undefined && field.value !== null && field.value !== '') {\r\n if (!originalField.Settings) originalField.Settings = {};\r\n originalField.Settings.Default_Value = field.value;\r\n }\r\n });\r\n }\r\n \r\n break;\r\n case \"ecoll-veto\":\r\n // console.log(\"TODO extractFilledData\", filledData, updatedSchema);\r\n if (filledData?.fields) {\r\n // Map AI response back to original schema structure\r\n filledData.fields.forEach((field: any) => {\r\n let originalField = updatedSchema[0].items.find((child: any) => \r\n child.label === field.name\r\n );\r\n if (!originalField)\r\n originalField = updatedSchema[1].items.find((child: any) =>\r\n child.label === field.name\r\n );\r\n \r\n if (originalField && field.value !== undefined && field.value !== null && field.value !== '') {\r\n updatedSchema[2][originalField.name] = field.value;\r\n }\r\n });\r\n }\r\n break;\r\n case \"track\":\r\n default:\r\n if (filledData?.fields) {\r\n Object.entries(filledData.fields).forEach(([fieldID, field]: [string, any]) => {\r\n if (field.value !== undefined && field.value !== null && field.value !== '') {\r\n if (field.id) {\r\n const schemaField = updatedSchema.fields[field.id];\r\n if (schemaField) {\r\n schemaField.value = field.value;\r\n schemaField.default = field.value;\r\n }\r\n } else {\r\n const fieldName = field.name;\r\n for (const key in updatedSchema.fields) {\r\n const schemaField = updatedSchema.fields[key];\r\n if (schemaField.title === fieldName) {\r\n schemaField.value = field.value;\r\n schemaField.default = field.value;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n break;\r\n }\r\n \r\n // console.log(\"extractFilledData result\", updatedSchema);\r\n return updatedSchema;\r\n }\r\n\r\n private async trimSchemaForAI(schema: any): Promise<any> {\r\n // console.log(\"trimSchemaForAI\", schema);\r\n switch(this.context){\r\n case \"ecoteka\":\r\n // console.log(\"TODO trimSchemaForAI\", schema)\r\n case \"ng\":\r\n const trimmed = { fields: [] };\r\n schema.Children.forEach((child: any) => {\r\n if (!child.System_Name || !child.Type) return;\r\n \r\n const fieldData: any = {\r\n name: child.Label || child.Settings?.Label || child.System_Name,\r\n type: this.mapFieldType(child.Type),\r\n default: child.Settings?.Default_Value\r\n };\r\n \r\n // Add options for classification/select/multiselect fields\r\n const selectTypes = ['InputClassification', 'select', 'multiselect', 'InputMultiSelect']\r\n if (selectTypes.includes(child.Type) && child.Children && child.Children.length > 0) {\r\n fieldData.options = child.Children.map((option: any) => \r\n option.System_Name || option.Label || option.toString()\r\n );\r\n }\r\n \r\n trimmed.fields.push(fieldData);\r\n });\r\n \r\n // console.log(\"Schema apres transformation, contexte NG:\", trimmed);\r\n return trimmed;\r\n case \"ecoll-veto\":\r\n // console.log(\"TODO trimSchemaForAI\", schema)\r\n const mergedItemsSchema = (this.parsedSchema[0].items).concat(this.parsedSchema[1].items);\r\n\r\n if (mergedItemsSchema) {\r\n const trimmedSchema: FormSchema = {\r\n title: 'Form Name',\r\n description: 'Form Description',\r\n schema: {}\r\n };\r\n\r\n Object.entries(mergedItemsSchema).forEach(async ([key, field]: [string, any]) => {\r\n const fieldName = field.name;\r\n const fieldType = this.mapFieldType(field.type) as any;\r\n const fieldLabel = field.label || fieldName;\r\n const isRequired = field.required || false;\r\n const fieldValue = ''; //TODO\r\n\r\n if (['position', 'thesaurus'].includes(fieldType)) {\r\n try {\r\n const response = await fetch(`${this.classificationRootUrl}/ng/api/v1/classification/getList/${fieldType.toLowerCase() == 'position' ? \"Position\" : \"Thesaurus\"}/?StartNodeID=${field.config.options.options.startNode}`);\r\n if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\r\n\r\n const data = await response.json();\r\n if (Array.isArray(data)) {\r\n const options = data.map(item => ({\r\n value: item.ID,\r\n label: item.System_Name\r\n }));\r\n if (options.length > 0) {\r\n field.pickerOptions = options;\r\n // TODO on degage les quotes simples temporairement, a corriger\r\n field.options = options.map(option => option.label.replace(\"'\", \"\"));\r\n }\r\n } else {\r\n console.error(\"Unexpected API response format:\", data);\r\n }\r\n } catch (error) {\r\n console.error(\"Error fetching classification data:\", error);\r\n }\r\n }\r\n \r\n trimmedSchema.schema[fieldName] = {\r\n type: fieldType,\r\n title: fieldLabel,\r\n options: field.options,\r\n readonly: field.readonly === true,\r\n default: '',\r\n };\r\n });\r\n\r\n // console.log(\"Schema apres transformation, contexte Track:\", trimmedSchema);\r\n return trimmedSchema;\r\n }\r\n case \"track\":\r\n default:\r\n if (schema?.schema ?? schema?.fields) {\r\n const trimmedSchema: FormSchema = {\r\n title: schema.title,\r\n description: schema.description,\r\n schema: {}\r\n };\r\n\r\n const finalSchema = schema?.schema ?? schema?.fields;\r\n\r\n Object.entries(finalSchema).forEach(([fieldName, field]: [string, any]) => {\r\n trimmedSchema.schema[fieldName] = {\r\n id: fieldName,\r\n type: field.type,\r\n title: field.title,\r\n options: field.options,\r\n readonly: field.type === 'header' || field.Enabled === false,\r\n default: field.default || field.DefaultValue,\r\n pattern: field.Mask,\r\n min: field.ValidationMin,\r\n max: field.ValidationMax\r\n };\r\n });\r\n\r\n return trimmedSchema;\r\n }\r\n break;\r\n }\r\n \r\n return schema;\r\n }\r\n\r\n private mapFieldType(type: string): string {\r\n const typeMapping = {\r\n 'InputAutocomplete': 'string',\r\n 'InputInteger': 'number',\r\n 'InputTextArea': 'string',\r\n 'InputDateTimePicker': 'datetime',\r\n 'InputDecimal': 'number',\r\n 'InputClassification': 'classification',\r\n 'InputCheckbox': 'boolean',\r\n 'InputTextTranslation': 'string',\r\n 'InputMultiSelect': 'multiselect',\r\n 'thesaurus': 'thesaurus',\r\n 'position': 'position',\r\n 'text': 'string',\r\n 'textarea': 'string',\r\n 'number': 'number',\r\n 'date': 'date',\r\n 'datetime': 'datetime',\r\n 'select': 'select',\r\n 'multiselect': 'multiselect',\r\n 'checkbox': 'checkbox'\r\n };\r\n \r\n return typeMapping[type] || 'string';\r\n }\r\n\r\n // Utility methods exposed as public API\r\n @Method() public async convertXmlToJson(xmlForm: string): Promise<FormSchemaFieldsOnly> {\r\n return SchemaConverter.convertXmlToJson(xmlForm, this.classificationRootUrl, this.language);\r\n }\r\n\r\n @Method() public async convertJsonToXml(jsonForm: FormSchemaFieldsOnlyExtended): Promise<string> {\r\n return SchemaConverter.convertJsonToXml(jsonForm);\r\n }\r\n\r\n // Utility methods exposed as public API\r\n @Method() public async convertXmlToJsonLegacy(xmlForm: string): Promise<FormSchema> {\r\n return SchemaConverter.convertXmlToJsonLegacy(xmlForm);\r\n }\r\n\r\n @Method() public async convertJsonToXmlLegacy(jsonForm: FormSchema): Promise<string> {\r\n return SchemaConverter.convertJsonToXmlLegacy(jsonForm);\r\n }\r\n\r\n private renderUploadButton() {\r\n if (!this.parsedInputTypes.includes('ocr'))\r\n return;\r\n const ocrStyle = this.parsedTheme.buttons?.ocr || {};\r\n const size = ocrStyle.size || '50px';\r\n \r\n // Prepare OCR theme to pass to ocr-file-uploader component\r\n const ocrTheme = {\r\n button: {\r\n size: size,\r\n backgroundColor: ocrStyle.backgroundColor || '#10b981',\r\n hoverColor: ocrStyle.hoverColor || '#059669',\r\n textColor: ocrStyle.textColor || '#ffffff'\r\n }\r\n };\r\n \r\n const isDisabled = this.isProcessing || this.hasError;\r\n \r\n return(\r\n <div style={{ width: size, height: size, flexShrink: '0', opacity: isDisabled ? '0.6' : '1', pointerEvents: isDisabled ? 'none' : 'auto' }}>\r\n <ocr-file-uploader\r\n batch={false}\r\n json-schema={this.convertSchemaToOcrFormat(this.parsedSchema)}\r\n callback={(data) => {this.processJsonForm(data);}}\r\n theme={JSON.stringify(ocrTheme)}\r\n style={{ width: '100%', height: '100%' }}\r\n >\r\n </ocr-file-uploader>\r\n </div>\r\n );\r\n }\r\n\r\n private convertSchemaToOcrFormat(schema: any): string {\r\n const ocrSchema = {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {\r\n meta: {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {\r\n page: { type: \"integer\" },\r\n confiance_global: { type: \"number\" }\r\n },\r\n required: [\"page\", \"confiance_global\"]\r\n },\r\n content: {\r\n type: \"object\",\r\n additionalProperties: false,\r\n properties: {},\r\n required: []\r\n }\r\n },\r\n required: [\"meta\", \"content\"]\r\n };\r\n\r\n if (schema?.Children) {\r\n schema.Children.forEach((child: any) => {\r\n if (child.System_Name && child.Type) {\r\n const fieldLabel = child.Settings?.Label || child.System_Name;\r\n const fieldType = this.mapOcrFieldType(child.Type);\r\n ocrSchema.properties.content.properties[fieldLabel] = {\r\n anyOf: [{ type: fieldType }, { type: \"null\" }]\r\n };\r\n }\r\n });\r\n }\r\n\r\n return JSON.stringify(ocrSchema);\r\n }\r\n\r\n private mapOcrFieldType(type: string): string {\r\n const typeMapping = {\r\n 'InputInteger': 'number',\r\n 'InputDecimal': 'number',\r\n 'InputDateTimePicker': 'string',\r\n 'InputCheckbox': 'boolean'\r\n };\r\n return typeMapping[type] || 'string';\r\n }\r\n\r\n private fileInputAudioRecord!: HTMLInputElement;\r\n\r\n private triggerAudioRecordUpload = () => {\r\n this.fileInputAudioRecord.click();\r\n };\r\n\r\n private handleAudioRecordChange = async (event: Event) => {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files || input.files.length === 0) return;\r\n\r\n const file = input.files[0];\r\n\r\n this.processAudioContent(file);\r\n };\r\n\r\n private renderUploadRecordButton() {\r\n if (!this.parsedInputTypes.includes('audio'))\r\n return;\r\n \r\n const audioStyle = this.parsedTheme.buttons?.audio || {};\r\n const size = audioStyle.size || '50px';\r\n const isDisabled = this.isProcessing || this.hasError;\r\n const buttonStyle = {\r\n stroke: audioStyle.backgroundColor || '#3b82f6',\r\n fill: audioStyle.backgroundColor || '#3b82f6',\r\n width: size,\r\n height: size,\r\n opacity: isDisabled ? '0.6' : '1'\r\n };\r\n \r\n return (\r\n <div class=\"upload-record-container\" onClick={isDisabled ? null : this.triggerAudioRecordUpload} style={{ width: size, height: size, cursor: isDisabled ? 'not-allowed' : 'pointer' }}>\r\n <input\r\n type=\"file\"\r\n ref={el => (this.fileInputAudioRecord = el!)}\r\n onChange={this.handleAudioRecordChange}\r\n style={{ display: 'none' }}\r\n />\r\n <div class='upload-record-button'>\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style={buttonStyle}>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C12.6345 21.25 13.2534 21.1862 13.8508 21.065C14.2567 20.9826 14.6526 21.2448 14.735 21.6508C14.8174 22.0567 14.5551 22.4526 14.1492 22.535C13.4541 22.6761 12.7353 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 12.7353 22.6761 13.4541 22.535 14.1492C22.4526 14.5551 22.0567 14.8174 21.6508 14.735C21.2448 14.6526 20.9826 14.2567 21.065 13.8508C21.1862 13.2534 21.25 12.6345 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM12.7676 8.52584C12.7661 8.53409 12.7604 8.56729 12.7564 8.64336C12.7502 8.76101 12.75 8.91982 12.75 9.17082C12.75 9.27795 12.7501 9.33904 12.7518 9.38529C12.7528 9.41425 12.7542 9.42649 12.7546 9.42955C12.7662 9.48945 12.7993 9.54303 12.8477 9.58021C12.8502 9.58194 12.8606 9.58864 12.886 9.60252C12.9266 9.62468 12.9812 9.65209 13.0771 9.7L14.3938 10.3584C14.6183 10.4706 14.7604 10.5414 14.8684 10.5885C14.9382 10.6189 14.9705 10.6287 14.9785 10.631C15.0885 10.6405 15.1917 10.5767 15.2324 10.4742C15.2339 10.4659 15.2396 10.4327 15.2436 10.3566C15.2498 10.239 15.25 10.0802 15.25 9.82918C15.25 9.72205 15.2499 9.66096 15.2482 9.61471C15.2472 9.58575 15.2458 9.57351 15.2454 9.57045C15.2338 9.51055 15.2007 9.45697 15.1523 9.41979C15.1498 9.41805 15.1394 9.41136 15.114 9.39748C15.0734 9.37533 15.0188 9.34791 14.9229 9.3L13.6062 8.64164C13.3817 8.52939 13.2396 8.45859 13.1316 8.41151C13.0617 8.38107 13.0295 8.37131 13.0215 8.36896C12.9115 8.35945 12.8083 8.42327 12.7676 8.52584ZM12.75 11.2135L13.7396 11.7083C13.9425 11.8098 14.1204 11.8987 14.269 11.9635C14.4199 12.0293 14.5988 12.097 14.7972 12.1202C15.6037 12.2142 16.3689 11.7413 16.6454 10.978C16.7134 10.7901 16.7328 10.5998 16.7415 10.4355C16.75 10.2735 16.75 10.0747 16.75 9.8479V9.82918C16.75 9.81565 16.75 9.80205 16.75 9.78837C16.7503 9.62647 16.7505 9.45474 16.7188 9.28904C16.638 8.86674 16.4045 8.48898 16.0629 8.22783C15.9289 8.12535 15.7752 8.04877 15.6303 7.97658C15.618 7.97048 15.6059 7.96441 15.5938 7.95836L14.2603 7.29164C14.0575 7.19022 13.8796 7.10128 13.731 7.03647C13.5801 6.97071 13.4012 6.90297 13.2028 6.87982C12.3963 6.78575 11.6311 7.25868 11.3546 8.02203C11.2866 8.20986 11.2672 8.40019 11.2585 8.56454C11.2519 8.68919 11.2504 8.83571 11.2501 9L11.25 9.11944C11.25 9.13026 11.25 9.14115 11.25 9.1521V9.17082C11.25 9.18435 11.25 9.19795 11.25 9.21163C11.2499 9.23918 11.2499 9.26701 11.25 9.29505V12.5499C10.875 12.3581 10.4501 12.25 10 12.25C8.48122 12.25 7.25 13.4812 7.25 15C7.25 16.5188 8.48122 17.75 10 17.75C11.5188 17.75 12.75 16.5188 12.75 15V11.2135ZM11.25 15C11.25 14.3096 10.6904 13.75 10 13.75C9.30964 13.75 8.75 14.3096 8.75 15C8.75 15.6904 9.30964 16.25 10 16.25C10.6904 16.25 11.25 15.6904 11.25 15ZM17.4697 14.4697C17.7626 14.1768 18.2374 14.1768 18.5303 14.4697L21.0303 16.9697C21.3232 17.2626 21.3232 17.7374 21.0303 18.0303C20.7374 18.3232 20.2626 18.3232 19.9697 18.0303L18.75 16.8107V22C18.75 22.4142 18.4142 22.75 18 22.75C17.5858 22.75 17.25 22.4142 17.25 22V16.8107L16.0303 18.0303C15.7374 18.3232 15.2626 18.3232 14.9697 18.0303C14.6768 17.7374 14.6768 17.2626 14.9697 16.9697L17.4697 14.4697Z\" />\r\n </svg>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n private renderRecordButton() {\r\n if (!this.parsedInputTypes.includes('voice'))\r\n return;\r\n\r\n const buttonClass = [\r\n 'record-button',\r\n this.isRecording && 'recording',\r\n this.isProcessing && 'processing'\r\n ].filter(Boolean).join(' ');\r\n\r\n const isDisabled = this.isProcessing || this.hasError;\r\n \r\n const voiceStyle = this.parsedTheme.buttons?.voice || {};\r\n const size = voiceStyle.size || '50px';\r\n const buttonStyle = {\r\n background: voiceStyle.backgroundColor || '#ee4444',\r\n width: size,\r\n height: size\r\n };\r\n\r\n return (\r\n <button \r\n class={buttonClass}\r\n style={buttonStyle}\r\n onClick={() => this.handleRecordClick()}\r\n disabled={isDisabled}\r\n aria-label={this.isRecording ? 'Stop recording' : 'Start recording'}\r\n >\r\n {this.isProcessing ? (\r\n <svg class=\"record-icon\" viewBox=\"0 0 24 24\">\r\n <circle cx=\"12\" cy=\"12\" r=\"3\">\r\n <animate attributeName=\"r\" values=\"3;6;3\" dur=\"1s\" repeatCount=\"indefinite\" />\r\n <animate attributeName=\"opacity\" values=\"1;0.3;1\" dur=\"1s\" repeatCount=\"indefinite\" />\r\n </circle>\r\n </svg>\r\n ) : this.isRecording ? (\r\n <svg class=\"record-icon\" viewBox=\"0 0 24 24\">\r\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" />\r\n </svg>\r\n ) : (\r\n <svg class=\"record-icon\" viewBox=\"0 0 24 24\">\r\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\r\n </svg>\r\n )}\r\n </button>\r\n );\r\n }\r\n\r\n private renderStatusMessage() {\r\n const statusClass = [\r\n 'status-text',\r\n this.hasError && 'error',\r\n this.filledData && !this.hasError && 'success'\r\n ].filter(Boolean).join(' ');\r\n\r\n return <div class={statusClass}>{this.statusMessage}</div>;\r\n }\r\n\r\n private renderFormPreview() {\r\n if (!this.parsedSchema) return null;\r\n\r\n const isPreview = this.isReadonlyMode && !this.filledData;\r\n const title = isPreview ? 'Form Preview (Voice input to fill)' : 'Voice-Filled Form:';\r\n \r\n return (\r\n <div class=\"form-preview\">\r\n <div class=\"form-preview-title\">{title}</div>\r\n <form class=\"voice-filled-form\">\r\n {this.renderFormFields()}\r\n </form>\r\n </div>\r\n );\r\n }\r\n\r\n private renderFormFields() {\r\n // console.log(\"renderFormFields\", this.parsedSchema);\r\n if (!this.parsedSchema) return null;\r\n \r\n const largeFieldTypes = ['select', 'multiselect', 'classification', 'thesaurus', 'position'];\r\n \r\n switch(this.context){\r\n case \"ecoteka\":\r\n // console.log(\"TODO renderFormFields\", this.parsedSchema);\r\n case \"ng\":\r\n return this.parsedSchema.Children.map((child: any) => {\r\n if (!child.System_Name || !child.Type) return null;\r\n \r\n const fieldName = child.System_Name;\r\n const fieldType = this.mapFieldType(child.Type);\r\n const fieldLabel = child.Settings?.Label || child.System_Name;\r\n const isRequired = child.Required || false;\r\n const fieldValue = child.Settings?.Default_Value;\r\n const isLargeField = largeFieldTypes.includes(fieldType) || (child.Children && child.Children.length > 5);\r\n \r\n return (\r\n <div class={isLargeField ? \"form-group full-width\" : \"form-group\"} key={fieldName}>\r\n <label htmlFor={fieldName} class=\"form-label\">\r\n {fieldLabel}\r\n {isRequired && <span class=\"required\">*</span>}\r\n </label>\r\n {this.renderFormField(fieldName, {\r\n type: fieldType,\r\n title: fieldLabel,\r\n required: isRequired,\r\n options: child.Children?.map((option: any) => \r\n option.System_Name || option.Label || option.toString()\r\n )\r\n }, fieldValue)}\r\n </div>\r\n );\r\n }).filter(Boolean);\r\n case \"ecoll-veto\":\r\n // NOTE STEP 2\r\n // console.log(\"TODO renderFormFields\", this.parsedSchema);\r\n const mergedItemsSchema = (this.parsedSchema[0].items).concat(this.parsedSchema[1].items);\r\n return Object.entries(mergedItemsSchema).map(([key, field]: [string, any]) => {\r\n \r\n const fieldName = field.name;\r\n field.type = this.mapFieldType(field.type);\r\n const fieldLabel = field.label || fieldName;\r\n const isRequired = field.required || false;\r\n const fieldValue = this.parsedSchema[2][fieldName];\r\n\r\n // if (['position', 'thesaurus'].includes(field.type)) {\r\n // try {\r\n // const response = await fetch(`${this.classificationRootUrl}/ng/api/v1/classification/getList/${fieldType.toLowerCase() == 'position' ? \"Position\" : \"Thesaurus\"}/?StartNodeID=${field.config.options.options.startNode}`);\r\n // if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);\r\n\r\n // const data = await response.json();\r\n // if (Array.isArray(data)) {\r\n // const options = data.map(item => ({\r\n // value: item.ID,\r\n // label: item.System_Name\r\n // }));\r\n // if (options.length > 0) {\r\n // field.pickerOptions = options;\r\n // // TODO on degage les quotes simples temporairement, a corriger\r\n // field.options = options.map(option => option.label.replace(\"'\", \"\"));\r\n // }\r\n // } else {\r\n // console.error(\"Unexpected API response format:\", data);\r\n // }\r\n // } catch (error) {\r\n // console.error(\"Error fetching classification data:\", error);\r\n // }\r\n // }\r\n\r\n return (\r\n <div class=\"form-group\" key={fieldName}>\r\n <label htmlFor={fieldName} class=\"form-label\">\r\n { fieldLabel }\r\n {isRequired && <span class=\"required\">*</span>}\r\n </label>\r\n {this.renderFormField(fieldName, field, (this.filledData?.[fieldName] ?? fieldValue))}\r\n </div>\r\n );\r\n });\r\n case \"track\":\r\n default:\r\n return Object.entries(this.parsedSchema.fields).map(([fieldName, field]: [string, any]) => {\r\n if (field.type === 'header') {\r\n return (\r\n <div class=\"form-header\" key={fieldName}>\r\n {field.title || fieldName}\r\n </div>\r\n );\r\n }\r\n \r\n return (\r\n <div class=\"form-group\" key={fieldName}>\r\n <label htmlFor={fieldName} class=\"form-label\">\r\n {field.title || fieldName}\r\n {field.required && <span class=\"required\">*</span>}\r\n </label>\r\n {this.renderFormField(fieldName, field, (this.filledData?.[fieldName] ?? field.value))}\r\n </div>\r\n );\r\n });\r\n }\r\n }\r\n\r\n private renderFormField(fieldName: string, field: any, value: any) {\r\n const isReadonly = this.isReadonlyMode && !this.filledData;\r\n const commonProps = {\r\n id: fieldName,\r\n name: fieldName,\r\n class: 'form-input',\r\n required: field.required,\r\n disabled: isReadonly\r\n };\r\n\r\n switch (field.type) {\r\n case 'multiselect':\r\n if (isReadonly) {\r\n return (\r\n <div class=\"readonly-select\">\r\n <div class=\"select-placeholder\">Available options:</div>\r\n <ul class=\"select-options-list\">\r\n {field.options?.map(option => (\r\n <li class=\"select-option\">{option}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n const selectedValues = Array.isArray(value) ? value : (value ? [value] : []);\r\n return (\r\n <div class=\"multiselect-container\">\r\n {field.options?.map(option => {\r\n const isChecked = selectedValues.some(v => \r\n v?.toString().toLowerCase() === option?.toString().toLowerCase()\r\n );\r\n return (\r\n <label class=\"multiselect-option\">\r\n <input \r\n type=\"checkbox\" \r\n name={fieldName}\r\n value={option}\r\n checked={isChecked}\r\n disabled={isReadonly}\r\n />\r\n <span class=\"multiselect-label\">{option}</span>\r\n </label>\r\n );\r\n })}\r\n </div>\r\n );\r\n \r\n case 'select':\r\n if (isReadonly) {\r\n // In readonly mode, show all options as a list instead of dropdown\r\n return (\r\n <div class=\"readonly-select\">\r\n <div class=\"select-placeholder\">Available options:</div>\r\n <ul class=\"select-options-list\">\r\n {field.options?.map(option => (\r\n <li class=\"select-option\">{option}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n }\r\n return (\r\n <select id={fieldName} name={fieldName} class=\"form-input\" required={field.required}>\r\n <option value=\"\">-- Select --</option>\r\n {field.options?.map(option => (\r\n <option value={option} selected={value === option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n );\r\n \r\n case 'boolean':\r\n return (\r\n <input \r\n {...commonProps}\r\n type=\"checkbox\" \r\n class=\"form-checkbox\"\r\n checked={value === true || value === 'true'}\r\n />\r\n );\r\n \r\n case 'number':\r\n return (\r\n <input \r\n {...commonProps}\r\n type=\"number\" \r\n min={field.min}\r\n max={field.max}\r\n step=\"any\"\r\n value={value || ''}\r\n />\r\n );\r\n \r\n case 'date':\r\n return (\r\n <input \r\n {...commonProps}\r\n type='date'\r\n value={value ? (([d, m, y]) => `${y}-${m}-${d}`)(value.split(\"/\")) : ''}\r\n />\r\n );\r\n\r\n case 'datetime':\r\n return (\r\n <input \r\n {...commonProps}\r\n type='datetime-local'\r\n value={value || ''}\r\n />\r\n );\r\n \r\n default: // string\r\n return (\r\n <input \r\n {...commonProps}\r\n type=\"text\" \r\n pattern={field.pattern}\r\n placeholder={field.description}\r\n value={value || ''}\r\n />\r\n );\r\n }\r\n }\r\n\r\n private renderDebugPanel() {\r\n if (!this.debug) return null;\r\n\r\n return (\r\n <div class=\"debug-panel\">\r\n <div class=\"debug-title\">Debug Information:</div>\r\n <div class=\"debug-content\">\r\n {JSON.stringify(this.debugInfo, null, 2)}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private getDefaultTheme() {\r\n return {\r\n texts: {\r\n idle: this.language === 'en' ? 'Select an input method' : 'Sélectionner une méthode de saisie',\r\n recording: this.language === 'en' ? 'Recording... Click to stop' : 'Enregistrement ... Cliquer pour stopper',\r\n processing: this.language === 'en' ? 'Processing...' : 'Traitement en cours...',\r\n transcribing: this.language === 'en' ? 'Transcribing speech...' : 'Transcription du texte...',\r\n filling: this.language === 'en' ? 'Filling form fields...' : 'Remplissage du formulaire...',\r\n completed: this.language === 'en' ? 'Form completed!' : 'Formulaire rempli !'\r\n },\r\n container: {\r\n width: 'auto',\r\n height: 'auto',\r\n backgroundColor: '#ffffff',\r\n borderColor: '#e2e8f0',\r\n borderRadius: '8px',\r\n padding: '20px',\r\n gap: '8px'\r\n },\r\n buttons: {\r\n voice: { backgroundColor: '#ee4444', textColor: '#ffffff', hoverColor: '#dd3333', size: '50px' },\r\n audio: { backgroundColor: '#3b82f6', textColor: '#ffffff', hoverColor: '#2563eb', size: '50px' },\r\n ocr: { backgroundColor: '#10b981', textColor: '#ffffff', hoverColor: '#059669', size: '50px' }\r\n },\r\n statusText: { color: '#1e293b', fontSize: '14px' }\r\n };\r\n }\r\n\r\n private getContainerStyle() {\r\n const c = this.parsedTheme.container || {};\r\n return {\r\n width: c.width || 'auto',\r\n height: c.height || 'auto',\r\n backgroundColor: c.backgroundColor || '#ffffff',\r\n border: `1px solid ${c.borderColor || '#e2e8f0'}`,\r\n borderRadius: c.borderRadius || '8px',\r\n padding: c.padding || '20px',\r\n gap: c.gap || '8px'\r\n };\r\n }\r\n\r\n private getStatusStyle() {\r\n const s = this.parsedTheme.statusText || {};\r\n return {\r\n color: s.color || '#1e293b',\r\n fontSize: s.fontSize || '14px'\r\n };\r\n }\r\n\r\n render() {\r\n const containerStyle = this.getContainerStyle();\r\n const statusStyle = this.getStatusStyle();\r\n \r\n return (\r\n <div>\r\n <div \r\n class={\"voice-recorder-container\" + (this.debug || this.renderForm ? \"-debug\" : \"\")}\r\n style={containerStyle}\r\n >\r\n <div class=\"row-audio-area\">\r\n {this.renderRecordButton()}\r\n {this.renderUploadRecordButton()}\r\n {this.renderUploadButton()}\r\n </div>\r\n {this.displayStatus ? <div class=\"status-text\" style={statusStyle}>{this.statusMessage}</div> : \"\"}\r\n {this.renderForm ? this.renderFormPreview() : \"\"}\r\n {this.debug ? this.renderDebugPanel() : \"\"}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|