@trismegisto/spine 3.3.5 → 3.3.6
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/README.md +4 -2
- package/fesm2022/trismegisto-spine-audit.mjs +20 -2
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs} +7 -3
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs → trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs} +24 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs → trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs} +2 -2
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs} +21 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs → trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs → trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs} +21 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs → trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs} +22 -4
- package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs → trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs} +46 -4
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs → trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs} +23 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs → trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs} +6 -3
- package/fesm2022/trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +10 -10
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs +294 -0
- package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs → trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs} +18 -4
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs → trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs} +1012 -57
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout.mjs +1 -1
- package/fesm2022/trismegisto-spine-modal.mjs +4 -1
- package/fesm2022/trismegisto-spine-modal.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-routing.mjs +2 -2
- package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +2 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs +4 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +200 -69
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +11 -4
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +124 -105
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-modal.d.ts +2 -1
- package/types/trismegisto-spine-modal.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine-side-panel.d.ts +2 -1
- package/types/trismegisto-spine-side-panel.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +104 -28
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +0 -1
package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs","sources":["../../../projects/ui/auto-service/src/groups/group-modal/auto-service-group-modal.component.ts","../../../projects/ui/auto-service/src/groups/group-modal/auto-service-group-modal.component.html","../../../projects/ui/auto-service/src/groups/members-loader.ts","../../../projects/ui/auto-service/src/groups/members/auto-service-group-members.component.ts","../../../projects/ui/auto-service/src/groups/members/auto-service-group-members.component.html","../../../projects/ui/auto-service/src/groups/members-modal/auto-service-group-members-modal.component.ts","../../../projects/ui/auto-service/src/groups/members-modal/auto-service-group-members-modal.component.html","../../../projects/ui/auto-service/src/groups/auto-service-groups.component.ts","../../../projects/ui/auto-service/src/groups/auto-service-groups.component.html"],"sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { CheckboxComponent } from '@trismegisto/angular/checkbox';\nimport { ComboboxComponent, ComboboxOption } from '@trismegisto/angular/combobox';\nimport { InputComponent } from '@trismegisto/angular/input';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { TextareaComponent } from '@trismegisto/angular/textarea';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { autoServiceErrorText } from '../../auto-service-errors';\nimport { optionalIdBody, optionalIdValidator } from '../../optional-id.validator';\nimport { AutoServiceGroup, AutoServiceGroupType, AutoServiceService } from '../../auto-service.service';\n\n/** Limite do nome no servidor (1–100). */\nexport const GROUP_NAME_MAX = 100;\n\n/**\n * Criar/editar grupo do projeto do client. Só os tipos `assignable` são oferecidos (o Administrador nunca é: é do grupo\n * de administração, que é gerido só no painel central e não aparece no auto-serviço). Falha do servidor aparece no próprio modal, no idioma ativo.\n * Mirror de admin/ui/.../groups/modals/groups-modal (argos-admin), sem o seletor de projeto.\n */\n@Component({\n selector: 'spine-auto-service-group-modal',\n standalone: true,\n imports: [\n CommonModule, ReactiveFormsModule, AlertComponent, ButtonComponent, CheckboxComponent, ComboboxComponent, InputComponent,\n ModalComponent, TextareaComponent,\n ],\n templateUrl: './auto-service-group-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./auto-service-group-modal.component.scss'],\n})\nexport class AutoServiceGroupModalComponent implements OnChanges {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly service = inject(AutoServiceService);\n /** Grupo em edição; `null` cria. */\n @Input() group: AutoServiceGroup | null = null;\n @Input() clientId = '';\n @Input() groupTypes: readonly AutoServiceGroupType[] = [];\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n /** O grupo gravado (o servidor devolve o grupo criado/alterado). */\n @Output() saved = new EventEmitter<AutoServiceGroup>();\n\n protected readonly nameMax = GROUP_NAME_MAX;\n readonly name = new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.maxLength(GROUP_NAME_MAX)] });\n readonly typeId = new FormControl('', { nonNullable: true, validators: [Validators.required] });\n readonly description = new FormControl('', { nonNullable: true });\n /** Id opcional só na criação (mesmo grupo com o mesmo id em homologação e produção). */\n readonly newId = new FormControl('', { nonNullable: true, validators: [optionalIdValidator] });\n readonly enabled = new FormControl(true, { nonNullable: true });\n\n saving = false;\n saveError: string | null = null;\n\n get isEdit(): boolean { return !!this.group?.id; }\n\n /** Tipos que dá para escolher (`assignable`; o Administrador nunca). */\n typeOptions: ComboboxOption[] = [];\n\n get canSave(): boolean {\n if (this.saving) return false;\n return this.name.valid && !!this.name.value.trim() && this.typeId.valid && (this.isEdit || this.newId.valid);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['groupTypes'] || changes['group']) {\n this.typeOptions = this.groupTypes\n .filter((t) => t.assignable !== false)\n .map((t) => ({ value: t.id, label: t.name }));\n }\n if (changes['open'] && this.open) this.resetForm();\n }\n\n resetForm() {\n const g = this.isEdit ? this.group : null;\n this.saveError = null;\n this.name.reset(g?.name ?? '');\n this.typeId.reset(g?.type?.id ?? '');\n this.description.reset(g?.description ?? '');\n this.newId.reset('');\n this.enabled.reset(g ? !!g.enabled : true);\n }\n\n onModalOpenChange(value: boolean) { this.open = value; this.openChange.emit(value); }\n close() { this.onModalOpenChange(false); }\n\n async save() {\n if (!this.canSave) return;\n this.saving = true;\n this.saveError = null;\n this.cdr.markForCheck();\n // Descrição vazia vai como null na edição: o servidor só ignora campo ausente, e é assim que se apaga a descrição.\n const description = this.description.value.trim();\n try {\n let saved: AutoServiceGroup;\n if (this.isEdit && this.group) {\n saved = await this.service.updateGroup(this.clientId, this.group.id,\n { name: this.name.value.trim(), type_id: this.typeId.value, description: description || null, enabled: this.enabled.value });\n } else {\n saved = await this.service.createGroup(this.clientId, {\n ...optionalIdBody('group_id', this.newId.value),\n name: this.name.value.trim(), type_id: this.typeId.value, ...(description ? { description } : {}),\n });\n }\n this.saved.emit(saved);\n this.close();\n } catch (err) {\n this.saveError = autoServiceErrorText(err, this.text, this.text.groupSaveError);\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"isEdit ? text.editGroup : text.newGroup\" (closed)=\"close()\">\n <div class=\"form-stack\">\n <hm-alert *ngIf=\"saveError\" variant=\"error\">{{ saveError }}</hm-alert>\n @if (!isEdit) {\n <hm-input [formControl]=\"newId\" [label]=\"text.optionalId\" [placeholder]=\"text.optionalIdPlaceholder\" [hint]=\"text.optionalIdHint\" [messages]=\"{ optionalId: text.optionalIdInvalid }\" />\n }\n <hm-input [formControl]=\"name\" [label]=\"text.groupName\" [maxLength]=\"nameMax\" />\n <hm-combobox [formControl]=\"typeId\" [options]=\"typeOptions\" [label]=\"text.groupType\" [placeholder]=\"text.groupTypePlaceholder\" />\n <hm-textarea [formControl]=\"description\" [label]=\"text.groupDescription\" />\n <hm-checkbox *ngIf=\"isEdit\" [formControl]=\"enabled\" [label]=\"text.active\" />\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [disabled]=\"!canSave\" [loading]=\"saving\" (clicked)=\"save()\">{{ isEdit ? text.save : text.create }}</hm-button>\n </ng-container>\n</hm-modal>\n","// Mesma peça de argos admin/ui src/shared/members-loader.ts (o painel central usa a dele). Interna deste ponto de\n// entrada: não vai no public-api.\nimport { computed, signal } from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\n\n/** Membros por página pedidos ao servidor: o teto das rotas `GET …/members` do argos-admin. */\nexport const MEMBERS_PAGE_LIMIT = 200;\n\n/** Uma página como as rotas `GET …/members` devolvem. */\nexport interface MembersPageLike<T> {\n members?: T[];\n total?: number;\n}\n\n/** Pede a página `page` (1..) ao servidor. */\nexport interface MembersPageFetcher<T> {\n (page: number): Observable<MembersPageLike<T>>;\n}\n\n/**\n * Lista inteira de membros carregada aos poucos: o servidor pagina (nunca monta o grupo inteiro em memória) e a tela\n * pede as páginas uma depois da outra, acrescentando conforme chegam, até ter o `total` (ou vir uma página vazia). A\n * lista já aparece e funciona com a primeira página; `loading` diz que ainda há páginas a caminho.\n *\n * `cancel()` desfaz a inscrição da requisição pendente (o HttpClient a cancela); chame ao fechar a tela ou trocar de\n * grupo. Falha numa página para em `error`, com o que já chegou intacto; `retry()` continua da página que falhou.\n */\nexport class MembersLoader<T> {\n readonly items = signal<readonly T[]>([]);\n /** Total do servidor (o grupo inteiro). */\n readonly total = signal(0);\n /** Ainda pedindo páginas. */\n readonly loading = signal(false);\n /** A primeira página já chegou (antes dela a tela mostra o estado de carregando). */\n readonly ready = signal(false);\n readonly error = signal<unknown>(null);\n readonly loaded = computed(() => this.items().length);\n\n private current: Subscription | null = null;\n private nextPage = 1;\n private readonly ids = new Set<string>();\n\n constructor(\n private readonly fetchPage: MembersPageFetcher<T>,\n private readonly idOf: (item: T) => string,\n ) {}\n\n /** Recomeça do zero (cancela o que estava a caminho). */\n start(): void {\n this.cancel();\n this.items.set([]);\n this.ids.clear();\n this.total.set(0);\n this.ready.set(false);\n this.error.set(null);\n this.nextPage = 1;\n this.fetchNext();\n }\n\n /** Depois de uma falha: continua da página que falhou, sem perder o que já chegou. */\n retry(): void {\n if (this.loading()) return;\n this.error.set(null);\n this.fetchNext();\n }\n\n cancel(): void {\n this.current?.unsubscribe();\n this.current = null;\n this.loading.set(false);\n }\n\n /**\n * Mudança feita pela própria tela depois de gravar (incluir, remover, trocar função), sem reler: `totalDelta` mantém o\n * total coerente com a lista.\n */\n patch(change: (items: readonly T[]) => readonly T[], totalDelta = 0): void {\n const next = change(this.items());\n this.ids.clear();\n for (const item of next) this.ids.add(this.idOf(item));\n this.items.set(next);\n this.total.update((n) => Math.max(next.length, n + totalDelta));\n }\n\n private fetchNext(): void {\n this.loading.set(true);\n // A continuação (próxima página) roda no `complete`; com uma resposta síncrona ela começa antes do `subscribe`\n // devolver, por isso a inscrição vai num contêiner criado antes.\n const holder = new Subscription();\n this.current = holder;\n let more = false;\n holder.add(this.fetchPage(this.nextPage).subscribe({\n next: (res) => {\n const page = res.members ?? [];\n const fresh = page.filter((item) => !this.ids.has(this.idOf(item)));\n for (const item of fresh) this.ids.add(this.idOf(item));\n if (fresh.length) this.items.update((list) => [...list, ...fresh]);\n this.total.set(Math.max(res.total ?? 0, this.items().length));\n this.ready.set(true);\n this.nextPage += 1;\n // Página vazia, ou só com quem já chegou (o servidor mudou no meio), encerra: sem isso a carga não teria fim.\n more = fresh.length > 0 && this.items().length < this.total();\n },\n error: (err) => {\n if (this.current !== holder) return;\n this.current = null;\n this.error.set(err);\n this.ready.set(true);\n this.loading.set(false);\n },\n complete: () => {\n if (this.current !== holder) return;\n if (more) {\n this.fetchNext();\n } else {\n this.current = null;\n this.loading.set(false);\n }\n },\n }));\n }\n}\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ChangeDetectionStrategy, inject, computed, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { tap } from 'rxjs';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { DataGridComponent, DataGridCellDirective } from '@trismegisto/angular/data-grid';\nimport { HermesI18nService } from '@trismegisto/angular/i18n';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { GridColumn } from '@trismegisto/primitives/data-grid';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { AutoServiceService } from '../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { MEMBERS_PAGE_LIMIT, MembersLoader } from '../members-loader';\n\ninterface GroupMemberRow {\n user_id: string;\n username: string;\n email: string;\n name?: string | null;\n picture?: string | null;\n enabled?: boolean;\n joined_at?: string | null;\n}\n\n// Mirror de admin/ui/.../groups/members/group-members.component.ts (argos-admin),\n// adaptado pra falar com /auto-service/:clientId/groups/:groupId/members em vez de\n// /admin/groups/:groupId/members. Todos os membros na grade: o servidor pagina e a tela pede as páginas até o fim\n// (`MembersLoader`); busca local e instantânea, rolagem virtual, sem paginador.\n@Component({\n selector: 'spine-auto-service-group-members',\n standalone: true,\n imports: [CommonModule, ButtonComponent, TagComponent, AccountAvatarComponent, DataGridComponent, DataGridCellDirective],\n templateUrl: './auto-service-group-members.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./auto-service-group-members.component.scss'],\n})\nexport class AutoServiceGroupMembersComponent implements OnChanges {\n\n private readonly catalog = inject(SPINE_MESSAGES);\n private readonly i18n = inject(HermesI18nService);\n /** Data e hora curtas no idioma ativo. */\n protected formatDate(value: string | null | undefined): string {\n return value ? new Intl.DateTimeFormat(this.catalog.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(value)) : '';\n }\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n @Input() clientId = '';\n @Input() groupId = '';\n @Input() refreshTrigger = 0;\n /** Quantos membros o grupo tem (o total do servidor). */\n @Output() countChange = new EventEmitter<number>();\n @Output() manageMembers = new EventEmitter<void>();\n\n readonly loader = new MembersLoader<GroupMemberRow>(\n (page) => this.service.getGroupMembers(this.clientId, this.groupId, { page, limit: MEMBERS_PAGE_LIMIT }).pipe(\n tap((res) => this.countChange.emit(res.total ?? 0)),\n ),\n (m) => m.user_id,\n );\n\n readonly rowId = (m: GroupMemberRow) => m.user_id;\n\n readonly columns = computed<GridColumn<GroupMemberRow>[]>(() => [\n // A busca da grade procura nome, login e e-mail; a ordem é pelo nome.\n { key: 'username', title: this.text.colUser, value: (m) => m.name || m.username, raw: (m) => [m.name, m.username, m.email].filter(Boolean).join(' '), sortable: true },\n {\n key: 'joined_at',\n title: this.text.colMemberSince,\n value: (m) => (m.joined_at ? this.formatDate(m.joined_at) : '—'),\n sortable: true,\n searchable: false,\n },\n ]);\n\n /** \"Carregando membros… 400 de 1.250\". */\n protected readonly progressLabel = computed(() => {\n const number = new Intl.NumberFormat(this.i18n.formatLocale());\n return formatMessage(this.text.membersLoadingProgress, { loaded: number.format(this.loader.loaded()), total: number.format(this.loader.total()) });\n });\n\n protected readonly incompleteLabel = computed(() => {\n const number = new Intl.NumberFormat(this.i18n.formatLocale());\n return formatMessage(this.text.membersLoadIncomplete, { loaded: number.format(this.loader.loaded()), total: number.format(this.loader.total()) });\n });\n\n constructor(private service: AutoServiceService) {\n inject(DestroyRef).onDestroy(() => this.loader.cancel());\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['groupId'] || changes['refreshTrigger']) this.load();\n }\n\n /** Recomeça do zero (outro grupo, ou depois de salvar no modal). */\n load() {\n if (!this.clientId || !this.groupId) {\n this.loader.cancel();\n this.loader.patch(() => [], -this.loader.total());\n this.countChange.emit(0);\n return;\n }\n this.loader.start();\n }\n}\n","@if (loader.error()) {\n <!-- Falha numa página: o que já chegou continua na grade; \"Tentar de novo\" segue de onde parou. -->\n <div class=\"members-status\">\n <span class=\"members-status__error\">{{ incompleteLabel() }}</span>\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"refresh\" (clicked)=\"loader.retry()\">{{ text.retryLoad }}</hm-button>\n </div>\n} @else if (loader.loading() && loader.ready()) {\n <p class=\"members-status members-status--progress\" role=\"status\">{{ progressLabel() }} · {{ text.membersPartialResults }}</p>\n}\n\n<!-- Todos os membros na grade (carregados aos poucos): busca local, rolagem virtual, sem paginador. -->\n<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"loader.items()\"\n [rowId]=\"rowId\"\n [caption]=\"text.membersCaption\"\n [loading]=\"!loader.ready()\"\n [emptyMessage]=\"text.noMembers\"\n [noResultsMessage]=\"text.noMembersMatch\"\n [paginated]=\"false\"\n [pagination]=\"false\"\n [virtual]=\"true\"\n maxHeight=\"32rem\"\n>\n <hm-button dataGridActions icon=\"employee-group\" (clicked)=\"manageMembers.emit()\">{{ text.manageMembers }}</hm-button>\n <ng-template hmCell=\"username\" let-m>\n <div class=\"user-cell\">\n <hm-account-avatar class=\"user-cell__avatar\" [name]=\"m.name || m.username\" [imageUrl]=\"m.picture\"></hm-account-avatar>\n <div class=\"user-cell__body\">\n <div class=\"user-cell__name\">\n <b>{{ m.name || m.username }}</b>\n <hm-tag [name]=\"m.enabled ? text.active : text.inactive\" [color]=\"m.enabled ? 'success' : 'danger'\" />\n </div>\n <div class=\"user-cell__email\">\n <ng-container *ngIf=\"m.name\">{{ m.username }} · </ng-container>{{ m.email }}\n </div>\n </div>\n </div>\n </ng-template>\n</hm-data-grid>\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, inject, computed, signal, ChangeDetectorRef, DestroyRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { map, tap } from 'rxjs';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { BadgeComponent } from '@trismegisto/angular/badge';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { ComboboxComponent, ComboboxOption } from '@trismegisto/angular/combobox';\nimport { DataGridCellDirective, DataGridComponent } from '@trismegisto/angular/data-grid';\nimport { HERMES_MESSAGES, HermesI18nService } from '@trismegisto/angular/i18n';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { IconButtonComponent } from '@trismegisto/angular/icon-button';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { EMPTY_SELECTION, GridColumn, GridSelection } from '@trismegisto/primitives/data-grid';\nimport { AutoServiceMemberSuggestion, AutoServiceService } from '../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { autoServiceErrorText } from '../../auto-service-errors';\nimport { MEMBERS_PAGE_LIMIT, MembersLoader } from '../members-loader';\n\ninterface StagedMember {\n user_id: string;\n username: string;\n email: string;\n name?: string | null;\n picture?: string | null;\n enabled?: boolean;\n role?: string | null;\n joined_at?: string | null;\n added_by_username?: string | null;\n new?: boolean;\n}\n\n// Funções do membro no grupo (auth.group_members.role); vazio = membro sem função, que só vê os outros.\nconst ROLE_OPTIONS = ['Administrador', 'Editor'];\n/** Sugestões mostradas: quem já está em outros grupos deste sistema (o servidor ordena pelos mais conectados). */\nconst SUGGESTIONS = 8;\n\nlet searchSequence = 0;\n\nfunction toStaged(m: any): StagedMember {\n return {\n user_id: m.user_id, username: m.username, email: m.email, name: m.name ?? null,\n picture: m.picture ?? null, enabled: m.enabled, role: m.role ?? null,\n joined_at: m.joined_at, added_by_username: m.added_by_username ?? null,\n };\n}\n\n/**\n * Membros do grupo, com as alterações guardadas até o Salvar. A lista inteira vem do servidor em páginas, uma depois\n * da outra (`MembersLoader`), e já funciona com a primeira; a busca é local e instantânea sobre o que já chegou.\n */\n@Component({\n selector: 'spine-auto-service-group-members-modal',\n standalone: true,\n imports: [\n CommonModule, FormsModule, AccountAvatarComponent, AlertComponent, BadgeComponent, ButtonComponent, ComboboxComponent, DataGridComponent,\n DataGridCellDirective, IconButtonComponent, IconComponent, ModalComponent, TagComponent,\n ],\n templateUrl: './auto-service-group-members-modal.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./auto-service-group-members-modal.component.scss'],\n})\nexport class AutoServiceGroupMembersModalComponent implements OnChanges {\n\n private readonly catalog = inject(SPINE_MESSAGES);\n private readonly i18n = inject(HermesI18nService);\n /** Data e hora curtas no idioma ativo. */\n protected formatDate(value: string | null | undefined): string {\n return value ? new Intl.DateTimeFormat(this.catalog.meta.locale, { dateStyle: 'short', timeStyle: 'short' }).format(new Date(value)) : '';\n }\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n protected readonly fmt = formatMessage;\n @Input() clientId = '';\n @Input() groupId = '';\n @Input() groupName = '';\n @Input() open = false;\n @Output() openChange = new EventEmitter<boolean>();\n @Output() saved = new EventEmitter<void>();\n\n roleOptions = ROLE_OPTIONS;\n /** Opções de função (o vazio é o membro sem função), como no painel central. */\n protected readonly roleCombo = computed<readonly ComboboxOption[]>(() => [\n { value: '', label: this.text.noRole },\n ...this.roleOptions.map((r) => ({ value: r, label: r })),\n ]);\n /** Liga o rótulo \"Adicionar usuário\" ao campo de busca. */\n protected readonly searchId = `spine-members-search-${++searchSequence}`;\n protected readonly titleId = `${this.searchId}-title`;\n protected readonly clearLabel = inject(HERMES_MESSAGES).searchField.clear;\n /** Busca na lista de membros (nome, username ou e-mail): local e instantânea. */\n readonly memberSearch = signal('');\n saving = false;\n /** Falha ao gravar (no idioma ativo); o que já tinha sido gravado fica — a lista é recarregada. */\n saveError: string | null = null;\n\n /** Os membros gravados, carregados aos poucos. Página que traz quem estava como \"novo\" o tira das inclusões. */\n readonly loader = new MembersLoader<StagedMember>(\n (page) => this.service.getGroupMembers(this.clientId, this.groupId, { page, limit: MEMBERS_PAGE_LIMIT }).pipe(\n map((res) => ({ total: res.total, members: (res.members ?? []).map(toStaged) })),\n tap((res) => this.dropStagedExisting(res.members)),\n ),\n (m) => m.user_id,\n );\n /** Inclusões ainda não salvas, a mais recente primeiro. */\n private readonly added = signal<StagedMember[]>([]);\n /** Trocas de função dos que já são membros (id -> função nova; null = sem função). */\n private readonly roleChanges = signal<ReadonlyMap<string, string | null>>(new Map());\n\n /** A lista inteira: as inclusões no topo, depois os gravados com as trocas de função aplicadas. */\n readonly members = computed<StagedMember[]>(() => {\n const changes = this.roleChanges();\n return [\n ...this.added(),\n ...this.loader.items().map((m) => (changes.has(m.user_id) ? { ...m, role: changes.get(m.user_id) ?? null } : m)),\n ];\n });\n\n readonly filteredMembers = computed(() => {\n const term = this.memberSearch().trim().toLowerCase();\n const all = this.members();\n if (!term) return all;\n return all.filter((m) => [m.name, m.username, m.email].some((v) => (v ?? '').toLowerCase().includes(term)));\n });\n\n /** Número no título: o grupo inteiro (total do servidor) mais as inclusões ainda não salvas. */\n readonly memberCount = computed(() => this.loader.total() + this.added().length);\n\n /** \"Carregando membros… 400 de 1.250\". */\n protected readonly progressLabel = computed(() => {\n const number = new Intl.NumberFormat(this.i18n.formatLocale());\n return formatMessage(this.text.membersLoadingProgress, { loaded: number.format(this.loader.loaded()), total: number.format(this.loader.total()) });\n });\n\n protected readonly incompleteLabel = computed(() => {\n const number = new Intl.NumberFormat(this.i18n.formatLocale());\n return formatMessage(this.text.membersLoadIncomplete, { loaded: number.format(this.loader.loaded()), total: number.format(this.loader.total()) });\n });\n\n /** Ids marcados pra remoção — o grid seleciona por id (não por objeto, ver `GridSelection`). */\n checkedForRemovalIds: GridSelection = EMPTY_SELECTION;\n addSearch = '';\n addSearchResults: any[] = [];\n selectedToAdd: any = null;\n selectedRole: string | null = null;\n private addSearchTimer: any;\n /** Quem já está em outros grupos deste sistema e ainda não neste (até `SUGGESTIONS`); clicar inclui direto. */\n suggestions: AutoServiceMemberSuggestion[] = [];\n\n readonly rowId = (m: StagedMember) => m.user_id;\n\n readonly columns = computed<GridColumn<StagedMember>[]>(() => [\n { key: 'username', title: this.text.colUser, value: (m) => [m.name, m.username, m.email].filter(Boolean).join(' '), sortable: true },\n { key: 'role', title: this.text.colRole, value: (m) => m.role ?? '—' },\n {\n key: 'joined_at',\n title: this.text.colAddedAt,\n value: (m) => (m.joined_at ? this.formatDate(m.joined_at) : '—'),\n sortable: true,\n },\n ]);\n\n constructor(private service: AutoServiceService) {\n inject(DestroyRef).onDestroy(() => this.loader.cancel());\n }\n\n ngOnChanges(changes: SimpleChanges) { if (changes['open'] && this.open) { this.resetAndLoad(); } }\n\n onModalOpenChange(value: boolean) {\n this.open = value;\n // Fechado, nada mais vem do servidor (a página pendente é cancelada).\n if (!value) this.loader.cancel();\n this.openChange.emit(value);\n }\n close() { this.onModalOpenChange(false); }\n\n get checkedForRemoval(): StagedMember[] {\n return this.loader.items().filter((m) => this.checkedForRemovalIds.has(m.user_id));\n }\n get removalCount(): number { return this.checkedForRemovalIds.size; }\n\n /** Segunda linha da pessoa: \"username · e-mail\" (só o e-mail quando o nome já é o username). */\n protected metaOf(u: { name?: string | null; username: string; email?: string | null }): string {\n return [u.name ? u.username : null, u.email].filter(Boolean).join(' · ');\n }\n\n /** Dica do chip: em quais grupos deste sistema a pessoa já está. */\n protected suggestionTitle(u: AutoServiceMemberSuggestion): string {\n return [this.metaOf(u), u.groups?.length ? formatMessage(this.text.suggestionGroups, { groups: u.groups.join(', ') }) : '']\n .filter(Boolean).join('\\n');\n }\n\n resetAndLoad() {\n this.addSearch = ''; this.addSearchResults = []; this.selectedToAdd = null; this.selectedRole = null;\n this.memberSearch.set('');\n this.checkedForRemovalIds = EMPTY_SELECTION; this.saveError = null;\n this.added.set([]); this.roleChanges.set(new Map());\n this.loader.start();\n void this.loadSuggestions();\n }\n\n /** Quem foi incluído como \"novo\" mas a página que chegou mostra que já é membro: sai das inclusões. */\n private dropStagedExisting(page: readonly StagedMember[]) {\n const ids = new Set(page.map((m) => m.user_id));\n if (this.added().some((m) => ids.has(m.user_id))) this.added.update((list) => list.filter((m) => !ids.has(m.user_id)));\n }\n\n /** Ids que não podem entrar de novo: os membros já carregados e as inclusões. */\n private takenIds(): Set<string> {\n return new Set([...this.loader.items().map((m) => m.user_id), ...this.added().map((m) => m.user_id)]);\n }\n\n /** Sugestões do servidor (ele já tira quem é membro); falha (Argos sem a rota, rede) só deixa sem sugestões. */\n async loadSuggestions() {\n this.suggestions = [];\n if (!this.clientId || !this.groupId) return;\n try {\n const res = await this.service.getMemberSuggestions(this.clientId, this.groupId, SUGGESTIONS);\n const taken = this.takenIds();\n this.suggestions = (res.users ?? []).filter((u) => !taken.has(u.id)).slice(0, SUGGESTIONS);\n } catch {\n this.suggestions = [];\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n /** Chip de sugestão: inclui direto (com a função escolhida ao lado), sem passar pela busca. */\n addSuggestion(user: AutoServiceMemberSuggestion) { this.stageMember(user); }\n\n onAddSearchChange(value: string) {\n this.addSearch = value; this.selectedToAdd = null; clearTimeout(this.addSearchTimer);\n if (value.trim().length < 2) { this.addSearchResults = []; return; }\n this.addSearchTimer = setTimeout(async () => {\n const res = await this.service.searchUsers(this.clientId, { search: value.trim(), limit: 10 });\n const taken = this.takenIds();\n this.addSearchResults = (res.users ?? []).filter((u: any) => !taken.has(u.id));\n this.cdr.markForCheck();\n }, 300);\n }\n\n selectCandidate(user: any) { this.selectedToAdd = user; this.addSearch = user.username; this.addSearchResults = []; }\n clearSelectedToAdd() { this.selectedToAdd = null; this.addSearch = ''; this.addSearchResults = []; }\n\n addSelectedMember() {\n if (this.selectedToAdd) this.stageMember(this.selectedToAdd);\n }\n\n private stageMember(user: any) {\n if (this.takenIds().has(user.id)) return;\n this.added.update((list) => [{\n user_id: user.id, username: user.username, email: user.email, name: user.name ?? null, picture: user.picture ?? null, enabled: user.enabled,\n role: this.selectedRole, joined_at: null, added_by_username: null, new: true,\n }, ...list]);\n this.suggestions = this.suggestions.filter((u) => u.id !== user.id);\n this.clearSelectedToAdd(); this.selectedRole = null;\n }\n\n removeStagedNew(member: StagedMember) { this.added.update((list) => list.filter((m) => m.user_id !== member.user_id)); }\n\n /** Função escolhida na linha: inclusão guarda nela; membro guarda como troca (ou deixa de ser, se voltou à gravada). */\n setRole(member: StagedMember, value: string) {\n const role = value || null;\n if (member.new) {\n this.added.update((list) => list.map((m) => (m.user_id === member.user_id ? { ...m, role } : m)));\n return;\n }\n const stored = this.loader.items().find((m) => m.user_id === member.user_id);\n const next = new Map(this.roleChanges());\n if (stored && role === (stored.role ?? null)) next.delete(member.user_id);\n else next.set(member.user_id, role);\n this.roleChanges.set(next);\n }\n\n /** `[(selection)]` do grid: separa o que ainda é staged (nunca existiu no servidor — remove\n * na hora, não \"marca pra remover\") do que já existe (fica marcado, removido só no Salvar). */\n onSelectionChange(ids: GridSelection): void {\n const stillNew = this.added().filter((m) => ids.has(m.user_id));\n for (const m of stillNew) this.removeStagedNew(m);\n this.checkedForRemovalIds = new Set([...ids].filter((id) => !stillNew.some((m) => m.user_id === id)));\n }\n\n isMarkedForRemoval(member: StagedMember): boolean { return this.checkedForRemovalIds.has(member.user_id); }\n undoRemoval(member: StagedMember): void {\n const next = new Set(this.checkedForRemovalIds);\n next.delete(member.user_id);\n this.checkedForRemovalIds = next;\n }\n\n async save() {\n this.saving = true;\n this.saveError = null;\n try {\n for (const m of this.added()) { await this.service.addGroupMember(this.clientId, this.groupId, m.user_id, m.role ?? null); }\n const removed = this.checkedForRemoval;\n for (const m of removed) { await this.service.removeGroupMember(this.clientId, this.groupId, m.user_id); }\n const removedIds = new Set(removed.map((m) => m.user_id));\n for (const [userId, role] of this.roleChanges()) {\n if (removedIds.has(userId)) continue;\n await this.service.updateGroupMemberRole(this.clientId, this.groupId, userId, role);\n }\n this.saved.emit();\n this.close();\n } catch (err) {\n // Parte pode ter sido gravada (as chamadas são em sequência): recarrega para mostrar o estado real.\n this.saveError = autoServiceErrorText(err, this.text, this.text.membersSaveError);\n this.saved.emit();\n const error = this.saveError;\n this.resetAndLoad();\n this.saveError = error;\n } finally { this.saving = false; this.cdr.markForCheck(); }\n }\n}\n","<hm-modal [open]=\"open\" (openChange)=\"onModalOpenChange($event)\" [heading]=\"fmt(text.membersHeading, { group: groupName })\" size=\"large\" (closed)=\"close()\">\n <div class=\"gm\">\n @if (saveError) {\n <hm-alert variant=\"error\">{{ saveError }}</hm-alert>\n }\n\n <!-- Adicionar: busca (candidatos da API a cada tecla) + função + Adicionar; sugestões em chips. -->\n <section class=\"gm-add\" [attr.aria-label]=\"text.addUser\">\n <div class=\"gm-add__row\">\n <div class=\"gm-field gm-field--grow\">\n <label class=\"gm-label\" [attr.for]=\"searchId\">{{ text.addUser }}</label>\n <div class=\"gm-search\">\n <hm-icon shape=\"search\" size=\"sm\" />\n <input type=\"text\" [id]=\"searchId\" [placeholder]=\"text.userSearch\" autocomplete=\"off\"\n [ngModel]=\"addSearch\" (ngModelChange)=\"onAddSearchChange($event)\" />\n @if (addSearch) {\n <button type=\"button\" class=\"gm-search__clear\" [attr.aria-label]=\"clearLabel\" (click)=\"clearSelectedToAdd()\">\n <hm-icon shape=\"times\" size=\"sm\" />\n </button>\n }\n @if (addSearchResults.length) {\n <ul class=\"gm-search__results\">\n @for (u of addSearchResults; track u.id) {\n <li>\n <button type=\"button\" class=\"gm-search__result\" (click)=\"selectCandidate(u)\">\n <span class=\"gm-user\">\n <hm-account-avatar size=\"small\" [name]=\"u.name || u.username\" [imageUrl]=\"u.picture\" />\n <span class=\"gm-user__body\">\n <span class=\"gm-user__name\"><span>{{ u.name || u.username }}</span></span>\n <span class=\"gm-user__meta\">{{ metaOf(u) }}</span>\n </span>\n </span>\n </button>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n\n <hm-combobox class=\"gm-field--role\" [label]=\"text.role\" [options]=\"roleCombo()\" [value]=\"selectedRole ?? ''\" (valueChange)=\"selectedRole = $event || null\" />\n\n <hm-button icon=\"plus\" [disabled]=\"!selectedToAdd\" (clicked)=\"addSelectedMember()\">{{ text.add }}</hm-button>\n </div>\n\n @if (suggestions.length) {\n <div class=\"gm-suggestions\">\n <span class=\"gm-suggestions__title\" [title]=\"text.suggestionsHint\">{{ text.suggestions }}</span>\n <ul class=\"gm-suggestions__list\" [attr.aria-label]=\"text.suggestionsHint\">\n @for (u of suggestions; track u.id) {\n <li>\n <button type=\"button\" class=\"gm-chip\" [title]=\"suggestionTitle(u)\"\n [attr.aria-label]=\"fmt(text.addSuggestion, { name: u.name || u.username })\" (click)=\"addSuggestion(u)\">\n <hm-account-avatar [name]=\"u.name || u.username\" [imageUrl]=\"u.picture\" />\n <span class=\"gm-chip__name\">{{ u.name || u.username }}</span>\n <hm-icon class=\"gm-chip__plus\" shape=\"plus\" size=\"xs\" />\n </button>\n </li>\n }\n </ul>\n </div>\n }\n </section>\n\n <div class=\"gm-split\">\n <section class=\"gm-members\" [attr.aria-labelledby]=\"titleId\">\n <div class=\"gm-members__head\">\n <h3 class=\"gm-members__title\" [id]=\"titleId\">{{ text.membersTitle }} <hm-badge [value]=\"memberCount()\" intent=\"primary\" [max]=\"9999\" /></h3>\n <div class=\"gm-search gm-members__filter\">\n <hm-icon shape=\"search\" size=\"sm\" />\n <input type=\"text\" [placeholder]=\"text.memberSearch\" [attr.aria-label]=\"text.memberSearch\" [ngModel]=\"memberSearch()\" (ngModelChange)=\"memberSearch.set($event)\" />\n </div>\n </div>\n\n @if (loader.error()) {\n <div class=\"gm-status\">\n <span class=\"gm-status__error\">{{ incompleteLabel() }}</span>\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"refresh\" (clicked)=\"loader.retry()\">{{ text.retryLoad }}</hm-button>\n </div>\n } @else if (loader.loading() && loader.ready()) {\n <p class=\"gm-status gm-status--progress\" role=\"status\">\n {{ progressLabel() }}@if (memberSearch().trim()) { · {{ text.membersPartialResults }} }\n </p>\n }\n\n <!-- Todos os membros (carregados aos poucos), os novos no topo; busca local, rolagem virtual, sem paginador. -->\n <hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"filteredMembers()\"\n [rowId]=\"rowId\"\n [caption]=\"fmt(text.membersOf, { group: groupName })\"\n [loading]=\"!loader.ready()\"\n [filterable]=\"false\"\n [paginated]=\"false\"\n [pagination]=\"false\"\n [virtual]=\"true\"\n maxHeight=\"24rem\"\n [selectable]=\"true\"\n [selection]=\"checkedForRemovalIds\"\n (selectionChange)=\"onSelectionChange($event)\"\n [emptyMessage]=\"memberSearch().trim() ? text.noMembersMatch : text.noMembersShort\"\n >\n <ng-template hmCell=\"username\" let-m>\n <span class=\"gm-user\">\n <hm-account-avatar [name]=\"m.name || m.username\" [imageUrl]=\"m.picture\" />\n <span class=\"gm-user__body\">\n <span class=\"gm-user__name\">\n <span>{{ m.name || m.username }}</span>\n @if (m.new) { <hm-tag [name]=\"text.newMember\" color=\"info\" /> }\n </span>\n <span class=\"gm-user__meta\">{{ metaOf(m) }}</span>\n </span>\n </span>\n </ng-template>\n\n <ng-template hmCell=\"role\" let-m>\n <hm-combobox class=\"gm-role\" [label]=\"text.colRole\" labelHidden [options]=\"roleCombo()\" [disabled]=\"isMarkedForRemoval(m)\"\n [value]=\"m.role ?? ''\" (valueChange)=\"setRole(m, $event)\" />\n </ng-template>\n\n <ng-template hmCell=\"joined_at\" let-m>\n @if (m.joined_at) {\n {{ formatDate(m.joined_at) }}\n @if (m.added_by_username) {\n <div class=\"gm-joined-by\">{{ fmt(text.addedBy, { user: m.added_by_username }) }}</div>\n }\n } @else {\n —\n }\n </ng-template>\n </hm-data-grid>\n </section>\n\n <!-- Remoção: sempre ao lado; vazia, só a dica. A remoção só vale ao salvar. -->\n <aside class=\"gm-removal\" [attr.aria-label]=\"text.removal\">\n <div class=\"gm-removal__head\">\n <hm-icon shape=\"trash\" size=\"sm\" /> {{ text.removal }}\n @if (removalCount) { <hm-badge [value]=\"removalCount\" intent=\"danger\" /> }\n </div>\n @if (removalCount === 0) {\n <div class=\"gm-removal__empty\">\n <hm-icon shape=\"employee-group\" size=\"md\" />\n <p>{{ text.removalEmpty }}</p>\n </div>\n } @else {\n <ul class=\"gm-removal__list\">\n @for (m of checkedForRemoval; track m.user_id) {\n <li class=\"gm-removal__item\">\n <span class=\"gm-user\">\n <hm-account-avatar size=\"small\" [name]=\"m.name || m.username\" [imageUrl]=\"m.picture\" />\n <span class=\"gm-user__body\">\n <span class=\"gm-user__name\"><span>{{ m.name || m.username }}</span></span>\n <span class=\"gm-user__meta\">{{ metaOf(m) }}</span>\n </span>\n </span>\n <hm-icon-button emphasis=\"subtle\" icon=\"undo\" [label]=\"text.undoRemoval\" (clicked)=\"undoRemoval(m)\" />\n </li>\n }\n </ul>\n }\n </aside>\n </div>\n </div>\n\n <ng-container footer>\n <hm-button emphasis=\"medium\" (clicked)=\"close()\">{{ text.cancel }}</hm-button>\n <hm-button [loading]=\"saving\" [disabled]=\"saving\" (clicked)=\"save()\" icon=\"floppy\">{{ text.saveChanges }}</hm-button>\n </ng-container>\n</hm-modal>\n","import { Component, ChangeDetectionStrategy, inject, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { CardComponent } from '@trismegisto/angular/card';\nimport { ComboboxComponent, ComboboxOption } from '@trismegisto/angular/combobox';\nimport { HermesDialogService } from '@trismegisto/angular/dialog';\nimport { TagColor, TagComponent } from '@trismegisto/angular/tag';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AutoServiceDeleteFeedback } from '../auto-service-delete';\nimport { AutoServiceGroup, AutoServiceGroupType, AutoServiceService } from '../auto-service.service';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceGroupModalComponent } from './group-modal/auto-service-group-modal.component';\nimport { AutoServiceGroupMembersComponent } from './members/auto-service-group-members.component';\nimport { AutoServiceGroupMembersModalComponent } from './members-modal/auto-service-group-members-modal.component';\n\n/** Valor do seletor de nível para os grupos sem tipo (servidor antigo). */\nexport const NO_LEVEL = '__sem-nivel__';\n\n/**\n * Grupos do projeto do client: Novo grupo e um cartão com dois seletores, o nível de acesso (tipo do grupo, do mais alto\n * para o mais baixo) e o grupo daquele nível, mais Consultar; o grupo consultado mostra o resumo (Editar/Excluir) e os\n * membros. O grupo de administração do projeto (`is_admin`) é gerido só no painel central (Argos): o\n * servidor não o devolve no auto-serviço e, se um servidor antigo devolver, a tela descarta. Mirror de admin/ui/.../features/admin/groups (argos-admin), escopado em `/auto-service/:clientId`.\n */\n@Component({\n selector: 'spine-auto-service-groups',\n standalone: true,\n imports: [\n CommonModule, ButtonComponent, CardComponent, ComboboxComponent, TagComponent,\n AutoServiceClientPickerComponent, AutoServiceGroupModalComponent, AutoServiceGroupMembersComponent, AutoServiceGroupMembersModalComponent,\n ],\n templateUrl: './auto-service-groups.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrls: ['./auto-service-groups.component.scss'],\n})\nexport class AutoServiceGroupsComponent {\n protected readonly text = inject(SPINE_MESSAGES).autoService;\n /** Telas com estado em campo comum, preenchido depois de `await`: marca a view ao terminar (app sem zone.js). */\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly dialogs = inject(HermesDialogService);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n private readonly service = inject(AutoServiceService);\n client: AutoServiceClient | null = null;\n groups: AutoServiceGroup[] = [];\n groupTypes: AutoServiceGroupType[] = [];\n loading = false;\n /** Nível escolhido no primeiro seletor (id do tipo, ou `NO_LEVEL`). */\n selectedLevel = '';\n /** Grupo escolhido no segundo seletor (só abre ao Consultar). */\n selectedGroupId = '';\n /** Grupo aberto (resumo + membros embaixo do seletor). */\n group: AutoServiceGroup | null = null;\n memberCount = 0;\n showMembersModal = false;\n membersVersion = 0;\n /** Grupo do modal de criar/editar; `null` cria. */\n modalGroup: AutoServiceGroup | null = null;\n showGroupModal = false;\n\n /**\n * Níveis do primeiro seletor: os tipos de `group-types` que se pode atribuir ou que já têm grupo na lista (o\n * Administrador, só do grupo de administração, fica de fora), mais os tipos que só aparecem nos grupos (sem a rota de\n * tipos) e \"Sem nível\" se algum grupo não tiver tipo. Do nível mais alto para o mais baixo. Recalculado na carga\n * (`refreshOptions`), não a cada checagem: o `hm-combobox` recebe sempre o mesmo array.\n */\n levelOptions: ComboboxOption[] = [];\n /** Grupos do nível escolhido, em ordem alfabética. */\n groupOptions: ComboboxOption[] = [];\n\n private buildLevelOptions(): ComboboxOption[] {\n const used = new Set(this.groups.map((g) => g.type?.id).filter((id): id is string => !!id));\n const levels = new Map<string, { name: string; level: number }>();\n for (const t of this.groupTypes) {\n if (t.assignable !== false || used.has(t.id)) levels.set(t.id, { name: t.name, level: t.level ?? 0 });\n }\n for (const g of this.groups) {\n if (g.type?.id && !levels.has(g.type.id)) levels.set(g.type.id, { name: g.type.name ?? g.type.id, level: g.type.level ?? 0 });\n }\n const options: ComboboxOption[] = [...levels.entries()]\n .sort((a, b) => b[1].level - a[1].level)\n .map(([id, t]) => ({ value: id, label: t.name }));\n if (this.groups.some((g) => !g.type?.id)) options.push({ value: NO_LEVEL, label: this.text.noLevel });\n return options;\n }\n\n private buildGroupOptions(): ComboboxOption[] {\n if (!this.selectedLevel) return [];\n return this.groups\n .filter((g) => this.levelOf(g) === this.selectedLevel)\n .map((g) => ({ value: g.id, label: g.name }))\n .sort((a, b) => a.label.localeCompare(b.label));\n }\n\n onClientChange(c: AutoServiceClient | null) {\n this.client = c;\n this.group = null;\n this.selectedLevel = '';\n this.selectedGroupId = '';\n this.groups = [];\n this.refreshOptions();\n void this.load();\n }\n\n /** Cor do selo do tipo de grupo (`hm-tag`): quanto mais alto o nível, mais \"quente\". O texto do\n * selo é o nome do tipo — a cor só reforça (WCAG 1.4.1). */\n levelTagColor(level?: number): TagColor {\n if (!level) return 'neutral';\n if (level >= 50) return 'danger';\n if (level >= 40) return 'warning';\n if (level >= 30) return 'info';\n if (level >= 20) return 'success';\n return 'neutral';\n }\n\n private levelOf(g: AutoServiceGroup): string { return g.type?.id || NO_LEVEL; }\n\n private refreshOptions() {\n this.levelOptions = this.buildLevelOptions();\n this.groupOptions = this.buildGroupOptions();\n }\n\n /** Trocar de nível limpa o grupo escolhido (ele é de outro nível). */\n selectLevel(level: string) {\n if (level !== this.selectedLevel) this.selectedGroupId = '';\n this.selectedLevel = level;\n this.groupOptions = this.buildGroupOptions();\n this.cdr.markForCheck();\n }\n\n /** Consultar: abre o grupo escolhido no segundo seletor. */\n searchGroup() {\n const g = this.groups.find((x) => x.id === this.selectedGroupId);\n if (g) this.openGroup(g);\n }\n\n /** Grupos (do tipo de nível mais alto para o mais baixo) e os tipos do realm, juntos. */\n async load() {\n const client = this.client;\n if (!client) { this.groups = []; this.groupTypes = []; return; }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n // Sem os tipos (admin-server sem `group-types`) a lista abre igual; só o modal fica sem tipo para escolher.\n const [groups, types] = await Promise.all([\n this.service.getGroups(client.id),\n this.service.getGroupTypes(client.id).catch(() => ({ group_types: [] as AutoServiceGroupType[] })),\n ]);\n if (this.client?.id !== client.id) return;\n // O grupo de administração não é do auto-serviço; servidor antigo ainda o devolve.\n this.groups = (groups.groups ?? []).filter((g) => !g.is_admin).sort((a, b) => (b.type?.level ?? 0) - (a.type?.level ?? 0));\n this.groupTypes = types.group_types ?? [];\n // O grupo aberto acompanha o que o servidor devolveu (nome/descrição/nível novos) ou fecha se sumiu.\n if (this.group) this.group = this.groups.find((g) => g.id === this.group!.id) ?? null;\n if (this.group) this.openGroup(this.group);\n else if (this.selectedGroupId && !this.groups.some((g) => g.id === this.selectedGroupId)) this.selectedGroupId = '';\n this.refreshOptions();\n } finally { this.loading = false; this.cdr.markForCheck(); }\n }\n\n /** Abre o grupo e deixa os dois seletores apontando para ele (nível e grupo). */\n openGroup(g: AutoServiceGroup) {\n if (this.group?.id !== g.id) this.memberCount = 0;\n this.group = g;\n this.selectedLevel = this.levelOf(g);\n this.selectedGroupId = g.id;\n this.groupOptions = this.buildGroupOptions();\n this.cdr.markForCheck();\n }\n\n openCreate() { this.modalGroup = null; this.showGroupModal = true; this.cdr.markForCheck(); }\n openEdit(g: AutoServiceGroup) { this.modalGroup = g; this.showGroupModal = true; this.cdr.markForCheck(); }\n\n async onGroupSaved(saved: AutoServiceGroup) {\n await this.load();\n // Recém-criado já abre, para incluir os membros em seguida.\n const fresh = this.groups.find((g) => g.id === saved?.id);\n if (fresh) this.openGroup(fresh);\n this.cdr.markForCheck();\n }\n\n /** Botão Excluir do resumo: confirma e exclui. */\n async confirmDelete(g: AutoServiceGroup) {\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteGroupHeading,\n message: formatMessage(this.text.confirmDeleteGroup, { name: g.name }),\n confirmLabel: this.text.delete,\n danger: true,\n });\n if (ok) await this.deleteGroup(g);\n }\n\n async deleteGroup(g: AutoServiceGroup) {\n if (!this.client) return;\n if (!(await this.deletion.run(() => this.service.deleteGroup(this.client!.id, g.id)))) return;\n if (this.group?.id === g.id) this.group = null;\n if (this.selectedGroupId === g.id) this.selectedGroupId = '';\n await this.load();\n }\n\n openMembers() { this.showMembersModal = true; }\n onMembersSaved() { this.membersVersion++; }\n}\n","<!-- Título e descrição da tela vêm da barra da página (nome + description do router). -->\n<div class=\"as-stack\">\n <spine-auto-service-client-picker (clientChange)=\"onClientChange($event)\"></spine-auto-service-client-picker>\n\n <ng-container *ngIf=\"client\">\n <div class=\"as-actions\">\n <hm-button icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newGroup }}</hm-button>\n </div>\n\n <!-- Primeiro o nível de acesso (tipo do grupo), depois o grupo daquele nível; Consultar abre o grupo embaixo. -->\n <hm-card>\n <div class=\"as-field-row\">\n <hm-combobox [label]=\"text.accessLevel\" [placeholder]=\"text.pickAccessLevel\" [options]=\"levelOptions\"\n [value]=\"selectedLevel\" (valueChange)=\"selectLevel($event)\" [disabled]=\"loading\">\n </hm-combobox>\n <hm-combobox [label]=\"text.group\" [placeholder]=\"text.pickGroup\" [options]=\"groupOptions\"\n [value]=\"selectedGroupId\" (valueChange)=\"selectedGroupId = $event\" [disabled]=\"loading || !selectedLevel\">\n </hm-combobox>\n <hm-button [disabled]=\"!selectedGroupId\" (clicked)=\"searchGroup()\" icon=\"search\">{{ text.search }}</hm-button>\n </div>\n <p class=\"as-empty muted\" *ngIf=\"!loading && groups.length === 0\">{{ text.noGroups }}</p>\n <p class=\"as-empty muted\" *ngIf=\"!loading && selectedLevel && groups.length > 0 && groupOptions.length === 0\">{{ text.noGroupsOfLevel }}</p>\n </hm-card>\n\n <ng-container *ngIf=\"group as g\">\n <hm-card>\n <div class=\"as-summary\">\n <div class=\"as-summary__info\">\n <p class=\"as-summary__title group-title\">\n {{ g.name }}\n <hm-tag *ngIf=\"g.type?.name\" [name]=\"g.type!.name\" [color]=\"levelTagColor(g.type?.level)\" />\n <hm-tag [name]=\"g.enabled ? text.active : text.inactive\" [color]=\"g.enabled ? 'success' : 'danger'\" />\n </p>\n <p class=\"as-summary__detail\">{{ g.description || text.noDescription }}</p>\n </div>\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" icon=\"pencil\" (clicked)=\"openEdit(g)\">{{ text.edit }}</hm-button>\n <hm-button intent=\"danger\" emphasis=\"medium\" icon=\"trash\" (clicked)=\"confirmDelete(g)\">{{ text.delete }}</hm-button>\n </div>\n </div>\n </hm-card>\n\n <spine-auto-service-group-members [clientId]=\"client.id\" [groupId]=\"g.id\" [refreshTrigger]=\"membersVersion\"\n (countChange)=\"memberCount = $event\" (manageMembers)=\"openMembers()\"></spine-auto-service-group-members>\n\n <spine-auto-service-group-members-modal [clientId]=\"client.id\" [groupId]=\"g.id\" [groupName]=\"g.name\"\n [open]=\"showMembersModal\" (openChange)=\"showMembersModal = $event\" (saved)=\"onMembersSaved()\">\n </spine-auto-service-group-members-modal>\n </ng-container>\n\n <spine-auto-service-group-modal [clientId]=\"client.id\" [group]=\"modalGroup\" [groupTypes]=\"groupTypes\"\n [open]=\"showGroupModal\" (openChange)=\"showGroupModal = $event\" (saved)=\"onGroupSaved($event)\">\n </spine-auto-service-group-modal>\n </ng-container>\n</div>\n"],"names":["i1","i1.AutoServiceService","i2"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { SpineLoginAttemptsComponent } from '@trismegisto/spine/audit';
|
|
4
|
-
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-
|
|
4
|
+
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Tela "Tentativas de login" do auto-serviço (router `AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID`, no menu
|
|
@@ -34,4 +34,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
34
34
|
}] });
|
|
35
35
|
|
|
36
36
|
export { AutoServiceLoginAttemptsComponent };
|
|
37
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-login-attempts.component-
|
|
37
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-login-attempts.component-
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs","sources":["../../../projects/ui/auto-service/src/audit/auto-service-login-attempts.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { SpineLoginAttemptsComponent } from '@trismegisto/spine/audit';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\n\n/**\n * Tela \"Tentativas de login\" do auto-serviço (router `AUTO_SERVICE_LOGIN_ATTEMPTS_TEMPLATE_ROUTER_ID`, no menu\n * Auditoria ao lado de Ações): o client do app + a MESMA tela do painel central (`SpineLoginAttemptsComponent`,\n * `@trismegisto/spine/audit`) no escopo `client` -- só as tentativas de login nesta aplicação. Carregada só por\n * `AUTO_SERVICE_SCREENS.loginAttempts` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-login-attempts',\n imports: [AutoServiceClientPickerComponent, SpineLoginAttemptsComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router AD100005).\n template: `\n <spine-auto-service-client-picker (clientChange)=\"client.set($event)\" />\n @if (client(); as c) {\n <br />\n <spine-login-attempts scope=\"client\" [clientId]=\"c.id\" />\n }\n `,\n styleUrl: './auto-service-audit.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceLoginAttemptsComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":[],"mappings":";;;;;AAIA;;;;;AAKG;MAeU,iCAAiC,CAAA;AAd9C,IAAA,WAAA,GAAA;AAeqB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA2B,IAAI,6EAAC;AACnE,IAAA;+GAFY,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAVlC;;;;;;GAMT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,s8CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EARS,gCAAgC,wGAAE,2BAA2B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAY5D,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAd7C,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mCAAmC,WACpC,CAAC,gCAAgC,EAAE,2BAA2B,CAAC,EAAA,QAAA,EAE9D;;;;;;GAMT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,s8CAAA,CAAA,EAAA;;;"}
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable, input, signal, computed, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
-
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-
|
|
3
|
+
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs';
|
|
4
4
|
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';
|
|
6
|
+
import { AlertComponent } from '@trismegisto/angular/alert';
|
|
7
|
+
import { ButtonComponent } from '@trismegisto/angular/button';
|
|
8
|
+
import { ComboboxMultiComponent } from '@trismegisto/angular/combobox-multi';
|
|
9
|
+
import { DataGridComponent, DataGridCellDirective } from '@trismegisto/angular/data-grid';
|
|
10
|
+
import { DatePickerComponent } from '@trismegisto/angular/date-picker';
|
|
11
|
+
import { HermesDialogService } from '@trismegisto/angular/dialog';
|
|
12
|
+
import { IconComponent } from '@trismegisto/angular/icon';
|
|
13
|
+
import { InputComponent } from '@trismegisto/angular/input';
|
|
14
|
+
import { ListEditorComponent } from '@trismegisto/angular/list-editor';
|
|
15
|
+
import { ModalComponent } from '@trismegisto/angular/modal';
|
|
16
|
+
import { RichTextComponent } from '@trismegisto/angular/rich-text';
|
|
17
|
+
import { SegmentedControlComponent } from '@trismegisto/angular/segmented-control';
|
|
18
|
+
import { TagComponent } from '@trismegisto/angular/tag';
|
|
19
|
+
import { TextareaComponent } from '@trismegisto/angular/textarea';
|
|
20
|
+
import { TimePickerComponent } from '@trismegisto/angular/time-picker';
|
|
21
|
+
import { formatMessage } from '@trismegisto/primitives/i18n';
|
|
7
22
|
import { SPINE_MESSAGES } from '@trismegisto/spine';
|
|
8
|
-
import { A as AutoServiceDeleteFeedback } from './trismegisto-spine-auto-service-auto-service-delete-
|
|
23
|
+
import { A as AutoServiceDeleteFeedback } from './trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs';
|
|
9
24
|
import { firstValueFrom } from 'rxjs';
|
|
10
25
|
import { AuthorizationService } from '@orfeu/angular/core';
|
|
26
|
+
import { urlPath } from '@trismegisto/primitives/html';
|
|
11
27
|
import { AUTO_SERVICE_CONFIG } from './trismegisto-spine-auto-service.mjs';
|
|
12
28
|
|
|
13
29
|
/**
|
|
@@ -429,4 +445,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
429
445
|
}] });
|
|
430
446
|
|
|
431
447
|
export { AutoServiceNewsPageComponent };
|
|
432
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-news-page.component-
|
|
448
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs.map
|
package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-news/auto-service-news.service.ts","../../../projects/ui/auto-service/src/tabs/auto-service-news/auto-service-news.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-news/auto-service-news.component.html","../../../projects/ui/auto-service/src/pages/auto-service-news-page.component.ts"],"sourcesContent":["import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { urlPath } from '@trismegisto/primitives/html';\nimport { AUTO_SERVICE_CONFIG } from '../../auto-service.tokens';\n\n/** Situação calculada pelo servidor (com o relógio do banco). */\nexport type AutoServiceNewsStatus = 'scheduled' | 'published' | 'expired';\n\n/**\n * Tipo de publicação: só texto (`informativo`); introdução + lista de mudanças (`implementacao`); ou introdução + antes\n * e agora (`alteracao`).\n */\nexport type AutoServiceNewsKind = 'informativo' | 'implementacao' | 'alteracao';\n\n/** Uma novidade do app (`GET /auto-service/:clientId/news`); o conteúdo (`body_html`, `items`, antes e agora) só no detalhe. */\nexport interface AutoServiceNews {\n id: string;\n /** Servidor antigo não manda: vale `informativo`. */\n kind?: AutoServiceNewsKind;\n title: string;\n summary: string;\n published_at: string;\n /** Último dia em que aparece (AAAA-MM-DD); null = não vence. */\n until: string | null;\n status: AutoServiceNewsStatus;\n /** Público restrito; vazio = todos que entram no app. */\n groups: { id: string; name: string }[];\n author: { id: string; username: string; name: string | null; picture: string | null } | null;\n created_at: string;\n updated_at: string;\n body_html?: string;\n items?: string[];\n before_html?: string;\n after_html?: string;\n}\n\nexport interface AutoServiceNewsPage { news: AutoServiceNews[]; total: number; page: number; limit: number }\n\n/**\n * Corpo de criar/editar. `published_at` null = agora; `group_ids` vazio = todos. `body_html` é o texto (informativo) ou\n * a introdução; `items` só na implementação e `before_html`/`after_html` só na alteração (nos outros tipos, vazios).\n */\nexport interface AutoServiceNewsWrite {\n kind: AutoServiceNewsKind;\n title: string;\n summary: string;\n body_html: string;\n items: string[];\n before_html: string;\n after_html: string;\n published_at: string | null;\n until: string | null;\n group_ids: string[];\n}\n\n/** Grupo que pode ser público (`GET .../news/audience`): os com acesso ao app, sem o de administração. */\nexport interface AutoServiceNewsAudienceGroup { id: string; name: string; description: string | null; enabled: boolean; member_count: number }\n\n/**\n * Novidades do app no auto-serviço (`{adminApi}/auto-service/:clientId/news*`): o servidor recorta pelo client da URL\n * e exige o grupo de administração com o crachá Administrador. Próprio da aba (o `AutoServiceService` é o das outras\n * telas).\n */\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceNewsService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly config = inject(AUTO_SERVICE_CONFIG);\n\n private url(clientId: string, rest = ''): string {\n return `${this.config.adminApi}/auto-service${urlPath`/${clientId}`}/news${rest}`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n list(clientId: string, page: number, limit: number): Promise<AutoServiceNewsPage> {\n return firstValueFrom(this.http.get<AutoServiceNewsPage>(this.url(clientId), { headers: this.headers, params: { page, limit } }));\n }\n\n get(clientId: string, newsId: string): Promise<AutoServiceNews> {\n return firstValueFrom(this.http.get<AutoServiceNews>(this.url(clientId, urlPath`/${newsId}`), { headers: this.headers }));\n }\n\n audience(clientId: string): Promise<{ groups: AutoServiceNewsAudienceGroup[] }> {\n return firstValueFrom(this.http.get<{ groups: AutoServiceNewsAudienceGroup[] }>(this.url(clientId, '/audience'), { headers: this.headers }));\n }\n\n create(clientId: string, body: AutoServiceNewsWrite): Promise<AutoServiceNews> {\n return firstValueFrom(this.http.post<AutoServiceNews>(this.url(clientId), body, { headers: this.headers }));\n }\n\n update(clientId: string, newsId: string, body: AutoServiceNewsWrite): Promise<AutoServiceNews> {\n return firstValueFrom(this.http.put<AutoServiceNews>(this.url(clientId, urlPath`/${newsId}`), body, { headers: this.headers }));\n }\n\n remove(clientId: string, newsId: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url(clientId, urlPath`/${newsId}`), { headers: this.headers }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, effect, signal, untracked } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { ComboboxOption } from '@trismegisto/angular/combobox';\nimport { ComboboxMultiComponent } from '@trismegisto/angular/combobox-multi';\nimport { DataGridActionTriggered, DataGridCellDirective, DataGridComponent, DataGridRowAction } from '@trismegisto/angular/data-grid';\nimport { DatePickerComponent } from '@trismegisto/angular/date-picker';\nimport { HermesDialogService } from '@trismegisto/angular/dialog';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { InputComponent } from '@trismegisto/angular/input';\nimport { ListEditorComponent } from '@trismegisto/angular/list-editor';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { RichTextComponent } from '@trismegisto/angular/rich-text';\nimport { SegmentedControlComponent, type SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { TextareaComponent } from '@trismegisto/angular/textarea';\nimport { TimePickerComponent } from '@trismegisto/angular/time-picker';\nimport { GridColumn } from '@trismegisto/primitives/data-grid';\nimport { type ListEditorValidator } from '@trismegisto/primitives/list-editor';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { type PaginationState } from '@trismegisto/primitives/pagination';\nimport { SPINE_MESSAGES, type SpineMessages } from '@trismegisto/spine';\nimport { AutoServiceDeleteFeedback } from '../../auto-service-delete';\nimport {\n AutoServiceNews, AutoServiceNewsKind, AutoServiceNewsService, AutoServiceNewsStatus, AutoServiceNewsWrite,\n} from './auto-service-news.service';\n\ntype NewsText = SpineMessages['autoServiceNews'];\n\nconst PAGE_SIZE = 20;\nconst TITLE_MAX = 140;\nconst SUMMARY_MAX = 300;\n\nlet sequence = 0;\n\n/** Teto da lista de mudanças (implementação) e de cada item -- os mesmos do servidor. */\nconst ITEMS_MAX = 30;\nconst ITEM_MAX = 300;\n\n/** Ícone de cada tipo (seletor do topo e prévia). */\nconst KIND_ICONS: Record<AutoServiceNewsKind, string> = {\n informativo: 'file-text',\n implementacao: 'rocket-diagonal',\n alteracao: 'two-way-arrows',\n};\n\n/** HTML de rich text com texto de verdade (não só tags vazias). */\nexport function newsHtmlHasText(html: string | null | undefined): boolean {\n return !!html && html.replace(/<[^>]*>/g, '').replace(/ | /g, ' ').trim() !== '';\n}\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** Data e hora LOCAIS (do navegador) de um instante ISO, no formato dos campos (`AAAA-MM-DD`, `HH:mm`). */\nexport function newsLocalParts(iso: string): { date: string | null; time: string | null } {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return { date: null, time: null };\n return { date: `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`, time: `${pad(d.getHours())}:${pad(d.getMinutes())}` };\n}\n\n/** Instante ISO (UTC) da data e hora locais dos campos; sem data = null (o servidor publica ao salvar); sem hora = 00:00. */\nexport function newsPublishedAt(date: string | null, time: string | null): string | null {\n if (!date) return null;\n const d = new Date(`${date}T${time || '00:00'}:00`);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n}\n\n/** Código do argos-admin (`{ error }`) → texto no idioma ativo; desconhecido, o `detail` do servidor ou `fallback`. */\nexport function newsErrorText(err: unknown, text: NewsText, fallback: string): string {\n if (!(err instanceof HttpErrorResponse)) return fallback;\n const body = err.error as { error?: unknown; detail?: unknown } | null;\n const known: Record<string, string> = {\n invalid_title: text.errors.invalidTitle,\n invalid_summary: text.errors.invalidSummary,\n body_too_large: text.errors.bodyTooLarge,\n invalid_published_at: text.errors.invalidPublishedAt,\n invalid_until: text.errors.invalidUntil,\n invalid_group_ids: text.errors.invalidGroupIds,\n invalid_kind: text.errors.invalidKind,\n invalid_items: text.errors.invalidItems,\n invalid_compare: text.errors.invalidCompare,\n compare_too_large: text.errors.compareTooLarge,\n };\n const code = typeof body?.error === 'string' ? body.error : '';\n if (Object.prototype.hasOwnProperty.call(known, code)) return known[code];\n return typeof body?.detail === 'string' && body.detail ? body.detail : fallback;\n}\n\n/**\n * O editor. `body` é o texto (informativo) ou a introdução (implementação, alteração). Trocar de tipo guarda o que já\n * foi escrito nos campos dos outros tipos; só o do tipo escolhido vai para o servidor.\n */\ninterface NewsForm {\n kind: AutoServiceNewsKind;\n title: string;\n summary: string;\n body: string;\n items: string[];\n before: string;\n after: string;\n publishDate: string | null;\n publishTime: string | null;\n until: string | null;\n groupIds: string[];\n}\n\nconst emptyForm = (): NewsForm => ({\n kind: 'informativo', title: '', summary: '', body: '', items: [], before: '', after: '', publishDate: null, publishTime: null,\n until: null, groupIds: [],\n});\n\n/**\n * Aba Novidades do Cliente: o que o spine mostra em \"Novidades\" (menu do perfil, aviso da entrada, card do Início)\n * para quem entra no app. Grade paginada no servidor (agendadas e vencidas também), criar/editar num modal e excluir\n * com confirmação (no menu da linha ou no rodapé do modal, ao editar). O modal é um editor em seções numeradas\n * (título e resumo, texto em rich text, publicação, validade e público) com a prévia ao vivo do card do Início ao\n * lado. Sem rascunho: a novidade não tem esse estado (sem data, sai ao salvar). O texto é saneado pelo argos-admin ao\n * gravar; o público vazio é todo mundo que entra no app.\n */\n@Component({\n selector: 'spine-auto-service-news',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, ComboboxMultiComponent, DataGridComponent, DataGridCellDirective,\n DatePickerComponent, IconComponent, InputComponent, ListEditorComponent, ModalComponent, RichTextComponent, SegmentedControlComponent,\n TagComponent, TextareaComponent, TimePickerComponent,\n ],\n templateUrl: './auto-service-news.component.html',\n styleUrls: ['./auto-service-news.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceNewsComponent {\n private readonly service = inject(AutoServiceNewsService);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n private readonly dialogs = inject(HermesDialogService);\n protected readonly text = inject(SPINE_MESSAGES).autoServiceNews;\n protected readonly common = inject(SPINE_MESSAGES).autoService;\n /** Rótulos do card Novidades do Início, repetidos na prévia. */\n protected readonly home = inject(SPINE_MESSAGES).home;\n protected readonly uid = `spine-as-news-${++sequence}`;\n private readonly dateFormat = new Intl.DateTimeFormat(inject(SPINE_MESSAGES).meta.locale, { dateStyle: 'short', timeStyle: 'short' });\n private readonly dayFormat = new Intl.DateTimeFormat(inject(SPINE_MESSAGES).meta.locale, { dateStyle: 'short', timeZone: 'UTC' });\n protected readonly TITLE_MAX = TITLE_MAX;\n protected readonly SUMMARY_MAX = SUMMARY_MAX;\n protected readonly ITEMS_MAX = ITEMS_MAX;\n /** Tipos do seletor do topo, com ícone. */\n protected readonly kindOptions: readonly SegmentedOption<AutoServiceNewsKind>[] = [\n { value: 'informativo', label: this.text.kindInformativo, icon: KIND_ICONS.informativo },\n { value: 'implementacao', label: this.text.kindImplementacao, icon: KIND_ICONS.implementacao },\n { value: 'alteracao', label: this.text.kindAlteracao, icon: KIND_ICONS.alteracao },\n ];\n /** Cada mudança até 300 caracteres (o vazio e o repetido o próprio hm-list-editor recusa). */\n protected readonly itemRule: ListEditorValidator<string> = (item) =>\n item.length > ITEM_MAX ? this.text.errors.invalidItems : null;\n\n readonly clientId = input('');\n\n protected readonly rows = signal<AutoServiceNews[]>([]);\n protected readonly total = signal(0);\n protected readonly pageState = signal<PaginationState>({ page: 1, size: PAGE_SIZE });\n protected readonly loading = signal(false);\n protected readonly loadError = signal('');\n protected readonly audienceOptions = signal<ComboboxOption[]>([]);\n\n protected readonly modalOpen = signal(false);\n protected readonly editingId = signal('');\n protected form: NewsForm = emptyForm();\n protected readonly saving = signal(false);\n protected readonly saveError = signal<string | null>(null);\n /** O texto da novidade em edição ainda está vindo (o editor espera). */\n protected readonly loadingBody = signal(false);\n /** Excluindo pelo rodapé do modal. */\n protected readonly removing = signal(false);\n\n readonly rowId = (n: AutoServiceNews) => n.id;\n readonly columns = computed<GridColumn<AutoServiceNews>[]>(() => [\n { key: 'title', title: this.text.colTitle, value: (n) => n.title },\n { key: 'status', title: this.text.colStatus, value: (n) => this.statusLabel(n.status) },\n { key: 'published_at', title: this.text.colPublishedAt, value: (n) => this.formatDate(n.published_at) },\n { key: 'until', title: this.text.colUntil, value: (n) => this.formatDay(n.until) },\n { key: 'groups', title: this.text.colAudience, value: (n) => n.groups.map((g) => g.name).join(', ') || this.text.audienceAll },\n { key: 'author', title: this.text.colAuthor, value: (n) => n.author?.name || n.author?.username || '' },\n ]);\n readonly rowActions = computed<DataGridRowAction<AutoServiceNews>[]>(() => [\n { id: 'edit', icon: 'pencil', label: this.common.edit },\n {\n id: 'delete', icon: 'trash', label: this.common.delete, danger: true, separatorAbove: true,\n confirm: (n) => ({ heading: this.text.confirmDeleteHeading, message: formatMessage(this.text.confirmDelete, { title: n.title }) }),\n },\n ]);\n\n /** Validade antes do dia da publicação: a novidade nunca apareceria. */\n protected get untilBeforePublish(): boolean {\n const publishDay = this.form.publishDate ?? newsLocalParts(new Date().toISOString()).date;\n return !!this.form.until && !!publishDay && this.form.until < publishDay;\n }\n\n /** Data e hora da prévia: as dos campos; sem data, \"ao salvar\". */\n protected get previewDate(): string {\n const at = newsPublishedAt(this.form.publishDate, this.form.publishTime);\n return at ? this.formatDate(at) : this.text.previewNow;\n }\n\n /** Publicação no futuro: a prévia marca \"Agendada\". */\n protected get previewScheduled(): boolean {\n const at = newsPublishedAt(this.form.publishDate, this.form.publishTime);\n return !!at && new Date(at).getTime() > Date.now();\n }\n\n protected get canSave(): boolean {\n const title = this.form.title.trim();\n return !!title && title.length <= TITLE_MAX && this.form.summary.trim().length <= SUMMARY_MAX && !this.untilBeforePublish\n && this.kindReady;\n }\n\n /** O conteúdo do tipo está completo: a implementação com ao menos uma mudança; a alteração com o antes e o agora. */\n protected get kindReady(): boolean {\n if (this.form.kind === 'implementacao') return this.form.items.length > 0 && this.form.items.length <= ITEMS_MAX;\n if (this.form.kind === 'alteracao') return newsHtmlHasText(this.form.before) && newsHtmlHasText(this.form.after);\n return true;\n }\n\n protected get kindIcon(): string {\n return KIND_ICONS[this.form.kind];\n }\n\n protected get kindLabel(): string {\n return this.kindOptions.find((o) => o.value === this.form.kind)?.label ?? '';\n }\n\n protected setKind(kind: string): void {\n if (kind === 'informativo' || kind === 'implementacao' || kind === 'alteracao') this.form = { ...this.form, kind };\n this.saveError.set(null);\n }\n\n constructor() {\n effect(() => {\n const id = this.clientId();\n untracked(() => {\n this.pageState.set({ page: 1, size: this.pageState().size });\n void this.load();\n void this.loadAudience(id);\n });\n });\n }\n\n protected statusLabel(status: AutoServiceNewsStatus): string {\n return status === 'scheduled' ? this.text.statusScheduled : status === 'expired' ? this.text.statusExpired : this.text.statusPublished;\n }\n\n protected statusColor(status: AutoServiceNewsStatus): 'info' | 'success' | 'neutral' {\n return status === 'scheduled' ? 'info' : status === 'expired' ? 'neutral' : 'success';\n }\n\n protected formatDate(iso: string): string {\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? '' : this.dateFormat.format(d);\n }\n\n /** `until` é um dia (AAAA-MM-DD), sem fuso: formatado em UTC para não mudar de dia. */\n protected formatDay(day: string | null): string {\n if (!day) return this.text.noUntil;\n const d = new Date(`${day}T00:00:00Z`);\n return Number.isNaN(d.getTime()) ? day : this.dayFormat.format(d);\n }\n\n async load(page = this.pageState().page, size = this.pageState().size): Promise<void> {\n const clientId = this.clientId();\n if (!clientId) { this.rows.set([]); this.total.set(0); return; }\n this.loading.set(true);\n this.loadError.set('');\n try {\n const res = await this.service.list(clientId, page, size);\n this.rows.set(res.news ?? []);\n this.total.set(res.total ?? 0);\n this.pageState.set({ page, size });\n } catch (err) {\n this.rows.set([]);\n this.total.set(0);\n this.loadError.set(newsErrorText(err, this.text, this.text.loadError));\n } finally {\n this.loading.set(false);\n }\n }\n\n /** Sem a lista de público o campo fica sem opção (a novidade sai para todos). */\n private async loadAudience(clientId: string): Promise<void> {\n if (!clientId) { this.audienceOptions.set([]); return; }\n try {\n const res = await this.service.audience(clientId);\n this.audienceOptions.set((res.groups ?? []).map((g) => ({ value: g.id, label: g.name })));\n } catch {\n this.audienceOptions.set([]);\n }\n }\n\n protected onPageStateChange(state: PaginationState): void {\n void this.load(state.page, state.size);\n }\n\n protected openCreate(): void {\n this.editingId.set('');\n this.form = emptyForm();\n this.saveError.set(null);\n this.loadingBody.set(false);\n this.removing.set(false);\n this.modalOpen.set(true);\n }\n\n /** O corpo não vem na lista: busca o detalhe antes de liberar o editor. */\n protected async openEdit(row: AutoServiceNews): Promise<void> {\n const parts = newsLocalParts(row.published_at);\n this.editingId.set(row.id);\n this.form = {\n kind: row.kind ?? 'informativo', title: row.title, summary: row.summary, body: '', items: [], before: '', after: '',\n publishDate: parts.date, publishTime: parts.time, until: row.until, groupIds: row.groups.map((g) => g.id),\n };\n this.saveError.set(null);\n this.loadingBody.set(true);\n this.removing.set(false);\n this.modalOpen.set(true);\n try {\n const full = await this.service.get(this.clientId(), row.id);\n if (this.editingId() === row.id) {\n this.form = {\n ...this.form, kind: full.kind ?? this.form.kind, body: full.body_html ?? '', items: [...(full.items ?? [])],\n before: full.before_html ?? '', after: full.after_html ?? '',\n };\n }\n } catch (err) {\n this.saveError.set(newsErrorText(err, this.text, this.text.loadError));\n } finally {\n this.loadingBody.set(false);\n }\n }\n\n protected async save(): Promise<void> {\n if (!this.canSave || this.saving() || this.loadingBody()) return;\n const body: AutoServiceNewsWrite = {\n kind: this.form.kind,\n title: this.form.title.trim(),\n summary: this.form.summary.trim(),\n body_html: this.form.body,\n // Só o conteúdo do tipo escolhido; o resto vai vazio (o servidor zera também).\n items: this.form.kind === 'implementacao' ? [...this.form.items] : [],\n before_html: this.form.kind === 'alteracao' ? this.form.before : '',\n after_html: this.form.kind === 'alteracao' ? this.form.after : '',\n published_at: newsPublishedAt(this.form.publishDate, this.form.publishTime),\n until: this.form.until || null,\n group_ids: [...this.form.groupIds],\n };\n this.saving.set(true);\n this.saveError.set(null);\n try {\n if (this.editingId()) await this.service.update(this.clientId(), this.editingId(), body);\n else await this.service.create(this.clientId(), body);\n } catch (err) {\n // O modal fica aberto com o motivo no idioma ativo.\n this.saveError.set(newsErrorText(err, this.text, this.text.saveError));\n return;\n } finally {\n this.saving.set(false);\n }\n this.modalOpen.set(false);\n await this.load(this.editingId() ? this.pageState().page : 1);\n }\n\n /** \"Excluir\" no rodapé do modal (só ao editar): confirma, exclui, fecha e recarrega; falha deixa o modal aberto. */\n protected async removeFromModal(): Promise<void> {\n const id = this.editingId();\n if (!id || this.saving() || this.removing()) return;\n const title = this.form.title.trim();\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteHeading, message: formatMessage(this.text.confirmDelete, { title }),\n confirmLabel: this.common.delete, danger: true,\n });\n if (!ok || this.editingId() !== id || !this.modalOpen()) return;\n this.removing.set(true);\n try {\n if (!(await this.deletion.run(() => this.service.remove(this.clientId(), id)))) return;\n } finally {\n this.removing.set(false);\n }\n this.modalOpen.set(false);\n await this.load();\n }\n\n /** Já confirmado pelo `confirm` da ação na grade. */\n private async remove(row: AutoServiceNews): Promise<void> {\n if (await this.deletion.run(() => this.service.remove(this.clientId(), row.id))) await this.load();\n }\n\n protected onAction(e: DataGridActionTriggered<AutoServiceNews>): void {\n if (e.action === 'edit') void this.openEdit(e.row);\n if (e.action === 'delete') void this.remove(e.row);\n }\n}\n","<!-- Paginação no servidor (agendadas e vencidas também); a busca/filtro local da grade fica desligada. -->\n<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"rows()\"\n [rowId]=\"rowId\"\n [caption]=\"text.caption\"\n [loading]=\"loading()\"\n [error]=\"loadError()\"\n [emptyMessage]=\"text.empty\"\n [rowActions]=\"rowActions()\"\n [filterable]=\"false\"\n [paginated]=\"false\"\n [totalItems]=\"total()\"\n [pageState]=\"pageState()\"\n (pageStateChange)=\"onPageStateChange($event)\"\n [pageSizes]=\"[10, 20, 50, 100]\"\n (actionTriggered)=\"onAction($event)\"\n>\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newNews }}</hm-button>\n <ng-template hmCell=\"title\" let-n>\n <span class=\"news-title\">\n <span>{{ n.title }}</span>\n @if (n.summary) { <span class=\"news-title__summary\">{{ n.summary }}</span> }\n </span>\n </ng-template>\n <ng-template hmCell=\"status\" let-n>\n <hm-tag [name]=\"statusLabel(n.status)\" [color]=\"statusColor(n.status)\" />\n </ng-template>\n <ng-template hmCell=\"groups\" let-n>\n @if (n.groups.length) {\n <span class=\"news-tags\">\n @for (g of n.groups; track g.id) { <hm-tag [name]=\"g.name\" color=\"info\" /> }\n </span>\n } @else {\n <span class=\"muted\">{{ text.audienceAll }}</span>\n }\n </ng-template>\n <ng-template hmCell=\"author\" let-n>\n @if (n.author; as a) {\n <span class=\"news-author\">\n <hm-account-avatar size=\"small\" [name]=\"a.name || a.username\" [imageUrl]=\"a.picture\" />\n <span>{{ a.name || a.username }}</span>\n </span>\n }\n </ng-template>\n</hm-data-grid>\n\n<!-- Modal: criar/editar novidade. O cabeçalho do hm-modal some da vista (o título segue como nome do diálogo, ver o\n .scss) e o editor desenha o seu: ícone, título e subtítulo. Pensado para caber sem rolagem num notebook: em cima,\n \"1. Informações principais\" (título) com o resumo ao lado; embaixo, o conteúdo do tipo escolhido no topo (texto;\n introdução + lista; ou introdução + antes e agora), que estica e rola por dentro, ao lado do painel com publicação,\n validade, público, dica e a prévia do Início no fim. O modal não rola; em tela estreita, tudo empilha. -->\n<hm-modal [open]=\"modalOpen()\" (openChange)=\"modalOpen.set($event)\" [heading]=\"editingId() ? text.editNews : text.newNews\" size=\"xlarge\"\n (closed)=\"modalOpen.set(false)\">\n <div class=\"ne\">\n <header class=\"ne-head\">\n <span class=\"ne-head__icon\" aria-hidden=\"true\"><hm-icon shape=\"announcement\" size=\"md\" /></span>\n <span class=\"ne-head__text\">\n <!-- O h2 do hm-modal já dá o nome ao diálogo: este é só o visual. -->\n <span class=\"ne-head__title\" aria-hidden=\"true\">{{ editingId() ? text.editNews : text.newNews }}</span>\n <span class=\"ne-head__intro\">{{ editingId() ? text.editNewsIntro : text.newNewsIntro }}</span>\n </span>\n <!-- Tipo de publicação: muda os campos do conteúdo e a prévia. -->\n <hm-segmented-control class=\"ne-kind\" [label]=\"text.kind\" [options]=\"kindOptions\" [value]=\"form.kind\" (valueChange)=\"setKind($event)\" />\n </header>\n\n <div class=\"ne-scroll\">\n @if (saveError()) { <hm-alert variant=\"error\">{{ saveError() }}</hm-alert> }\n\n <div class=\"ne-grid\">\n <!-- Linha de cima: a seção 1 ocupa as duas colunas (subgrid): título à esquerda, resumo à direita. -->\n <section class=\"ne-section ne-intro\" [attr.aria-labelledby]=\"uid + '-main'\">\n <div class=\"ne-intro__lead\">\n <div class=\"ne-section__head\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-main'\"><span class=\"ne-step\" aria-hidden=\"true\">1</span>{{ text.sectionMain }}</h3>\n <p class=\"ne-section__hint\">{{ text.sectionMainHint }}</p>\n </div>\n <hm-input [label]=\"text.title\" required [maxLength]=\"TITLE_MAX\" [(value)]=\"form.title\" (valueChange)=\"saveError.set(null)\" />\n </div>\n <hm-textarea class=\"ne-intro__summary\" [label]=\"text.summary\" [hint]=\"text.summaryHint\" [rows]=\"3\" [maxLength]=\"SUMMARY_MAX\"\n [(value)]=\"form.summary\" />\n </section>\n\n <section class=\"ne-section ne-content\" [attr.aria-labelledby]=\"uid + '-body'\">\n <div class=\"ne-section__head\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-body'\"><span class=\"ne-step\" aria-hidden=\"true\">2</span>{{ text.sectionBody }}</h3>\n <p class=\"ne-section__hint\">\n {{ form.kind === 'implementacao' ? text.sectionBodyHintImpl : form.kind === 'alteracao' ? text.sectionBodyHintAlt : text.sectionBodyHint }}\n </p>\n </div>\n <!-- Estica até o fim da linha; quem rola é o texto (ou a lista), não o modal. -->\n @switch (form.kind) {\n @case ('implementacao') {\n <hm-rich-text class=\"ne-content__intro\" [label]=\"text.intro\" [rows]=\"2\" [maxRows]=\"4\" [loading]=\"loadingBody()\"\n [(value)]=\"form.body\" />\n <div class=\"ne-content__items\">\n <hm-list-editor [label]=\"text.items\" [hint]=\"text.itemsHint\" [placeholder]=\"text.itemPlaceholder\" [emptyText]=\"text.itemsEmpty\"\n [max]=\"ITEMS_MAX\" [validate]=\"itemRule\" editable [items]=\"form.items\" (itemsChange)=\"form.items = [...$event]\" />\n </div>\n }\n @case ('alteracao') {\n <hm-rich-text class=\"ne-content__intro\" [label]=\"text.intro\" [rows]=\"2\" [maxRows]=\"4\" [loading]=\"loadingBody()\"\n [(value)]=\"form.body\" />\n <div class=\"ne-content__compare\">\n <hm-rich-text class=\"ne-content__editor ne-content__editor--labelled\" [label]=\"text.before\" required [rows]=\"4\" [maxRows]=\"16\" [loading]=\"loadingBody()\"\n [(value)]=\"form.before\" />\n <hm-rich-text class=\"ne-content__editor ne-content__editor--labelled\" [label]=\"text.after\" required [rows]=\"4\" [maxRows]=\"16\" [loading]=\"loadingBody()\"\n [(value)]=\"form.after\" />\n </div>\n }\n @default {\n <hm-rich-text class=\"ne-content__editor\" [label]=\"text.sectionBody\" labelHidden [hint]=\"text.bodyHint\" [rows]=\"6\" [maxRows]=\"24\"\n showCounter [loading]=\"loadingBody()\" [(value)]=\"form.body\" />\n }\n }\n </section>\n\n <aside class=\"ne-side\">\n <section class=\"ne-section ne-side__publish\" [attr.aria-labelledby]=\"uid + '-publish'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-publish'\"><span class=\"ne-step\" aria-hidden=\"true\">3</span>{{ text.sectionPublish }}</h3>\n <div class=\"ne-row\">\n <hm-date-picker [label]=\"text.publishDate\" [(value)]=\"form.publishDate\" />\n <hm-time-picker [label]=\"text.publishTime\" [(value)]=\"form.publishTime\" />\n </div>\n <p class=\"ne-note\">{{ text.publishHint }}</p>\n </section>\n\n <section class=\"ne-section ne-side__until\" [attr.aria-labelledby]=\"uid + '-until'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-until'\"><span class=\"ne-step\" aria-hidden=\"true\">4</span>{{ text.sectionUntil }}</h3>\n <hm-date-picker [label]=\"text.untilDate\" [hint]=\"text.untilHint\" [min]=\"form.publishDate\" [(value)]=\"form.until\" />\n @if (untilBeforePublish) { <hm-alert variant=\"warning\">{{ text.errors.untilBeforePublish }}</hm-alert> }\n </section>\n\n <section class=\"ne-section ne-side__audience\" [attr.aria-labelledby]=\"uid + '-audience'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-audience'\"><span class=\"ne-step\" aria-hidden=\"true\">5</span>{{ text.sectionAudience }}</h3>\n <!-- Vazio = todos que entram no app. -->\n <hm-combobox-multi [label]=\"text.audienceGroups\" [hint]=\"text.audienceHint\" [placeholder]=\"text.audienceAll\" [options]=\"audienceOptions()\"\n [visibleChipsLimit]=\"null\" [selected]=\"form.groupIds\" (selectedChange)=\"form.groupIds = [...$event]\" />\n </section>\n\n <p class=\"ne-tip\"><hm-icon class=\"ne-tip__icon\" shape=\"lightbulb\" size=\"sm\" /><span><strong>{{ text.tipTitle }}</strong> {{ text.tipText }}</span></p>\n\n <section class=\"ne-section ne-side__preview\" [attr.aria-labelledby]=\"uid + '-preview'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-preview'\"><hm-icon class=\"ne-section__icon\" shape=\"eye\" size=\"sm\" />{{ text.preview }}</h3>\n <!-- Mesmo desenho do card Novidades do Início; repete o que está nos campos, então fica fora da leitura. -->\n <div class=\"ne-preview\" aria-hidden=\"true\">\n <div class=\"ne-preview__head\">\n <span class=\"ne-preview__heading\">{{ home.news }}</span>\n <span class=\"ne-preview__badge\">{{ home.newsBadge }}</span>\n </div>\n <div class=\"ne-preview__item\">\n <span class=\"ne-preview__icon\"><hm-icon [shape]=\"kindIcon\" size=\"sm\" /></span>\n <span class=\"ne-preview__text\">\n <span class=\"ne-preview__title\" [class.ne-preview__placeholder]=\"!form.title.trim()\">{{ form.title.trim() || text.previewTitle }}</span>\n <span class=\"ne-preview__summary\" [class.ne-preview__placeholder]=\"!form.summary.trim()\">{{ form.summary.trim() || text.previewSummary }}</span>\n <span class=\"ne-preview__date\">\n <hm-icon shape=\"calendar\" size=\"xs\" />{{ previewDate }}\n @if (previewScheduled) { <span class=\"ne-preview__status\">{{ text.statusScheduled }}</span> }\n <span class=\"ne-preview__kind\">{{ kindLabel }}</span>\n </span>\n </span>\n <hm-icon class=\"ne-preview__chevron\" shape=\"angle-right\" size=\"sm\" />\n </div>\n </div>\n </section>\n </aside>\n </div>\n </div>\n </div>\n\n <ng-container footer>\n <!-- Sem rascunho: a novidade não tem esse estado (sem data = publica ao salvar). -->\n @if (editingId()) {\n <hm-button class=\"ne-delete\" emphasis=\"medium\" intent=\"danger\" icon=\"trash\" [disabled]=\"saving() || removing()\" [loading]=\"removing()\"\n (clicked)=\"removeFromModal()\">{{ common.delete }}</hm-button>\n }\n <hm-button emphasis=\"medium\" (clicked)=\"modalOpen.set(false)\">{{ common.cancel }}</hm-button>\n <hm-button [disabled]=\"!canSave || loadingBody() || removing()\" [loading]=\"saving()\" (clicked)=\"save()\">\n {{ editingId() ? common.save : common.create }}\n </hm-button>\n </ng-container>\n</hm-modal>\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceNewsComponent } from '../tabs/auto-service-news/auto-service-news.component';\n\n/**\n * Tela \"Novidades\" do auto-serviço (router `AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID`, na raiz do menu; migration 0036 do\n * argos): o seletor de client + o painel de novidades que era a aba Cliente › Novidades. Carregada só por\n * `AUTO_SERVICE_SCREENS.news` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-news-page',\n imports: [AutoServiceClientPickerComponent, AutoServiceNewsComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router AD100006).\n template: `\n <div class=\"as-stack\">\n <spine-auto-service-client-picker (clientChange)=\"client.set($event)\" />\n @if (client(); as c) {\n <spine-auto-service-news [clientId]=\"c.id\" />\n }\n </div>\n `,\n styleUrl: './auto-service-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceNewsPageComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DA;;;;AAIG;MAEU,sBAAsB,CAAA;AADnC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAiCtD,IAAA;AA/BS,IAAA,GAAG,CAAC,QAAgB,EAAE,IAAI,GAAG,EAAE,EAAA;AACrC,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA,aAAA,EAAgB,OAAO,CAAA,IAAI,QAAQ,CAAA,CAAE,CAAA,KAAA,EAAQ,IAAI,EAAE;IACnF;AAEA,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,OAAO,IAAI,WAAW,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;IAC1E;AAEA,IAAA,IAAI,CAAC,QAAgB,EAAE,IAAY,EAAE,KAAa,EAAA;AAChD,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAsB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACnI;IAEA,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAA;AAClC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAA,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3H;AAEA,IAAA,QAAQ,CAAC,QAAgB,EAAA;QACvB,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAA6C,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9I;IAEA,MAAM,CAAC,QAAgB,EAAE,IAA0B,EAAA;QACjD,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAkB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7G;AAEA,IAAA,MAAM,CAAC,QAAgB,EAAE,MAAc,EAAE,IAA0B,EAAA;AACjE,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAkB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAA,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjI;IAEA,MAAM,CAAC,QAAgB,EAAE,MAAc,EAAA;AACrC,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAA,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACnH;+GAnCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA,CAAA;;4FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AClClC,MAAM,SAAS,GAAG,EAAE;AACpB,MAAM,SAAS,GAAG,GAAG;AACrB,MAAM,WAAW,GAAG,GAAG;AAEvB,IAAI,QAAQ,GAAG,CAAC;AAEhB;AACA,MAAM,SAAS,GAAG,EAAE;AACpB,MAAM,QAAQ,GAAG,GAAG;AAEpB;AACA,MAAM,UAAU,GAAwC;AACtD,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,aAAa,EAAE,iBAAiB;AAChC,IAAA,SAAS,EAAE,gBAAgB;CAC5B;AAED;AACM,SAAU,eAAe,CAAC,IAA+B,EAAA;IAC7D,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;AAC5F;AAEA,MAAM,GAAG,GAAG,CAAC,CAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAErD;AACM,SAAU,cAAc,CAAC,GAAW,EAAA;AACxC,IAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACvB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;IAChE,OAAO,EAAE,IAAI,EAAE,CAAA,EAAG,CAAC,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAE,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA,CAAE,EAAE;AACzI;AAEA;AACM,SAAU,eAAe,CAAC,IAAmB,EAAE,IAAmB,EAAA;AACtE,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AACtB,IAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,OAAO,CAAA,GAAA,CAAK,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE;AAC3D;AAEA;SACgB,aAAa,CAAC,GAAY,EAAE,IAAc,EAAE,QAAgB,EAAA;AAC1E,IAAA,IAAI,EAAE,GAAG,YAAY,iBAAiB,CAAC;AAAE,QAAA,OAAO,QAAQ;AACxD,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,KAAqD;AACtE,IAAA,MAAM,KAAK,GAA2B;AACpC,QAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;AACvC,QAAA,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;AAC3C,QAAA,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;AACxC,QAAA,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;AACpD,QAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;AACvC,QAAA,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;AAC9C,QAAA,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;AACrC,QAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;AACvC,QAAA,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;AAC3C,QAAA,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;KAC/C;AACD,IAAA,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;IAC9D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC;IACzE,OAAO,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ;AACjF;AAoBA,MAAM,SAAS,GAAG,OAAiB;AACjC,IAAA,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI;AAC7H,IAAA,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;AAC1B,CAAA,CAAC;AAEF;;;;;;;AAOG;MAYU,wBAAwB,CAAA;;AA6DnC,IAAA,IAAc,kBAAkB,GAAA;AAC9B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,cAAc,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI;AACzF,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,UAAU;IAC1E;;AAGA,IAAA,IAAc,WAAW,GAAA;AACvB,QAAA,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AACxE,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU;IACxD;;AAGA,IAAA,IAAc,gBAAgB,GAAA;AAC5B,QAAA,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AACxE,QAAA,OAAO,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;IACpD;AAEA,IAAA,IAAc,OAAO,GAAA;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACpC,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC;eAClG,IAAI,CAAC,SAAS;IACrB;;AAGA,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,SAAS;AAChH,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW;AAAE,YAAA,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAChH,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAc,QAAQ,GAAA;QACpB,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACnC;AAEA,IAAA,IAAc,SAAS,GAAA;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE;IAC9E;AAEU,IAAA,OAAO,CAAC,IAAY,EAAA;QAC5B,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,WAAW;YAAE,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;AAClH,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;AAEA,IAAA,WAAA,GAAA;AAvGiB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,sBAAsB,CAAC;AACxC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC5C,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACnC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe;AAC7C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW;;AAE3C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI;AAClC,QAAA,IAAA,CAAA,GAAG,GAAG,CAAA,cAAA,EAAiB,EAAE,QAAQ,EAAE;QACrC,IAAA,CAAA,UAAU,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QACpH,IAAA,CAAA,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC9G,IAAA,CAAA,SAAS,GAAG,SAAS;QACrB,IAAA,CAAA,WAAW,GAAG,WAAW;QACzB,IAAA,CAAA,SAAS,GAAG,SAAS;;AAErB,QAAA,IAAA,CAAA,WAAW,GAAoD;AAChF,YAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE;AACxF,YAAA,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,UAAU,CAAC,aAAa,EAAE;AAC9F,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,UAAU,CAAC,SAAS,EAAE;SACnF;;QAEkB,IAAA,CAAA,QAAQ,GAAgC,CAAC,IAAI,KAC9D,IAAI,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI;AAEtD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,+EAAC;AAEV,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAoB,EAAE,2EAAC;AACpC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC,4EAAC;AACjB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,gFAAC;AACjE,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;AACtB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAmB,EAAE,sFAAC;AAE9C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;AACzB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,EAAE,gFAAC;QAC/B,IAAA,CAAA,IAAI,GAAa,SAAS,EAAE;AACnB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,6EAAC;AACtB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,gFAAC;;AAEvC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,kFAAC;;AAE3B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;QAElC,IAAA,CAAA,KAAK,GAAG,CAAC,CAAkB,KAAK,CAAC,CAAC,EAAE;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAgC,MAAM;YAC/D,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;YAClE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;YACvF,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE;YACvG,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;YAClF,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AAC9H,YAAA,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,EAAE;AACxG,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAuC,MAAM;AACzE,YAAA,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACvD,YAAA;gBACE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI;AAC1F,gBAAA,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;AACnI,aAAA;AACF,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;QA+CA,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;YAC1B,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;AAC5D,gBAAA,KAAK,IAAI,CAAC,IAAI,EAAE;AAChB,gBAAA,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;AAC5B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,WAAW,CAAC,MAA6B,EAAA;AACjD,QAAA,OAAO,MAAM,KAAK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,MAAM,KAAK,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe;IACxI;AAEU,IAAA,WAAW,CAAC,MAA6B,EAAA;QACjD,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS;IACvF;AAEU,IAAA,UAAU,CAAC,GAAW,EAAA;AAC9B,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE;;AAGU,IAAA,SAAS,CAAC,GAAkB,EAAA;AACpC,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;QAClC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,UAAA,CAAY,CAAC;QACtC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE;AAEA,IAAA,MAAM,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,EAAA;AACnE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE;QAAQ;AAC/D,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACpC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxE;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;;IAGQ,MAAM,YAAY,CAAC,QAAgB,EAAA;QACzC,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE;QAAQ;AACvD,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACjD,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3F;AAAE,QAAA,MAAM;AACN,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B;IACF;AAEU,IAAA,iBAAiB,CAAC,KAAsB,EAAA;AAChD,QAAA,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IACxC;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,SAAS,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;IAC1B;;IAGU,MAAM,QAAQ,CAAC,GAAoB,EAAA;QAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG;AACV,YAAA,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;AACnH,YAAA,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;SAC1G;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5D,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE;gBAC/B,IAAI,CAAC,IAAI,GAAG;AACV,oBAAA,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAC3G,oBAAA,MAAM,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;iBAC7D;YACH;QACF;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxE;gBAAU;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;IACF;AAEU,IAAA,MAAM,IAAI,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE;YAAE;AAC1D,QAAA,MAAM,IAAI,GAAyB;AACjC,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAC7B,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjC,YAAA,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;;YAEzB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;AACrE,YAAA,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE;AACnE,YAAA,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE;AACjE,YAAA,YAAY,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AAC3E,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;YAC9B,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SACnC;AACD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;YACF,IAAI,IAAI,CAAC,SAAS,EAAE;AAAE,gBAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC;;AACnF,gBAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC;QACvD;QAAE,OAAO,GAAG,EAAE;;YAEZ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtE;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/D;;AAGU,IAAA,MAAM,eAAe,GAAA;AAC7B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;QAC3B,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QACpC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC;YACnG,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI;AAC/C,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AACzD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;YACF,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAAE;QAClF;gBAAU;AACR,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACnB;;IAGQ,MAAM,MAAM,CAAC,GAAoB,EAAA;QACvC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAAE,YAAA,MAAM,IAAI,CAAC,IAAI,EAAE;IACpG;AAEU,IAAA,QAAQ,CAAC,CAA2C,EAAA;AAC5D,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IACpD;+GAxQW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpIrC,sgWAsLA,EAAA,MAAA,EAAA,CAAA,mkSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED1DI,sBAAsB,oIAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,eAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,aAAA,EAAA,MAAA,EAAA,KAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,OAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,EAAA,WAAA,EAAA,YAAA,EAAA,YAAA,EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,SAAA,EAAA,cAAA,EAAA,UAAA,EAAA,WAAA,EAAA,OAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,qBAAqB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzH,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,KAAA,EAAA,KAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,WAAA,EAAA,KAAA,EAAA,KAAA,EAAA,MAAA,EAAA,aAAA,EAAA,WAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,2YAAE,cAAc,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,eAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrI,YAAY,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,iBAAiB,kSAAE,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,aAAA,EAAA,KAAA,EAAA,KAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAM3C,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAXpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,OAAA,EAC1B;wBACP,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,qBAAqB;wBACzH,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,iBAAiB,EAAE,yBAAyB;wBACrI,YAAY,EAAE,iBAAiB,EAAE,mBAAmB;qBACrD,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sgWAAA,EAAA,MAAA,EAAA,CAAA,mkSAAA,CAAA,EAAA;;;AE9HjD;;;;AAIG;MAgBU,4BAA4B,CAAA;AAfzC,IAAA,WAAA,GAAA;AAgBqB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA2B,IAAI,6EAAC;AACnE,IAAA;+GAFY,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAX7B;;;;;;;GAOT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4+CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EATS,gCAAgC,wGAAE,wBAAwB,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAazD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAfxC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,WAC/B,CAAC,gCAAgC,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAE3D;;;;;;;GAOT,EAAA,eAAA,EAEgB,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,4+CAAA,CAAA,EAAA;;;"}
|
|
@@ -1,14 +1,32 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable, input, model, output, signal, computed, ChangeDetectionStrategy, Component, viewChild, effect, untracked } from '@angular/core';
|
|
3
|
-
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-
|
|
3
|
+
import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs';
|
|
4
4
|
import { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';
|
|
6
|
+
import { AlertComponent } from '@trismegisto/angular/alert';
|
|
7
|
+
import { ButtonComponent } from '@trismegisto/angular/button';
|
|
8
|
+
import { CardComponent } from '@trismegisto/angular/card';
|
|
9
|
+
import { ComboboxComponent } from '@trismegisto/angular/combobox';
|
|
10
|
+
import { DrawerComponent } from '@trismegisto/angular/drawer';
|
|
11
|
+
import { IconComponent } from '@trismegisto/angular/icon';
|
|
12
|
+
import { MenuButtonComponent } from '@trismegisto/angular/menu-button';
|
|
13
|
+
import { PaginatorComponent } from '@trismegisto/angular/paginator';
|
|
14
|
+
import { SegmentedControlComponent } from '@trismegisto/angular/segmented-control';
|
|
15
|
+
import { SkeletonComponent } from '@trismegisto/angular/skeleton';
|
|
16
|
+
import { StateScreenComponent } from '@trismegisto/angular/state-screen';
|
|
17
|
+
import { SwitchComponent } from '@trismegisto/angular/switch';
|
|
18
|
+
import { TabComponent, TabContentDirective, TabsComponent } from '@trismegisto/angular/tabs';
|
|
19
|
+
import { TagComponent } from '@trismegisto/angular/tag';
|
|
20
|
+
import { HermesToastService } from '@trismegisto/angular/toast';
|
|
21
|
+
import { TooltipDirective } from '@trismegisto/angular/tooltip';
|
|
22
|
+
import { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';
|
|
7
23
|
import { SPINE_MESSAGES } from '@trismegisto/spine';
|
|
8
24
|
import { SpineRatingStarsComponent, SPINE_RATING_SCORE_MAX, SpinePageActionsDirective } from '@trismegisto/spine/layout';
|
|
9
25
|
import { firstValueFrom } from 'rxjs';
|
|
10
26
|
import { AuthorizationService } from '@orfeu/angular/core';
|
|
27
|
+
import { urlPath } from '@trismegisto/primitives/html';
|
|
11
28
|
import { AUTO_SERVICE_CONFIG } from './trismegisto-spine-auto-service.mjs';
|
|
29
|
+
import { SearchFieldComponent } from '@trismegisto/angular/search-field';
|
|
12
30
|
|
|
13
31
|
/**
|
|
14
32
|
* Leitura das avaliações do app no auto-serviço (`{adminApi}/auto-service/:clientId/ratings*`): o servidor recorta
|
|
@@ -766,4 +784,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
766
784
|
}] });
|
|
767
785
|
|
|
768
786
|
export { AutoServiceRatingsPageComponent };
|
|
769
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-ratings-page.component-
|
|
787
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs.map
|