@trismegisto/spine 3.3.1 → 3.3.3
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/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs +2179 -0
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs → trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs} +7 -4
- package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +2 -2
- package/fesm2022/trismegisto-spine-graphql.mjs +3 -1
- package/fesm2022/trismegisto-spine-graphql.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs +532 -0
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs +8429 -0
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout.mjs +1 -7651
- package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-routing.mjs +16 -3
- package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +4 -2
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +286 -29
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-layout.d.ts +879 -20
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-routing.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +130 -12
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs +0 -2123
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { OnDestroy,
|
|
2
|
+
import { OnDestroy, InjectionToken, Signal, OnInit, Type, Provider, TemplateRef, DestroyRef, EnvironmentProviders } from '@angular/core';
|
|
3
3
|
import { Router } from '@angular/router';
|
|
4
4
|
import * as _trismegisto_spine from '@trismegisto/spine';
|
|
5
5
|
import { Route, ThemeService, ThemePresetService, DensityService, SpineConfig, SpinePreferencesService, SpineHourCyclePreference, SpineStartPagePreference, SpineNoticeType, SpineMcpServer, SpineFeatures } from '@trismegisto/spine';
|
|
@@ -150,7 +150,6 @@ declare class SpineNewsService {
|
|
|
150
150
|
readonly favoritesVersion: _angular_core.WritableSignal<number>;
|
|
151
151
|
private announced;
|
|
152
152
|
constructor();
|
|
153
|
-
private get headers();
|
|
154
153
|
/** Relê as mais recentes; qualquer falha deixa a lista vazia (o item some em vez de mostrar um erro sem contexto). */
|
|
155
154
|
refresh(): Promise<void>;
|
|
156
155
|
/** Uma página da lista (`page` a partir de 1). Falha propaga: o painel mostra o erro com "Tentar de novo". */
|
|
@@ -240,12 +239,85 @@ declare class ShortcutService implements OnDestroy {
|
|
|
240
239
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<ShortcutService>;
|
|
241
240
|
}
|
|
242
241
|
|
|
242
|
+
/** Query de uma aba, como objeto (o último valor de cada nome). */
|
|
243
|
+
type SpineTabParams = Readonly<Record<string, string>>;
|
|
244
|
+
/**
|
|
245
|
+
* A aba do workspace em que a tela está montada (`inject(SPINE_TAB)` na tela). Com o keepAlive, várias abas da MESMA
|
|
246
|
+
* tela ficam vivas ao mesmo tempo (um registro por aba); `window.location`/`ActivatedRoute` só refletem a aba do
|
|
247
|
+
* painel focado. Aqui cada tela lê e escreve a SUA.
|
|
248
|
+
*
|
|
249
|
+
* ```ts
|
|
250
|
+
* private readonly tab = inject(SPINE_TAB, { optional: true });
|
|
251
|
+
* readonly pedido = computed(() => this.tab?.params()['pedido'] ?? null);
|
|
252
|
+
* // trocar a seção: a mesma aba, sem recriar a tela (e o endereço do navegador acompanha, se a aba está à vista)
|
|
253
|
+
* this.tab?.navigate({ queryParams: { secao: 'itens' } });
|
|
254
|
+
* // o nome do registro no lugar do nome da rota
|
|
255
|
+
* this.tab?.setLabel('Pedido 123');
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
interface SpineTab {
|
|
259
|
+
/** Identidade estável da aba (o caminho, ou o caminho com os parâmetros que a identificam). */
|
|
260
|
+
readonly id: Signal<string>;
|
|
261
|
+
/** O painel em que a aba está agora. */
|
|
262
|
+
readonly panelId: Signal<string>;
|
|
263
|
+
/** O endereço atual da aba, com a query. */
|
|
264
|
+
readonly url: Signal<string>;
|
|
265
|
+
/** A query da aba. */
|
|
266
|
+
readonly params: Signal<SpineTabParams>;
|
|
267
|
+
/** A aba é a visível do painel focado (é a que o endereço do navegador mostra). */
|
|
268
|
+
readonly focused: Signal<boolean>;
|
|
269
|
+
/** Troca o nome (e, se vier, o ícone) da aba; persiste no F5 nas abas com parâmetros. */
|
|
270
|
+
setLabel(label: string, icon?: string): void;
|
|
271
|
+
/**
|
|
272
|
+
* Muda o endereço da própria aba. Com `queryParams`, mescla na query atual (`merge`, padrão) ou troca a query
|
|
273
|
+
* inteira (`merge: false`); `null`/`undefined` tira o parâmetro. Mesma tela: só a query muda, a tela não é recriada.
|
|
274
|
+
* Outra tela (um caminho diferente): é a navegação no lugar da aba, como um link dentro do painel.
|
|
275
|
+
*/
|
|
276
|
+
navigate(target: string | {
|
|
277
|
+
queryParams: Readonly<Record<string, string | number | boolean | null | undefined>>;
|
|
278
|
+
merge?: boolean;
|
|
279
|
+
}): void;
|
|
280
|
+
}
|
|
281
|
+
declare const SPINE_TAB: InjectionToken<SpineTab>;
|
|
282
|
+
|
|
283
|
+
/** O caminho de um endereço (sem query nem fragmento). */
|
|
284
|
+
declare function spinePathOf(url: string): string;
|
|
285
|
+
/** A query de um endereço, como objeto. */
|
|
286
|
+
declare function spineParamsOf(url: string): SpineTabParams;
|
|
287
|
+
/** Caminho + query com os nomes em ordem: o mesmo endereço escrito de dois jeitos vira um só (sem o fragmento). */
|
|
288
|
+
declare function spineNormalizeUrl(url: string): string;
|
|
289
|
+
/** Como abrir uma aba pelo app (`openTab`). */
|
|
290
|
+
interface SpineOpenTabOptions {
|
|
291
|
+
/** Nome da aba (senão, o da rota). A tela pode trocar depois (`SPINE_TAB.setLabel`). */
|
|
292
|
+
label?: string;
|
|
293
|
+
icon?: string;
|
|
294
|
+
/**
|
|
295
|
+
* Os parâmetros que IDENTIFICAM a aba: com `['dispositivo']`, o mesmo dispositivo em outra seção reaproveita a aba
|
|
296
|
+
* aberta, e trocar a seção dentro dela não abre outra. Sem `match`, todos os parâmetros do endereço identificam.
|
|
297
|
+
*/
|
|
298
|
+
match?: readonly string[];
|
|
299
|
+
/** Abre num painel novo ao lado do focado (para comparar), em vez de no próprio painel focado. */
|
|
300
|
+
beside?: boolean;
|
|
301
|
+
}
|
|
243
302
|
/**
|
|
244
303
|
* Dono do `WorkspaceStore` do shell — mesmo padrão do `WorkspaceNavService` do docs/website
|
|
245
304
|
* (`packages/hermes-ui/docs/website/src/app/workspace-nav.service.ts`), adaptado pra ler a
|
|
246
305
|
* árvore de rotas do BACKEND (`ViewService.currentView`) em vez de um `page-registry.ts`
|
|
247
306
|
* estático. Cada página visitada vira uma aba, pertencente a um painel; a navegação real do
|
|
248
307
|
* `Router` (routerLink, busca, sidebar) sempre atualiza a aba ativa do painel FOCADO.
|
|
308
|
+
*
|
|
309
|
+
* **Dois jeitos de ter aba, que convivem.** A navegação de sempre (menu, links, busca) mantém UMA aba por tela, com o
|
|
310
|
+
* caminho como `id` — como antes; a query que a tela usa fica guardada no `url` da aba e volta junto quando a pessoa
|
|
311
|
+
* retorna a ela. E o app pode abrir **abas com parâmetros** (`openTab`): a mesma tela várias vezes, uma por registro
|
|
312
|
+
* (um pedido, um dispositivo...). Nelas o `id` é a identidade (o caminho com os parâmetros que a identificam) e o `url`
|
|
313
|
+
* é o endereço atual (com a query que a tela vai mudando).
|
|
314
|
+
* O keepAlive do workspace acompanha o `id`, então mudar a query da aba não recria a tela. Uma navegação real cai
|
|
315
|
+
* numa destas, em ordem:
|
|
316
|
+
* 1. o endereço já é o da aba ativa → nada;
|
|
317
|
+
* 2. a mesma tela da aba ativa, mantendo os parâmetros que a identificam → só o `url` da aba muda (mesma aba);
|
|
318
|
+
* 3. outra aba do painel já está nesse endereço → ela é ativada;
|
|
319
|
+
* 4. senão → a aba ativa passa a ser a da tela nova (o comportamento de sempre).
|
|
320
|
+
* `openTab` abre (ou foca, em qualquer painel) a aba de um endereço com parâmetros.
|
|
249
321
|
*/
|
|
250
322
|
declare class SpineWorkspaceNavService {
|
|
251
323
|
private readonly router;
|
|
@@ -259,22 +331,51 @@ declare class SpineWorkspaceNavService {
|
|
|
259
331
|
* `viewService.logControl$`/`breadCrumb$` globais (que só existiam porque havia uma página
|
|
260
332
|
* "atual" só; agora cada painel tem a sua). */
|
|
261
333
|
readonly focusedChain: _angular_core.Signal<Route[] | null>;
|
|
262
|
-
|
|
334
|
+
/** O último endereço que o `Router` mostrou (normalizado, com a query): o `effect` abaixo não navega para ele de novo. */
|
|
335
|
+
private lastKnownUrl;
|
|
263
336
|
constructor();
|
|
337
|
+
private activeTab;
|
|
338
|
+
/** Uma navegação real no painel focado: as quatro regras do comentário da classe. */
|
|
339
|
+
private followNavigation;
|
|
264
340
|
/**
|
|
265
341
|
* As abas abertas passam a obedecer à view atual: aba de tela que a pessoa não pode mais abrir fecha (e o
|
|
266
342
|
* conteúdo dela é destruído junto); painel que ficaria sem aba nenhuma mostra o Início no lugar; a aba ativa
|
|
267
|
-
* de cada painel recebe o nome e o ícone da view nova
|
|
343
|
+
* de cada painel recebe o nome e o ícone da view nova (a aba com parâmetros guarda o nome que a tela deu). View
|
|
344
|
+
* vazia (ainda carregando) não fecha nada.
|
|
268
345
|
*/
|
|
269
346
|
reconcileWithView(): void;
|
|
270
347
|
/** Resolve a cadeia de rotas pra uma URL, direto na view atual — sem `Router`, sem `async`
|
|
271
348
|
* (o componente da folha só é carregado por quem for de fato desenhar o painel). Desce sozinho
|
|
272
349
|
* por nós organizacionais (com filhos, sem conteúdo próprio) — o rótulo/ícone da aba e o que a
|
|
273
|
-
* sidebar/breadcrumb mostram refletem o destino DE VERDADE, não a rota-container clicada.
|
|
350
|
+
* sidebar/breadcrumb mostram refletem o destino DE VERDADE, não a rota-container clicada. A query não
|
|
351
|
+
* conta: `ViewService.routePath` a tira. */
|
|
274
352
|
private chainFor;
|
|
353
|
+
/** A aba de uma tela pelo endereço: o `id` é o caminho; com query, o endereço vai no `url` (a mesma aba da tela). */
|
|
275
354
|
tabFor(url: string): TabItem;
|
|
355
|
+
/**
|
|
356
|
+
* Restaura uma aba salva (F5): a rota precisa continuar valendo para a pessoa. A aba com parâmetros volta com o
|
|
357
|
+
* endereço e o nome que tinha (o nome é o que a tela deu — "RT-MPLS-3046-0001" —, a rota não sabe); as outras
|
|
358
|
+
* voltam com o nome da rota (que acompanha o idioma).
|
|
359
|
+
*/
|
|
360
|
+
private restoreTab;
|
|
276
361
|
/** O `+` de um painel: abre a home ali, como um navegador. */
|
|
277
362
|
openNewTab(panelId: string): void;
|
|
363
|
+
/**
|
|
364
|
+
* Abre (ou foca) a aba de um endereço com parâmetros — um registro por aba na mesma tela:
|
|
365
|
+
* `openTab('/vendas/pedidos?pedido=123&secao=itens', { label: 'Pedido 123', match: ['pedido'] })`.
|
|
366
|
+
* Se alguma aba (em qualquer painel) já tem essa identidade, ela é focada e passa a esse endereço; senão abre uma
|
|
367
|
+
* no painel focado (ou num painel novo ao lado, com `beside`). Só abre o que a view da pessoa permite (a mesma
|
|
368
|
+
* regra do menu e do `ViewGuard`); fora dela, não faz nada.
|
|
369
|
+
*/
|
|
370
|
+
openTab(url: string, options?: SpineOpenTabOptions): void;
|
|
371
|
+
/** O nome (e o ícone) de uma aba, dado pela tela (`SPINE_TAB.setLabel`). */
|
|
372
|
+
setTabLabel(panelId: string, tabId: string, label: string, icon?: string): void;
|
|
373
|
+
/**
|
|
374
|
+
* A tela muda o endereço da própria aba (`SPINE_TAB.navigate`). A mesma tela, mantendo a identidade: só o `url` da
|
|
375
|
+
* aba muda (sem recriar a tela) e, se ela é a visível do painel focado, o endereço do navegador acompanha (sem
|
|
376
|
+
* empilhar histórico). Outra tela: navegação local no painel, como um link dentro dele.
|
|
377
|
+
*/
|
|
378
|
+
navigateTab(panelId: string, tabId: string, url: string): void;
|
|
278
379
|
/** Navegação LOCAL a um painel específico (usada pelo `PanelLocalLinkDirective`) — troca o
|
|
279
380
|
* ASSUNTO da aba ativa daquele painel, não empilha uma aba nova. */
|
|
280
381
|
navigateLocally(panelId: string, href: string): void;
|
|
@@ -2669,7 +2770,6 @@ declare class SpineRatingsService {
|
|
|
2669
2770
|
readonly appAverage: _angular_core.WritableSignal<SpineRatingAverage | null>;
|
|
2670
2771
|
private appRatedChecked;
|
|
2671
2772
|
private get url();
|
|
2672
|
-
private get headers();
|
|
2673
2773
|
/** "Avaliar o {app}": abre a janela (ou troca o conteúdo dela) para a ferramenta. */
|
|
2674
2774
|
openApp(): void;
|
|
2675
2775
|
/** "Avaliar esta tela": abre a janela (ou troca o conteúdo dela) para a tela. */
|
|
@@ -2781,6 +2881,132 @@ declare class SpinePageActionsDirective implements OnDestroy {
|
|
|
2781
2881
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SpinePageActionsDirective, "ng-template[spinePageActions]", never, {}, {}, never, never, true, never>;
|
|
2782
2882
|
}
|
|
2783
2883
|
|
|
2884
|
+
/** Uma novidade na central de notificações (o sino do cabeçalho). */
|
|
2885
|
+
interface SpineInboxItem {
|
|
2886
|
+
/** Único dentro da fonte. */
|
|
2887
|
+
readonly id: string;
|
|
2888
|
+
readonly title: string;
|
|
2889
|
+
/** A novidade em uma linha ("Ana: pode mandar um exemplo?"). */
|
|
2890
|
+
readonly body?: string;
|
|
2891
|
+
/** Quando aconteceu (a novidade mais recente do item): ordena a lista e vira "há 5 min". */
|
|
2892
|
+
readonly at: string | Date;
|
|
2893
|
+
/** Quantas novidades o item junta (mostra "+N" a partir de 2). */
|
|
2894
|
+
readonly count?: number;
|
|
2895
|
+
/** Quem fez: a foto (ou as iniciais) na linha; sem pessoa, o ícone da fonte. */
|
|
2896
|
+
readonly person?: {
|
|
2897
|
+
readonly name: string;
|
|
2898
|
+
readonly picture?: string | null;
|
|
2899
|
+
} | null;
|
|
2900
|
+
}
|
|
2901
|
+
/**
|
|
2902
|
+
* Uma fonte da central de notificações: o que há de novo PARA a pessoa num recurso (sugestões, aprovações, chamados…).
|
|
2903
|
+
* Não são os toasts (`HermesToastService`/`NotificationService`), que passam: aqui fica até a pessoa ver. Registre com
|
|
2904
|
+
* `provideSpineInboxSource`; o sino só aparece com alguma fonte.
|
|
2905
|
+
*/
|
|
2906
|
+
interface SpineInboxSource {
|
|
2907
|
+
readonly id: string;
|
|
2908
|
+
/** O nome da fonte ("Sugestões"), acima dos itens dela. */
|
|
2909
|
+
readonly label: string;
|
|
2910
|
+
/** Ícone da fonte (@trismegisto/icons), nos itens sem pessoa. */
|
|
2911
|
+
readonly icon?: string;
|
|
2912
|
+
/** As novidades (as mais recentes, até umas 20) e o total de itens com novidade (o número do sino). */
|
|
2913
|
+
load(): Promise<{
|
|
2914
|
+
readonly items: readonly SpineInboxItem[];
|
|
2915
|
+
readonly total: number;
|
|
2916
|
+
}>;
|
|
2917
|
+
/** A pessoa escolheu o item: marque como visto e abra onde ele está. A central relê depois. */
|
|
2918
|
+
open(item: SpineInboxItem): void | Promise<void>;
|
|
2919
|
+
}
|
|
2920
|
+
/** As fontes registradas (multi). Uma fábrica pode devolver `null` (recurso desligado): fica de fora. */
|
|
2921
|
+
declare const SPINE_INBOX_SOURCES: InjectionToken<readonly (SpineInboxSource | null)[]>;
|
|
2922
|
+
/**
|
|
2923
|
+
* Registra uma fonte na central de notificações. A fábrica roda num contexto de injeção (`inject()` vale) e pode
|
|
2924
|
+
* devolver `null` para não registrar nada.
|
|
2925
|
+
*
|
|
2926
|
+
* ```ts
|
|
2927
|
+
* provideSpineInboxSource(() => {
|
|
2928
|
+
* const api = inject(AprovacoesApi);
|
|
2929
|
+
* const router = inject(Router);
|
|
2930
|
+
* return {
|
|
2931
|
+
* id: 'aprovacoes', label: 'Aprovações', icon: 'check-circle',
|
|
2932
|
+
* load: async () => { const r = await api.pendentes(); return { total: r.total, items: r.itens.map(toItem) }; },
|
|
2933
|
+
* open: (item) => void router.navigateByUrl(`/aprovacoes/${item.id}`),
|
|
2934
|
+
* };
|
|
2935
|
+
* })
|
|
2936
|
+
* ```
|
|
2937
|
+
*/
|
|
2938
|
+
declare function provideSpineInboxSource(factory: () => SpineInboxSource | null): Provider;
|
|
2939
|
+
|
|
2940
|
+
/** Um item na lista do sino, com a fonte dele. */
|
|
2941
|
+
interface SpineInboxEntry {
|
|
2942
|
+
/** `fonte:item`, único na lista. */
|
|
2943
|
+
readonly key: string;
|
|
2944
|
+
readonly source: SpineInboxSource;
|
|
2945
|
+
readonly item: SpineInboxItem;
|
|
2946
|
+
}
|
|
2947
|
+
/** De quanto em quanto tempo a central relê, com a aba do navegador à vista. */
|
|
2948
|
+
declare const SPINE_INBOX_POLL_MS = 60000;
|
|
2949
|
+
/**
|
|
2950
|
+
* A central de notificações (o sino do cabeçalho): junta as novidades das fontes registradas
|
|
2951
|
+
* (`provideSpineInboxSource`), a mais recente primeiro. Relê enquanto alguém acompanha (`watch`): de minuto em minuto
|
|
2952
|
+
* com a aba à vista e ao voltar para ela. Quem muda o que conta como novidade (ler uma conversa, por exemplo) chama
|
|
2953
|
+
* `refresh()`.
|
|
2954
|
+
*/
|
|
2955
|
+
declare class SpineInboxService {
|
|
2956
|
+
private readonly browser;
|
|
2957
|
+
private readonly sources;
|
|
2958
|
+
/** Alguma fonte registrada: sem nenhuma, o sino não aparece. */
|
|
2959
|
+
readonly enabled: boolean;
|
|
2960
|
+
readonly entries: _angular_core.WritableSignal<readonly SpineInboxEntry[]>;
|
|
2961
|
+
/** Itens com novidade, somando as fontes (o número do sino). */
|
|
2962
|
+
readonly total: _angular_core.WritableSignal<number>;
|
|
2963
|
+
readonly loading: _angular_core.WritableSignal<boolean>;
|
|
2964
|
+
/** Nenhuma fonte respondeu na última leitura. */
|
|
2965
|
+
readonly failed: _angular_core.WritableSignal<boolean>;
|
|
2966
|
+
private request;
|
|
2967
|
+
private watchers;
|
|
2968
|
+
private timer;
|
|
2969
|
+
private readonly onVisible;
|
|
2970
|
+
/** Relê todas as fontes. Uma fonte que falha não derruba as outras. */
|
|
2971
|
+
refresh(): Promise<void>;
|
|
2972
|
+
/** A pessoa escolheu um item: a fonte abre (e marca como visto); depois a central relê. */
|
|
2973
|
+
open(entry: SpineInboxEntry): Promise<void>;
|
|
2974
|
+
/**
|
|
2975
|
+
* Passa a reler sozinha enquanto `destroyRef` viver (o sino no cabeçalho): lê agora, de minuto em minuto com a aba à
|
|
2976
|
+
* vista e ao voltar para a aba. Vários acompanhando dividem o mesmo relógio.
|
|
2977
|
+
*/
|
|
2978
|
+
watch(destroyRef: DestroyRef): void;
|
|
2979
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineInboxService, never>;
|
|
2980
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineInboxService>;
|
|
2981
|
+
}
|
|
2982
|
+
|
|
2983
|
+
/**
|
|
2984
|
+
* O sino do cabeçalho: a central de notificações (`SpineInboxService`). O número é quantos itens têm novidade; o
|
|
2985
|
+
* painel lista as novidades das fontes, a mais recente primeiro, e escolher uma abre onde ela está. Sem fonte
|
|
2986
|
+
* registrada, não desenha nada.
|
|
2987
|
+
*/
|
|
2988
|
+
declare class SpineInboxButtonComponent {
|
|
2989
|
+
protected readonly inbox: SpineInboxService;
|
|
2990
|
+
private readonly messages;
|
|
2991
|
+
protected readonly text: {
|
|
2992
|
+
title: string;
|
|
2993
|
+
button: _trismegisto_primitives.PluralMessage;
|
|
2994
|
+
empty: string;
|
|
2995
|
+
error: string;
|
|
2996
|
+
retry: string;
|
|
2997
|
+
news: _trismegisto_primitives.PluralMessage;
|
|
2998
|
+
};
|
|
2999
|
+
protected readonly buttonLabel: _angular_core.Signal<string>;
|
|
3000
|
+
constructor();
|
|
3001
|
+
protected choose(entry: SpineInboxEntry): void;
|
|
3002
|
+
protected newsText(count: number): string;
|
|
3003
|
+
protected iso(entry: SpineInboxEntry): string;
|
|
3004
|
+
/** "há 5 min", "ontem", "há 3 dias" (Intl, no idioma do catálogo). */
|
|
3005
|
+
protected ago(entry: SpineInboxEntry): string;
|
|
3006
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineInboxButtonComponent, never>;
|
|
3007
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineInboxButtonComponent, "spine-inbox-button", never, {}, {}, never, never, true, never>;
|
|
3008
|
+
}
|
|
3009
|
+
|
|
2784
3010
|
/** Tipos de sugestão, como o Argos guarda (`web.app_suggestions.kind`). */
|
|
2785
3011
|
declare const SPINE_SUGGESTION_KINDS: readonly ["melhoria", "nova_funcionalidade", "problema", "outro"];
|
|
2786
3012
|
type SpineSuggestionKind = (typeof SPINE_SUGGESTION_KINDS)[number];
|
|
@@ -2824,10 +3050,7 @@ interface SpineSuggestion {
|
|
|
2824
3050
|
kind: SpineSuggestionKind;
|
|
2825
3051
|
title: string;
|
|
2826
3052
|
description: string;
|
|
2827
|
-
screen:
|
|
2828
|
-
path: string | null;
|
|
2829
|
-
label: string | null;
|
|
2830
|
-
};
|
|
3053
|
+
screen: SpineSuggestionScreen;
|
|
2831
3054
|
status: SpineSuggestionStatus;
|
|
2832
3055
|
position: number;
|
|
2833
3056
|
votes: number;
|
|
@@ -2840,6 +3063,9 @@ interface SpineSuggestion {
|
|
|
2840
3063
|
} | null;
|
|
2841
3064
|
/** Desde quando está no status atual (o último evento para ele; sem evento, a criação). */
|
|
2842
3065
|
status_at?: string;
|
|
3066
|
+
/** Com quem está a vez na conversa (null = em dia). */
|
|
3067
|
+
waiting_on?: SpineSuggestionWaiting | null;
|
|
3068
|
+
waiting_since?: string | null;
|
|
2843
3069
|
created_at: string;
|
|
2844
3070
|
updated_at: string;
|
|
2845
3071
|
/** Só no auto-serviço: quem pediu, com a foto (null = pessoa removida). */
|
|
@@ -2866,10 +3092,7 @@ interface SpineAppSuggestion {
|
|
|
2866
3092
|
title: string;
|
|
2867
3093
|
/** Texto puro (a descrição inteira, até 4000). */
|
|
2868
3094
|
description: string;
|
|
2869
|
-
screen:
|
|
2870
|
-
path: string | null;
|
|
2871
|
-
label: string | null;
|
|
2872
|
-
};
|
|
3095
|
+
screen: SpineSuggestionScreen;
|
|
2873
3096
|
status: SpineSuggestionStatus;
|
|
2874
3097
|
votes: number;
|
|
2875
3098
|
/** Quem consulta apoia. */
|
|
@@ -2906,23 +3129,129 @@ interface SpineAppSuggestionsQuery {
|
|
|
2906
3129
|
interface SpineSuggestionDraft {
|
|
2907
3130
|
kind: SpineSuggestionKind;
|
|
2908
3131
|
title: string;
|
|
2909
|
-
|
|
3132
|
+
/** Texto puro (o formato antigo; o servidor ainda aceita). */
|
|
3133
|
+
description?: string;
|
|
3134
|
+
/** A descrição em rich text (o editor do modal); o servidor saneia e deriva o texto puro. */
|
|
3135
|
+
description_html?: string;
|
|
3136
|
+
/** Tela do menu (`router_id` e a rota) ou `new: true` com o nome da tela que ainda não existe em `label`. */
|
|
2910
3137
|
screen: {
|
|
2911
3138
|
path: string | null;
|
|
2912
3139
|
label: string | null;
|
|
3140
|
+
router_id?: string | null;
|
|
3141
|
+
new?: boolean;
|
|
2913
3142
|
};
|
|
2914
3143
|
}
|
|
3144
|
+
/** Por que a pessoa vê a sugestão (o servidor decide; uma sugestão pode ter vários). */
|
|
3145
|
+
declare const SPINE_SUGGESTION_REASONS: readonly ["autor", "relator", "envolvido", "responsavel", "grupo"];
|
|
3146
|
+
type SpineSuggestionReason = (typeof SPINE_SUGGESTION_REASONS)[number];
|
|
3147
|
+
/** Com quem está a vez na conversa: quem pediu (a equipe respondeu) ou a equipe (quem pediu escreveu). */
|
|
3148
|
+
declare const SPINE_SUGGESTION_WAITING: readonly ["solicitante", "responsaveis"];
|
|
3149
|
+
type SpineSuggestionWaiting = (typeof SPINE_SUGGESTION_WAITING)[number];
|
|
3150
|
+
/** Cor do selo "Aguardando…": a vez de quem pede chama atenção; a da equipe, não. */
|
|
3151
|
+
declare const SPINE_SUGGESTION_WAITING_COLORS: Record<SpineSuggestionWaiting, TagColor>;
|
|
3152
|
+
declare const SPINE_SUGGESTION_VISIBLE_SORTS: readonly ["activity", "recent", "votes"];
|
|
3153
|
+
type SpineSuggestionVisibleSort = (typeof SPINE_SUGGESTION_VISIBLE_SORTS)[number];
|
|
3154
|
+
/** A tela de uma sugestão: a do menu (`router_id`, rota e o caminho legível) ou uma nova (`new`, o nome no `label`). */
|
|
3155
|
+
interface SpineSuggestionScreen {
|
|
3156
|
+
path: string | null;
|
|
3157
|
+
label: string | null;
|
|
3158
|
+
router_id?: string | null;
|
|
3159
|
+
new?: boolean;
|
|
3160
|
+
}
|
|
3161
|
+
/**
|
|
3162
|
+
* Uma sugestão que a pessoa VÊ (`/me/suggestions/visible` e o detalhe): as dela, as do grupo dela e as em que ela está
|
|
3163
|
+
* envolvida, com os motivos (`reasons`), se ela pode conversar (`can_comment`, quem tem motivo pessoal) e com quem está
|
|
3164
|
+
* a vez (`waiting_on`).
|
|
3165
|
+
*/
|
|
3166
|
+
interface SpineVisibleSuggestion {
|
|
3167
|
+
id: string;
|
|
3168
|
+
key: string;
|
|
3169
|
+
kind: SpineSuggestionKind;
|
|
3170
|
+
title: string;
|
|
3171
|
+
description: string;
|
|
3172
|
+
/** A descrição em rich text (saneada pelo servidor); vazia sem descrição. */
|
|
3173
|
+
description_html?: string;
|
|
3174
|
+
screen: SpineSuggestionScreen;
|
|
3175
|
+
status: SpineSuggestionStatus;
|
|
3176
|
+
status_at?: string;
|
|
3177
|
+
votes: number;
|
|
3178
|
+
voted: boolean;
|
|
3179
|
+
mine: boolean;
|
|
3180
|
+
reasons: SpineSuggestionReason[];
|
|
3181
|
+
can_comment: boolean;
|
|
3182
|
+
waiting_on: SpineSuggestionWaiting | null;
|
|
3183
|
+
waiting_since: string | null;
|
|
3184
|
+
comments_count: number;
|
|
3185
|
+
last_comment: {
|
|
3186
|
+
comment: string;
|
|
3187
|
+
created_at: string;
|
|
3188
|
+
} | null;
|
|
3189
|
+
/** Mensagens de outras pessoas que quem consulta ainda não leu. */
|
|
3190
|
+
unread: number;
|
|
3191
|
+
archived: boolean;
|
|
3192
|
+
merged_from: Array<{
|
|
3193
|
+
id: string;
|
|
3194
|
+
key: string;
|
|
3195
|
+
title: string;
|
|
3196
|
+
}>;
|
|
3197
|
+
groups: Array<{
|
|
3198
|
+
id: string;
|
|
3199
|
+
name: string;
|
|
3200
|
+
}>;
|
|
3201
|
+
author: SpineSuggestionPerson | null;
|
|
3202
|
+
assignees: SpineSuggestionPerson[];
|
|
3203
|
+
created_at: string;
|
|
3204
|
+
updated_at: string;
|
|
3205
|
+
last_activity_at?: string;
|
|
3206
|
+
}
|
|
3207
|
+
/** Contagens do conjunto visível inteiro (sem os filtros), para os filtros rápidos da página. */
|
|
3208
|
+
type SpineVisibleCounts = Record<SpineSuggestionReason, number> & {
|
|
3209
|
+
waiting_me: number;
|
|
3210
|
+
unread: number;
|
|
3211
|
+
};
|
|
3212
|
+
interface SpineVisibleQuery {
|
|
3213
|
+
limit: number;
|
|
3214
|
+
offset: number;
|
|
3215
|
+
reason?: SpineSuggestionReason | '';
|
|
3216
|
+
status?: SpineSuggestionStatus | '';
|
|
3217
|
+
kind?: SpineSuggestionKind | '';
|
|
3218
|
+
waiting?: SpineSuggestionWaiting | '';
|
|
3219
|
+
screen?: string;
|
|
3220
|
+
newScreen?: boolean;
|
|
3221
|
+
q?: string;
|
|
3222
|
+
sort?: SpineSuggestionVisibleSort;
|
|
3223
|
+
}
|
|
3224
|
+
/** Mensagem da conversa (comentário público): `from_requester` = escrita por quem pediu ou um envolvido. */
|
|
3225
|
+
interface SpineSuggestionMessage extends SpineSuggestionComment {
|
|
3226
|
+
from_requester?: boolean;
|
|
3227
|
+
}
|
|
2915
3228
|
/**
|
|
2916
3229
|
* Sugestões de melhoria da pessoa — `argos-admin /me/suggestions`. Sempre da aplicação LOGADA (o servidor tira o client
|
|
2917
3230
|
* do access-token da sessão) e com o token da sessão (o servidor recusa x-app-token). Sem `SPINE_ADMIN_API` não há
|
|
2918
3231
|
* para onde mandar: o botão da barra da página nem aparece (`SpineSuggestButtonComponent`).
|
|
2919
3232
|
*/
|
|
3233
|
+
/** Uma sugestão acompanhada com novidade (`/me/suggestions/updates`): a central de notificações. */
|
|
3234
|
+
interface SpineSuggestionUpdate {
|
|
3235
|
+
id: string;
|
|
3236
|
+
key: string;
|
|
3237
|
+
title: string;
|
|
3238
|
+
status: SpineSuggestionStatus;
|
|
3239
|
+
/** Quantas novidades desde a última leitura (comentários públicos e mudanças de status de outras pessoas). */
|
|
3240
|
+
count: number;
|
|
3241
|
+
/** A mais recente: o comentário (até 200) ou o status novo, e quem fez. */
|
|
3242
|
+
last: {
|
|
3243
|
+
kind: 'comment' | 'status';
|
|
3244
|
+
status: SpineSuggestionStatus | null;
|
|
3245
|
+
comment: string | null;
|
|
3246
|
+
at: string;
|
|
3247
|
+
author: SpineSuggestionPerson | null;
|
|
3248
|
+
};
|
|
3249
|
+
}
|
|
2920
3250
|
declare class SpineSuggestionsService {
|
|
2921
3251
|
private readonly http;
|
|
2922
3252
|
private readonly auth;
|
|
2923
3253
|
private readonly adminApi;
|
|
2924
3254
|
private url;
|
|
2925
|
-
private get headers();
|
|
2926
3255
|
create(draft: SpineSuggestionDraft): Promise<SpineSuggestion>;
|
|
2927
3256
|
/** As minhas, da mais nova; `status` filtra uma coluna. */
|
|
2928
3257
|
mine(opts: {
|
|
@@ -2938,14 +3267,36 @@ declare class SpineSuggestionsService {
|
|
|
2938
3267
|
suggestions: SpineAppSuggestion[];
|
|
2939
3268
|
total: number;
|
|
2940
3269
|
}>;
|
|
2941
|
-
/** Os comentários públicos de uma sugestão (
|
|
3270
|
+
/** Os comentários públicos de uma sugestão (a conversa), do mais novo. */
|
|
2942
3271
|
comments(id: string, page: {
|
|
2943
3272
|
limit: number;
|
|
2944
3273
|
offset: number;
|
|
2945
3274
|
}): Promise<{
|
|
2946
|
-
comments:
|
|
3275
|
+
comments: SpineSuggestionMessage[];
|
|
3276
|
+
total: number;
|
|
3277
|
+
}>;
|
|
3278
|
+
/**
|
|
3279
|
+
* As que a pessoa vê (página "Sugestões do app"): as dela, as agrupadas, as em que está envolvida e as do grupo dela,
|
|
3280
|
+
* com filtros e paginação no servidor; `counts` é do conjunto inteiro (os números dos filtros rápidos).
|
|
3281
|
+
*/
|
|
3282
|
+
visible(query: SpineVisibleQuery): Promise<{
|
|
3283
|
+
suggestions: SpineVisibleSuggestion[];
|
|
2947
3284
|
total: number;
|
|
3285
|
+
counts: SpineVisibleCounts | null;
|
|
2948
3286
|
}>;
|
|
3287
|
+
/** Uma que a pessoa vê, pelo id (404 se não vê). */
|
|
3288
|
+
get(id: string): Promise<SpineVisibleSuggestion>;
|
|
3289
|
+
/** Pela chave ("SUG-12"): o link "?sugestao=SUG-12" abre a sugestão na página. */
|
|
3290
|
+
lookup(key: string): Promise<SpineVisibleSuggestion>;
|
|
3291
|
+
/** Escreve na conversa (quem pediu ou um envolvido): a vez passa para os responsáveis. */
|
|
3292
|
+
reply(id: string, comment: string): Promise<SpineSuggestionMessage>;
|
|
3293
|
+
/** As que a pessoa acompanha com novidade, a mais recente primeiro; `total` = quantas têm novidade. */
|
|
3294
|
+
updates(limit?: number): Promise<{
|
|
3295
|
+
updates: SpineSuggestionUpdate[];
|
|
3296
|
+
total: number;
|
|
3297
|
+
}>;
|
|
3298
|
+
/** Marca a conversa como lida por quem consulta (zera o `unread`). */
|
|
3299
|
+
markRead(id: string): Promise<void>;
|
|
2949
3300
|
/** As ainda abertas da tela, de qualquer pessoa: o modal oferece apoiar em vez de repetir. */
|
|
2950
3301
|
byScreen(path: string): Promise<SpineSuggestion[]>;
|
|
2951
3302
|
vote(id: string): Promise<void>;
|
|
@@ -2954,6 +3305,514 @@ declare class SpineSuggestionsService {
|
|
|
2954
3305
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<SpineSuggestionsService>;
|
|
2955
3306
|
}
|
|
2956
3307
|
|
|
3308
|
+
/**
|
|
3309
|
+
* A página "Sugestões do app" de quem pede: uma página do PRÓPRIO spine (ver `registerSpineBuiltinPage`), em todo app
|
|
3310
|
+
* com sugestões ligadas, sem cadastro de rota por client. Abre como qualquer tela do workspace (aba, painel, F5, link).
|
|
3311
|
+
*/
|
|
3312
|
+
declare const SPINE_SUGGESTIONS_PAGE_PATH = "/sugestoes";
|
|
3313
|
+
/** Chave sintética da página no distribuidor de telas (não é UUID: não colide com router do banco). */
|
|
3314
|
+
declare const SPINE_SUGGESTIONS_PAGE_ID = "spine:sugestoes";
|
|
3315
|
+
/** "?sugestao=SUG-12": abrir a página com ela abre a sugestão no painel (o mesmo parâmetro do quadro da equipe). */
|
|
3316
|
+
declare const SPINE_SUGGESTION_PAGE_PARAM = "sugestao";
|
|
3317
|
+
/** "&aba=conversa": junto com `sugestao`, abre a gaveta na Conversa (sem ele, em Detalhes). */
|
|
3318
|
+
declare const SPINE_SUGGESTION_TAB_PARAM = "aba";
|
|
3319
|
+
declare const SPINE_SUGGESTION_TAB_CONVERSATION = "conversa";
|
|
3320
|
+
/** Sugestões ligadas: o recurso não foi desligado (`SpineFeatures.suggestions`) e há para onde mandar (`SPINE_ADMIN_API`). */
|
|
3321
|
+
declare function spineSuggestionsEnabled(): boolean;
|
|
3322
|
+
/**
|
|
3323
|
+
* Registra a página no bootstrap (antes da primeira navegação: o F5 em /sugestoes passa pelo `ViewGuard`). Vai no
|
|
3324
|
+
* `provideShell`; com as sugestões desligadas, não registra nada e o endereço cai no fallback de sempre.
|
|
3325
|
+
*/
|
|
3326
|
+
declare function provideSpineSuggestionsPage(): EnvironmentProviders;
|
|
3327
|
+
|
|
3328
|
+
/** Uma tela que dá para escolher no "Sugerir melhoria": a rota, o `router_id` e o caminho legível ("Módulo › Tela"). */
|
|
3329
|
+
interface SuggestionScreenOption {
|
|
3330
|
+
path: string;
|
|
3331
|
+
routerId: string | null;
|
|
3332
|
+
/** O nome da tela (o último nível). */
|
|
3333
|
+
name: string;
|
|
3334
|
+
/** O caminho inteiro, como a barra da página mostra ("Vendas › Pedidos › Consulta"): é o que vai para o `screen.label`. */
|
|
3335
|
+
label: string;
|
|
3336
|
+
icon: string;
|
|
3337
|
+
}
|
|
3338
|
+
/** Valor da opção "Nova tela" no seletor (não é rota: nenhuma rota começa sem "/"). */
|
|
3339
|
+
declare const NEW_SCREEN_VALUE = "nova-tela";
|
|
3340
|
+
/**
|
|
3341
|
+
* As telas que a pessoa alcança, da árvore de rotas que ela já recebe (`spineRoutesOf(view)`), na ordem do menu: cada
|
|
3342
|
+
* nó com endereço e nome, com o caminho dos ancestrais com endereço (o mesmo "Módulo › … › Tela" da barra da página).
|
|
3343
|
+
* Um endereço aparece uma vez só (o primeiro). Nó com endereço e filhos (módulo que também é página) entra.
|
|
3344
|
+
*/
|
|
3345
|
+
declare function suggestionScreens(routes: readonly Route[] | null | undefined): SuggestionScreenOption[];
|
|
3346
|
+
/** O módulo (primeiro nível) de um caminho legível: "Vendas › Pedidos" → "Vendas". */
|
|
3347
|
+
declare function screenModule(label: string | null | undefined): string;
|
|
3348
|
+
/** O nome da tela (último nível) de um caminho legível: "Vendas › Pedidos › Consulta" → "Consulta". */
|
|
3349
|
+
declare function screenName(label: string | null | undefined): string;
|
|
3350
|
+
|
|
3351
|
+
/** De que lado da conversa a tela está: a de quem pede (página) ou a da equipe (detalhe da tarefa). */
|
|
3352
|
+
type SpineChatSide = 'solicitante' | 'equipe';
|
|
3353
|
+
/** Uma mensagem da conversa de uma sugestão, do jeito que o chat desenha (a página e o detalhe convertem para isto). */
|
|
3354
|
+
interface SpineChatMessage {
|
|
3355
|
+
id: string;
|
|
3356
|
+
text: string;
|
|
3357
|
+
created_at: string;
|
|
3358
|
+
author: SpineSuggestionPerson | null;
|
|
3359
|
+
/** Escrita como quem pede (pela página); `false` = como equipe (pelo detalhe da tarefa). */
|
|
3360
|
+
from_requester: boolean;
|
|
3361
|
+
/** Comentário interno da equipe (só aparece do lado da equipe). */
|
|
3362
|
+
internal?: boolean;
|
|
3363
|
+
/** A mudança de status que o comentário acompanha. */
|
|
3364
|
+
status?: SpineSuggestionStatus | null;
|
|
3365
|
+
}
|
|
3366
|
+
/** Uma linha do chat já resolvida: lado, cabeçalho, agrupamento e o divisor de dia antes dela. */
|
|
3367
|
+
interface ChatRow {
|
|
3368
|
+
message: SpineChatMessage;
|
|
3369
|
+
mine: boolean;
|
|
3370
|
+
author: string;
|
|
3371
|
+
grouped: boolean;
|
|
3372
|
+
day: string | null;
|
|
3373
|
+
}
|
|
3374
|
+
/**
|
|
3375
|
+
* A conversa de uma sugestão como chat (`hm-message-scroller` + `hm-message` + `hm-bubble`), com o campo de resposta
|
|
3376
|
+
* embaixo. Usado nos dois lados: a página de quem pede (`side="solicitante"`) e o detalhe da tarefa da equipe
|
|
3377
|
+
* (`side="equipe"`).
|
|
3378
|
+
*
|
|
3379
|
+
* **Quem fica à direita** é quem está com a tela aberta, no papel desta tela: a mensagem é da pessoa (`me`) E foi
|
|
3380
|
+
* escrita do mesmo lado (`from_requester` casa com `side`). A mesma pessoa no outro papel (quem administra e também
|
|
3381
|
+
* pediu, por exemplo) aparece à esquerda, como qualquer outro participante, com o papel no cabeçalho — a conversa
|
|
3382
|
+
* mostra de que lado cada mensagem foi escrita, não só quem a escreveu.
|
|
3383
|
+
*
|
|
3384
|
+
* - Mensagens do mais ANTIGO ao mais novo; o histórico mais antigo carrega pelo topo (`loadHistory`) sem tirar a
|
|
3385
|
+
* pessoa do lugar. Divisor de dia ("Hoje", "Ontem", a data) antes da primeira de cada dia.
|
|
3386
|
+
* - Mensagens seguidas da mesma pessoa, no mesmo papel e em poucos minutos se agrupam (sem repetir o cabeçalho).
|
|
3387
|
+
* - Comentário interno (só a equipe vê) em balão de destaque, com um cadeado pequeno no começo (sem selo embaixo: não
|
|
3388
|
+
* gasta uma linha); a mudança de status que o comentário acompanha, com o selo do status.
|
|
3389
|
+
* - O campo, numa linha só: Enter envia, Shift+Enter quebra a linha. Conteúdo extra do campo (o "Só para a equipe" do detalhe) entra
|
|
3390
|
+
* por projeção com o atributo `spineChatComposer`. Sem `canWrite`, no lugar do campo vai o conteúdo projetado com
|
|
3391
|
+
* `spineChatReadOnly`.
|
|
3392
|
+
*/
|
|
3393
|
+
declare class SpineSuggestionChatComponent {
|
|
3394
|
+
private readonly messages;
|
|
3395
|
+
protected readonly text: {
|
|
3396
|
+
button: string;
|
|
3397
|
+
buttonHint: string;
|
|
3398
|
+
modalTitle: string;
|
|
3399
|
+
intro: string;
|
|
3400
|
+
kind: string;
|
|
3401
|
+
kinds: Record<"melhoria" | "nova_funcionalidade" | "problema" | "outro", string>;
|
|
3402
|
+
statuses: Record<"em_analise" | "planejada" | "em_desenvolvimento" | "concluida" | "recusada", string>;
|
|
3403
|
+
legacyStatuses: Record<"nova", string>;
|
|
3404
|
+
title: string;
|
|
3405
|
+
titlePlaceholder: string;
|
|
3406
|
+
titleRequired: string;
|
|
3407
|
+
description: string;
|
|
3408
|
+
descriptionHint: string;
|
|
3409
|
+
screen: string;
|
|
3410
|
+
screenHint: string;
|
|
3411
|
+
send: string;
|
|
3412
|
+
cancel: string;
|
|
3413
|
+
sent: string;
|
|
3414
|
+
sendError: string;
|
|
3415
|
+
similarHeading: string;
|
|
3416
|
+
similarHint: string;
|
|
3417
|
+
vote: string;
|
|
3418
|
+
voted: string;
|
|
3419
|
+
votes: _trismegisto_primitives.PluralMessage;
|
|
3420
|
+
voteError: string;
|
|
3421
|
+
yours: string;
|
|
3422
|
+
mine: string;
|
|
3423
|
+
mineEmpty: string;
|
|
3424
|
+
mineError: string;
|
|
3425
|
+
loadMore: string;
|
|
3426
|
+
statusFilter: string;
|
|
3427
|
+
allStatuses: string;
|
|
3428
|
+
adminReply: string;
|
|
3429
|
+
sentAt: string;
|
|
3430
|
+
boardLabel: string;
|
|
3431
|
+
search: string;
|
|
3432
|
+
kindFilter: string;
|
|
3433
|
+
allKinds: string;
|
|
3434
|
+
refresh: string;
|
|
3435
|
+
boardEmpty: string;
|
|
3436
|
+
boardEmptyHint: string;
|
|
3437
|
+
boardFiltered: string;
|
|
3438
|
+
loadError: string;
|
|
3439
|
+
moveError: string;
|
|
3440
|
+
removedAuthor: string;
|
|
3441
|
+
noScreen: string;
|
|
3442
|
+
noDescription: string;
|
|
3443
|
+
requestedBy: string;
|
|
3444
|
+
requestedAt: string;
|
|
3445
|
+
status: string;
|
|
3446
|
+
statusSaved: string;
|
|
3447
|
+
statusError: string;
|
|
3448
|
+
history: string;
|
|
3449
|
+
historyEmpty: string;
|
|
3450
|
+
eventStatus: string;
|
|
3451
|
+
eventComment: string;
|
|
3452
|
+
someone: string;
|
|
3453
|
+
comment: string;
|
|
3454
|
+
commentHint: string;
|
|
3455
|
+
commentSend: string;
|
|
3456
|
+
commentSent: string;
|
|
3457
|
+
commentError: string;
|
|
3458
|
+
commentRequired: string;
|
|
3459
|
+
viewLabel: string;
|
|
3460
|
+
viewBoard: string;
|
|
3461
|
+
viewArchive: string;
|
|
3462
|
+
kpis: string;
|
|
3463
|
+
kpiOpen: string;
|
|
3464
|
+
kpiStatusCount: string;
|
|
3465
|
+
kpiDone: string;
|
|
3466
|
+
kpiDoneToday: string;
|
|
3467
|
+
kpiDoneNoneToday: string;
|
|
3468
|
+
kpiOverdueTrend: string;
|
|
3469
|
+
kpiOverdueSteady: string;
|
|
3470
|
+
kpiSoon: string;
|
|
3471
|
+
kpiMineHint: string;
|
|
3472
|
+
kpiPriority: string;
|
|
3473
|
+
kpiPriorityNone: string;
|
|
3474
|
+
kpiPriorityPart: string;
|
|
3475
|
+
filters: string;
|
|
3476
|
+
moreFilters: string;
|
|
3477
|
+
moreFiltersActive: string;
|
|
3478
|
+
allBoardStatuses: string;
|
|
3479
|
+
newTaskIn: string;
|
|
3480
|
+
newTaskOptions: string;
|
|
3481
|
+
columnOldest: string;
|
|
3482
|
+
columnOverdue: _trismegisto_primitives.PluralMessage;
|
|
3483
|
+
columnEmpty: string;
|
|
3484
|
+
columnEmptyFiltered: string;
|
|
3485
|
+
columnEmptyHints: Record<"em_analise" | "planejada" | "em_desenvolvimento" | "concluida", string>;
|
|
3486
|
+
duration: Record<"days" | "hours" | "minutes", string>;
|
|
3487
|
+
createdOn: string;
|
|
3488
|
+
dueWithin: string;
|
|
3489
|
+
dueLateDays: _trismegisto_primitives.PluralMessage;
|
|
3490
|
+
screenFilter: string;
|
|
3491
|
+
allScreens: string;
|
|
3492
|
+
authorFilter: string;
|
|
3493
|
+
allAuthors: string;
|
|
3494
|
+
sort: string;
|
|
3495
|
+
sorts: Record<"position" | "votes" | "recent", string>;
|
|
3496
|
+
sortHint: string;
|
|
3497
|
+
clearFilters: string;
|
|
3498
|
+
topVoted: string;
|
|
3499
|
+
comments: _trismegisto_primitives.PluralMessage;
|
|
3500
|
+
statusSince: string;
|
|
3501
|
+
openScreen: string;
|
|
3502
|
+
statusChange: string;
|
|
3503
|
+
statusComment: string;
|
|
3504
|
+
statusCommentHint: string;
|
|
3505
|
+
statusApply: string;
|
|
3506
|
+
archiveLabel: string;
|
|
3507
|
+
archiveSearch: string;
|
|
3508
|
+
archiveEmpty: string;
|
|
3509
|
+
archiveEmptyHint: string;
|
|
3510
|
+
archiveCount: _trismegisto_primitives.PluralMessage;
|
|
3511
|
+
closedOn: Record<"concluida" | "recusada", string>;
|
|
3512
|
+
pagination: string;
|
|
3513
|
+
reopen: string;
|
|
3514
|
+
reopened: string;
|
|
3515
|
+
reopenError: string;
|
|
3516
|
+
newTask: string;
|
|
3517
|
+
addTaskPlaceholder: string;
|
|
3518
|
+
taskCreated: string;
|
|
3519
|
+
createError: string;
|
|
3520
|
+
saveError: string;
|
|
3521
|
+
kpiMine: string;
|
|
3522
|
+
kpiOverdue: string;
|
|
3523
|
+
assigneeFilter: string;
|
|
3524
|
+
allAssignees: string;
|
|
3525
|
+
assigneeMine: string;
|
|
3526
|
+
assigneeNone: string;
|
|
3527
|
+
labelFilter: string;
|
|
3528
|
+
allLabels: string;
|
|
3529
|
+
priorityFilter: string;
|
|
3530
|
+
allPriorities: string;
|
|
3531
|
+
dueFilter: string;
|
|
3532
|
+
dueAny: string;
|
|
3533
|
+
dueOverdueFilter: string;
|
|
3534
|
+
dueSoonFilter: string;
|
|
3535
|
+
priority: string;
|
|
3536
|
+
priorities: Record<"urgente" | "alta" | "media" | "baixa", string>;
|
|
3537
|
+
dueOn: string;
|
|
3538
|
+
dueToday: string;
|
|
3539
|
+
dueTomorrow: string;
|
|
3540
|
+
dueLate: string;
|
|
3541
|
+
checklistSpoken: string;
|
|
3542
|
+
moreAssignees: string;
|
|
3543
|
+
cardMenu: string;
|
|
3544
|
+
menuStatus: string;
|
|
3545
|
+
menuAssignMe: string;
|
|
3546
|
+
menuCopyLink: string;
|
|
3547
|
+
menuCopyKey: string;
|
|
3548
|
+
menuLabel: string;
|
|
3549
|
+
menuNoLabels: string;
|
|
3550
|
+
menuPriority: string;
|
|
3551
|
+
menuArchive: string;
|
|
3552
|
+
menuRestore: string;
|
|
3553
|
+
menuDelete: string;
|
|
3554
|
+
labelColorName: string;
|
|
3555
|
+
linkCopied: string;
|
|
3556
|
+
keyCopied: string;
|
|
3557
|
+
copyError: string;
|
|
3558
|
+
deleteHeading: string;
|
|
3559
|
+
deleteMessage: string;
|
|
3560
|
+
deleteConfirm: string;
|
|
3561
|
+
deleted: string;
|
|
3562
|
+
archivedToast: string;
|
|
3563
|
+
restoredToast: string;
|
|
3564
|
+
assignedToMe: string;
|
|
3565
|
+
archivedTag: string;
|
|
3566
|
+
taskLabel: string;
|
|
3567
|
+
close: string;
|
|
3568
|
+
editTitle: string;
|
|
3569
|
+
editDescription: string;
|
|
3570
|
+
save: string;
|
|
3571
|
+
checklist: string;
|
|
3572
|
+
checklistAdd: string;
|
|
3573
|
+
checklistPlaceholder: string;
|
|
3574
|
+
checklistOnCard: string;
|
|
3575
|
+
checklistEmpty: string;
|
|
3576
|
+
checklistRemove: string;
|
|
3577
|
+
checklistUp: string;
|
|
3578
|
+
checklistDown: string;
|
|
3579
|
+
tabComments: string;
|
|
3580
|
+
tabActivity: string;
|
|
3581
|
+
commentsEmpty: string;
|
|
3582
|
+
activityEmpty: string;
|
|
3583
|
+
commentInternal: string;
|
|
3584
|
+
internalTag: string;
|
|
3585
|
+
activity: Record<"created" | "title" | "description" | "kind" | "priority" | "start_date" | "start_date_removed" | "due_date" | "due_date_removed" | "cover" | "cover_removed" | "checklist_on_card" | "screen" | "assignee_added" | "assignee_removed" | "watcher_added" | "watcher_removed" | "label_added" | "label_removed" | "checklist_added" | "checklist_done" | "checklist_undone" | "checklist_renamed" | "checklist_removed" | "archived" | "restored" | "merged" | "merged_here" | "unmerged" | "unmerged_here" | "other", string>;
|
|
3586
|
+
assignees: string;
|
|
3587
|
+
assignMe: string;
|
|
3588
|
+
addAssignee: string;
|
|
3589
|
+
watchers: string;
|
|
3590
|
+
addWatcher: string;
|
|
3591
|
+
removePerson: string;
|
|
3592
|
+
peopleSearch: string;
|
|
3593
|
+
peopleEmpty: string;
|
|
3594
|
+
nobody: string;
|
|
3595
|
+
reporter: string;
|
|
3596
|
+
originUser: string;
|
|
3597
|
+
originTeam: string;
|
|
3598
|
+
startDate: string;
|
|
3599
|
+
dueDate: string;
|
|
3600
|
+
labels: string;
|
|
3601
|
+
addLabel: string;
|
|
3602
|
+
createLabel: string;
|
|
3603
|
+
labelColor: string;
|
|
3604
|
+
noLabels: string;
|
|
3605
|
+
screenOrigin: string;
|
|
3606
|
+
votesField: string;
|
|
3607
|
+
createdAt: string;
|
|
3608
|
+
updatedAt: string;
|
|
3609
|
+
lastChange: string;
|
|
3610
|
+
lastChangeNoActor: string;
|
|
3611
|
+
key: string;
|
|
3612
|
+
copyKey: string;
|
|
3613
|
+
newTaskHeading: string;
|
|
3614
|
+
createTask: string;
|
|
3615
|
+
draftHint: string;
|
|
3616
|
+
assignMeOnCreate: string;
|
|
3617
|
+
appSuggestions: string;
|
|
3618
|
+
listView: string;
|
|
3619
|
+
tabAll: string;
|
|
3620
|
+
tabMine: string;
|
|
3621
|
+
appSearch: string;
|
|
3622
|
+
thisScreen: string;
|
|
3623
|
+
appSorts: Record<"votes" | "recent", string>;
|
|
3624
|
+
appEmpty: string;
|
|
3625
|
+
appEmptyHint: string;
|
|
3626
|
+
appEmptyFiltered: string;
|
|
3627
|
+
appError: string;
|
|
3628
|
+
support: string;
|
|
3629
|
+
supported: string;
|
|
3630
|
+
ownSupportHint: string;
|
|
3631
|
+
publicComments: string;
|
|
3632
|
+
publicCommentsEmpty: string;
|
|
3633
|
+
commentsError: string;
|
|
3634
|
+
moreComments: string;
|
|
3635
|
+
appPagination: string;
|
|
3636
|
+
menuMerge: string;
|
|
3637
|
+
mergeHeading: string;
|
|
3638
|
+
mergeIntro: string;
|
|
3639
|
+
mergeSearch: string;
|
|
3640
|
+
mergeNone: string;
|
|
3641
|
+
mergeHasMerged: string;
|
|
3642
|
+
mergePreview: string;
|
|
3643
|
+
mergeCalculating: string;
|
|
3644
|
+
mergePreviewError: string;
|
|
3645
|
+
reportersCount: _trismegisto_primitives.PluralMessage;
|
|
3646
|
+
mergeConfirmHeading: string;
|
|
3647
|
+
mergeConfirmMessage: string;
|
|
3648
|
+
mergeConfirm: string;
|
|
3649
|
+
mergedToast: string;
|
|
3650
|
+
mergeError: string;
|
|
3651
|
+
mergedTag: string;
|
|
3652
|
+
mergedInto: string;
|
|
3653
|
+
mergedIntoHint: string;
|
|
3654
|
+
openMerged: string;
|
|
3655
|
+
unmerge: string;
|
|
3656
|
+
unmergeLabel: string;
|
|
3657
|
+
unmergedToast: string;
|
|
3658
|
+
reporters: string;
|
|
3659
|
+
reporterAuthor: string;
|
|
3660
|
+
reporterVia: string;
|
|
3661
|
+
mergedHere: string;
|
|
3662
|
+
mergedFrom: string;
|
|
3663
|
+
mergedFromHint: string;
|
|
3664
|
+
buttonMenu: string;
|
|
3665
|
+
openPage: string;
|
|
3666
|
+
screenPick: string;
|
|
3667
|
+
screenPickHint: string;
|
|
3668
|
+
screenPickPlaceholder: string;
|
|
3669
|
+
newScreenOption: string;
|
|
3670
|
+
newScreenName: string;
|
|
3671
|
+
newScreenHint: string;
|
|
3672
|
+
newScreenRequired: string;
|
|
3673
|
+
newScreenTag: string;
|
|
3674
|
+
waiting: Record<"solicitante" | "responsaveis", string>;
|
|
3675
|
+
waitingFilter: string;
|
|
3676
|
+
waitingAny: string;
|
|
3677
|
+
waitingClear: string;
|
|
3678
|
+
waitingSaved: string;
|
|
3679
|
+
menuWaiting: string;
|
|
3680
|
+
groupFilter: string;
|
|
3681
|
+
allGroups: string;
|
|
3682
|
+
requestingGroups: string;
|
|
3683
|
+
noGroups: string;
|
|
3684
|
+
unread: _trismegisto_primitives.PluralMessage;
|
|
3685
|
+
fromRequester: string;
|
|
3686
|
+
cardChecklist: _trismegisto_primitives.PluralMessage;
|
|
3687
|
+
requestedByName: string;
|
|
3688
|
+
tabSummary: string;
|
|
3689
|
+
chatAuthor: string;
|
|
3690
|
+
chatSendHint: string;
|
|
3691
|
+
inbox: {
|
|
3692
|
+
label: string;
|
|
3693
|
+
comment: string;
|
|
3694
|
+
status: string;
|
|
3695
|
+
};
|
|
3696
|
+
page: {
|
|
3697
|
+
title: string;
|
|
3698
|
+
description: string;
|
|
3699
|
+
allTitle: string;
|
|
3700
|
+
statusPart: string;
|
|
3701
|
+
reasons: Record<"autor" | "relator" | "envolvido" | "responsavel" | "grupo", string>;
|
|
3702
|
+
reasonHints: Record<"autor" | "relator" | "envolvido" | "responsavel" | "grupo", string>;
|
|
3703
|
+
reasonFilter: string;
|
|
3704
|
+
allReasons: string;
|
|
3705
|
+
needsYou: string;
|
|
3706
|
+
sorts: Record<"activity" | "recent" | "votes", string>;
|
|
3707
|
+
empty: string;
|
|
3708
|
+
emptyHint: string;
|
|
3709
|
+
emptyFiltered: string;
|
|
3710
|
+
error: string;
|
|
3711
|
+
count: _trismegisto_primitives.PluralMessage;
|
|
3712
|
+
pickOne: string;
|
|
3713
|
+
notFound: string;
|
|
3714
|
+
conversation: string;
|
|
3715
|
+
conversationEmpty: string;
|
|
3716
|
+
conversationError: string;
|
|
3717
|
+
olderMessages: string;
|
|
3718
|
+
reply: string;
|
|
3719
|
+
replyPlaceholder: string;
|
|
3720
|
+
replySend: string;
|
|
3721
|
+
replyError: string;
|
|
3722
|
+
readOnly: string;
|
|
3723
|
+
team: string;
|
|
3724
|
+
you: string;
|
|
3725
|
+
groups: string;
|
|
3726
|
+
details: string;
|
|
3727
|
+
listLabel: string;
|
|
3728
|
+
filtersLabel: string;
|
|
3729
|
+
waitingYou: string;
|
|
3730
|
+
waitingTeam: string;
|
|
3731
|
+
};
|
|
3732
|
+
};
|
|
3733
|
+
private readonly preferences;
|
|
3734
|
+
private readonly scroller;
|
|
3735
|
+
/** As mensagens, do mais antigo ao mais novo. */
|
|
3736
|
+
readonly items: _angular_core.InputSignal<readonly SpineChatMessage[]>;
|
|
3737
|
+
/** O papel desta tela: as mensagens da pessoa escritas deste lado ficam à direita. */
|
|
3738
|
+
readonly side: _angular_core.InputSignal<SpineChatSide>;
|
|
3739
|
+
/** O `user_id` de quem está com a tela aberta. */
|
|
3740
|
+
readonly me: _angular_core.InputSignal<string>;
|
|
3741
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
3742
|
+
readonly empty: _angular_core.InputSignal<string>;
|
|
3743
|
+
readonly hasMore: _angular_core.InputSignal<boolean>;
|
|
3744
|
+
readonly loading: _angular_core.InputSignal<boolean>;
|
|
3745
|
+
readonly canWrite: _angular_core.InputSignal<boolean>;
|
|
3746
|
+
readonly composerLabel: _angular_core.InputSignal<string>;
|
|
3747
|
+
readonly placeholder: _angular_core.InputSignal<string>;
|
|
3748
|
+
readonly sendLabel: _angular_core.InputSignal<string>;
|
|
3749
|
+
readonly sending: _angular_core.InputSignal<boolean>;
|
|
3750
|
+
readonly error: _angular_core.InputSignal<string>;
|
|
3751
|
+
/** O texto do campo (em mão dupla: quem usa limpa depois de enviar). */
|
|
3752
|
+
readonly draft: _angular_core.ModelSignal<string>;
|
|
3753
|
+
readonly loadHistory: _angular_core.OutputEmitterRef<void>;
|
|
3754
|
+
/** Enviar: o texto aparado (nunca vazio). */
|
|
3755
|
+
readonly send: _angular_core.OutputEmitterRef<string>;
|
|
3756
|
+
protected readonly statusColors: Record<"em_analise" | "planejada" | "em_desenvolvimento" | "concluida" | "recusada", _trismegisto_angular.TagColor>;
|
|
3757
|
+
protected readonly timeFormat: Intl.DateTimeFormatOptions;
|
|
3758
|
+
protected readonly rows: _angular_core.Signal<ChatRow[]>;
|
|
3759
|
+
/** Depois de enviar: a pessoa quer ver a própria mensagem, mesmo se estava lendo lá em cima. */
|
|
3760
|
+
scrollToEnd(): void;
|
|
3761
|
+
protected onKey(event: Event): void;
|
|
3762
|
+
protected submit(): void;
|
|
3763
|
+
protected statusOf(m: SpineChatMessage): SpineSuggestionStatus | null;
|
|
3764
|
+
/** "Ana Souza (Equipe)": do outro lado, o papel junto do nome — inclusive a própria pessoa no outro papel. */
|
|
3765
|
+
private authorText;
|
|
3766
|
+
private dayKey;
|
|
3767
|
+
/** "Hoje", "Ontem" ou a data por extenso (no idioma do catálogo e no fuso da pessoa). */
|
|
3768
|
+
private dayLabel;
|
|
3769
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineSuggestionChatComponent, never>;
|
|
3770
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineSuggestionChatComponent, "spine-suggestion-chat", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": true; "isSignal": true; }; "me": { "alias": "me"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "hasMore": { "alias": "hasMore"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "canWrite": { "alias": "canWrite"; "required": false; "isSignal": true; }; "composerLabel": { "alias": "composerLabel"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "sendLabel": { "alias": "sendLabel"; "required": false; "isSignal": true; }; "sending": { "alias": "sending"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "draft": { "alias": "draft"; "required": false; "isSignal": true; }; }, { "draft": "draftChange"; "loadHistory": "loadHistory"; "send": "send"; }, never, ["[spineChatComposer]", "[spineChatReadOnly]"], true, never>;
|
|
3771
|
+
}
|
|
3772
|
+
|
|
3773
|
+
/** Um selo da linha: o nome e, se quiser, a cor (1..8, a paleta categórica do tema); sem cor, uma estável pelo id. */
|
|
3774
|
+
interface SpineTagRowItem {
|
|
3775
|
+
id: string;
|
|
3776
|
+
name: string;
|
|
3777
|
+
color?: number;
|
|
3778
|
+
}
|
|
3779
|
+
/** Cor categórica estável para um id (o mesmo grupo sempre na mesma cor, em qualquer tela). */
|
|
3780
|
+
declare function spineTagColor(id: string): number;
|
|
3781
|
+
/**
|
|
3782
|
+
* Selos numa linha só, no modelo dos rótulos do quadro (fundo claro da cor e o ponto na cor cheia): cabem os que cabem
|
|
3783
|
+
* na largura e o resto vira "+N", com os nomes na dica e para o leitor de tela. Mede de novo quando a largura muda
|
|
3784
|
+
* (ResizeObserver) e quando a lista muda; sem medida (servidor, teste sem layout), mostra todos.
|
|
3785
|
+
*
|
|
3786
|
+
* Os que não cabem continuam no DOM, fora do fluxo e invisíveis (`visibility: hidden`), só para a largura deles poder
|
|
3787
|
+
* ser medida; ficam `aria-hidden` — quem lê a tela ouve os nomes no "+N".
|
|
3788
|
+
*/
|
|
3789
|
+
declare class SpineTagRowComponent {
|
|
3790
|
+
private readonly text;
|
|
3791
|
+
private readonly host;
|
|
3792
|
+
private readonly browser;
|
|
3793
|
+
private readonly injector;
|
|
3794
|
+
private readonly destroyRef;
|
|
3795
|
+
readonly items: _angular_core.InputSignal<readonly SpineTagRowItem[]>;
|
|
3796
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
3797
|
+
/** Texto quando não há nenhum (vazio = nada). */
|
|
3798
|
+
readonly empty: _angular_core.InputSignal<string>;
|
|
3799
|
+
protected readonly tags: _angular_core.Signal<{
|
|
3800
|
+
color: number;
|
|
3801
|
+
id: string;
|
|
3802
|
+
name: string;
|
|
3803
|
+
}[]>;
|
|
3804
|
+
/** Quantos cabem; começa com todos (sem medida, todos aparecem). */
|
|
3805
|
+
protected readonly visible: _angular_core.WritableSignal<number>;
|
|
3806
|
+
protected readonly hiddenCount: _angular_core.Signal<number>;
|
|
3807
|
+
protected readonly hiddenNames: _angular_core.Signal<string>;
|
|
3808
|
+
protected readonly moreText: _angular_core.Signal<string>;
|
|
3809
|
+
constructor();
|
|
3810
|
+
/** Quantos selos cabem na largura, reservando o "+N" quando nem todos cabem. */
|
|
3811
|
+
private measure;
|
|
3812
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<SpineTagRowComponent, never>;
|
|
3813
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<SpineTagRowComponent, "spine-tag-row", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
3814
|
+
}
|
|
3815
|
+
|
|
2957
3816
|
/**
|
|
2958
3817
|
* Modal de documentação das telas: índice (com busca) à esquerda e leitura à direita. Montado uma vez
|
|
2959
3818
|
* pelo `spine-layout`; abrir, fechar e o que se lê vêm todos do `SpineDocsService`.
|
|
@@ -2999,6 +3858,6 @@ declare const SPINE_MARKDOWN_PURIFY_CONFIG: Config;
|
|
|
2999
3858
|
/** HTML limpo pelo perfil do spine, ou `null` quando não há DOM (SSR: melhor não renderizar). */
|
|
3000
3859
|
declare function sanitizeSpineMarkdownHtml(html: string): string | null;
|
|
3001
3860
|
|
|
3002
|
-
export { AiAgentComponent, AppLauncherComponent, HeaderComponent, LayoutComponent, SPINE_BRAND, SPINE_GLOBAL_PREFERENCE_KEYS, SPINE_IDLE_WARNING_SECONDS, SPINE_MARKDOWN_PURIFY_CONFIG, SPINE_PREFERENCES_SAVE_DELAY_MS, SPINE_RATING_COMMENT_MAX, SPINE_RATING_SCORE_MAX, SPINE_SETTINGS_ALIASES, SPINE_SETTINGS_KEYS, SPINE_SETTINGS_SECTIONS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_LIMITS, SPINE_SUGGESTION_PUBLIC_SORTS, SPINE_SUGGESTION_PUBLIC_STATUSES, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUS_ICONS, SettingsPanelComponent, ShortcutService, ShortcutsCheatsheetComponent, SidebarComponent, SpineAccountPreferencesService, SpineAccountSecurityService, SpineAppTokensService, SpineBrandComponent, SpineConnectionBannerComponent, SpineDocsComponent, SpineDocsService, SpineIdleService, SpineIdleWarningComponent, SpineInitialSetupComponent, SpineInitialSetupService, SpineLogoutService, SpineMarkdownComponent, SpineMyGroupsService, SpineNewsComponent, SpineNewsService, SpineNoticesService, SpinePageActionsDirective, SpinePageActionsSlot, SpineRatingStarsComponent, SpineRatingsService, SpineSettingsService, SpineStartPageService, SpineSuggestionsService, accountErrorCode, argosAccountApi, buildMcpConfig, effectiveIdleMinutes, idleLimits, isInternalPath, provideSettingsSection, ratingTargetKey, resolveSettingsSection, sanitizeSpineMarkdownHtml, spineScoreBand, spineStarFills, stable };
|
|
3003
|
-
export type { AccountActivityEntry, AccountActivityPage, AccountBadges, AccountMethod, AccountOverview, AccountPreferences, AccountReauth, AccountSession, AppToken, AppTokenList, AppTokenOptions, CreatedAppToken, DocsEntry, DocsGroup, DocsView, GroupMember, GroupRole, ManagedGroup, RealmUser, ShortcutActions, SpineAccountPreferencesDoc, SpineAccountPreferencesStatus, SpineAppSuggestion, SpineAppSuggestionsQuery, SpineGlobalPreferencesDoc, SpineIdleLimits, SpineInitialSetupMode, SpineInitialSetupStep, SpineNewsAuthor, SpineNewsDetail, SpineNewsFilter, SpineNewsKind, SpineNewsPage, SpineNewsSummary, SpineNotice, SpineNoticePermission, SpineRating, SpineRatingAverage, SpineRatingScope, SpineRatingTarget, SpineScoreBand, SpineSettingsSection, SpineStarFill, SpineSuggestion, SpineSuggestionComment, SpineSuggestionDraft, SpineSuggestionKind, SpineSuggestionPerson, SpineSuggestionPublicSort, SpineSuggestionPublicStatus, SpineSuggestionStatus };
|
|
3861
|
+
export { AiAgentComponent, AppLauncherComponent, HeaderComponent, LayoutComponent, NEW_SCREEN_VALUE, SPINE_BRAND, SPINE_GLOBAL_PREFERENCE_KEYS, SPINE_IDLE_WARNING_SECONDS, SPINE_INBOX_POLL_MS, SPINE_INBOX_SOURCES, SPINE_MARKDOWN_PURIFY_CONFIG, SPINE_PREFERENCES_SAVE_DELAY_MS, SPINE_RATING_COMMENT_MAX, SPINE_RATING_SCORE_MAX, SPINE_SETTINGS_ALIASES, SPINE_SETTINGS_KEYS, SPINE_SETTINGS_SECTIONS, SPINE_SUGGESTIONS_PAGE_ID, SPINE_SUGGESTIONS_PAGE_PATH, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_LIMITS, SPINE_SUGGESTION_PAGE_PARAM, SPINE_SUGGESTION_PUBLIC_SORTS, SPINE_SUGGESTION_PUBLIC_STATUSES, SPINE_SUGGESTION_REASONS, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUS_ICONS, SPINE_SUGGESTION_TAB_CONVERSATION, SPINE_SUGGESTION_TAB_PARAM, SPINE_SUGGESTION_VISIBLE_SORTS, SPINE_SUGGESTION_WAITING, SPINE_SUGGESTION_WAITING_COLORS, SPINE_TAB, SettingsPanelComponent, ShortcutService, ShortcutsCheatsheetComponent, SidebarComponent, SpineAccountPreferencesService, SpineAccountSecurityService, SpineAppTokensService, SpineBrandComponent, SpineConnectionBannerComponent, SpineDocsComponent, SpineDocsService, SpineIdleService, SpineIdleWarningComponent, SpineInboxButtonComponent, SpineInboxService, SpineInitialSetupComponent, SpineInitialSetupService, SpineLogoutService, SpineMarkdownComponent, SpineMyGroupsService, SpineNewsComponent, SpineNewsService, SpineNoticesService, SpinePageActionsDirective, SpinePageActionsSlot, SpineRatingStarsComponent, SpineRatingsService, SpineSettingsService, SpineStartPageService, SpineSuggestionChatComponent, SpineSuggestionsService, SpineTagRowComponent, SpineWorkspaceNavService, accountErrorCode, argosAccountApi, buildMcpConfig, effectiveIdleMinutes, idleLimits, isInternalPath, provideSettingsSection, provideSpineInboxSource, provideSpineSuggestionsPage, ratingTargetKey, resolveSettingsSection, sanitizeSpineMarkdownHtml, screenModule, screenName, spineNormalizeUrl, spineParamsOf, spinePathOf, spineScoreBand, spineStarFills, spineSuggestionsEnabled, spineTagColor, stable, suggestionScreens };
|
|
3862
|
+
export type { AccountActivityEntry, AccountActivityPage, AccountBadges, AccountMethod, AccountOverview, AccountPreferences, AccountReauth, AccountSession, AppToken, AppTokenList, AppTokenOptions, CreatedAppToken, DocsEntry, DocsGroup, DocsView, GroupMember, GroupRole, ManagedGroup, RealmUser, ShortcutActions, SpineAccountPreferencesDoc, SpineAccountPreferencesStatus, SpineAppSuggestion, SpineAppSuggestionsQuery, SpineChatMessage, SpineChatSide, SpineGlobalPreferencesDoc, SpineIdleLimits, SpineInboxEntry, SpineInboxItem, SpineInboxSource, SpineInitialSetupMode, SpineInitialSetupStep, SpineNewsAuthor, SpineNewsDetail, SpineNewsFilter, SpineNewsKind, SpineNewsPage, SpineNewsSummary, SpineNotice, SpineNoticePermission, SpineOpenTabOptions, SpineRating, SpineRatingAverage, SpineRatingScope, SpineRatingTarget, SpineScoreBand, SpineSettingsSection, SpineStarFill, SpineSuggestion, SpineSuggestionComment, SpineSuggestionDraft, SpineSuggestionKind, SpineSuggestionMessage, SpineSuggestionPerson, SpineSuggestionPublicSort, SpineSuggestionPublicStatus, SpineSuggestionReason, SpineSuggestionScreen, SpineSuggestionStatus, SpineSuggestionUpdate, SpineSuggestionVisibleSort, SpineSuggestionWaiting, SpineTab, SpineTabParams, SpineTagRowItem, SpineVisibleCounts, SpineVisibleQuery, SpineVisibleSuggestion, SuggestionScreenOption };
|
|
3004
3863
|
//# sourceMappingURL=trismegisto-spine-layout.d.ts.map
|