{"version":3,"file":"mosaic-design-infosec-components-components-recipient-select.mjs","sources":["../../../libs/components/recipient-select/src/lib/utils/recipient.ts","../../../libs/components/recipient-select/src/lib/components/recipient-select/recipient-select.component.ts","../../../libs/components/recipient-select/src/lib/components/recipient-select/recipient-select.component.html","../../../libs/components/recipient-select/src/lib/recipient-select.module.ts","../../../libs/components/recipient-select/mosaic-design-infosec-components-components-recipient-select.ts"],"sourcesContent":["import { isObject, isObjectValid, isStringNotEmpty } from '@mosaic-design/infosec-components/utils';\n\nimport { Recipient, ParticipantValue } from '../types';\n\nexport function isRecipient(value: string | Recipient | ParticipantValue): value is Recipient {\n    return isObject(value) && isObjectValid(value, { id: isStringNotEmpty });\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, forwardRef, Injector, Input, ViewChild } from '@angular/core';\nimport { FormControl, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { KbqAutocomplete, KbqAutocompleteSelectedEvent } from '@koobiq/components/autocomplete';\nimport { KbqTagInputEvent } from '@koobiq/components/tags';\nimport { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, Observable, takeUntil } from 'rxjs';\n\nimport { ControlValueAccessor } from '@mosaic-design/infosec-components/core-components/common';\nimport { isEqualByHash } from '@mosaic-design/infosec-components/external/object-hash/utils';\nimport { DestroyService } from '@mosaic-design/infosec-components/services';\nimport { FormGroupValue } from '@mosaic-design/infosec-components/types';\nimport {\n    controlValueChanges$,\n    isEmailValid,\n    isNonNullable,\n    isString,\n    normalizeString\n} from '@mosaic-design/infosec-components/utils';\n\nimport { ParticipantValue, Recipient, Recipients } from '../../types';\nimport { isRecipient } from '../../utils';\n\ninterface Form {\n    search: FormControl<string | Recipient>;\n    recipients: FormControl<(string | Recipient)[]>;\n}\n\n@Component({\n    selector: 'ic-recipient-select',\n    templateUrl: './recipient-select.component.html',\n    styleUrls: ['./recipient-select.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        DestroyService,\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => RecipientSelectComponent),\n            multi: true\n        }\n    ]\n})\nexport class RecipientSelectComponent extends ControlValueAccessor<Recipients | null | undefined, Recipients> {\n    @ViewChild('autocomplete') readonly autocomplete: KbqAutocomplete | undefined;\n    @ViewChild('tagInput') readonly tagInput: ElementRef<HTMLInputElement> | undefined;\n\n    @Input() set recipients(value: Recipient[] | undefined) {\n        this.#recipients$.next(value ?? []);\n    }\n\n    readonly #recipients$ = new BehaviorSubject<Recipient[]>([]);\n\n    readonly form: FormGroup<Form>;\n    readonly filteredRecipients$: Observable<Recipient[]>;\n\n    #lastEmittedValue: Recipients | undefined;\n\n    constructor(\n        injector: Injector,\n        private destroyed$: DestroyService\n    ) {\n        super(injector);\n\n        this.form = this.createForm();\n        this.createFormSubscriptions();\n\n        this.filteredRecipients$ = this.createFilteredRecipients$();\n    }\n\n    writeValue(value: Recipients | undefined | null): void {\n        const participants = value?.participants ?? [];\n        const recipients = value?.recipients ?? [];\n\n        this.form.setValue({\n            search: this.form.value.search ?? '',\n            recipients: [...participants, ...recipients]\n        });\n    }\n\n    formatSelectedRecipient(recipient: Recipient | string): string {\n        return isString(recipient) ? recipient : recipient.name;\n    }\n\n    mapParticipantValue(value: string): ParticipantValue {\n        return {\n            isNew: true,\n            input: value\n        };\n    }\n\n    onRemove(tag: Recipient | string): void {\n        const recipients = this.form.value.recipients ?? [];\n        const index = recipients.indexOf(tag);\n\n        if (index !== -1) {\n            recipients.splice(index, 1);\n            this.form.controls.recipients.setValue(recipients);\n        }\n    }\n\n    onBlur(event: FocusEvent): void {\n        const { tagInput, autocomplete } = this;\n\n        if (tagInput && autocomplete) {\n            const isClickOnOption = autocomplete.options.some((item) => item.getHostElement() === event.relatedTarget);\n\n            if (!isClickOnOption) {\n                const value = tagInput.nativeElement.value;\n\n                try {\n                    this.createRecipientOrParticipant(value);\n                } catch {\n                    return;\n                }\n\n                this.clearSearch();\n            }\n        }\n    }\n\n    onInputTokenEnd(event: KbqTagInputEvent): void {\n        const value = event.value.trim();\n\n        try {\n            this.createRecipientOrParticipant(value);\n        } catch {\n            return;\n        }\n\n        this.clearSearch();\n    }\n\n    onSelect(event: KbqAutocompleteSelectedEvent): void {\n        const optionValue = event.option.value as ParticipantValue | Recipient;\n\n        try {\n            this.createRecipientOrParticipant(optionValue);\n        } catch {\n            return;\n        }\n\n        event.option.deselect();\n        this.clearSearch();\n    }\n\n    private createForm(): FormGroup<Form> {\n        return new FormGroup<Form>({\n            search: new FormControl<string>('', { nonNullable: true }),\n            recipients: new FormControl<(string | Recipient)[]>([], { nonNullable: true })\n        });\n    }\n\n    private createFormSubscriptions(): void {\n        this.form.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe((formValue) => {\n            const value = this.mapValue(formValue);\n            if (!isEqualByHash(value, this.#lastEmittedValue)) {\n                this.#lastEmittedValue = value;\n                this.onChange(value);\n            }\n        });\n    }\n\n    private mapValue(formValue: FormGroupValue<Form>): Recipients {\n        const recipients: Recipient[] = [];\n        const participants: string[] = [];\n\n        formValue.recipients?.forEach((item) => {\n            if (isString(item)) {\n                participants.push(item);\n            } else {\n                recipients.push(item);\n            }\n        });\n\n        return {\n            recipients,\n            participants\n        };\n    }\n\n    private createFilteredRecipients$(): Observable<Recipient[]> {\n        const form$ = controlValueChanges$(this.form, this.destroyed$);\n        const recipients$ = form$.pipe(map((form) => form.recipients));\n        const search$ = form$.pipe(\n            map((form) => form.search),\n            filter(isString),\n            distinctUntilChanged()\n        );\n\n        return combineLatest([recipients$, search$, this.#recipients$]).pipe(\n            map(([recipients, search, users]) => {\n                const normalizedRecipients = recipients ?? [];\n\n                const selectedRecipients = normalizedRecipients.filter(isRecipient);\n                const selectedEmails = normalizedRecipients.filter(isString);\n\n                const availableUsers = users\n                    .filter((user) => !selectedRecipients.some((item) => item.id === user.id))\n                    .filter((user) => user.email && !selectedEmails.includes(user.email));\n\n                if (search) {\n                    const normalizedSearch = normalizeString(search);\n\n                    return availableUsers.filter(\n                        (item) =>\n                            normalizeString(item.name).includes(normalizedSearch) ||\n                            (isNonNullable(item.email) && normalizeString(item.email).includes(normalizedSearch))\n                    );\n                } else {\n                    return availableUsers;\n                }\n            })\n        );\n    }\n\n    private isRecipientEmailValid(value: ParticipantValue | Recipient | string): boolean {\n        if (isRecipient(value)) {\n            return true;\n        } else if (isString(value)) {\n            return isEmailValid(value);\n        } else {\n            return isEmailValid(value.input);\n        }\n    }\n\n    private isRecipientExists(value: ParticipantValue | Recipient | string): boolean {\n        const recipients = this.form.value.recipients ?? [];\n\n        if (isRecipient(value)) {\n            return recipients.filter(isRecipient).some((item) => isEqualByHash(item, value));\n        } else {\n            const valueToSearch = isString(value) ? value : value.input;\n\n            return recipients.filter(isString).includes(valueToSearch);\n        }\n    }\n\n    private mapRecipientInputValue(value: ParticipantValue | Recipient | string): string | Recipient {\n        if (isRecipient(value)) {\n            return value;\n        } else {\n            return isString(value) ? value : value.input;\n        }\n    }\n\n    private createRecipientOrParticipant(value: ParticipantValue | Recipient | string): void {\n        if (!this.isRecipientEmailValid(value)) {\n            throw new Error('Invalid email');\n        }\n\n        const { form } = this;\n\n        if (!this.isRecipientExists(value)) {\n            const formValue = this.mapRecipientInputValue(value);\n            form.controls.recipients.setValue([...(form.value.recipients ?? []), formValue]);\n        }\n    }\n\n    private clearSearch(): void {\n        const { form, tagInput } = this;\n\n        if (tagInput) {\n            tagInput.nativeElement.value = '';\n        }\n\n        form.controls.search.setValue('');\n    }\n}\n","<form [formGroup]=\"form\" class=\"ic-recipient-select\">\n    <kbq-form-field>\n        <kbq-tag-list #tags [formControl]=\"form.controls.recipients\">\n            <kbq-tag\n                *ngFor=\"let selectedRecipient of form.value.recipients ?? []\"\n                [value]=\"selectedRecipient\"\n                (removed)=\"onRemove(selectedRecipient)\"\n            >\n                {{ formatSelectedRecipient(selectedRecipient) }}\n                <i kbq-icon=\"kbq-xmark-s_16\" kbqTagRemove></i>\n            </kbq-tag>\n\n            <input\n                #tagInput\n                [formControl]=\"form.controls.search\"\n                [kbqAutocomplete]=\"autocomplete\"\n                [kbqTagInputFor]=\"tags\"\n                (kbqTagInputTokenEnd)=\"onInputTokenEnd($event)\"\n                [kbqTagInputAddOnBlur]=\"false\"\n                (blur)=\"onBlur($event)\"\n            />\n        </kbq-tag-list>\n        <kbq-autocomplete #autocomplete (optionSelected)=\"onSelect($event)\" class=\"recipient-select-autocomplete\">\n            <kbq-option\n                class=\"ic-recipient-select__option\"\n                *ngIf=\"tagInput.value\"\n                [value]=\"mapParticipantValue(tagInput.value)\"\n                >{{ tagInput.value }}\n            </kbq-option>\n\n            <kbq-option\n                class=\"ic-recipient-select__option\"\n                *ngFor=\"let recipient of filteredRecipients$ | icPush: []\"\n                [value]=\"recipient\"\n            >\n                <div class=\"ic-recipient-select__recipient\">\n                    <span class=\"ic-recipient-select__name\">{{ recipient.name }}</span>\n                    <span class=\"ic-recipient-select__email\">{{ recipient.email }}</span>\n                </div>\n            </kbq-option>\n        </kbq-autocomplete>\n    </kbq-form-field>\n</form>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { KbqAutocompleteModule } from '@koobiq/components/autocomplete';\nimport { KbqFormFieldModule } from '@koobiq/components/form-field';\nimport { KbqIconModule } from '@koobiq/components/icon';\nimport { KbqTagsModule } from '@koobiq/components/tags';\n\nimport { IcPushPipe } from '@mosaic-design/infosec-components/external/ngrx-component/pipes';\n\nimport { RecipientSelectComponent } from './components';\n\n/**\n * @deprecated Будет удален в 19 версии. Компоненты будут standalone\n */\n@NgModule({\n    imports: [\n        CommonModule,\n        ReactiveFormsModule,\n\n        KbqFormFieldModule,\n        KbqTagsModule,\n        KbqAutocompleteModule,\n        KbqIconModule,\n\n        IcPushPipe\n    ],\n    declarations: [RecipientSelectComponent],\n    exports: [RecipientSelectComponent]\n})\nexport class IcRecipientSelectModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}