@trismegisto/spine 3.3.3 → 3.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -2
- package/fesm2022/trismegisto-spine-audit.mjs +6 -6
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs → trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs} +8 -8
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs.map → trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs} +251 -85
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs → trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs.map → trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs → trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs} +2 -2
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs.map → trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map} +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs +3733 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs → trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs} +7 -7
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs.map → trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs → trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs} +12 -3
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs → trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs} +7 -2
- package/fesm2022/{trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs.map → trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs → trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs} +14 -1
- package/fesm2022/{trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs.map → trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs → trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs} +26 -3
- package/fesm2022/trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +24 -11
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs → trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs} +3 -3
- package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs.map → trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map} +1 -1
- package/fesm2022/{trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs → trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs} +428 -93
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout.mjs +1 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs +1 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +528 -10
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-auto-service.d.ts +20 -4
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +327 -63
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +221 -3
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs +0 -2179
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs.map +0 -1
package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.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 {\n AlertComponent, ButtonComponent, CheckboxComponent, ComboboxComponent, ComboboxOption, InputComponent, ModalComponent, TextareaComponent,\n} from '@trismegisto/angular';\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 {\n AccountAvatarComponent, ButtonComponent, DataGridComponent, DataGridCellDirective, GridColumn, HermesI18nService, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\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 {\n AccountAvatarComponent, AlertComponent, BadgeComponent, ButtonComponent, ComboboxComponent, ComboboxOption, DataGridCellDirective, DataGridComponent,\n EMPTY_SELECTION, GridColumn, GridSelection, HERMES_MESSAGES, HermesI18nService, IconButtonComponent, IconComponent, ModalComponent, TagComponent,\n} from '@trismegisto/angular';\nimport { AutoServiceMemberSuggestion, AutoServiceService } from '../../auto-service.service';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { formatMessage } from '@trismegisto/primitives';\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 {\n ButtonComponent, CardComponent, ComboboxComponent, ComboboxOption, HermesDialogService, TagColor, TagComponent,\n} from '@trismegisto/angular';\nimport { formatMessage } from '@trismegisto/primitives';\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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"}
|
|
@@ -386,7 +386,7 @@ class AutoServiceNewsComponent {
|
|
|
386
386
|
void this.remove(e.row);
|
|
387
387
|
}
|
|
388
388
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceNewsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
389
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.24", type: AutoServiceNewsComponent, isStandalone: true, selector: "spine-auto-service-news", inputs: { clientId: { classPropertyName: "clientId", publicName: "clientId", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<!-- Pagina\u00E7\u00E3o no servidor (agendadas e vencidas tamb\u00E9m); 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\u00E7alho do hm-modal some da vista (o t\u00EDtulo segue como nome do di\u00E1logo, ver o\n .scss) e o editor desenha o seu: \u00EDcone, t\u00EDtulo e subt\u00EDtulo. Pensado para caber sem rolagem num notebook: em cima,\n \"1. Informa\u00E7\u00F5es principais\" (t\u00EDtulo) com o resumo ao lado; embaixo, o conte\u00FAdo do tipo escolhido no topo (texto;\n introdu\u00E7\u00E3o + lista; ou introdu\u00E7\u00E3o + antes e agora), que estica e rola por dentro, ao lado do painel com publica\u00E7\u00E3o,\n validade, p\u00FAblico, dica e a pr\u00E9via do In\u00EDcio no fim. O modal n\u00E3o 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\u00E1 d\u00E1 o nome ao di\u00E1logo: este \u00E9 s\u00F3 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\u00E7\u00E3o: muda os campos do conte\u00FAdo e a pr\u00E9via. -->\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\u00E7\u00E3o 1 ocupa as duas colunas (subgrid): t\u00EDtulo \u00E0 esquerda, resumo \u00E0 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\u00E9 o fim da linha; quem rola \u00E9 o texto (ou a lista), n\u00E3o 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\u00EDcio; repete o que est\u00E1 nos campos, ent\u00E3o 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\u00E3o 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", styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>hm-combobox{flex:1 1 16rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}.as-empty{margin:var(--hm-space-xs) 0 0;font-size:var(--hm-font-size-sm)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface-muted);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}:host{display:block}.news-title{display:flex;flex-direction:column;gap:2px;min-inline-size:0}.news-title__summary{overflow:hidden;color:var(--hm-muted);font-size:var(--hm-font-size-xs);text-overflow:ellipsis;white-space:nowrap}.news-tags,.news-author{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne){block-size:min(100dvh - 2 * var(--hm-space-md),60rem);max-block-size:none;grid-template-rows:minmax(0,1fr) auto}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne)>.hm-modal__header{position:absolute;z-index:1;inset-block-start:0;inset-inline-end:0;border:0;padding:var(--hm-space-sm)}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne) .hm-modal__heading{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne)>.hm-modal__body{display:flex;flex-direction:column;min-block-size:0;overflow:hidden;padding:0}.ne{container:ne/inline-size;display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.ne-head{display:flex;flex:none;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm);padding:var(--hm-space-sm) var(--hm-space-md);padding-inline-end:calc(var(--hm-space-md) + var(--hm-control-height) + var(--hm-space-sm));border-block-end:var(--hm-border-hairline) solid var(--hm-divider)}.ne-head__icon{display:grid;flex:none;place-items:center;inline-size:2.5rem;block-size:2.5rem;border-radius:var(--hm-radius);background:var(--hm-accent-subtle);color:var(--hm-accent)}.ne-head__text{display:flex;flex-direction:column;gap:var(--hm-space-nano);min-inline-size:0}.ne-head__title{color:var(--hm-text);font-size:var(--hm-font-size-xl);font-weight:var(--hm-font-weight-bold);line-height:var(--hm-line-height-tight)}.ne-head__intro{color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.ne-kind{margin-inline-start:auto}.ne-content__intro{flex:none}.ne-content__compare{display:flex;flex-direction:column;gap:var(--hm-space-sm)}.ne-preview__kind{padding:var(--hm-space-nano) var(--hm-space-xs);border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-pill);color:var(--hm-text);font-size:var(--hm-font-size-3xs)}.ne-scroll{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--hm-space-sm);min-block-size:0;overflow-y:auto;padding:var(--hm-space-md)}.ne-grid{display:grid;flex:1 0 auto;grid-template-columns:minmax(0,1fr);gap:var(--hm-space-md)}.ne-section{display:flex;flex-direction:column;gap:var(--hm-space-xs);min-inline-size:0}.ne-section__head{display:flex;flex-direction:column;gap:var(--hm-space-nano)}.ne-section__title{display:flex;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.ne-section__icon{flex:none;color:var(--hm-accent)}.ne-section__hint{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.ne-step{display:inline-grid;flex:none;place-items:center;inline-size:1.5rem;block-size:1.5rem;border-radius:var(--hm-radius-pill);background:var(--hm-accent-subtle);color:var(--hm-accent);font-size:var(--hm-font-size-xs);font-weight:var(--hm-font-weight-bold)}.ne-intro{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--hm-space-sm) var(--hm-space-md)}.ne-intro__lead{display:flex;flex-direction:column;gap:var(--hm-space-xs);min-inline-size:0}.ne-side{container:ne-side/inline-size;display:grid;grid-template-areas:\"publish\" \"until\" \"audience\" \"tip\" \"preview\";grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto auto auto 1fr;gap:var(--hm-space-md);min-inline-size:0;padding:var(--hm-space-sm) var(--hm-space-md);border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius);background:var(--hm-surface-muted)}.ne-side__publish{grid-area:publish}.ne-side__until{grid-area:until}.ne-side__audience{grid-area:audience}.ne-tip{grid-area:tip}.ne-side__preview{grid-area:preview;align-self:end}@container ne (min-width: 52rem){.ne-scroll{overflow:hidden}.ne-grid{flex:1 1 auto;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto minmax(0,1fr);min-block-size:0}.ne-intro{grid-column:1/-1;grid-template-columns:subgrid}.ne-content{min-block-size:0;overflow:hidden}.ne-side{min-block-size:0;overflow-y:auto}.ne-content__items{flex:1 1 0;min-block-size:0;overflow-y:auto}.ne-content__compare{display:grid;flex:1 1 0;grid-template-columns:repeat(2,minmax(0,1fr));min-block-size:0}.ne-content__editor{flex:1 1 0;grid-template-rows:minmax(0,1fr);grid-auto-rows:auto;min-block-size:0}.ne-content__editor ::ng-deep .hm-rich-text__frame,.ne-content__editor ::ng-deep .hm-rich-text__loading{min-block-size:0}.ne-content__editor ::ng-deep .hm-rich-text__body{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.ne-content__editor ::ng-deep .hm-rich-text__area{flex:1 1 0;min-block-size:2lh;max-block-size:none;overflow-y:auto}.ne-content__editor--labelled{grid-template-rows:auto minmax(0,1fr)}}@media(max-height:55rem){@container ne-side (min-width: 34rem){.ne-side{grid-template-areas:\"publish audience\" \"until preview\" \"tip preview\";grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto auto 1fr}}}.ne-row{display:flex;flex-wrap:wrap;gap:var(--hm-space-sm)}.ne-row>*{flex:1 1 8rem;min-inline-size:0}.ne-note{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.ne-preview{display:flex;flex-direction:column;gap:var(--hm-space-micro);padding:var(--hm-space-sm) var(--hm-space-md);border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius);background:var(--hm-surface-raised)}.ne-preview__head{display:flex;align-items:center;gap:var(--hm-space-xs)}.ne-preview__heading{color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.ne-preview__badge,.ne-preview__status{flex:none;padding:var(--hm-space-nano) var(--hm-space-xs);border-radius:var(--hm-radius-micro);background:var(--hm-accent-subtle);color:var(--hm-accent);font-size:var(--hm-font-size-3xs);font-weight:var(--hm-font-weight-semibold);letter-spacing:.04em;text-transform:uppercase}.ne-preview__item{display:flex;align-items:center;gap:var(--hm-space-sm);padding:var(--hm-space-xs) 0;border-block-start:var(--hm-border-hairline) solid var(--hm-divider)}.ne-preview__icon{display:grid;flex:none;place-items:center;inline-size:2rem;block-size:2rem;border-radius:var(--hm-radius-control);background:var(--hm-accent-subtle);color:var(--hm-accent)}.ne-preview__text{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--hm-space-nano);min-inline-size:0}.ne-preview__title{overflow:hidden;color:var(--hm-text);font-size:var(--hm-font-size-sm);font-weight:var(--hm-font-weight-semibold);text-overflow:ellipsis;white-space:nowrap}.ne-preview__summary{display:-webkit-box;overflow:hidden;color:var(--hm-muted);font-size:var(--hm-font-size-xs);overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2}.ne-preview__placeholder{color:var(--hm-muted);font-style:italic;font-weight:var(--hm-font-weight-regular)}.ne-preview__date{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-micro);color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.ne-preview__chevron{flex:none;color:var(--hm-muted)}.ne-tip{display:flex;align-items:flex-start;gap:var(--hm-space-xs);margin:0;padding:var(--hm-space-xs) var(--hm-space-sm);border-inline-start:var(--hm-border-thin) solid var(--hm-info);border-radius:var(--hm-radius-control);background:var(--hm-info-bg);color:var(--hm-text);font-size:var(--hm-font-size-xs)}@media(forced-colors:active){.ne-tip{border:var(--hm-border-hairline) solid CanvasText}}.ne-tip__icon{flex:none;color:var(--hm-info)}.ne-delete{margin-inline-end:auto}\n"], dependencies: [{ kind: "component", type: AccountAvatarComponent, selector: "hm-account-avatar", inputs: ["name", "imageUrl", "size", "loading"] }, { kind: "component", type: AlertComponent, selector: "hm-alert", inputs: ["variant", "appearance", "heading", "closable", "size", "showIcon", "link", "linkLabel", "linkTarget", "dismissKey", "duration"], outputs: ["closed"] }, { kind: "component", type: ButtonComponent, selector: "hm-button", inputs: ["emphasis", "intent", "size", "type", "icon", "iconDirection", "iconEnd", "disabled", "loading", "loadingState", "block", "link", "newTab", "caret", "inMenu", "toggle", "pressed"], outputs: ["loadingStateChange", "pressedChange", "clicked"] }, { kind: "component", type: ComboboxMultiComponent, selector: "hm-combobox-multi", inputs: ["label", "options", "selected", "extraOptions", "unknownLabel", "placeholder", "hint", "max", "visibleChipsLimit"], outputs: ["selectedChange"] }, { kind: "component", type: DataGridComponent, selector: "hm-data-grid", inputs: ["columns", "rows", "rowId", "caption", "rowActions", "loading", "error", "emptyMessage", "noResultsMessage", "filterable", "paginated", "pageState", "pagination", "totalItems", "sort", "selectable", "selectionMode", "selection", "rowSelectable", "rowSelectableReason", "rowDetailDisabled", "rowDetailHidden", "virtual", "rowHeight", "pinnedColumns", "columnState", "pageSizes", "fillHeight", "maxHeight", "bordered", "rowState", "rowClickable", "remoteSearch", "remoteSort", "itemsLabel", "pageSizeLabel", "exportable", "exportFileName", "groupBy", "aggregates", "aggregateFormatter", "persistKey", "persistStorage", "advancedFilter", "filterQuery", "columnManager", "columnOrder", "searchTerm"], outputs: ["pageStateChange", "sortChange", "selectionChange", "pinnedColumnsChange", "columnStateChange", "actionTriggered", "detailToggled", "rowClicked", "clearFiltersRequested", "filteredChange", "searchTermChanged", "groupByChange", "filterQueryChange", "columnOrderChange", "searchTermChange", "detailPaneToggled"] }, { kind: "directive", type: DataGridCellDirective, selector: "ng-template[hmCell]", inputs: ["hmCell"] }, { kind: "component", type: DatePickerComponent, selector: "hm-date-picker", inputs: ["value", "label", "labelHidden", "hint", "placeholder", "min", "max", "valueFormat"], outputs: ["valueChange"] }, { kind: "component", type: IconComponent, selector: "hm-icon", inputs: ["shape", "direction", "size", "solid", "badge", "status", "flip", "inverse", "label"] }, { kind: "component", type: InputComponent, selector: "hm-input", inputs: ["value", "label", "type", "placeholder", "icon", "labelHidden", "hint", "prefix", "suffix", "prefixIcon", "mask", "maskValue", "min", "max", "step", "stepButtons", "maxLength", "autocomplete", "inputMode"], outputs: ["valueChange"] }, { kind: "component", type: ListEditorComponent, selector: "hm-list-editor", inputs: ["items", "label", "labelHidden", "hint", "placeholder", "descriptionPlaceholder", "pair", "itemLabel", "titleLabel", "descriptionLabel", "addLabel", "emptyText", "descriptionRequired", "allowDuplicates", "ignoreCase", "max", "validate", "editable", "readonly"], outputs: ["itemsChange", "added", "removed", "moved", "edited"] }, { kind: "component", type: ModalComponent, selector: "hm-modal", inputs: ["open", "heading", "size", "closeLabel", "closable", "beforeClose"], outputs: ["openChange", "closed"] }, { kind: "component", type: RichTextComponent, selector: "hm-rich-text", inputs: ["value", "label", "labelHidden", "hint", "placeholder", "readonly", "loading", "tools", "headingLevels", "hideToolbar", "rows", "maxRows", "maxLength", "showCounter", "pasteMode", "linkProtocols", "allowRelativeLinks", "spellcheck"], outputs: ["valueChange", "focusChange"] }, { kind: "component", type: SegmentedControlComponent, selector: "hm-segmented-control", inputs: ["options", "value", "label", "size", "emphasis"], outputs: ["valueChange"] }, { kind: "component", type: TagComponent, selector: "hm-tag", inputs: ["name", "color", "compact"] }, { kind: "component", type: TextareaComponent, selector: "hm-textarea", inputs: ["value", "label", "hint", "placeholder", "maxLength", "rows", "autoGrow", "labelHidden", "loading", "maxRows", "submitKey"], outputs: ["valueChange", "submitted"] }, { kind: "component", type: TimePickerComponent, selector: "hm-time-picker", inputs: ["value", "label", "labelHidden", "hint", "placeholder", "min", "max", "interval", "hourCycle"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
389
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.24", type: AutoServiceNewsComponent, isStandalone: true, selector: "spine-auto-service-news", inputs: { clientId: { classPropertyName: "clientId", publicName: "clientId", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<!-- Pagina\u00E7\u00E3o no servidor (agendadas e vencidas tamb\u00E9m); 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\u00E7alho do hm-modal some da vista (o t\u00EDtulo segue como nome do di\u00E1logo, ver o\n .scss) e o editor desenha o seu: \u00EDcone, t\u00EDtulo e subt\u00EDtulo. Pensado para caber sem rolagem num notebook: em cima,\n \"1. Informa\u00E7\u00F5es principais\" (t\u00EDtulo) com o resumo ao lado; embaixo, o conte\u00FAdo do tipo escolhido no topo (texto;\n introdu\u00E7\u00E3o + lista; ou introdu\u00E7\u00E3o + antes e agora), que estica e rola por dentro, ao lado do painel com publica\u00E7\u00E3o,\n validade, p\u00FAblico, dica e a pr\u00E9via do In\u00EDcio no fim. O modal n\u00E3o 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\u00E1 d\u00E1 o nome ao di\u00E1logo: este \u00E9 s\u00F3 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\u00E7\u00E3o: muda os campos do conte\u00FAdo e a pr\u00E9via. -->\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\u00E7\u00E3o 1 ocupa as duas colunas (subgrid): t\u00EDtulo \u00E0 esquerda, resumo \u00E0 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\u00E9 o fim da linha; quem rola \u00E9 o texto (ou a lista), n\u00E3o 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\u00EDcio; repete o que est\u00E1 nos campos, ent\u00E3o 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\u00E3o 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", styles: [".as-stack{display:flex;flex-direction:column;gap:var(--hm-space-md);min-inline-size:0}.as-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--hm-space-xs)}.as-field-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--hm-space-sm)}.as-field-row>hm-combobox{flex:1 1 16rem;min-inline-size:0}.as-summary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm)}.as-summary__info{display:flex;flex:1 1 16rem;flex-direction:column;gap:var(--hm-space-micro);min-inline-size:0}.as-summary__title{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.as-summary__detail{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.muted{color:var(--hm-muted)}.as-empty{margin:var(--hm-space-xs) 0 0;font-size:var(--hm-font-size-sm)}.as-secret{display:grid;gap:var(--hm-space-micro)}.as-secret__label{color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.as-secret__row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}.as-secret__value{flex:1 1 240px;min-width:0;border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-control);padding:var(--hm-space-xs) var(--hm-space-sm);background:var(--hm-surface-muted);color:var(--hm-text);font-family:var(--hm-font-mono);font-size:var(--hm-font-size-sm);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all}:host{display:block}.news-title{display:flex;flex-direction:column;gap:2px;min-inline-size:0}.news-title__summary{overflow:hidden;color:var(--hm-muted);font-size:var(--hm-font-size-xs);text-overflow:ellipsis;white-space:nowrap}.news-tags,.news-author{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-xs)}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne){block-size:min(100dvh - 2 * var(--hm-space-md),60rem);max-block-size:none;grid-template-rows:minmax(0,1fr) auto}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne)>.hm-modal__header{position:absolute;z-index:1;inset-block-start:0;inset-inline-end:0;border:0;padding:var(--hm-space-sm)}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne) .hm-modal__heading{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}:host ::ng-deep .hm-modal__window:has(>.hm-modal__body>.ne)>.hm-modal__body{display:flex;flex-direction:column;min-block-size:0;overflow:hidden;padding:0}.ne{container:ne/inline-size;display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.ne-head{display:flex;flex:none;flex-wrap:wrap;align-items:center;gap:var(--hm-space-sm);padding:var(--hm-space-sm) var(--hm-space-md);padding-inline-end:calc(var(--hm-space-md) + var(--hm-control-height) + var(--hm-space-sm));border-block-end:var(--hm-border-hairline) solid var(--hm-divider)}.ne-head__icon{display:grid;flex:none;place-items:center;inline-size:2.5rem;block-size:2.5rem;border-radius:var(--hm-radius);background:var(--hm-accent-subtle);color:var(--hm-accent)}.ne-head__text{display:flex;flex-direction:column;gap:var(--hm-space-nano);min-inline-size:0}.ne-head__title{color:var(--hm-text);font-size:var(--hm-font-size-xl);font-weight:var(--hm-font-weight-bold);line-height:var(--hm-line-height-tight)}.ne-head__intro{color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.ne-kind{margin-inline-start:auto}.ne-content__intro{flex:none}.ne-content__compare{display:flex;flex-direction:column;gap:var(--hm-space-sm)}.ne-preview__kind{padding:var(--hm-space-nano) var(--hm-space-xs);border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius-pill);color:var(--hm-text);font-size:var(--hm-font-size-3xs)}.ne-scroll{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--hm-space-sm);min-block-size:0;overflow-y:auto;padding:var(--hm-space-md)}.ne-grid{display:grid;flex:1 0 auto;grid-template-columns:minmax(0,1fr);gap:var(--hm-space-md)}.ne-section{display:flex;flex-direction:column;gap:var(--hm-space-xs);min-inline-size:0}.ne-section__head{display:flex;flex-direction:column;gap:var(--hm-space-nano)}.ne-section__title{display:flex;align-items:center;gap:var(--hm-space-xs);margin:0;color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.ne-section__icon{flex:none;color:var(--hm-accent)}.ne-section__hint{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-sm)}.ne-step{display:inline-grid;flex:none;place-items:center;inline-size:1.5rem;block-size:1.5rem;border-radius:var(--hm-radius-pill);background:var(--hm-accent-subtle);color:var(--hm-accent);font-size:var(--hm-font-size-xs);font-weight:var(--hm-font-weight-bold)}.ne-intro{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--hm-space-sm) var(--hm-space-md)}.ne-intro__lead{display:flex;flex-direction:column;gap:var(--hm-space-xs);min-inline-size:0}.ne-side{container:ne-side/inline-size;display:grid;grid-template-areas:\"publish\" \"until\" \"audience\" \"tip\" \"preview\";grid-template-columns:minmax(0,1fr);grid-template-rows:auto auto auto auto 1fr;gap:var(--hm-space-md);min-inline-size:0;padding:var(--hm-space-sm) var(--hm-space-md);border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius);background:var(--hm-surface-muted)}.ne-side__publish{grid-area:publish}.ne-side__until{grid-area:until}.ne-side__audience{grid-area:audience}.ne-tip{grid-area:tip}.ne-side__preview{grid-area:preview;align-self:end}@container ne (min-width: 52rem){.ne-scroll{overflow:hidden}.ne-grid{flex:1 1 auto;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto minmax(0,1fr);min-block-size:0}.ne-intro{grid-column:1/-1;grid-template-columns:subgrid}.ne-content{min-block-size:0;overflow:hidden}.ne-side{min-block-size:0;overflow-y:auto}.ne-content__items{flex:1 1 0;min-block-size:0;overflow-y:auto}.ne-content__compare{display:grid;flex:1 1 0;grid-template-columns:repeat(2,minmax(0,1fr));min-block-size:0}.ne-content__editor{flex:1 1 0;grid-template-rows:minmax(0,1fr);grid-auto-rows:auto;min-block-size:0}.ne-content__editor ::ng-deep .hm-rich-text__frame,.ne-content__editor ::ng-deep .hm-rich-text__loading{min-block-size:0}.ne-content__editor ::ng-deep .hm-rich-text__body{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.ne-content__editor ::ng-deep .hm-rich-text__area{flex:1 1 0;min-block-size:2lh;max-block-size:none;overflow-y:auto}.ne-content__editor--labelled{grid-template-rows:auto minmax(0,1fr)}}@media(max-height:55rem){@container ne-side (min-width: 34rem){.ne-side{grid-template-areas:\"publish audience\" \"until preview\" \"tip preview\";grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:auto auto 1fr}}}.ne-row{display:flex;flex-wrap:wrap;gap:var(--hm-space-sm)}.ne-row>*{flex:1 1 8rem;min-inline-size:0}.ne-note{margin:0;color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.ne-preview{display:flex;flex-direction:column;gap:var(--hm-space-micro);padding:var(--hm-space-sm) var(--hm-space-md);border:var(--hm-border-hairline) solid var(--hm-divider);border-radius:var(--hm-radius);background:var(--hm-surface-raised)}.ne-preview__head{display:flex;align-items:center;gap:var(--hm-space-xs)}.ne-preview__heading{color:var(--hm-text);font-size:var(--hm-font-size-md);font-weight:var(--hm-font-weight-semibold)}.ne-preview__badge,.ne-preview__status{flex:none;padding:var(--hm-space-nano) var(--hm-space-xs);border-radius:var(--hm-radius-micro);background:var(--hm-accent-subtle);color:var(--hm-accent);font-size:var(--hm-font-size-3xs);font-weight:var(--hm-font-weight-semibold);letter-spacing:.04em;text-transform:uppercase}.ne-preview__item{display:flex;align-items:center;gap:var(--hm-space-sm);padding:var(--hm-space-xs) 0;border-block-start:var(--hm-border-hairline) solid var(--hm-divider)}.ne-preview__icon{display:grid;flex:none;place-items:center;inline-size:2rem;block-size:2rem;border-radius:var(--hm-radius-control);background:var(--hm-accent-subtle);color:var(--hm-accent)}.ne-preview__text{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--hm-space-nano);min-inline-size:0}.ne-preview__title{overflow:hidden;color:var(--hm-text);font-size:var(--hm-font-size-sm);font-weight:var(--hm-font-weight-semibold);text-overflow:ellipsis;white-space:nowrap}.ne-preview__summary{display:-webkit-box;overflow:hidden;color:var(--hm-muted);font-size:var(--hm-font-size-xs);overflow-wrap:anywhere;-webkit-box-orient:vertical;-webkit-line-clamp:2}.ne-preview__placeholder{color:var(--hm-muted);font-style:italic;font-weight:var(--hm-font-weight-regular)}.ne-preview__date{display:inline-flex;flex-wrap:wrap;align-items:center;gap:var(--hm-space-micro);color:var(--hm-muted);font-size:var(--hm-font-size-xs)}.ne-preview__chevron{flex:none;color:var(--hm-muted)}.ne-tip{display:flex;align-items:flex-start;gap:var(--hm-space-xs);margin:0;padding:var(--hm-space-xs) var(--hm-space-sm);border-inline-start:var(--hm-border-thin) solid var(--hm-info);border-radius:var(--hm-radius-control);background:var(--hm-info-bg);color:var(--hm-text);font-size:var(--hm-font-size-xs)}@media(forced-colors:active){.ne-tip{border:var(--hm-border-hairline) solid CanvasText}}.ne-tip__icon{flex:none;color:var(--hm-info)}.ne-delete{margin-inline-end:auto}\n"], dependencies: [{ kind: "component", type: AccountAvatarComponent, selector: "hm-account-avatar", inputs: ["name", "imageUrl", "size", "loading", "presence", "texts"] }, { kind: "component", type: AlertComponent, selector: "hm-alert", inputs: ["variant", "appearance", "heading", "closable", "size", "showIcon", "link", "linkLabel", "linkTarget", "dismissKey", "duration"], outputs: ["closed"] }, { kind: "component", type: ButtonComponent, selector: "hm-button", inputs: ["emphasis", "intent", "size", "type", "icon", "iconDirection", "iconEnd", "disabled", "loading", "loadingState", "block", "link", "newTab", "caret", "inMenu", "toggle", "pressed"], outputs: ["loadingStateChange", "pressedChange", "clicked"] }, { kind: "component", type: ComboboxMultiComponent, selector: "hm-combobox-multi", inputs: ["label", "labelHidden", "options", "selected", "extraOptions", "unknownLabel", "placeholder", "hint", "max", "visibleChipsLimit"], outputs: ["selectedChange"] }, { kind: "component", type: DataGridComponent, selector: "hm-data-grid", inputs: ["columns", "rows", "rowId", "caption", "rowActions", "loading", "error", "emptyMessage", "noResultsMessage", "filterable", "paginated", "pageState", "pagination", "totalItems", "sort", "selectable", "selectionMode", "selection", "rowSelectable", "rowSelectableReason", "rowDetailDisabled", "rowDetailHidden", "virtual", "rowHeight", "pinnedColumns", "columnState", "pageSizes", "fillHeight", "maxHeight", "bordered", "rowState", "rowClickable", "remoteSearch", "remoteSort", "itemsLabel", "pageSizeLabel", "exportable", "exportFileName", "groupBy", "aggregates", "aggregateFormatter", "persistKey", "persistStorage", "advancedFilter", "filterQuery", "columnManager", "columnOrder", "striped", "columnGroups", "editMode", "editBatch", "texts", "treeChildren", "treeHasChildren", "treeExpanded", "searchTerm"], outputs: ["pageStateChange", "sortChange", "selectionChange", "pinnedColumnsChange", "columnStateChange", "actionTriggered", "detailToggled", "rowClicked", "clearFiltersRequested", "filteredChange", "searchTermChanged", "groupByChange", "filterQueryChange", "columnOrderChange", "editSaved", "editStarted", "editCanceled", "treeExpandedChange", "treeToggled", "searchTermChange", "detailPaneToggled"] }, { kind: "directive", type: DataGridCellDirective, selector: "ng-template[hmCell]", inputs: ["hmCell"] }, { kind: "component", type: DatePickerComponent, selector: "hm-date-picker", inputs: ["value", "label", "labelHidden", "hint", "placeholder", "min", "max", "valueFormat"], outputs: ["valueChange"] }, { kind: "component", type: IconComponent, selector: "hm-icon", inputs: ["shape", "direction", "size", "solid", "badge", "status", "flip", "inverse", "label"] }, { kind: "component", type: InputComponent, selector: "hm-input", inputs: ["value", "label", "type", "placeholder", "icon", "labelHidden", "hint", "prefix", "suffix", "prefixIcon", "mask", "maskValue", "min", "max", "step", "stepButtons", "maxLength", "autocomplete", "inputMode"], outputs: ["valueChange"] }, { kind: "component", type: ListEditorComponent, selector: "hm-list-editor", inputs: ["items", "label", "labelHidden", "hint", "placeholder", "descriptionPlaceholder", "pair", "itemLabel", "titleLabel", "descriptionLabel", "addLabel", "emptyText", "descriptionRequired", "allowDuplicates", "ignoreCase", "max", "validate", "editable", "readonly"], outputs: ["itemsChange", "added", "removed", "moved", "edited"] }, { kind: "component", type: ModalComponent, selector: "hm-modal", inputs: ["open", "heading", "size", "closeLabel", "closable", "beforeClose"], outputs: ["openChange", "closed"] }, { kind: "component", type: RichTextComponent, selector: "hm-rich-text", inputs: ["value", "label", "labelHidden", "hint", "placeholder", "readonly", "loading", "tools", "headingLevels", "hideToolbar", "rows", "maxRows", "maxLength", "showCounter", "pasteMode", "linkProtocols", "allowRelativeLinks", "spellcheck"], outputs: ["valueChange", "focusChange"] }, { kind: "component", type: SegmentedControlComponent, selector: "hm-segmented-control", inputs: ["options", "value", "label", "size", "emphasis"], outputs: ["valueChange"] }, { kind: "component", type: TagComponent, selector: "hm-tag", inputs: ["name", "color", "compact"] }, { kind: "component", type: TextareaComponent, selector: "hm-textarea", inputs: ["value", "label", "hint", "placeholder", "maxLength", "rows", "autoGrow", "labelHidden", "loading", "maxRows", "submitKey", "mentionCandidates", "mentionTrigger", "texts"], outputs: ["valueChange", "submitted", "mentioned"] }, { kind: "component", type: TimePickerComponent, selector: "hm-time-picker", inputs: ["value", "label", "labelHidden", "hint", "placeholder", "min", "max", "interval", "hourCycle"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
390
390
|
}
|
|
391
391
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImport: i0, type: AutoServiceNewsComponent, decorators: [{
|
|
392
392
|
type: Component,
|
|
@@ -429,4 +429,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
|
|
|
429
429
|
}] });
|
|
430
430
|
|
|
431
431
|
export { AutoServiceNewsPageComponent };
|
|
432
|
-
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-news-page.component-
|
|
432
|
+
//# sourceMappingURL=trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map
|