@seniorsistemas/angular-components 19.9.4 → 19.9.5
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/autocomplete/README.md +4 -0
- package/autocomplete/lib/autocomplete/autocomplete.component.d.ts +7 -1
- package/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +3 -1
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +10 -4
- package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +5 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +2 -2
- package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
- package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +21 -3
- package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +14 -3
- package/esm2022/insights/lib/insights/insights.component.mjs +15 -4
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
- package/esm2022/rating-scale/lib/rating-scale/models/rating-scale-node.mjs +1 -1
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +23 -3
- package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +5 -3
- package/esm2022/select/lib/select/select.component.mjs +6 -4
- package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +7 -3
- package/esm2022/split-button/lib/split-button/split-button.component.mjs +11 -3
- package/esm2022/table/lib/table/table-column/table-columns.component.mjs +1 -1
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +1 -1
- package/esm2022/token-list/lib/token-list/token-list.component.mjs +7 -3
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +13 -5
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-insights.mjs +47 -7
- package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +22 -2
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +9 -5
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +6 -2
- package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs +10 -2
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs +6 -2
- package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
- package/insights/README.md +12 -0
- package/insights/lib/insights/components/insights-card/insights-card.component.d.ts +22 -1
- package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +9 -1
- package/insights/lib/insights/insights.component.d.ts +9 -1
- package/package.json +7 -7
- package/rating-scale/README.md +38 -13
- package/rating-scale/lib/rating-scale/models/rating-scale-node.d.ts +8 -0
- package/rating-scale/lib/rating-scale/rating-scale.component.d.ts +4 -1
- package/select/README.md +2 -0
- package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
- package/select/lib/select/select.component.d.ts +3 -1
- package/speech-recognition/README.md +1 -0
- package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +3 -1
- package/split-button/README.md +2 -0
- package/split-button/lib/split-button/split-button.component.d.ts +5 -1
- package/token-list/lib/token-list/token-list.component.d.ts +3 -1
|
@@ -264,6 +264,8 @@ class SpeechRecognitionComponent {
|
|
|
264
264
|
keepContext = false;
|
|
265
265
|
/** @description Placeholder exibido no textarea durante o reconhecimento de voz. @default '' */
|
|
266
266
|
speechRecognitionPlaceholder = '';
|
|
267
|
+
/** @description Classe do ícone do botão de mais opções. @default 'far fa-ellipsis-h' */
|
|
268
|
+
moreOptionsIconClass = 'far fa-ellipsis-h';
|
|
267
269
|
_recognizedText = '';
|
|
268
270
|
originalTextAreaElementText = '';
|
|
269
271
|
isDoneTextToSpeech = false;
|
|
@@ -447,7 +449,7 @@ class SpeechRecognitionComponent {
|
|
|
447
449
|
return this.textAreaElement.value;
|
|
448
450
|
}
|
|
449
451
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpeechRecognitionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
450
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpeechRecognitionComponent, isStandalone: true, selector: "s-speech-recognition", inputs: { textAreaElement: { classPropertyName: "textAreaElement", publicName: "textAreaElement", isSignal: false, isRequired: true, transformFunction: null }, keepContext: { classPropertyName: "keepContext", publicName: "keepContext", isSignal: false, isRequired: false, transformFunction: null }, speechRecognitionPlaceholder: { classPropertyName: "speechRecognitionPlaceholder", publicName: "speechRecognitionPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, disabledSpeechRecognition: { classPropertyName: "disabledSpeechRecognition", publicName: "disabledSpeechRecognition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { recognizedText: "recognizedText" }, ngImport: i0, template: "@if(hasSpeechRecognitionBrowserApi) {\n <section class=\"speech-recognition\">\n <div class=\"speech-recognition-text\">\n @if(canRenderMicrophone) {\n {{ 'platform.angular_components.text_area_before_speech' | translate }}\n }\n\n @if(isListeningUserVoice) {\n {{ 'platform.angular_components.text_area_while_speech' | translate }}\n }\n\n @if(canRenderAprove && canRenderDiscard) {\n {{ 'platform.angular_components.text_area_end_speech' | translate }}\n }\n </div>\n <div class=\"speech-recognition-buttons\">\n @if(canRenderListeningText) {\n <span\n (click)=\"stopListening()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"disabledSpeechRecognition()\">\n <i class=\"
|
|
452
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SpeechRecognitionComponent, isStandalone: true, selector: "s-speech-recognition", inputs: { textAreaElement: { classPropertyName: "textAreaElement", publicName: "textAreaElement", isSignal: false, isRequired: true, transformFunction: null }, keepContext: { classPropertyName: "keepContext", publicName: "keepContext", isSignal: false, isRequired: false, transformFunction: null }, speechRecognitionPlaceholder: { classPropertyName: "speechRecognitionPlaceholder", publicName: "speechRecognitionPlaceholder", isSignal: false, isRequired: false, transformFunction: null }, moreOptionsIconClass: { classPropertyName: "moreOptionsIconClass", publicName: "moreOptionsIconClass", isSignal: false, isRequired: false, transformFunction: null }, disabledSpeechRecognition: { classPropertyName: "disabledSpeechRecognition", publicName: "disabledSpeechRecognition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { recognizedText: "recognizedText" }, ngImport: i0, template: "@if(hasSpeechRecognitionBrowserApi) {\n <section class=\"speech-recognition\">\n <div class=\"speech-recognition-text\">\n @if(canRenderMicrophone) {\n {{ 'platform.angular_components.text_area_before_speech' | translate }}\n }\n\n @if(isListeningUserVoice) {\n {{ 'platform.angular_components.text_area_while_speech' | translate }}\n }\n\n @if(canRenderAprove && canRenderDiscard) {\n {{ 'platform.angular_components.text_area_end_speech' | translate }}\n }\n </div>\n <div class=\"speech-recognition-buttons\">\n @if(canRenderListeningText) {\n <span\n (click)=\"stopListening()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"disabledSpeechRecognition()\">\n <i [class]=\"moreOptionsIconClass\"></i>\n </span>\n }\n\n @if(canRenderMicrophone) {\n <span\n (click)=\"onListen()\"\n class=\"speech-recognition-item speech-recognition-item-microphone\"\n [class.speech-recognition-item-disabled]=\"isDisabledMicrophone || isListening || disabled || disabledSpeechRecognition()\">\n <i class=\"fas fa-microphone\"></i>\n </span>\n }\n\n\n @if(canRenderAprove) {\n <span\n (click)=\"onAprove()\"\n class=\"speech-recognition-item speech-recognition-item-aprove\">\n <i class=\"fas fa-check\"></i>\n </span>\n }\n\n @if(canRenderDiscard) {\n <span\n (click)=\"onDiscard()\"\n class=\"speech-recognition-item speech-recognition-item-discard\">\n <i class=\"fas fa-times\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeech) {\n <span\n (click)=\"onOpenToolbar()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"isDisabledTextToSpeech\">\n <i class=\"fas fa-volume-down\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeechToolbar) {\n <span\n class=\"speech-recognition-item-toolbar\">\n <i class=\"fas\" [class.fa-pause]=\"isPlayingTextToSpeech\" [class.fa-play]=\"!isPlayingTextToSpeech\"\n (click)=\"toggleTextToSpeech()\"></i>\n <i class=\"fas fa-backward\" (click)=\"restartTextToSpeech()\"></i>\n <span (click)=\"updateVoiceSpeed()\">\n {{ voiceSpeed }}x\n </span>\n <i class=\"fas fa-times\" (click)=\"onCloseToolbar()\"></i>\n </span>\n }\n </div>\n </section>\n}\n", styles: [".speech-recognition{display:flex;gap:10px;justify-content:space-between;width:100%}.speech-recognition-buttons{display:flex;gap:10px;position:relative;bottom:15px;margin-right:16px}.speech-recognition-item{display:inline-flex;height:25px;padding:4px 12px;justify-content:center;align-items:center;gap:8px;border-radius:15px;cursor:pointer;transition:background .1s ease-in}.speech-recognition-item i,.speech-recognition-item span{color:#fff}.speech-recognition-item-disabled{cursor:default!important}.speech-recognition-item-disabled *{opacity:.5}.speech-recognition-item-microphone{background:#428bca}.speech-recognition-item-microphone:not(.speech-recognition-item-disabled):hover{background:#063951}.speech-recognition-item-regular{background:#7892a1}.speech-recognition-item-regular:not(.speech-recognition-item-disabled):hover{background:#697882}.speech-recognition-item-aprove{background:#0c9348}.speech-recognition-item-aprove:not(.speech-recognition-item-disabled):hover{background:#063951}.speech-recognition-item-discard{background:#c13018}.speech-recognition-item-discard:not(.speech-recognition-item-disabled):hover{background:#063951}.speech-recognition-item-toolbar{background:#7892a1;display:flex;border-radius:15px;align-items:center;color:#fff;height:25px}.speech-recognition-item-toolbar i,.speech-recognition-item-toolbar span{cursor:pointer}.speech-recognition-item-toolbar i:not(:first-child),.speech-recognition-item-toolbar i:not(:last-child){padding:6px}.speech-recognition-item-toolbar i:first-child{padding-left:10px}.speech-recognition-item-toolbar i:last-child{padding-right:10px}.speech-recognition-text{color:#212533;font-size:12px;font-style:normal;font-weight:400;word-break:break-word}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
451
453
|
}
|
|
452
454
|
__decorate([
|
|
453
455
|
SkipIf('disabledSpeechRecognition', 'isDisabledMicrophone', 'isListening')
|
|
@@ -478,7 +480,7 @@ __decorate([
|
|
|
478
480
|
], SpeechRecognitionComponent.prototype, "stopListening", null);
|
|
479
481
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SpeechRecognitionComponent, decorators: [{
|
|
480
482
|
type: Component,
|
|
481
|
-
args: [{ selector: 's-speech-recognition', standalone: true, imports: [TranslatePipe], template: "@if(hasSpeechRecognitionBrowserApi) {\n <section class=\"speech-recognition\">\n <div class=\"speech-recognition-text\">\n @if(canRenderMicrophone) {\n {{ 'platform.angular_components.text_area_before_speech' | translate }}\n }\n\n @if(isListeningUserVoice) {\n {{ 'platform.angular_components.text_area_while_speech' | translate }}\n }\n\n @if(canRenderAprove && canRenderDiscard) {\n {{ 'platform.angular_components.text_area_end_speech' | translate }}\n }\n </div>\n <div class=\"speech-recognition-buttons\">\n @if(canRenderListeningText) {\n <span\n (click)=\"stopListening()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"disabledSpeechRecognition()\">\n <i class=\"
|
|
483
|
+
args: [{ selector: 's-speech-recognition', standalone: true, imports: [TranslatePipe], template: "@if(hasSpeechRecognitionBrowserApi) {\n <section class=\"speech-recognition\">\n <div class=\"speech-recognition-text\">\n @if(canRenderMicrophone) {\n {{ 'platform.angular_components.text_area_before_speech' | translate }}\n }\n\n @if(isListeningUserVoice) {\n {{ 'platform.angular_components.text_area_while_speech' | translate }}\n }\n\n @if(canRenderAprove && canRenderDiscard) {\n {{ 'platform.angular_components.text_area_end_speech' | translate }}\n }\n </div>\n <div class=\"speech-recognition-buttons\">\n @if(canRenderListeningText) {\n <span\n (click)=\"stopListening()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"disabledSpeechRecognition()\">\n <i [class]=\"moreOptionsIconClass\"></i>\n </span>\n }\n\n @if(canRenderMicrophone) {\n <span\n (click)=\"onListen()\"\n class=\"speech-recognition-item speech-recognition-item-microphone\"\n [class.speech-recognition-item-disabled]=\"isDisabledMicrophone || isListening || disabled || disabledSpeechRecognition()\">\n <i class=\"fas fa-microphone\"></i>\n </span>\n }\n\n\n @if(canRenderAprove) {\n <span\n (click)=\"onAprove()\"\n class=\"speech-recognition-item speech-recognition-item-aprove\">\n <i class=\"fas fa-check\"></i>\n </span>\n }\n\n @if(canRenderDiscard) {\n <span\n (click)=\"onDiscard()\"\n class=\"speech-recognition-item speech-recognition-item-discard\">\n <i class=\"fas fa-times\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeech) {\n <span\n (click)=\"onOpenToolbar()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"isDisabledTextToSpeech\">\n <i class=\"fas fa-volume-down\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeechToolbar) {\n <span\n class=\"speech-recognition-item-toolbar\">\n <i class=\"fas\" [class.fa-pause]=\"isPlayingTextToSpeech\" [class.fa-play]=\"!isPlayingTextToSpeech\"\n (click)=\"toggleTextToSpeech()\"></i>\n <i class=\"fas fa-backward\" (click)=\"restartTextToSpeech()\"></i>\n <span (click)=\"updateVoiceSpeed()\">\n {{ voiceSpeed }}x\n </span>\n <i class=\"fas fa-times\" (click)=\"onCloseToolbar()\"></i>\n </span>\n }\n </div>\n </section>\n}\n", styles: [".speech-recognition{display:flex;gap:10px;justify-content:space-between;width:100%}.speech-recognition-buttons{display:flex;gap:10px;position:relative;bottom:15px;margin-right:16px}.speech-recognition-item{display:inline-flex;height:25px;padding:4px 12px;justify-content:center;align-items:center;gap:8px;border-radius:15px;cursor:pointer;transition:background .1s ease-in}.speech-recognition-item i,.speech-recognition-item span{color:#fff}.speech-recognition-item-disabled{cursor:default!important}.speech-recognition-item-disabled *{opacity:.5}.speech-recognition-item-microphone{background:#428bca}.speech-recognition-item-microphone:not(.speech-recognition-item-disabled):hover{background:#063951}.speech-recognition-item-regular{background:#7892a1}.speech-recognition-item-regular:not(.speech-recognition-item-disabled):hover{background:#697882}.speech-recognition-item-aprove{background:#0c9348}.speech-recognition-item-aprove:not(.speech-recognition-item-disabled):hover{background:#063951}.speech-recognition-item-discard{background:#c13018}.speech-recognition-item-discard:not(.speech-recognition-item-disabled):hover{background:#063951}.speech-recognition-item-toolbar{background:#7892a1;display:flex;border-radius:15px;align-items:center;color:#fff;height:25px}.speech-recognition-item-toolbar i,.speech-recognition-item-toolbar span{cursor:pointer}.speech-recognition-item-toolbar i:not(:first-child),.speech-recognition-item-toolbar i:not(:last-child){padding:6px}.speech-recognition-item-toolbar i:first-child{padding-left:10px}.speech-recognition-item-toolbar i:last-child{padding-right:10px}.speech-recognition-text{color:#212533;font-size:12px;font-style:normal;font-weight:400;word-break:break-word}\n"] }]
|
|
482
484
|
}], propDecorators: { textAreaElement: [{
|
|
483
485
|
type: Input,
|
|
484
486
|
args: [{ required: true }]
|
|
@@ -486,6 +488,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
486
488
|
type: Input
|
|
487
489
|
}], speechRecognitionPlaceholder: [{
|
|
488
490
|
type: Input
|
|
491
|
+
}], moreOptionsIconClass: [{
|
|
492
|
+
type: Input
|
|
489
493
|
}], recognizedText: [{
|
|
490
494
|
type: Output
|
|
491
495
|
}], onListen: [], onOpenToolbar: [], onCloseToolbar: [], onDiscard: [], onAprove: [], toggleTextToSpeech: [], restartTextToSpeech: [], updateVoiceSpeed: [], stopListening: [] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-speech-recognition.mjs","sources":["../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition.service.ts","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/text-to-speech.service.ts","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition/speech-recognition.component.ts","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition/speech-recognition.component.html","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition.module.ts","../../projects/angular-components/speech-recognition/src/seniorsistemas-angular-components-speech-recognition.ts"],"sourcesContent":["import { Injectable, NgZone, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\nimport { ToastService } from '@seniorsistemas/angular-components/toast';\n\nexport type MicrophoneStatus = 'active' | 'inactive';\nexport interface SpeechResult {\n text: string;\n isFinal: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SpeechRecognitionService {\n private readonly localeService = inject(LocaleService);\n private readonly ngZone = inject(NgZone);\n private readonly toastService = inject(ToastService);\n private translateService = inject(TranslateService);\n\n hasSupportSpeechRecognition = false;\n isListening = false;\n readonly microphoneStatus$ = new Subject<MicrophoneStatus>();\n private recognition!: SpeechRecognition;\n private readonly TIMEOUT_NO_MESSAGE = 3000;\n\n constructor() {\n this.setRecognition();\n }\n\n listen() {\n const speechSubject = new Subject<SpeechResult>();\n if (this.isListening) {\n speechSubject.error('Already listening');\n }\n this.hasMicrophoneAccess.then((hasAccess) => {\n if (!hasAccess) {\n this.toastService.show({ severity: 'error', text: this.translateService.instant('platform.angular_components.no_microphone_permission') });\n speechSubject.error('Microphone access is disabled');\n return;\n }\n this.microphoneStatus$.next('active');\n\n this.isListening = true;\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n this.recognition.maxAlternatives = 1;\n let silenceTimer: any;\n const restartSilenceTimer = () => {\n if (silenceTimer !== undefined) {\n clearTimeout(silenceTimer);\n }\n\n silenceTimer = setTimeout(() => {\n this.recognition.stop();\n }, this.TIMEOUT_NO_MESSAGE);\n };\n let fullTranscript = '';\n let interimTranscript = '';\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\n this.ngZone.run(() => {\n restartSilenceTimer();\n let interimTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n fullTranscript += transcript + '\\n';\n } else {\n interimTranscript += transcript;\n }\n }\n interimTranscript = interimTranscript;\n speechSubject.next({ text: fullTranscript + interimTranscript, isFinal: false });\n })\n };\n this.recognition.onerror = () => {\n this.ngZone.run(() => {\n if (silenceTimer !== undefined) {\n clearTimeout(silenceTimer);\n }\n this.isListening = false;\n speechSubject.error('Speech recognition error');\n this.microphoneStatus$.next('inactive')\n })\n };\n\n this.recognition.onend = () => {\n this.ngZone.run(() => {\n if (silenceTimer !== undefined) {\n clearTimeout(silenceTimer);\n }\n speechSubject.next({ text: fullTranscript + interimTranscript, isFinal: true });\n this.isListening = false;\n speechSubject.complete();\n this.microphoneStatus$.next('inactive')\n })\n };\n this.recognition.start();\n })\n return speechSubject;\n }\n\n\n stop() {\n this.recognition.stop();\n }\n\n private setRecognition() {\n const SpeechRecognitionConstructor =\n (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognitionConstructor) {\n console.warn('Speech recognition is not supported in this browser.');\n return;\n }\n this.hasSupportSpeechRecognition = true;\n this.recognition = new SpeechRecognitionConstructor();\n this.recognition.lang = this.localeService.getLocaleOptions()?.locale || 'pt-BR';\n this.recognition.interimResults = false;\n this.recognition.maxAlternatives = 1;\n this.localeService.getLocale().subscribe(locale => this.recognition.lang = locale);\n }\n\n private get hasMicrophoneAccess() {\n return new Promise(async (resolve) => {\n const permission = await navigator.permissions.query({ name: 'microphone' as PermissionName });\n if (permission.state === 'denied') {\n resolve(false);\n } else if (permission.state === 'granted') {\n resolve(true)\n } else if (permission.state === 'prompt') {\n try {\n navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {\n stream.getTracks().forEach(t => t.stop());\n }).catch(() => {\n resolve(false);\n });\n permission.onchange = () => {\n this.ngZone.run(() => {\n resolve(permission.state === 'granted' ? true : false);\n })\n }\n } catch (error) {\n resolve(false);\n }\n }\n })\n }\n}\n","import { Injectable, NgZone, inject } from '@angular/core';\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TextToSpeechService {\n private readonly locale = inject(LocaleService);\n private readonly ngZone = inject(NgZone);\n\n private readonly utterance = new SpeechSynthesisUtterance();\n private activeVoice: SpeechSynthesisVoice | undefined;\n voices: SpeechSynthesisVoice[] = [];\n constructor() {\n this.setVoices();\n }\n\n private setVoices() {\n let _voices = speechSynthesis.getVoices();\n\n if (!_voices.length) {\n speechSynthesis.onvoiceschanged = () => {\n this.ngZone.run(() => {\n _voices = speechSynthesis.getVoices();\n const currentLang = this.locale.getLocaleOptions()?.locale || 'pt-BR';\n this.setActiveVoice(_voices, currentLang);\n this.locale.getLocale().subscribe((locale) => {\n this.setActiveVoice(_voices, locale);\n })\n })\n }\n }\n }\n\n /**\n * Updates the active voice\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SpeechSynthesisVoice/voiceURI)\n * @param voiceUri\n */\n updateVoice(voiceUri: string) {\n this.activeVoice = this.voices.find((voice) => voice.voiceURI === voiceUri);\n }\n\n\n speak(text: string, speed: number = 1) {\n return new Promise((resolve) => {\n if (!this.activeVoice) {\n return resolve(true);\n }\n this.utterance.text = text;\n this.utterance.voice = this.activeVoice as SpeechSynthesisVoice;\n this.utterance.rate = speed;\n speechSynthesis.speak(this.utterance);\n this.utterance.onend = () => {\n this.ngZone.run(() => {\n resolve(true);\n })\n }\n })\n }\n\n pause() {\n speechSynthesis.pause();\n }\n\n resume() {\n speechSynthesis.resume();\n }\n\n cancel() {\n speechSynthesis.cancel();\n }\n\n get hasVoice() {\n return !!this.activeVoice;\n }\n\n private setActiveVoice(voices: SpeechSynthesisVoice[], lang: string) {\n const _voice = voices.find((voice) => voice.lang === lang);\n if (_voice) {\n this.activeVoice = _voice;\n }\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject, input, isSignal } from '@angular/core';\r\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { SpeechRecognitionService } from '../speech-recognition.service';\r\nimport { TextToSpeechService } from '../text-to-speech.service';\r\n\r\nfunction SkipIf(...propNames: Array<keyof SpeechRecognitionComponent>) {\r\n return function (\r\n _target: unknown,\r\n _propertyKey: string,\r\n descriptor: TypedPropertyDescriptor<(...args: any[]) => any>\r\n ) {\r\n const original = descriptor.value;\r\n\r\n if (original) {\r\n descriptor.value = function (this: Record<string, any>, ...args: any[]) {\r\n\r\n const shouldSkip = propNames.some((propName) => {\r\n const targetProp = this[propName];\r\n\r\n\r\n return typeof targetProp === 'function'\r\n ? Boolean(targetProp())\r\n : Boolean(targetProp);\r\n });\r\n\r\n if (shouldSkip) {\r\n return;\r\n }\r\n\r\n return original.apply(this, args);\r\n };\r\n }\r\n\r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * @description Componente de reconhecimento de voz que integra a Web Speech API para\r\n * transcrever a fala do usuário em texto, inserída diretamente em um `<textarea>` fornecido.\r\n * Suporta também text-to-speech para leitura em voz alta do conteúdo do campo.\r\n *\r\n * @example\r\n * ```html\r\n * <s-speech-recognition\r\n * [textAreaElement]=\"textAreaRef.nativeElement\"\r\n * (recognizedText)=\"onTextoReconhecido($event)\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n selector: 's-speech-recognition',\r\n templateUrl: './speech-recognition.component.html',\r\n styleUrls: ['./speech-recognition.component.scss'],\r\n standalone: true,\r\n imports: [TranslatePipe],\r\n})\r\nexport class SpeechRecognitionComponent implements OnInit, OnDestroy {\r\n private readonly speechRecognitionService = inject(SpeechRecognitionService);\r\n private readonly textToSpeechService = inject(TextToSpeechService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n private static TOOLBAR_ACTIVE = false;\r\n /** @description Referência ao elemento `<textarea>` nativo que receberá o texto transcrito. Campo obrigatório. */\r\n @Input({ required: true }) textAreaElement!: HTMLTextAreaElement;\r\n /** @description Quando `true`, mantém o texto existente no campo ao iniciar novo reconhecimento. @default false */\r\n @Input() keepContext = false;\r\n /** @description Placeholder exibido no textarea durante o reconhecimento de voz. @default '' */\r\n @Input() speechRecognitionPlaceholder = '';\r\n private _recognizedText = '';\r\n private originalTextAreaElementText = '';\r\n private isDoneTextToSpeech = false;\r\n private readonly onDestroy$ = new Subject<void>();\r\n private readonly VOICE_SPEEDS = [0.5, 1, 1.5, 2];\r\n private readonly keydownEventListener = (event: KeyboardEvent) => {\r\n if (this.disabled) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n disabledSpeechRecognition = input(false);\r\n\r\n disabled = false;\r\n isListeningUserVoice = false;\r\n voiceSpeed = 1;\r\n isDisabledMicrophone = false;\r\n\r\n canRenderMicrophone = true;\r\n canRenderTextToSpeech = true;\r\n canRenderListeningText = false;\r\n canRenderDiscard = false;\r\n canRenderAprove = false;\r\n canRenderTextToSpeechToolbar = false;\r\n\r\n isPlayingTextToSpeech = false;\r\n\r\n /** @description Emitido quando o reconhecimento de voz é concluído, com o texto transcrito. */\r\n @Output() recognizedText = new EventEmitter<string>();\r\n\r\n ngOnInit(): void {\r\n if (!this.hasSpeechRecognitionBrowserApi) {\r\n return;\r\n }\r\n if (!this.textAreaElement) {\r\n throw new Error('textAreaElement is required');\r\n }\r\n this.textAreaElement.placeholder = this.speechRecognitionPlaceholder\r\n ? this.speechRecognitionPlaceholder\r\n : this.translateService.instant('platform.angular_components.text_area_speech_recognition_placeholder');\r\n this.textAreaElement.addEventListener('keydown', this.keydownEventListener);\r\n this.speechRecognitionService.microphoneStatus$.pipe(takeUntil(this.onDestroy$)).subscribe((status) => {\r\n if (status === 'active') {\r\n this.onCloseToolbar();\r\n }\r\n });\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition', 'isDisabledMicrophone', 'isListening')\r\n onListen() {\r\n this.disabled = true;\r\n this.canRenderMicrophone = false;\r\n this.canRenderListeningText = true;\r\n this.originalTextAreaElementText = this.textAreaElement.value;\r\n this.textAreaElement.value = '';\r\n this.isListeningUserVoice = true;\r\n this.speechRecognitionService\r\n .listen()\r\n .pipe(takeUntil(this.onDestroy$))\r\n .subscribe(\r\n ({ text, isFinal }) => {\r\n this._recognizedText = text;\r\n this.setTextAreaValue(text);\r\n this.scrollTextAreaBottom();\r\n if (isFinal) {\r\n this.canRenderAprove = true;\r\n this.canRenderDiscard = true;\r\n this.canRenderListeningText = false;\r\n this.isListeningUserVoice = false;\r\n }\r\n },\r\n () => {\r\n this.isListeningUserVoice = false;\r\n this.canRenderMicrophone = true;\r\n this.isDisabledMicrophone = false;\r\n this.canRenderListeningText = false;\r\n this.disabled = false;\r\n },\r\n );\r\n }\r\n\r\n private scrollTextAreaBottom() {\r\n setTimeout(() => {\r\n this.textAreaElement.scrollTop = this.textAreaElement.scrollHeight;\r\n }, 120);\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onOpenToolbar() {\r\n if (this.isDisabledTextToSpeech) {\r\n return;\r\n }\r\n this.canRenderTextToSpeechToolbar = true;\r\n this.canRenderTextToSpeech = false;\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = true;\r\n this.speak();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onCloseToolbar() {\r\n this.canRenderTextToSpeechToolbar = false;\r\n this.canRenderTextToSpeech = true;\r\n this.stopTextToSpeech();\r\n this.voiceSpeed = 1;\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = false;\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onDiscard() {\r\n this.canRenderAprove = false;\r\n this.canRenderDiscard = false;\r\n this.canRenderMicrophone = true;\r\n this.canRenderTextToSpeechToolbar = false;\r\n this.canRenderTextToSpeech = true;\r\n this._recognizedText = '';\r\n this.setTextAreaValue(this.originalTextAreaElementText);\r\n this.disabled = false;\r\n this.stopTextToSpeech();\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = false;\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onAprove() {\r\n this.canRenderAprove = false;\r\n this.canRenderDiscard = false;\r\n this.canRenderMicrophone = true;\r\n this.canRenderTextToSpeechToolbar = false;\r\n this.canRenderTextToSpeech = true;\r\n if (this.keepContext) {\r\n const breakLine = this.originalTextAreaElementText.length > 0 ? '\\n' : '';\r\n this.originalTextAreaElementText += `${breakLine}${this._recognizedText}`;\r\n } else {\r\n this.originalTextAreaElementText = this._recognizedText;\r\n }\r\n this.recognizedText.emit(this.keepContext ? this.originalTextAreaElementText : this._recognizedText);\r\n this.scrollTextAreaBottom();\r\n this._recognizedText = '';\r\n this.disabled = false;\r\n this.textToSpeechService.cancel();\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = false;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.onDestroy$.next();\r\n this.onDestroy$.complete();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n toggleTextToSpeech() {\r\n if (this.isPlayingTextToSpeech) {\r\n this.textToSpeechService.pause();\r\n } else {\r\n if (this.isDoneTextToSpeech) {\r\n this.speak();\r\n } else {\r\n this.textToSpeechService.resume();\r\n }\r\n }\r\n this.isPlayingTextToSpeech = !this.isPlayingTextToSpeech;\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n restartTextToSpeech() {\r\n this.textToSpeechService.cancel();\r\n this.speak();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n updateVoiceSpeed() {\r\n const voiceSpeedIndex = this.VOICE_SPEEDS.indexOf(this.voiceSpeed);\r\n const nextVoiceSpeedIndex = this.VOICE_SPEEDS[voiceSpeedIndex + 1] ? voiceSpeedIndex + 1 : 0;\r\n this.voiceSpeed = this.VOICE_SPEEDS[nextVoiceSpeedIndex];\r\n this.textToSpeechService.cancel();\r\n this.speak();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n stopListening() {\r\n this.speechRecognitionService.stop();\r\n }\r\n\r\n\r\n get isListening() {\r\n return this.speechRecognitionService.isListening;\r\n }\r\n\r\n get hasSpeechRecognitionBrowserApi() {\r\n return this.speechRecognitionService.hasSupportSpeechRecognition;\r\n }\r\n\r\n get isDisabledTextToSpeech() {\r\n const hasTextToSpeechVoice = this.textToSpeechService.hasVoice;\r\n return (\r\n !this.textToSpeech || !hasTextToSpeechVoice || this.isListening || SpeechRecognitionComponent.TOOLBAR_ACTIVE\r\n );\r\n }\r\n\r\n private setTextAreaValue(value: string) {\r\n this.textAreaElement.value = value;\r\n }\r\n\r\n private stopTextToSpeech() {\r\n this.isPlayingTextToSpeech = false;\r\n this.textToSpeechService.cancel();\r\n }\r\n\r\n private speak() {\r\n this.isDoneTextToSpeech = false;\r\n this.isPlayingTextToSpeech = true;\r\n this.textToSpeechService.speak(this.textToSpeech, this.voiceSpeed).then(() => {\r\n this.isPlayingTextToSpeech = false;\r\n this.isDoneTextToSpeech = true;\r\n });\r\n }\r\n\r\n private get textToSpeech() {\r\n return this.textAreaElement.value;\r\n }\r\n}\r\n","@if(hasSpeechRecognitionBrowserApi) {\n <section class=\"speech-recognition\">\n <div class=\"speech-recognition-text\">\n @if(canRenderMicrophone) {\n {{ 'platform.angular_components.text_area_before_speech' | translate }}\n }\n\n @if(isListeningUserVoice) {\n {{ 'platform.angular_components.text_area_while_speech' | translate }}\n }\n\n @if(canRenderAprove && canRenderDiscard) {\n {{ 'platform.angular_components.text_area_end_speech' | translate }}\n }\n </div>\n <div class=\"speech-recognition-buttons\">\n @if(canRenderListeningText) {\n <span\n (click)=\"stopListening()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"disabledSpeechRecognition()\">\n <i class=\"far fa-ellipsis-h\"></i>\n </span>\n }\n\n @if(canRenderMicrophone) {\n <span\n (click)=\"onListen()\"\n class=\"speech-recognition-item speech-recognition-item-microphone\"\n [class.speech-recognition-item-disabled]=\"isDisabledMicrophone || isListening || disabled || disabledSpeechRecognition()\">\n <i class=\"fas fa-microphone\"></i>\n </span>\n }\n\n\n @if(canRenderAprove) {\n <span\n (click)=\"onAprove()\"\n class=\"speech-recognition-item speech-recognition-item-aprove\">\n <i class=\"fas fa-check\"></i>\n </span>\n }\n\n @if(canRenderDiscard) {\n <span\n (click)=\"onDiscard()\"\n class=\"speech-recognition-item speech-recognition-item-discard\">\n <i class=\"fas fa-times\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeech) {\n <span\n (click)=\"onOpenToolbar()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"isDisabledTextToSpeech\">\n <i class=\"fas fa-volume-down\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeechToolbar) {\n <span\n class=\"speech-recognition-item-toolbar\">\n <i class=\"fas\" [class.fa-pause]=\"isPlayingTextToSpeech\" [class.fa-play]=\"!isPlayingTextToSpeech\"\n (click)=\"toggleTextToSpeech()\"></i>\n <i class=\"fas fa-backward\" (click)=\"restartTextToSpeech()\"></i>\n <span (click)=\"updateVoiceSpeed()\">\n {{ voiceSpeed }}x\n </span>\n <i class=\"fas fa-times\" (click)=\"onCloseToolbar()\"></i>\n </span>\n }\n </div>\n </section>\n}\n","import { NgModule } from '@angular/core';\r\nimport { SpeechRecognitionComponent } from './speech-recognition/speech-recognition.component';\r\n\r\n@NgModule({\r\n imports: [SpeechRecognitionComponent],\r\n exports: [SpeechRecognitionComponent],\r\n})\r\nexport class SpeechRecognitionModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-speech-recognition.mjs","sources":["../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition.service.ts","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/text-to-speech.service.ts","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition/speech-recognition.component.ts","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition/speech-recognition.component.html","../../projects/angular-components/speech-recognition/src/lib/speech-recognition/speech-recognition.module.ts","../../projects/angular-components/speech-recognition/src/seniorsistemas-angular-components-speech-recognition.ts"],"sourcesContent":["import { Injectable, NgZone, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { TranslateService } from '@ngx-translate/core';\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\nimport { ToastService } from '@seniorsistemas/angular-components/toast';\n\nexport type MicrophoneStatus = 'active' | 'inactive';\nexport interface SpeechResult {\n text: string;\n isFinal: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SpeechRecognitionService {\n private readonly localeService = inject(LocaleService);\n private readonly ngZone = inject(NgZone);\n private readonly toastService = inject(ToastService);\n private translateService = inject(TranslateService);\n\n hasSupportSpeechRecognition = false;\n isListening = false;\n readonly microphoneStatus$ = new Subject<MicrophoneStatus>();\n private recognition!: SpeechRecognition;\n private readonly TIMEOUT_NO_MESSAGE = 3000;\n\n constructor() {\n this.setRecognition();\n }\n\n listen() {\n const speechSubject = new Subject<SpeechResult>();\n if (this.isListening) {\n speechSubject.error('Already listening');\n }\n this.hasMicrophoneAccess.then((hasAccess) => {\n if (!hasAccess) {\n this.toastService.show({ severity: 'error', text: this.translateService.instant('platform.angular_components.no_microphone_permission') });\n speechSubject.error('Microphone access is disabled');\n return;\n }\n this.microphoneStatus$.next('active');\n\n this.isListening = true;\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n this.recognition.maxAlternatives = 1;\n let silenceTimer: any;\n const restartSilenceTimer = () => {\n if (silenceTimer !== undefined) {\n clearTimeout(silenceTimer);\n }\n\n silenceTimer = setTimeout(() => {\n this.recognition.stop();\n }, this.TIMEOUT_NO_MESSAGE);\n };\n let fullTranscript = '';\n let interimTranscript = '';\n\n this.recognition.onresult = (event: SpeechRecognitionEvent) => {\n this.ngZone.run(() => {\n restartSilenceTimer();\n let interimTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n fullTranscript += transcript + '\\n';\n } else {\n interimTranscript += transcript;\n }\n }\n interimTranscript = interimTranscript;\n speechSubject.next({ text: fullTranscript + interimTranscript, isFinal: false });\n })\n };\n this.recognition.onerror = () => {\n this.ngZone.run(() => {\n if (silenceTimer !== undefined) {\n clearTimeout(silenceTimer);\n }\n this.isListening = false;\n speechSubject.error('Speech recognition error');\n this.microphoneStatus$.next('inactive')\n })\n };\n\n this.recognition.onend = () => {\n this.ngZone.run(() => {\n if (silenceTimer !== undefined) {\n clearTimeout(silenceTimer);\n }\n speechSubject.next({ text: fullTranscript + interimTranscript, isFinal: true });\n this.isListening = false;\n speechSubject.complete();\n this.microphoneStatus$.next('inactive')\n })\n };\n this.recognition.start();\n })\n return speechSubject;\n }\n\n\n stop() {\n this.recognition.stop();\n }\n\n private setRecognition() {\n const SpeechRecognitionConstructor =\n (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognitionConstructor) {\n console.warn('Speech recognition is not supported in this browser.');\n return;\n }\n this.hasSupportSpeechRecognition = true;\n this.recognition = new SpeechRecognitionConstructor();\n this.recognition.lang = this.localeService.getLocaleOptions()?.locale || 'pt-BR';\n this.recognition.interimResults = false;\n this.recognition.maxAlternatives = 1;\n this.localeService.getLocale().subscribe(locale => this.recognition.lang = locale);\n }\n\n private get hasMicrophoneAccess() {\n return new Promise(async (resolve) => {\n const permission = await navigator.permissions.query({ name: 'microphone' as PermissionName });\n if (permission.state === 'denied') {\n resolve(false);\n } else if (permission.state === 'granted') {\n resolve(true)\n } else if (permission.state === 'prompt') {\n try {\n navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {\n stream.getTracks().forEach(t => t.stop());\n }).catch(() => {\n resolve(false);\n });\n permission.onchange = () => {\n this.ngZone.run(() => {\n resolve(permission.state === 'granted' ? true : false);\n })\n }\n } catch (error) {\n resolve(false);\n }\n }\n })\n }\n}\n","import { Injectable, NgZone, inject } from '@angular/core';\nimport { LocaleService } from '@seniorsistemas/angular-components/locale';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TextToSpeechService {\n private readonly locale = inject(LocaleService);\n private readonly ngZone = inject(NgZone);\n\n private readonly utterance = new SpeechSynthesisUtterance();\n private activeVoice: SpeechSynthesisVoice | undefined;\n voices: SpeechSynthesisVoice[] = [];\n constructor() {\n this.setVoices();\n }\n\n private setVoices() {\n let _voices = speechSynthesis.getVoices();\n\n if (!_voices.length) {\n speechSynthesis.onvoiceschanged = () => {\n this.ngZone.run(() => {\n _voices = speechSynthesis.getVoices();\n const currentLang = this.locale.getLocaleOptions()?.locale || 'pt-BR';\n this.setActiveVoice(_voices, currentLang);\n this.locale.getLocale().subscribe((locale) => {\n this.setActiveVoice(_voices, locale);\n })\n })\n }\n }\n }\n\n /**\n * Updates the active voice\n * [MDN Reference](https://developer.mozilla.org/docs/Web/API/SpeechSynthesisVoice/voiceURI)\n * @param voiceUri\n */\n updateVoice(voiceUri: string) {\n this.activeVoice = this.voices.find((voice) => voice.voiceURI === voiceUri);\n }\n\n\n speak(text: string, speed: number = 1) {\n return new Promise((resolve) => {\n if (!this.activeVoice) {\n return resolve(true);\n }\n this.utterance.text = text;\n this.utterance.voice = this.activeVoice as SpeechSynthesisVoice;\n this.utterance.rate = speed;\n speechSynthesis.speak(this.utterance);\n this.utterance.onend = () => {\n this.ngZone.run(() => {\n resolve(true);\n })\n }\n })\n }\n\n pause() {\n speechSynthesis.pause();\n }\n\n resume() {\n speechSynthesis.resume();\n }\n\n cancel() {\n speechSynthesis.cancel();\n }\n\n get hasVoice() {\n return !!this.activeVoice;\n }\n\n private setActiveVoice(voices: SpeechSynthesisVoice[], lang: string) {\n const _voice = voices.find((voice) => voice.lang === lang);\n if (_voice) {\n this.activeVoice = _voice;\n }\n }\n}\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, inject, input, isSignal } from '@angular/core';\r\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { SpeechRecognitionService } from '../speech-recognition.service';\r\nimport { TextToSpeechService } from '../text-to-speech.service';\r\n\r\nfunction SkipIf(...propNames: Array<keyof SpeechRecognitionComponent>) {\r\n return function (\r\n _target: unknown,\r\n _propertyKey: string,\r\n descriptor: TypedPropertyDescriptor<(...args: any[]) => any>\r\n ) {\r\n const original = descriptor.value;\r\n\r\n if (original) {\r\n descriptor.value = function (this: Record<string, any>, ...args: any[]) {\r\n\r\n const shouldSkip = propNames.some((propName) => {\r\n const targetProp = this[propName];\r\n\r\n\r\n return typeof targetProp === 'function'\r\n ? Boolean(targetProp())\r\n : Boolean(targetProp);\r\n });\r\n\r\n if (shouldSkip) {\r\n return;\r\n }\r\n\r\n return original.apply(this, args);\r\n };\r\n }\r\n\r\n return descriptor;\r\n };\r\n}\r\n\r\n/**\r\n * @description Componente de reconhecimento de voz que integra a Web Speech API para\r\n * transcrever a fala do usuário em texto, inserída diretamente em um `<textarea>` fornecido.\r\n * Suporta também text-to-speech para leitura em voz alta do conteúdo do campo.\r\n *\r\n * @example\r\n * ```html\r\n * <s-speech-recognition\r\n * [textAreaElement]=\"textAreaRef.nativeElement\"\r\n * (recognizedText)=\"onTextoReconhecido($event)\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n selector: 's-speech-recognition',\r\n templateUrl: './speech-recognition.component.html',\r\n styleUrls: ['./speech-recognition.component.scss'],\r\n standalone: true,\r\n imports: [TranslatePipe],\r\n})\r\nexport class SpeechRecognitionComponent implements OnInit, OnDestroy {\r\n private readonly speechRecognitionService = inject(SpeechRecognitionService);\r\n private readonly textToSpeechService = inject(TextToSpeechService);\r\n private readonly translateService = inject(TranslateService);\r\n\r\n private static TOOLBAR_ACTIVE = false;\r\n /** @description Referência ao elemento `<textarea>` nativo que receberá o texto transcrito. Campo obrigatório. */\r\n @Input({ required: true }) textAreaElement!: HTMLTextAreaElement;\r\n /** @description Quando `true`, mantém o texto existente no campo ao iniciar novo reconhecimento. @default false */\r\n @Input() keepContext = false;\r\n /** @description Placeholder exibido no textarea durante o reconhecimento de voz. @default '' */\r\n @Input() speechRecognitionPlaceholder = '';\r\n /** @description Classe do ícone do botão de mais opções. @default 'far fa-ellipsis-h' */\r\n @Input() moreOptionsIconClass = 'far fa-ellipsis-h';\r\n \r\n private _recognizedText = '';\r\n private originalTextAreaElementText = '';\r\n private isDoneTextToSpeech = false;\r\n private readonly onDestroy$ = new Subject<void>();\r\n private readonly VOICE_SPEEDS = [0.5, 1, 1.5, 2];\r\n private readonly keydownEventListener = (event: KeyboardEvent) => {\r\n if (this.disabled) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n disabledSpeechRecognition = input(false);\r\n\r\n disabled = false;\r\n isListeningUserVoice = false;\r\n voiceSpeed = 1;\r\n isDisabledMicrophone = false;\r\n\r\n canRenderMicrophone = true;\r\n canRenderTextToSpeech = true;\r\n canRenderListeningText = false;\r\n canRenderDiscard = false;\r\n canRenderAprove = false;\r\n canRenderTextToSpeechToolbar = false;\r\n\r\n isPlayingTextToSpeech = false;\r\n\r\n /** @description Emitido quando o reconhecimento de voz é concluído, com o texto transcrito. */\r\n @Output() recognizedText = new EventEmitter<string>();\r\n\r\n ngOnInit(): void {\r\n if (!this.hasSpeechRecognitionBrowserApi) {\r\n return;\r\n }\r\n if (!this.textAreaElement) {\r\n throw new Error('textAreaElement is required');\r\n }\r\n this.textAreaElement.placeholder = this.speechRecognitionPlaceholder\r\n ? this.speechRecognitionPlaceholder\r\n : this.translateService.instant('platform.angular_components.text_area_speech_recognition_placeholder');\r\n this.textAreaElement.addEventListener('keydown', this.keydownEventListener);\r\n this.speechRecognitionService.microphoneStatus$.pipe(takeUntil(this.onDestroy$)).subscribe((status) => {\r\n if (status === 'active') {\r\n this.onCloseToolbar();\r\n }\r\n });\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition', 'isDisabledMicrophone', 'isListening')\r\n onListen() {\r\n this.disabled = true;\r\n this.canRenderMicrophone = false;\r\n this.canRenderListeningText = true;\r\n this.originalTextAreaElementText = this.textAreaElement.value;\r\n this.textAreaElement.value = '';\r\n this.isListeningUserVoice = true;\r\n this.speechRecognitionService\r\n .listen()\r\n .pipe(takeUntil(this.onDestroy$))\r\n .subscribe(\r\n ({ text, isFinal }) => {\r\n this._recognizedText = text;\r\n this.setTextAreaValue(text);\r\n this.scrollTextAreaBottom();\r\n if (isFinal) {\r\n this.canRenderAprove = true;\r\n this.canRenderDiscard = true;\r\n this.canRenderListeningText = false;\r\n this.isListeningUserVoice = false;\r\n }\r\n },\r\n () => {\r\n this.isListeningUserVoice = false;\r\n this.canRenderMicrophone = true;\r\n this.isDisabledMicrophone = false;\r\n this.canRenderListeningText = false;\r\n this.disabled = false;\r\n },\r\n );\r\n }\r\n\r\n private scrollTextAreaBottom() {\r\n setTimeout(() => {\r\n this.textAreaElement.scrollTop = this.textAreaElement.scrollHeight;\r\n }, 120);\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onOpenToolbar() {\r\n if (this.isDisabledTextToSpeech) {\r\n return;\r\n }\r\n this.canRenderTextToSpeechToolbar = true;\r\n this.canRenderTextToSpeech = false;\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = true;\r\n this.speak();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onCloseToolbar() {\r\n this.canRenderTextToSpeechToolbar = false;\r\n this.canRenderTextToSpeech = true;\r\n this.stopTextToSpeech();\r\n this.voiceSpeed = 1;\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = false;\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onDiscard() {\r\n this.canRenderAprove = false;\r\n this.canRenderDiscard = false;\r\n this.canRenderMicrophone = true;\r\n this.canRenderTextToSpeechToolbar = false;\r\n this.canRenderTextToSpeech = true;\r\n this._recognizedText = '';\r\n this.setTextAreaValue(this.originalTextAreaElementText);\r\n this.disabled = false;\r\n this.stopTextToSpeech();\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = false;\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n onAprove() {\r\n this.canRenderAprove = false;\r\n this.canRenderDiscard = false;\r\n this.canRenderMicrophone = true;\r\n this.canRenderTextToSpeechToolbar = false;\r\n this.canRenderTextToSpeech = true;\r\n if (this.keepContext) {\r\n const breakLine = this.originalTextAreaElementText.length > 0 ? '\\n' : '';\r\n this.originalTextAreaElementText += `${breakLine}${this._recognizedText}`;\r\n } else {\r\n this.originalTextAreaElementText = this._recognizedText;\r\n }\r\n this.recognizedText.emit(this.keepContext ? this.originalTextAreaElementText : this._recognizedText);\r\n this.scrollTextAreaBottom();\r\n this._recognizedText = '';\r\n this.disabled = false;\r\n this.textToSpeechService.cancel();\r\n SpeechRecognitionComponent.TOOLBAR_ACTIVE = false;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.onDestroy$.next();\r\n this.onDestroy$.complete();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n toggleTextToSpeech() {\r\n if (this.isPlayingTextToSpeech) {\r\n this.textToSpeechService.pause();\r\n } else {\r\n if (this.isDoneTextToSpeech) {\r\n this.speak();\r\n } else {\r\n this.textToSpeechService.resume();\r\n }\r\n }\r\n this.isPlayingTextToSpeech = !this.isPlayingTextToSpeech;\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n restartTextToSpeech() {\r\n this.textToSpeechService.cancel();\r\n this.speak();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n updateVoiceSpeed() {\r\n const voiceSpeedIndex = this.VOICE_SPEEDS.indexOf(this.voiceSpeed);\r\n const nextVoiceSpeedIndex = this.VOICE_SPEEDS[voiceSpeedIndex + 1] ? voiceSpeedIndex + 1 : 0;\r\n this.voiceSpeed = this.VOICE_SPEEDS[nextVoiceSpeedIndex];\r\n this.textToSpeechService.cancel();\r\n this.speak();\r\n }\r\n\r\n @SkipIf('disabledSpeechRecognition')\r\n stopListening() {\r\n this.speechRecognitionService.stop();\r\n }\r\n\r\n\r\n get isListening() {\r\n return this.speechRecognitionService.isListening;\r\n }\r\n\r\n get hasSpeechRecognitionBrowserApi() {\r\n return this.speechRecognitionService.hasSupportSpeechRecognition;\r\n }\r\n\r\n get isDisabledTextToSpeech() {\r\n const hasTextToSpeechVoice = this.textToSpeechService.hasVoice;\r\n return (\r\n !this.textToSpeech || !hasTextToSpeechVoice || this.isListening || SpeechRecognitionComponent.TOOLBAR_ACTIVE\r\n );\r\n }\r\n\r\n private setTextAreaValue(value: string) {\r\n this.textAreaElement.value = value;\r\n }\r\n\r\n private stopTextToSpeech() {\r\n this.isPlayingTextToSpeech = false;\r\n this.textToSpeechService.cancel();\r\n }\r\n\r\n private speak() {\r\n this.isDoneTextToSpeech = false;\r\n this.isPlayingTextToSpeech = true;\r\n this.textToSpeechService.speak(this.textToSpeech, this.voiceSpeed).then(() => {\r\n this.isPlayingTextToSpeech = false;\r\n this.isDoneTextToSpeech = true;\r\n });\r\n }\r\n\r\n private get textToSpeech() {\r\n return this.textAreaElement.value;\r\n }\r\n}\r\n","@if(hasSpeechRecognitionBrowserApi) {\n <section class=\"speech-recognition\">\n <div class=\"speech-recognition-text\">\n @if(canRenderMicrophone) {\n {{ 'platform.angular_components.text_area_before_speech' | translate }}\n }\n\n @if(isListeningUserVoice) {\n {{ 'platform.angular_components.text_area_while_speech' | translate }}\n }\n\n @if(canRenderAprove && canRenderDiscard) {\n {{ 'platform.angular_components.text_area_end_speech' | translate }}\n }\n </div>\n <div class=\"speech-recognition-buttons\">\n @if(canRenderListeningText) {\n <span\n (click)=\"stopListening()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"disabledSpeechRecognition()\">\n <i [class]=\"moreOptionsIconClass\"></i>\n </span>\n }\n\n @if(canRenderMicrophone) {\n <span\n (click)=\"onListen()\"\n class=\"speech-recognition-item speech-recognition-item-microphone\"\n [class.speech-recognition-item-disabled]=\"isDisabledMicrophone || isListening || disabled || disabledSpeechRecognition()\">\n <i class=\"fas fa-microphone\"></i>\n </span>\n }\n\n\n @if(canRenderAprove) {\n <span\n (click)=\"onAprove()\"\n class=\"speech-recognition-item speech-recognition-item-aprove\">\n <i class=\"fas fa-check\"></i>\n </span>\n }\n\n @if(canRenderDiscard) {\n <span\n (click)=\"onDiscard()\"\n class=\"speech-recognition-item speech-recognition-item-discard\">\n <i class=\"fas fa-times\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeech) {\n <span\n (click)=\"onOpenToolbar()\"\n class=\"speech-recognition-item speech-recognition-item-regular\"\n [class.speech-recognition-item-disabled]=\"isDisabledTextToSpeech\">\n <i class=\"fas fa-volume-down\"></i>\n </span>\n }\n\n @if(canRenderTextToSpeechToolbar) {\n <span\n class=\"speech-recognition-item-toolbar\">\n <i class=\"fas\" [class.fa-pause]=\"isPlayingTextToSpeech\" [class.fa-play]=\"!isPlayingTextToSpeech\"\n (click)=\"toggleTextToSpeech()\"></i>\n <i class=\"fas fa-backward\" (click)=\"restartTextToSpeech()\"></i>\n <span (click)=\"updateVoiceSpeed()\">\n {{ voiceSpeed }}x\n </span>\n <i class=\"fas fa-times\" (click)=\"onCloseToolbar()\"></i>\n </span>\n }\n </div>\n </section>\n}\n","import { NgModule } from '@angular/core';\r\nimport { SpeechRecognitionComponent } from './speech-recognition/speech-recognition.component';\r\n\r\n@NgModule({\r\n imports: [SpeechRecognitionComponent],\r\n exports: [SpeechRecognitionComponent],\r\n})\r\nexport class SpeechRecognitionModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,10 @@ class SplitButtonComponent {
|
|
|
30
30
|
type = 'primary';
|
|
31
31
|
/** @description Lista de opções exibidas no dropdown. Campo obrigatório. */
|
|
32
32
|
options;
|
|
33
|
+
/** @description Classe do ícone exibido quando o dropdown está fechado. @default 'far fa-chevron-down' */
|
|
34
|
+
openIcon = 'far fa-chevron-down';
|
|
35
|
+
/** @description Classe do ícone exibido quando o dropdown está aberto. @default 'far fa-chevron-up' */
|
|
36
|
+
closeIcon = 'far fa-chevron-up';
|
|
33
37
|
/** @description Emitido quando o usuário clica no botão principal (não no dropdown). */
|
|
34
38
|
buttonClicked = new EventEmitter();
|
|
35
39
|
open = false;
|
|
@@ -57,11 +61,11 @@ class SplitButtonComponent {
|
|
|
57
61
|
this.open = false;
|
|
58
62
|
}
|
|
59
63
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SplitButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
60
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SplitButtonComponent, isStandalone: true, selector: "s-split-button", inputs: { disabled: "disabled", iconClass: "iconClass", label: "label", type: "type", options: "options" }, outputs: { buttonClicked: "buttonClicked" }, host: { listeners: { "document:click": "onClickout($event)" } }, ngImport: i0, template: "<div\n class=\"split-button\"\n [ngClass]=\"{\n 'split-button--primary': type === 'primary',\n 'split-button--secondary': type === 'secondary',\n 'split-button--default': type === 'default',\n 'split-button--disabled': disabled,\n }\"\n>\n <button\n class=\"button\"\n (click)=\"onButtonClick()\"\n >\n <span\n class=\"button__icon\"\n [ngClass]=\"iconClass\"\n ></span>\n <span class=\"button__label\">{{ label }}</span>\n </button>\n <button\n class=\"dropdown\"\n (click)=\"onDropdownClick()\"\n >\n <span\n class=\"dropdown__icon\"\n [
|
|
64
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SplitButtonComponent, isStandalone: true, selector: "s-split-button", inputs: { disabled: "disabled", iconClass: "iconClass", label: "label", type: "type", options: "options", openIcon: "openIcon", closeIcon: "closeIcon" }, outputs: { buttonClicked: "buttonClicked" }, host: { listeners: { "document:click": "onClickout($event)" } }, ngImport: i0, template: "<div\n class=\"split-button\"\n [ngClass]=\"{\n 'split-button--primary': type === 'primary',\n 'split-button--secondary': type === 'secondary',\n 'split-button--default': type === 'default',\n 'split-button--disabled': disabled,\n }\"\n>\n <button\n class=\"button\"\n (click)=\"onButtonClick()\"\n >\n <span\n class=\"button__icon\"\n [ngClass]=\"iconClass\"\n ></span>\n <span class=\"button__label\">{{ label }}</span>\n </button>\n <button\n class=\"dropdown\"\n (click)=\"onDropdownClick()\"\n >\n <span\n class=\"dropdown__icon\"\n [class]=\"open ? closeIcon : openIcon\"\n >\n </span>\n </button>\n</div>\n\n@if (this.open) {\n <ul class=\"options\">\n @for (option of options; track option.title) {\n <li (click)=\"onOptionClick(option)\">\n {{ option.title }}\n </li>\n }\n </ul>\n}\n", styles: [".split-button{display:flex;-webkit-user-select:none;user-select:none;max-height:35px}.split-button .button{align-items:center;border:none;border-radius:4px 0 0 4px;display:flex;padding:8px 8px 8px 12px;transition:all .3s ease-in-out}.split-button .button__icon{font-size:16px;padding:0 4px}.split-button .button__title{font-family:Open Sans,sans-serif;font-size:14px;font-weight:400;line-height:21px}.split-button .dropdown{align-items:center;border:none;border-left:1px solid #608190;border-radius:0 4px 4px 0;display:flex;justify-content:center;padding:12px 8px;transition:all .3s ease-in-out}.split-button--disabled{opacity:.5}.split-button--primary .button,.split-button--primary .dropdown{background-color:#428bca;color:#fff}.split-button--primary:not(.split-button--primary--disabled) .button,.split-button--primary:not(.split-button--primary--disabled) .dropdown{cursor:pointer}.split-button--primary:not(.split-button--primary--disabled) .button:hover,.split-button--primary:not(.split-button--primary--disabled) .dropdown:hover{background-color:#063951}.split-button--secondary .button,.split-button--secondary .dropdown{background-color:#7892a1;color:#fff}.split-button--secondary:not(.split-button--secondary--disabled) .button,.split-button--secondary:not(.split-button--secondary--disabled) .dropdown{cursor:pointer}.split-button--secondary:not(.split-button--secondary--disabled) .button:hover,.split-button--secondary:not(.split-button--secondary--disabled) .dropdown:hover{background-color:#697882}.split-button--default .button,.split-button--default .dropdown{background-color:unset;border:1px solid #d8d8d8;color:#333}.split-button--default:not(.split-button--default--disabled) .button,.split-button--default:not(.split-button--default--disabled) .dropdown{cursor:pointer}.split-button--default:not(.split-button--default--disabled) .button:hover,.split-button--default:not(.split-button--default--disabled) .dropdown:hover{background-color:#d8d8d8}.options{background-color:#fff;border-radius:4px;box-shadow:0 1px 5px #00000040;display:inline-block;list-style:none;margin:2px 0;padding:8px 0;position:absolute;-webkit-user-select:none;user-select:none;z-index:10}.options li{color:#333;cursor:pointer;font-family:Open Sans,sans-serif;font-weight:400;font-size:14px;line-height:21px;padding:8px 16px}.options li:hover{background-color:#d8d8d8}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
61
65
|
}
|
|
62
66
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SplitButtonComponent, decorators: [{
|
|
63
67
|
type: Component,
|
|
64
|
-
args: [{ selector: 's-split-button', standalone: true, imports: [NgClass], template: "<div\n class=\"split-button\"\n [ngClass]=\"{\n 'split-button--primary': type === 'primary',\n 'split-button--secondary': type === 'secondary',\n 'split-button--default': type === 'default',\n 'split-button--disabled': disabled,\n }\"\n>\n <button\n class=\"button\"\n (click)=\"onButtonClick()\"\n >\n <span\n class=\"button__icon\"\n [ngClass]=\"iconClass\"\n ></span>\n <span class=\"button__label\">{{ label }}</span>\n </button>\n <button\n class=\"dropdown\"\n (click)=\"onDropdownClick()\"\n >\n <span\n class=\"dropdown__icon\"\n [
|
|
68
|
+
args: [{ selector: 's-split-button', standalone: true, imports: [NgClass], template: "<div\n class=\"split-button\"\n [ngClass]=\"{\n 'split-button--primary': type === 'primary',\n 'split-button--secondary': type === 'secondary',\n 'split-button--default': type === 'default',\n 'split-button--disabled': disabled,\n }\"\n>\n <button\n class=\"button\"\n (click)=\"onButtonClick()\"\n >\n <span\n class=\"button__icon\"\n [ngClass]=\"iconClass\"\n ></span>\n <span class=\"button__label\">{{ label }}</span>\n </button>\n <button\n class=\"dropdown\"\n (click)=\"onDropdownClick()\"\n >\n <span\n class=\"dropdown__icon\"\n [class]=\"open ? closeIcon : openIcon\"\n >\n </span>\n </button>\n</div>\n\n@if (this.open) {\n <ul class=\"options\">\n @for (option of options; track option.title) {\n <li (click)=\"onOptionClick(option)\">\n {{ option.title }}\n </li>\n }\n </ul>\n}\n", styles: [".split-button{display:flex;-webkit-user-select:none;user-select:none;max-height:35px}.split-button .button{align-items:center;border:none;border-radius:4px 0 0 4px;display:flex;padding:8px 8px 8px 12px;transition:all .3s ease-in-out}.split-button .button__icon{font-size:16px;padding:0 4px}.split-button .button__title{font-family:Open Sans,sans-serif;font-size:14px;font-weight:400;line-height:21px}.split-button .dropdown{align-items:center;border:none;border-left:1px solid #608190;border-radius:0 4px 4px 0;display:flex;justify-content:center;padding:12px 8px;transition:all .3s ease-in-out}.split-button--disabled{opacity:.5}.split-button--primary .button,.split-button--primary .dropdown{background-color:#428bca;color:#fff}.split-button--primary:not(.split-button--primary--disabled) .button,.split-button--primary:not(.split-button--primary--disabled) .dropdown{cursor:pointer}.split-button--primary:not(.split-button--primary--disabled) .button:hover,.split-button--primary:not(.split-button--primary--disabled) .dropdown:hover{background-color:#063951}.split-button--secondary .button,.split-button--secondary .dropdown{background-color:#7892a1;color:#fff}.split-button--secondary:not(.split-button--secondary--disabled) .button,.split-button--secondary:not(.split-button--secondary--disabled) .dropdown{cursor:pointer}.split-button--secondary:not(.split-button--secondary--disabled) .button:hover,.split-button--secondary:not(.split-button--secondary--disabled) .dropdown:hover{background-color:#697882}.split-button--default .button,.split-button--default .dropdown{background-color:unset;border:1px solid #d8d8d8;color:#333}.split-button--default:not(.split-button--default--disabled) .button,.split-button--default:not(.split-button--default--disabled) .dropdown{cursor:pointer}.split-button--default:not(.split-button--default--disabled) .button:hover,.split-button--default:not(.split-button--default--disabled) .dropdown:hover{background-color:#d8d8d8}.options{background-color:#fff;border-radius:4px;box-shadow:0 1px 5px #00000040;display:inline-block;list-style:none;margin:2px 0;padding:8px 0;position:absolute;-webkit-user-select:none;user-select:none;z-index:10}.options li{color:#333;cursor:pointer;font-family:Open Sans,sans-serif;font-weight:400;font-size:14px;line-height:21px;padding:8px 16px}.options li:hover{background-color:#d8d8d8}\n"] }]
|
|
65
69
|
}], propDecorators: { disabled: [{
|
|
66
70
|
type: Input
|
|
67
71
|
}], iconClass: [{
|
|
@@ -75,6 +79,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
75
79
|
}], options: [{
|
|
76
80
|
type: Input,
|
|
77
81
|
args: [{ required: true }]
|
|
82
|
+
}], openIcon: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], closeIcon: [{
|
|
85
|
+
type: Input
|
|
78
86
|
}], buttonClicked: [{
|
|
79
87
|
type: Output
|
|
80
88
|
}], onClickout: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seniorsistemas-angular-components-split-button.mjs","sources":["../../projects/angular-components/split-button/src/lib/split-button/split-button.component.ts","../../projects/angular-components/split-button/src/lib/split-button/split-button.component.html","../../projects/angular-components/split-button/src/lib/split-button/split-button.module.ts","../../projects/angular-components/split-button/src/seniorsistemas-angular-components-split-button.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';\r\n\r\nimport { SplitButtonOption } from './models/split-button-option';\r\nimport { SplitButtonType } from './models/split-button-type';\r\n\r\n/**\r\n * @description Botão composto com ação principal e dropdown de opções adicionais.\r\n * Ao clicar no botão principal emite `buttonClicked`; ao clicar no ícone de seta\r\n * abre/fecha o dropdown com a lista de `options`.\r\n *\r\n * @example\r\n * ```html\r\n * <s-split-button\r\n * label=\"Salvar\"\r\n * iconClass=\"fas fa-save\"\r\n * [options]=\"menuOpcoes\"\r\n * (buttonClicked)=\"onSalvar()\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n selector: 's-split-button',\r\n templateUrl: './split-button.component.html',\r\n styleUrls: ['./split-button.component.scss'],\r\n standalone: true,\r\n imports: [NgClass],\r\n})\r\nexport class SplitButtonComponent {\r\n private readonly _eRef = inject(ElementRef);\r\n\r\n /** @description Desabilita o botão principal e o dropdown. @default false */\r\n @Input()\r\n public disabled = false;\r\n\r\n /** @description Classe do ícone exibido no botão principal. Campo obrigatório. */\r\n @Input({ required: true })\r\n public iconClass!: string;\r\n\r\n /** @description Rótulo do botão principal. Campo obrigatório. */\r\n @Input({ required: true })\r\n public label!: string;\r\n\r\n /** @description Estilo visual do botão (`'primary'` ou `'secondary'`). @default 'primary' */\r\n @Input()\r\n public type: SplitButtonType = 'primary';\r\n\r\n /** @description Lista de opções exibidas no dropdown. Campo obrigatório. */\r\n @Input({ required: true })\r\n public options!: SplitButtonOption[];\r\n\r\n /** @description Emitido quando o usuário clica no botão principal (não no dropdown). */\r\n @Output()\r\n public buttonClicked = new EventEmitter();\r\n\r\n public open = false;\r\n\r\n @HostListener('document:click', ['$event'])\r\n public onClickout(event: MouseEvent) {\r\n if (!this._eRef.nativeElement.contains(event.target)) {\r\n this._closeDropdown();\r\n }\r\n }\r\n\r\n public onButtonClick() {\r\n if (!this.disabled) {\r\n this.buttonClicked.emit();\r\n this._closeDropdown();\r\n }\r\n }\r\n\r\n public onDropdownClick() {\r\n if (!this.disabled) {\r\n this.open = !this.open;\r\n }\r\n }\r\n\r\n public onOptionClick(option: SplitButtonOption) {\r\n option.action?.();\r\n this._closeDropdown();\r\n }\r\n\r\n private _closeDropdown() {\r\n this.open = false;\r\n }\r\n}\r\n","<div\n class=\"split-button\"\n [ngClass]=\"{\n 'split-button--primary': type === 'primary',\n 'split-button--secondary': type === 'secondary',\n 'split-button--default': type === 'default',\n 'split-button--disabled': disabled,\n }\"\n>\n <button\n class=\"button\"\n (click)=\"onButtonClick()\"\n >\n <span\n class=\"button__icon\"\n [ngClass]=\"iconClass\"\n ></span>\n <span class=\"button__label\">{{ label }}</span>\n </button>\n <button\n class=\"dropdown\"\n (click)=\"onDropdownClick()\"\n >\n <span\n class=\"dropdown__icon\"\n [
|
|
1
|
+
{"version":3,"file":"seniorsistemas-angular-components-split-button.mjs","sources":["../../projects/angular-components/split-button/src/lib/split-button/split-button.component.ts","../../projects/angular-components/split-button/src/lib/split-button/split-button.component.html","../../projects/angular-components/split-button/src/lib/split-button/split-button.module.ts","../../projects/angular-components/split-button/src/seniorsistemas-angular-components-split-button.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, HostListener, inject, Input, Output } from '@angular/core';\r\n\r\nimport { SplitButtonOption } from './models/split-button-option';\r\nimport { SplitButtonType } from './models/split-button-type';\r\n\r\n/**\r\n * @description Botão composto com ação principal e dropdown de opções adicionais.\r\n * Ao clicar no botão principal emite `buttonClicked`; ao clicar no ícone de seta\r\n * abre/fecha o dropdown com a lista de `options`.\r\n *\r\n * @example\r\n * ```html\r\n * <s-split-button\r\n * label=\"Salvar\"\r\n * iconClass=\"fas fa-save\"\r\n * [options]=\"menuOpcoes\"\r\n * (buttonClicked)=\"onSalvar()\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n selector: 's-split-button',\r\n templateUrl: './split-button.component.html',\r\n styleUrls: ['./split-button.component.scss'],\r\n standalone: true,\r\n imports: [NgClass],\r\n})\r\nexport class SplitButtonComponent {\r\n private readonly _eRef = inject(ElementRef);\r\n\r\n /** @description Desabilita o botão principal e o dropdown. @default false */\r\n @Input()\r\n public disabled = false;\r\n\r\n /** @description Classe do ícone exibido no botão principal. Campo obrigatório. */\r\n @Input({ required: true })\r\n public iconClass!: string;\r\n\r\n /** @description Rótulo do botão principal. Campo obrigatório. */\r\n @Input({ required: true })\r\n public label!: string;\r\n\r\n /** @description Estilo visual do botão (`'primary'` ou `'secondary'`). @default 'primary' */\r\n @Input()\r\n public type: SplitButtonType = 'primary';\r\n\r\n /** @description Lista de opções exibidas no dropdown. Campo obrigatório. */\r\n @Input({ required: true })\r\n public options!: SplitButtonOption[];\r\n\r\n /** @description Classe do ícone exibido quando o dropdown está fechado. @default 'far fa-chevron-down' */\r\n @Input()\r\n public openIcon = 'far fa-chevron-down';\r\n\r\n /** @description Classe do ícone exibido quando o dropdown está aberto. @default 'far fa-chevron-up' */\r\n @Input()\r\n public closeIcon = 'far fa-chevron-up';\r\n\r\n /** @description Emitido quando o usuário clica no botão principal (não no dropdown). */\r\n @Output()\r\n public buttonClicked = new EventEmitter();\r\n\r\n public open = false;\r\n\r\n @HostListener('document:click', ['$event'])\r\n public onClickout(event: MouseEvent) {\r\n if (!this._eRef.nativeElement.contains(event.target)) {\r\n this._closeDropdown();\r\n }\r\n }\r\n\r\n public onButtonClick() {\r\n if (!this.disabled) {\r\n this.buttonClicked.emit();\r\n this._closeDropdown();\r\n }\r\n }\r\n\r\n public onDropdownClick() {\r\n if (!this.disabled) {\r\n this.open = !this.open;\r\n }\r\n }\r\n\r\n public onOptionClick(option: SplitButtonOption) {\r\n option.action?.();\r\n this._closeDropdown();\r\n }\r\n\r\n private _closeDropdown() {\r\n this.open = false;\r\n }\r\n}\r\n","<div\n class=\"split-button\"\n [ngClass]=\"{\n 'split-button--primary': type === 'primary',\n 'split-button--secondary': type === 'secondary',\n 'split-button--default': type === 'default',\n 'split-button--disabled': disabled,\n }\"\n>\n <button\n class=\"button\"\n (click)=\"onButtonClick()\"\n >\n <span\n class=\"button__icon\"\n [ngClass]=\"iconClass\"\n ></span>\n <span class=\"button__label\">{{ label }}</span>\n </button>\n <button\n class=\"dropdown\"\n (click)=\"onDropdownClick()\"\n >\n <span\n class=\"dropdown__icon\"\n [class]=\"open ? closeIcon : openIcon\"\n >\n </span>\n </button>\n</div>\n\n@if (this.open) {\n <ul class=\"options\">\n @for (option of options; track option.title) {\n <li (click)=\"onOptionClick(option)\">\n {{ option.title }}\n </li>\n }\n </ul>\n}\n","import { NgModule } from '@angular/core';\r\n\r\nimport { SplitButtonComponent } from './split-button.component';\r\n\r\n@NgModule({\r\n imports: [SplitButtonComponent],\r\n exports: [SplitButtonComponent],\r\n})\r\nexport class SplitButtonModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -508,7 +508,7 @@ class TableColumnsComponent {
|
|
|
508
508
|
return columns.sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0));
|
|
509
509
|
}
|
|
510
510
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableColumnsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
511
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableColumnsComponent, isStandalone: true, selector: "s-table-columns", inputs: { columns: "columns", rowValue: "rowValue", locale: "locale" }, viewQueries: [{ propertyName: "columnsTemplate", first: true, predicate: ["columnsTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #columnsTemplate>\n @for (column of formattedColumns; track $index; let i = $index) {\n <td\n [ngStyle]=\"column.style\"\n (click)=\"column.onColumnClick ? column.onColumnClick(rowValue) : null\"\n >\n @if (column.type !== 'TOKENS' || !isArray(column.columnValue)) {\n <div [ngClass]=\"{ 'compact-column': column.compact }\">\n @if (column.type !== 'LINK') {\n <span\n [sTooltip]=\"column.tooltip\"\n [escape]=\"false\"\n >\n <ng-container *ngTemplateOutlet=\"columnValueTemplate\"></ng-container>\n </span>\n }\n\n @if (column.type === 'LINK') {\n @if (cellsData[i]?.[0]?.isUninformed) {\n <span class=\"sds-empty-value\">{{ cellsData[i]?.[0]?.value }}</span>\n } @else {\n <a\n [sTooltip]=\"column.tooltip\"\n [escape]=\"false\"\n (click)=\"column.onLinkClick ? column.onLinkClick(rowValue) : null\"\n >\n <ng-container *ngTemplateOutlet=\"columnValueTemplate\"></ng-container>\n </a>\n }\n }\n\n <ng-template #columnValueTemplate>\n @for (cellData of cellsData[i]; track $index) {\n @if (cellData.isUninformed) {\n <span class=\"sds-empty-value\">{{ cellData.value }}</span>\n } @else {\n @if (column.badgeConfigs) {\n <s-badge\n [sTooltip]=\"column.tooltip\"\n [color]=\"column.badgeConfigs.color\"\n [text]=\"cellData.value\"\n ></s-badge>\n } @else {\n <span\n [ngClass]=\"{\n 'column-cell-red': column.color === 'Red',\n 'column-cell-orange': column.color === 'Orange',\n 'column-cell-yellow': column.color === 'Yellow',\n 'column-cell-green': column.color === 'Green',\n 'column-cell-blue': column.color === 'Blue',\n }\"\n >{{ cellData.value }}</span\n >\n }\n }\n\n @if (cellData.separator) {\n <span>{{ cellData.separator }}</span>\n }\n }\n\n @if (!!column.infoSign) {\n <span *sInfoSign=\"column.infoSign\"></span>\n }\n </ng-template>\n </div>\n } @else {\n <s-token-list\n [tokens]=\"getTokensByColumn(column)\"\n [hidePointerEvents]=\"true\"\n ></s-token-list>\n\n @if (!!column.infoSign) {\n <span *sInfoSign=\"column.infoSign\"></span>\n }\n }\n </td>\n }\n</ng-template>\n\n", styles: [":host{display:none}.compact-column{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.column-cell-red{color:#c13018}.column-cell-orange{color:#f8931f}.column-cell-yellow{color:#fcbf10}.column-cell-green{color:#0c9348}.column-cell-blue{color:#428bca}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "directive", type: InfoSignDirective, selector: "[sInfoSign]", inputs: ["sInfoSign", "sInfoSignDisplayTime", "sInfoSignFocusedInputRef", "sInfoSignUseFocusedInputRef"] }, { kind: "component", type: TokenListComponent, selector: "s-token-list", inputs: ["id", "tokens", "removableTokens", "hidePointerEvents"], outputs: ["tokenSelected", "tokenRemoved"] }] });
|
|
511
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TableColumnsComponent, isStandalone: true, selector: "s-table-columns", inputs: { columns: "columns", rowValue: "rowValue", locale: "locale" }, viewQueries: [{ propertyName: "columnsTemplate", first: true, predicate: ["columnsTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #columnsTemplate>\n @for (column of formattedColumns; track $index; let i = $index) {\n <td\n [ngStyle]=\"column.style\"\n (click)=\"column.onColumnClick ? column.onColumnClick(rowValue) : null\"\n >\n @if (column.type !== 'TOKENS' || !isArray(column.columnValue)) {\n <div [ngClass]=\"{ 'compact-column': column.compact }\">\n @if (column.type !== 'LINK') {\n <span\n [sTooltip]=\"column.tooltip\"\n [escape]=\"false\"\n >\n <ng-container *ngTemplateOutlet=\"columnValueTemplate\"></ng-container>\n </span>\n }\n\n @if (column.type === 'LINK') {\n @if (cellsData[i]?.[0]?.isUninformed) {\n <span class=\"sds-empty-value\">{{ cellsData[i]?.[0]?.value }}</span>\n } @else {\n <a\n [sTooltip]=\"column.tooltip\"\n [escape]=\"false\"\n (click)=\"column.onLinkClick ? column.onLinkClick(rowValue) : null\"\n >\n <ng-container *ngTemplateOutlet=\"columnValueTemplate\"></ng-container>\n </a>\n }\n }\n\n <ng-template #columnValueTemplate>\n @for (cellData of cellsData[i]; track $index) {\n @if (cellData.isUninformed) {\n <span class=\"sds-empty-value\">{{ cellData.value }}</span>\n } @else {\n @if (column.badgeConfigs) {\n <s-badge\n [sTooltip]=\"column.tooltip\"\n [color]=\"column.badgeConfigs.color\"\n [text]=\"cellData.value\"\n ></s-badge>\n } @else {\n <span\n [ngClass]=\"{\n 'column-cell-red': column.color === 'Red',\n 'column-cell-orange': column.color === 'Orange',\n 'column-cell-yellow': column.color === 'Yellow',\n 'column-cell-green': column.color === 'Green',\n 'column-cell-blue': column.color === 'Blue',\n }\"\n >{{ cellData.value }}</span\n >\n }\n }\n\n @if (cellData.separator) {\n <span>{{ cellData.separator }}</span>\n }\n }\n\n @if (!!column.infoSign) {\n <span *sInfoSign=\"column.infoSign\"></span>\n }\n </ng-template>\n </div>\n } @else {\n <s-token-list\n [tokens]=\"getTokensByColumn(column)\"\n [hidePointerEvents]=\"true\"\n ></s-token-list>\n\n @if (!!column.infoSign) {\n <span *sInfoSign=\"column.infoSign\"></span>\n }\n }\n </td>\n }\n</ng-template>\n\n", styles: [":host{display:none}.compact-column{overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.column-cell-red{color:#c13018}.column-cell-orange{color:#f8931f}.column-cell-yellow{color:#fcbf10}.column-cell-green{color:#0c9348}.column-cell-blue{color:#428bca}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: TooltipDirective, selector: "[sTooltip]", inputs: ["sTooltip", "tooltipPosition", "showDelay", "displayTime", "tooltipEvent", "escape", "visible", "mobileBehavior", "focusedInputRef", "checkTruncatedText"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "directive", type: InfoSignDirective, selector: "[sInfoSign]", inputs: ["sInfoSign", "sInfoSignDisplayTime", "sInfoSignFocusedInputRef", "sInfoSignUseFocusedInputRef"] }, { kind: "component", type: TokenListComponent, selector: "s-token-list", inputs: ["id", "tokens", "removableTokens", "hidePointerEvents", "removeIconClass"], outputs: ["tokenSelected", "tokenRemoved"] }] });
|
|
512
512
|
}
|
|
513
513
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TableColumnsComponent, decorators: [{
|
|
514
514
|
type: Component,
|