@praxisui/table 3.0.0-beta.6 → 3.0.0-beta.7

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.
@@ -32,7 +32,7 @@ import * as i12 from '@angular/cdk/drag-drop';
32
32
  import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
33
33
  import { Subject, debounceTime, takeUntil, of, firstValueFrom, BehaviorSubject, take as take$1 } from 'rxjs';
34
34
  import * as i1 from '@praxisui/core';
35
- import { LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisIconDirective, isTableConfigV2, GLOBAL_ACTION_SPEC_CATALOG, getGlobalActionUiSchema, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, ASYNC_CONFIG_STORAGE, resolveControlTypeAlias, mapFieldDefinitionsToMetadata, GenericCrudService, TableConfigService, createDefaultTableConfig, fillUndefined, deepMerge, INLINE_FILTER_ALIAS_TOKENS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, resolveInlineFilterControlType, fetchWithETag, ComponentMetadataRegistry, ResourceQuickConnectComponent, PRAXIS_LOADING_CTX, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, EmptyStateCardComponent } from '@praxisui/core';
35
+ import { LoggerService, createCorporateLoggerConfig, ConsoleLoggerSink, PraxisIconDirective, isTableConfigV2, GLOBAL_ACTION_SPEC_CATALOG, PraxisI18nService, SURFACE_OPEN_I18N_NAMESPACE, getGlobalActionUiSchema, SurfaceOpenActionEditorComponent, providePraxisI18nConfig, SURFACE_OPEN_I18N_CONFIG, INLINE_FILTER_CONTROL_TYPES, INLINE_FILTER_CONTROL_TYPE_VALUES, FieldControlType, normalizeControlTypeToken, ASYNC_CONFIG_STORAGE, resolveControlTypeAlias, mapFieldDefinitionsToMetadata, GenericCrudService, TableConfigService, createDefaultTableConfig, fillUndefined, deepMerge, INLINE_FILTER_ALIAS_TOKENS, GlobalConfigService, buildSchemaId, MemoryCacheAdapter, LocalStorageCacheAdapter, SchemaMetadataClient, resolveInlineFilterControlType, fetchWithETag, ComponentMetadataRegistry, ResourceQuickConnectComponent, PRAXIS_LOADING_CTX, supportsImplicitValuePresentation, resolveValuePresentation, CONNECTION_STORAGE, PRAXIS_LOADING_RENDERER, EmptyStateCardComponent } from '@praxisui/core';
36
36
  import * as i2 from '@angular/material/toolbar';
37
37
  import { MatToolbarModule } from '@angular/material/toolbar';
38
38
  import { FunctionRegistry, DslParser, DslValidator, ValidationSeverity, ValidationIssueType } from '@praxisui/specification';
@@ -6665,6 +6665,9 @@ class DataFormattingService {
6665
6665
  const fmt = formatString.trim();
6666
6666
  return !!(fmt && columnType !== 'custom');
6667
6667
  }
6668
+ getHostLocale() {
6669
+ return this.hostLocale;
6670
+ }
6668
6671
  resolveFormattingContext(options) {
6669
6672
  const locale = options?.localization?.locale?.trim() ||
6670
6673
  options?.locale?.trim() ||
@@ -16351,11 +16354,24 @@ class ToolbarActionsEditorComponent {
16351
16354
  actionFieldDrafts = new Map();
16352
16355
  actionFieldErrors = new Map();
16353
16356
  warnedInvalidShortcutScopes = new Set();
16357
+ i18n = inject(PraxisI18nService);
16354
16358
  destroy$ = new Subject();
16355
16359
  constructor(fb, iconPicker) {
16356
16360
  this.fb = fb;
16357
16361
  this.iconPicker = iconPicker;
16358
16362
  }
16363
+ getGlobalActionSpecLabel(spec) {
16364
+ if (spec?.id === 'surface.open') {
16365
+ return this.i18n.t('action.surfaceOpen.label', undefined, spec.label || '', SURFACE_OPEN_I18N_NAMESPACE);
16366
+ }
16367
+ return spec?.label || '';
16368
+ }
16369
+ getGlobalActionSpecHint(spec) {
16370
+ if (spec?.id === 'surface.open') {
16371
+ return this.i18n.t('action.surfaceOpen.hint', undefined, (spec.param?.hint || spec.description || ''), SURFACE_OPEN_I18N_NAMESPACE);
16372
+ }
16373
+ return spec?.param?.hint || spec?.description || '';
16374
+ }
16359
16375
  ngOnInit() {
16360
16376
  this.isV2 = true; // Always V2 in unified architecture
16361
16377
  this.initializeForm();
@@ -16818,6 +16834,17 @@ class ToolbarActionsEditorComponent {
16818
16834
  return undefined;
16819
16835
  return getGlobalActionUiSchema(parsed.id);
16820
16836
  }
16837
+ getSurfaceOpenActionPayload(action) {
16838
+ const info = this.getActionParamInfo(action.action);
16839
+ const payload = info.isJson && info.json && typeof info.json === 'object' && !Array.isArray(info.json)
16840
+ ? info.json
16841
+ : undefined;
16842
+ return this.normalizeSurfaceOpenPayload(payload);
16843
+ }
16844
+ onSurfaceOpenActionPayloadChange(action, payload, kind) {
16845
+ action.action = `surface.open:${JSON.stringify(this.normalizeSurfaceOpenPayload(payload))}`;
16846
+ this.touchActionList(kind);
16847
+ }
16821
16848
  shouldShowGlobalActionField(action, field) {
16822
16849
  if (!field.dependsOnKey)
16823
16850
  return true;
@@ -16933,7 +16960,7 @@ class ToolbarActionsEditorComponent {
16933
16960
  this.clearActionFieldError(action, field.key);
16934
16961
  }
16935
16962
  catch {
16936
- this.setActionFieldError(action, field.key, 'JSON inválido.');
16963
+ this.setActionFieldError(action, field.key, 'JSON inválido.');
16937
16964
  return;
16938
16965
  }
16939
16966
  }
@@ -16992,6 +17019,30 @@ class ToolbarActionsEditorComponent {
16992
17019
  return '';
16993
17020
  }
16994
17021
  }
17022
+ normalizeSurfaceOpenPayload(payload) {
17023
+ return {
17024
+ presentation: payload?.presentation === 'drawer' ? 'drawer' : 'modal',
17025
+ title: payload?.title,
17026
+ subtitle: payload?.subtitle,
17027
+ icon: payload?.icon,
17028
+ size: payload?.size && Object.keys(payload.size).length
17029
+ ? { ...payload.size }
17030
+ : undefined,
17031
+ widget: {
17032
+ id: String(payload?.widget?.id || ''),
17033
+ inputs: { ...(payload?.widget?.inputs || {}) },
17034
+ bindingOrder: payload?.widget?.bindingOrder?.length
17035
+ ? [...payload.widget.bindingOrder]
17036
+ : undefined,
17037
+ },
17038
+ bindings: payload?.bindings?.length
17039
+ ? payload.bindings.map((binding) => ({ ...binding }))
17040
+ : [],
17041
+ context: payload?.context && typeof payload.context === 'object' && !Array.isArray(payload.context)
17042
+ ? { ...payload.context }
17043
+ : undefined,
17044
+ };
17045
+ }
16995
17046
  setActionFieldError(action, key, message) {
16996
17047
  const draftKey = this.getActionDraftKey(action);
16997
17048
  const errors = this.actionFieldErrors.get(draftKey) || {};
@@ -17274,7 +17325,7 @@ class ToolbarActionsEditorComponent {
17274
17325
  addToolbarAction() {
17275
17326
  const newAction = {
17276
17327
  id: `action-${Date.now()}`,
17277
- label: 'Nova Ação',
17328
+ label: 'Nova Ação',
17278
17329
  icon: 'add',
17279
17330
  type: 'button',
17280
17331
  action: 'newAction',
@@ -17312,7 +17363,7 @@ class ToolbarActionsEditorComponent {
17312
17363
  addRowAction() {
17313
17364
  const newAction = {
17314
17365
  id: `row-action-${Date.now()}`,
17315
- label: 'Nova Ação',
17366
+ label: 'Nova Ação',
17316
17367
  icon: 'edit',
17317
17368
  action: 'editRow',
17318
17369
  autoDelete: false,
@@ -17347,7 +17398,7 @@ class ToolbarActionsEditorComponent {
17347
17398
  addBulkAction() {
17348
17399
  const newAction = {
17349
17400
  id: `bulk-action-${Date.now()}`,
17350
- label: 'Nova Ação em Lote',
17401
+ label: 'Nova Ação em Lote',
17351
17402
  icon: 'delete',
17352
17403
  action: 'delete',
17353
17404
  autoDelete: false,
@@ -17380,7 +17431,7 @@ class ToolbarActionsEditorComponent {
17380
17431
  this.updateConfig(values);
17381
17432
  }
17382
17433
  // =============================================================
17383
- // Templates (Presets) Toolbar & Row Actions
17434
+ // Templates (Presets) — Toolbar & Row Actions
17384
17435
  // =============================================================
17385
17436
  applyToolbarTemplate(tpl, mode) {
17386
17437
  const preset = [
@@ -17620,12 +17671,19 @@ class ToolbarActionsEditorComponent {
17620
17671
  }
17621
17672
  }
17622
17673
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ToolbarActionsEditorComponent, deps: [{ token: i1$1.FormBuilder }, { token: i1.IconPickerService }], target: i0.ɵɵFactoryTarget.Component });
17623
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: ToolbarActionsEditorComponent, isStandalone: true, selector: "toolbar-actions-editor", inputs: { config: "config" }, outputs: { configChange: "configChange", toolbarActionsChange: "toolbarActionsChange" }, usesOnChanges: true, ngImport: i0, template: `
17674
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: ToolbarActionsEditorComponent, isStandalone: true, selector: "toolbar-actions-editor", inputs: { config: "config" }, outputs: { configChange: "configChange", toolbarActionsChange: "toolbarActionsChange" }, providers: [providePraxisI18nConfig(SURFACE_OPEN_I18N_CONFIG)], usesOnChanges: true, ngImport: i0, template: `
17624
17675
  <div class="toolbar-actions-container">
17625
17676
  <ng-template #globalActionFields let-action let-kind="kind">
17626
17677
  @if (getGlobalActionSchema(action); as schema) {
17627
17678
  <div class="action-global-fields">
17628
- <div class="action-global-title">Configuração da ação global</div>
17679
+ <div class="action-global-title">Configuração da ação global</div>
17680
+ @if (schema.editorMode === 'surface-open') {
17681
+ <praxis-surface-open-action-editor
17682
+ [value]="getSurfaceOpenActionPayload(action)"
17683
+ hostKind="table"
17684
+ (valueChange)="onSurfaceOpenActionPayloadChange(action, $event, kind)"
17685
+ ></praxis-surface-open-action-editor>
17686
+ } @else {
17629
17687
  <div class="action-global-grid">
17630
17688
  @for (field of schema.fields; track field.key) {
17631
17689
  @if (shouldShowGlobalActionField(action, field)) {
@@ -17633,7 +17691,7 @@ class ToolbarActionsEditorComponent {
17633
17691
  <div class="action-section-title">Essencial</div>
17634
17692
  }
17635
17693
  @if (schema.id === 'showAlert' && field.key === 'title') {
17636
- <div class="action-section-title">Diálogo (opcional)</div>
17694
+ <div class="action-section-title">Diálogo (opcional)</div>
17637
17695
  }
17638
17696
  @if (field.type === 'toggle') {
17639
17697
  <mat-slide-toggle
@@ -17692,7 +17750,7 @@ class ToolbarActionsEditorComponent {
17692
17750
  matSuffix
17693
17751
  type="button"
17694
17752
  class="help-icon-button"
17695
- matTooltip="Informe um JSON válido."
17753
+ matTooltip="Informe um JSON válido."
17696
17754
  >
17697
17755
  <mat-icon>help_outline</mat-icon>
17698
17756
  </button>
@@ -17751,6 +17809,7 @@ class ToolbarActionsEditorComponent {
17751
17809
  }
17752
17810
  }
17753
17811
  </div>
17812
+ }
17754
17813
  </div>
17755
17814
  }
17756
17815
  </ng-template>
@@ -17779,43 +17838,43 @@ class ToolbarActionsEditorComponent {
17779
17838
  class="config-fields"
17780
17839
  >
17781
17840
  <mat-form-field appearance="outline">
17782
- <mat-label>Título da barra</mat-label>
17841
+ <mat-label>Título da barra</mat-label>
17783
17842
  <input
17784
17843
  matInput
17785
17844
  formControlName="toolbarTitle"
17786
- placeholder="Ex: Gerenciar Usuários"
17845
+ placeholder="Ex: Gerenciar Usuários"
17787
17846
  />
17788
17847
  <button
17789
17848
  mat-icon-button
17790
17849
  matSuffix
17791
17850
  type="button"
17792
17851
  class="help-icon-button"
17793
- matTooltip="Título exibido na barra de ferramentas."
17852
+ matTooltip="Título exibido na barra de ferramentas."
17794
17853
  >
17795
17854
  <mat-icon>help_outline</mat-icon>
17796
17855
  </button>
17797
17856
  </mat-form-field>
17798
17857
 
17799
17858
  <mat-form-field appearance="outline">
17800
- <mat-label>Subtítulo</mat-label>
17859
+ <mat-label>Subtítulo</mat-label>
17801
17860
  <input
17802
17861
  matInput
17803
17862
  formControlName="toolbarSubtitle"
17804
- placeholder="Ex: Lista completa de usuários do sistema"
17863
+ placeholder="Ex: Lista completa de usuários do sistema"
17805
17864
  />
17806
17865
  <button
17807
17866
  mat-icon-button
17808
17867
  matSuffix
17809
17868
  type="button"
17810
17869
  class="help-icon-button"
17811
- matTooltip="Texto de apoio abaixo do título."
17870
+ matTooltip="Texto de apoio abaixo do título."
17812
17871
  >
17813
17872
  <mat-icon>help_outline</mat-icon>
17814
17873
  </button>
17815
17874
  </mat-form-field>
17816
17875
 
17817
17876
  <mat-form-field appearance="outline">
17818
- <mat-label>Posição das ações</mat-label>
17877
+ <mat-label>Posição das ações</mat-label>
17819
17878
  <mat-select formControlName="toolbarActionsPosition">
17820
17879
  <mat-option value="top">Acima da tabela</mat-option>
17821
17880
  <mat-option value="bottom">Abaixo da tabela</mat-option>
@@ -17844,12 +17903,12 @@ class ToolbarActionsEditorComponent {
17844
17903
  </mat-form-field>
17845
17904
 
17846
17905
  <mat-form-field appearance="outline">
17847
- <mat-label>Cor de fundo das ações</mat-label>
17906
+ <mat-label>Cor de fundo das ações</mat-label>
17848
17907
  <mat-select
17849
17908
  [value]="toolbarForm.get('toolbarActionsBackgroundColor')?.value || ''"
17850
17909
  (selectionChange)="toolbarForm.get('toolbarActionsBackgroundColor')?.setValue($event.value)"
17851
17910
  >
17852
- <mat-option value="">Padrão do tema</mat-option>
17911
+ <mat-option value="">Padrão do tema</mat-option>
17853
17912
  <mat-option value="var(--p-table-header-bg)">Header da tabela</mat-option>
17854
17913
  <mat-option value="var(--md-sys-color-surface)">Surface</mat-option>
17855
17914
  <mat-option value="var(--md-sys-color-surface-container)">Surface container</mat-option>
@@ -17861,7 +17920,7 @@ class ToolbarActionsEditorComponent {
17861
17920
  matSuffix
17862
17921
  type="button"
17863
17922
  class="help-icon-button"
17864
- matTooltip="Preset de fundo para a barra de ações."
17923
+ matTooltip="Preset de fundo para a barra de ações."
17865
17924
  >
17866
17925
  <mat-icon>help_outline</mat-icon>
17867
17926
  </button>
@@ -17899,26 +17958,26 @@ class ToolbarActionsEditorComponent {
17899
17958
  </div>
17900
17959
  </mat-expansion-panel>
17901
17960
 
17902
- <!-- Ações da Toolbar -->
17961
+ <!-- Ações da Toolbar -->
17903
17962
  <mat-expansion-panel>
17904
17963
  <mat-expansion-panel-header>
17905
17964
  <mat-panel-title>
17906
17965
  <mat-icon class="section-icon">add_circle</mat-icon>
17907
- Ações da Toolbar
17966
+ Ações da Toolbar
17908
17967
  </mat-panel-title>
17909
17968
  <mat-panel-description>
17910
- Botões e menus personalizados na barra
17969
+ Botões e menus personalizados na barra
17911
17970
  </mat-panel-description>
17912
17971
  </mat-expansion-panel-header>
17913
17972
 
17914
17973
  <div class="config-section">
17915
17974
  <div class="section-hint">
17916
- Ações internas disparam eventos do componente. Ações globais exigem ActionResolver no app.
17975
+ Ações internas disparam eventos do componente. Ações globais exigem ActionResolver no app.
17917
17976
  </div>
17918
- <!-- Atalho rápido: Botão Adicionar (create) -->
17977
+ <!-- Atalho rápido: Botão Adicionar (create) -->
17919
17978
  <div class="quick-add">
17920
17979
  <mat-slide-toggle formControlName="addButtonEnabled" class="toggle-field">
17921
- Exibir botão "Adicionar"
17980
+ Exibir botão "Adicionar"
17922
17981
  </mat-slide-toggle>
17923
17982
 
17924
17983
  @if (toolbarForm.get('addButtonEnabled')?.value) { <div class="config-fields">
@@ -17928,7 +17987,7 @@ class ToolbarActionsEditorComponent {
17928
17987
  </mat-form-field>
17929
17988
 
17930
17989
  <mat-form-field appearance="outline">
17931
- <mat-labelcone</mat-label>
17990
+ <mat-label>Ícone</mat-label>
17932
17991
  @if (toolbarForm.value.addButtonIcon) { <span matPrefix>
17933
17992
  <mat-icon aria-hidden="true">{{ toolbarForm.value.addButtonIcon }}</mat-icon>
17934
17993
  </span> }
@@ -17942,7 +18001,7 @@ class ToolbarActionsEditorComponent {
17942
18001
  >
17943
18002
  <mat-icon>help_outline</mat-icon>
17944
18003
  </button>
17945
- <button mat-icon-button matSuffix type="button" (click)="pickAddButtonIcon()" matTooltip="Escolher ícone">
18004
+ <button mat-icon-button matSuffix type="button" (click)="pickAddButtonIcon()" matTooltip="Escolher ícone">
17946
18005
  <mat-icon>search</mat-icon>
17947
18006
  </button>
17948
18007
  @if (toolbarForm.value.addButtonIcon) { <button mat-icon-button matSuffix type="button" (click)="toolbarForm.get('addButtonIcon')?.setValue('')" matTooltip="Limpar">
@@ -17951,7 +18010,7 @@ class ToolbarActionsEditorComponent {
17951
18010
  </mat-form-field>
17952
18011
 
17953
18012
  <mat-form-field appearance="outline">
17954
- <mat-label>Cor do botão</mat-label>
18013
+ <mat-label>Cor do botão</mat-label>
17955
18014
  <mat-select formControlName="addButtonColor">
17956
18015
  <mat-option value="primary">Primary</mat-option>
17957
18016
  <mat-option value="accent">Accent</mat-option>
@@ -17960,15 +18019,15 @@ class ToolbarActionsEditorComponent {
17960
18019
  </mat-form-field>
17961
18020
 
17962
18021
  <mat-form-field appearance="outline">
17963
- <mat-label>Posição do botão</mat-label>
18022
+ <mat-label>Posição do botão</mat-label>
17964
18023
  <mat-select formControlName="addButtonPosition">
17965
- <mat-option value="start">Início</mat-option>
18024
+ <mat-option value="start">Início</mat-option>
17966
18025
  <mat-option value="end">Fim</mat-option>
17967
18026
  </mat-select>
17968
18027
  </mat-form-field>
17969
18028
 
17970
18029
  <mat-form-field appearance="outline">
17971
- <mat-label>Aparência</mat-label>
18030
+ <mat-label>Aparência</mat-label>
17972
18031
  <mat-select formControlName="addButtonAppearance">
17973
18032
  <mat-option value="filled">Preenchido</mat-option>
17974
18033
  <mat-option value="outlined">Contornado</mat-option>
@@ -17988,7 +18047,7 @@ class ToolbarActionsEditorComponent {
17988
18047
  type="button"
17989
18048
  >
17990
18049
  <mat-icon [praxisIcon]="'add'"></mat-icon>
17991
- Adicionar Ação
18050
+ Adicionar Ação
17992
18051
  </button>
17993
18052
  <button mat-stroked-button [matMenuTriggerFor]="toolbarTplMenu" type="button" style="margin-left:8px">
17994
18053
  <mat-icon [praxisIcon]="'bolt'"></mat-icon>
@@ -17997,7 +18056,7 @@ class ToolbarActionsEditorComponent {
17997
18056
  <mat-menu #toolbarTplMenu="matMenu">
17998
18057
  <button mat-menu-item [matMenuTriggerFor]="toolbarCrudTpl">
17999
18058
  <mat-icon [praxisIcon]="'add_circle'"></mat-icon>
18000
- <span>CRUD: botão Adicionar</span>
18059
+ <span>CRUD: botão Adicionar</span>
18001
18060
  </button>
18002
18061
  </mat-menu>
18003
18062
  <mat-menu #toolbarCrudTpl="matMenu">
@@ -18020,7 +18079,7 @@ class ToolbarActionsEditorComponent {
18020
18079
  <mat-icon class="drag-handle" [praxisIcon]="'drag_indicator'"></mat-icon>
18021
18080
  <mat-icon [praxisIcon]="action.icon"></mat-icon>
18022
18081
  <span class="action-label">{{
18023
- action.label || 'Nova Ação'
18082
+ action.label || 'Nova Ação'
18024
18083
  }}</span>
18025
18084
  <div class="action-controls">
18026
18085
  <button
@@ -18046,7 +18105,7 @@ class ToolbarActionsEditorComponent {
18046
18105
  >
18047
18106
  <div class="action-form">
18048
18107
  <mat-form-field appearance="outline">
18049
- <mat-label>ID da ação</mat-label>
18108
+ <mat-label>ID da ação</mat-label>
18050
18109
  <input
18051
18110
  matInput
18052
18111
  [(ngModel)]="action.id"
@@ -18066,7 +18125,7 @@ class ToolbarActionsEditorComponent {
18066
18125
  </mat-form-field>
18067
18126
 
18068
18127
  <mat-form-field appearance="outline">
18069
- <mat-labelcone</mat-label>
18128
+ <mat-label>Ícone</mat-label>
18070
18129
  @if (action.icon) { <span matPrefix>
18071
18130
  <mat-icon aria-hidden="true" [praxisIcon]="action.icon"></mat-icon>
18072
18131
  </span> }
@@ -18086,7 +18145,7 @@ class ToolbarActionsEditorComponent {
18086
18145
  >
18087
18146
  <mat-icon>help_outline</mat-icon>
18088
18147
  </button>
18089
- <button mat-icon-button matSuffix type="button" (click)="pickActionIcon(i)" matTooltip="Escolher ícone">
18148
+ <button mat-icon-button matSuffix type="button" (click)="pickActionIcon(i)" matTooltip="Escolher ícone">
18090
18149
  <mat-icon [praxisIcon]="'search'"></mat-icon>
18091
18150
  </button>
18092
18151
  @if (action.icon) { <button mat-icon-button matSuffix type="button" (click)="action.icon=''; updateToolbarActions()" matTooltip="Limpar">
@@ -18101,7 +18160,7 @@ class ToolbarActionsEditorComponent {
18101
18160
  (ngModelChange)="updateToolbarActions()"
18102
18161
  [ngModelOptions]="{ standalone: true }"
18103
18162
  >
18104
- <mat-option value="button">Botão</mat-option>
18163
+ <mat-option value="button">Botão</mat-option>
18105
18164
  <mat-option value="menu">Menu</mat-option>
18106
18165
  <mat-option value="toggle">Toggle</mat-option>
18107
18166
  <mat-option value="input">Input</mat-option>
@@ -18109,7 +18168,7 @@ class ToolbarActionsEditorComponent {
18109
18168
  </mat-form-field>
18110
18169
 
18111
18170
  @if (action.type === 'button') { <mat-form-field appearance="outline">
18112
- <mat-label>Aparência</mat-label>
18171
+ <mat-label>Aparência</mat-label>
18113
18172
  <mat-select
18114
18173
  [(ngModel)]="action.appearance"
18115
18174
  (ngModelChange)="updateToolbarActions()"
@@ -18126,14 +18185,14 @@ class ToolbarActionsEditorComponent {
18126
18185
  matSuffix
18127
18186
  type="button"
18128
18187
  class="help-icon-button"
18129
- matTooltip="Compatível com Angular Material: filled/raised/stroked/text; tonal usa estilo custom."
18188
+ matTooltip="Compatível com Angular Material: filled/raised/stroked/text; tonal usa estilo custom."
18130
18189
  >
18131
18190
  <mat-icon>help_outline</mat-icon>
18132
18191
  </button>
18133
18192
  </mat-form-field> }
18134
18193
 
18135
18194
  <mat-form-field appearance="outline">
18136
- <mat-label>Ação</mat-label>
18195
+ <mat-label>Ação</mat-label>
18137
18196
  <mat-select
18138
18197
  [ngModel]="getActionSelectValue(action.action)"
18139
18198
  (ngModelChange)="onActionSelectChange(action, $event, 'toolbar')"
@@ -18142,12 +18201,12 @@ class ToolbarActionsEditorComponent {
18142
18201
  <mat-option [value]="customActionValue">Customizada</mat-option>
18143
18202
  <mat-optgroup label="Acoes internas">
18144
18203
  @for (spec of internalActionCatalog; track spec.id) {
18145
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
18204
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
18146
18205
  }
18147
18206
  </mat-optgroup>
18148
18207
  <mat-optgroup label="Acoes globais">
18149
18208
  @for (spec of globalActionCatalog; track spec.id) {
18150
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
18209
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
18151
18210
  }
18152
18211
  </mat-optgroup>
18153
18212
  </mat-select>
@@ -18156,7 +18215,7 @@ class ToolbarActionsEditorComponent {
18156
18215
  matSuffix
18157
18216
  type="button"
18158
18217
  class="help-icon-button"
18159
- matTooltip="Ações internas disparam eventos do componente. Ações globais precisam de executor no app (ActionResolver). Cor/posição afetam o botão."
18218
+ matTooltip="Ações internas disparam eventos do componente. Ações globais precisam de executor no app (ActionResolver). Cor/posição afetam o botão."
18160
18219
  >
18161
18220
  <mat-icon>help_outline</mat-icon>
18162
18221
  </button>
@@ -18164,7 +18223,7 @@ class ToolbarActionsEditorComponent {
18164
18223
 
18165
18224
  @if (getActionSelectValue(action.action) === customActionValue) {
18166
18225
  <mat-form-field appearance="outline">
18167
- <mat-label>Ação customizada</mat-label>
18226
+ <mat-label>Ação customizada</mat-label>
18168
18227
  <input
18169
18228
  matInput
18170
18229
  [ngModel]="getActionCustomValue(action.action)"
@@ -18177,7 +18236,7 @@ class ToolbarActionsEditorComponent {
18177
18236
  matSuffix
18178
18237
  type="button"
18179
18238
  class="help-icon-button"
18180
- matTooltip="Informe o ID da ação a ser emitida."
18239
+ matTooltip="Informe o ID da ação a ser emitida."
18181
18240
  >
18182
18241
  <mat-icon>help_outline</mat-icon>
18183
18242
  </button>
@@ -18192,7 +18251,7 @@ class ToolbarActionsEditorComponent {
18192
18251
  @if (getActionSpecById(getActionSelectValue(action.action)); as actionSpec) {
18193
18252
  @if (actionSpec.param) {
18194
18253
  <mat-form-field appearance="outline">
18195
- <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
18254
+ <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
18196
18255
  <input
18197
18256
  matInput
18198
18257
  [ngModel]="getActionParam(action.action)"
@@ -18205,7 +18264,7 @@ class ToolbarActionsEditorComponent {
18205
18264
  matSuffix
18206
18265
  type="button"
18207
18266
  class="help-icon-button"
18208
- [matTooltip]="actionSpec.param.hint || actionSpec.description"
18267
+ [matTooltip]="getGlobalActionSpecHint(actionSpec)"
18209
18268
  >
18210
18269
  <mat-icon>help_outline</mat-icon>
18211
18270
  </button>
@@ -18219,13 +18278,13 @@ class ToolbarActionsEditorComponent {
18219
18278
  }
18220
18279
 
18221
18280
  <mat-form-field appearance="outline">
18222
- <mat-label>Posição do botão</mat-label>
18281
+ <mat-label>Posição do botão</mat-label>
18223
18282
  <mat-select
18224
18283
  [(ngModel)]="action.position"
18225
18284
  (ngModelChange)="updateToolbarActions()"
18226
18285
  [ngModelOptions]="{ standalone: true }"
18227
18286
  >
18228
- <mat-option value="start">Início</mat-option>
18287
+ <mat-option value="start">Início</mat-option>
18229
18288
  <mat-option value="end">Fim</mat-option>
18230
18289
  </mat-select>
18231
18290
  <button
@@ -18233,20 +18292,20 @@ class ToolbarActionsEditorComponent {
18233
18292
  matSuffix
18234
18293
  type="button"
18235
18294
  class="help-icon-button"
18236
- matTooltip="Posição do botão na toolbar (início/fim)."
18295
+ matTooltip="Posição do botão na toolbar (início/fim)."
18237
18296
  >
18238
18297
  <mat-icon>help_outline</mat-icon>
18239
18298
  </button>
18240
18299
  </mat-form-field>
18241
18300
 
18242
18301
  <mat-form-field appearance="outline">
18243
- <mat-label>Cor do botão</mat-label>
18302
+ <mat-label>Cor do botão</mat-label>
18244
18303
  <mat-select
18245
18304
  [(ngModel)]="action.color"
18246
18305
  (ngModelChange)="updateToolbarActions()"
18247
18306
  [ngModelOptions]="{ standalone: true }"
18248
18307
  >
18249
- <mat-option value="">Padrão</mat-option>
18308
+ <mat-option value="">Padrão</mat-option>
18250
18309
  <mat-option value="primary">Primary</mat-option>
18251
18310
  <mat-option value="accent">Accent</mat-option>
18252
18311
  <mat-option value="warn">Warn</mat-option>
@@ -18256,7 +18315,7 @@ class ToolbarActionsEditorComponent {
18256
18315
  matSuffix
18257
18316
  type="button"
18258
18317
  class="help-icon-button"
18259
- matTooltip="Cor do botão (não altera o alerta)."
18318
+ matTooltip="Cor do botão (não altera o alerta)."
18260
18319
  >
18261
18320
  <mat-icon>help_outline</mat-icon>
18262
18321
  </button>
@@ -18288,7 +18347,7 @@ class ToolbarActionsEditorComponent {
18288
18347
  matSuffix
18289
18348
  type="button"
18290
18349
  class="help-icon-button"
18291
- matTooltip="Define se o atalho vale para a toolbar em foco ou globalmente."
18350
+ matTooltip="Define se o atalho vale só para a toolbar em foco ou globalmente."
18292
18351
  >
18293
18352
  <mat-icon>help_outline</mat-icon>
18294
18353
  </button>
@@ -18310,15 +18369,15 @@ class ToolbarActionsEditorComponent {
18310
18369
  </div>
18311
18370
  </mat-expansion-panel>
18312
18371
 
18313
- <!-- Ações por Linha -->
18372
+ <!-- Ações por Linha -->
18314
18373
  <mat-expansion-panel>
18315
18374
  <mat-expansion-panel-header>
18316
18375
  <mat-panel-title>
18317
18376
  <mat-icon class="section-icon" [praxisIcon]="'more_vert'"></mat-icon>
18318
- Ações por Linha
18377
+ Ações por Linha
18319
18378
  </mat-panel-title>
18320
18379
  <mat-panel-description>
18321
- Ações específicas para cada registro
18380
+ Ações específicas para cada registro
18322
18381
  </mat-panel-description>
18323
18382
  </mat-expansion-panel-header>
18324
18383
 
@@ -18327,19 +18386,19 @@ class ToolbarActionsEditorComponent {
18327
18386
  formControlName="rowActionsEnabled"
18328
18387
  class="toggle-field"
18329
18388
  >
18330
- Habilitar ações por linha
18389
+ Habilitar ações por linha
18331
18390
  </mat-slide-toggle>
18332
18391
 
18333
18392
  @if (toolbarForm.get('rowActionsEnabled')?.value) { <div
18334
18393
  class="config-fields"
18335
18394
  >
18336
18395
  <mat-form-field appearance="outline">
18337
- <mat-label>Modo de exibição</mat-label>
18396
+ <mat-label>Modo de exibição</mat-label>
18338
18397
  <mat-select formControlName="rowActionsDisplay">
18339
18398
  <mat-option value="menu">Menu suspenso</mat-option>
18340
- <mat-option value="buttons">Botões individuais</mat-option>
18399
+ <mat-option value="buttons">Botões individuais</mat-option>
18341
18400
  <mat-option value="hybrid"
18342
- >Híbrido (botões + menu)</mat-option
18401
+ >Híbrido (botões + menu)</mat-option
18343
18402
  >
18344
18403
  </mat-select>
18345
18404
  </mat-form-field>
@@ -18347,14 +18406,14 @@ class ToolbarActionsEditorComponent {
18347
18406
  <mat-form-field appearance="outline">
18348
18407
  <mat-label>Quando mostrar</mat-label>
18349
18408
  <mat-select formControlName="rowActionsTrigger">
18350
- <mat-option value="always">Sempre visível</mat-option>
18409
+ <mat-option value="always">Sempre visível</mat-option>
18351
18410
  <mat-option value="hover">Apenas no hover</mat-option>
18352
18411
  <mat-option value="focus">Apenas com foco</mat-option>
18353
18412
  </mat-select>
18354
18413
  </mat-form-field>
18355
18414
 
18356
18415
  <mat-form-field appearance="outline">
18357
- <mat-label>Máximo de ações visíveis</mat-label>
18416
+ <mat-label>Máximo de ações visíveis</mat-label>
18358
18417
  <input
18359
18418
  matInput
18360
18419
  type="number"
@@ -18367,31 +18426,31 @@ class ToolbarActionsEditorComponent {
18367
18426
  matSuffix
18368
18427
  type="button"
18369
18428
  class="help-icon-button"
18370
- matTooltip="Demais ações ficam no menu Mais”."
18429
+ matTooltip="Demais ações ficam no menu “Mais”."
18371
18430
  >
18372
18431
  <mat-icon>help_outline</mat-icon>
18373
18432
  </button>
18374
18433
  </mat-form-field>
18375
18434
 
18376
18435
  <mat-form-field appearance="outline">
18377
- <mat-label>Largura da coluna de ações</mat-label>
18436
+ <mat-label>Largura da coluna de ações</mat-label>
18378
18437
  <input matInput formControlName="rowActionsWidth" placeholder="ex.: 96px, 6rem" />
18379
18438
  <button
18380
18439
  mat-icon-button
18381
18440
  matSuffix
18382
18441
  type="button"
18383
18442
  class="help-icon-button"
18384
- matTooltip="Aplica no header e nas células."
18443
+ matTooltip="Aplica no header e nas células."
18385
18444
  >
18386
18445
  <mat-icon>help_outline</mat-icon>
18387
18446
  </button>
18388
18447
  </mat-form-field>
18389
18448
 
18390
18449
  <mat-form-field appearance="outline">
18391
- <mat-label>Fixar coluna de ações</mat-label>
18450
+ <mat-label>Fixar coluna de ações</mat-label>
18392
18451
  <mat-select formControlName="rowActionsSticky">
18393
18452
  <mat-option [value]="null">Nenhum</mat-option>
18394
- <mat-option value="start">Início</mat-option>
18453
+ <mat-option value="start">Início</mat-option>
18395
18454
  <mat-option value="end">Fim</mat-option>
18396
18455
  </mat-select>
18397
18456
  <button
@@ -18399,19 +18458,19 @@ class ToolbarActionsEditorComponent {
18399
18458
  matSuffix
18400
18459
  type="button"
18401
18460
  class="help-icon-button"
18402
- matTooltip="Fixar coluna de ações (início/fim)."
18461
+ matTooltip="Fixar coluna de ações (início/fim)."
18403
18462
  >
18404
18463
  <mat-icon>help_outline</mat-icon>
18405
18464
  </button>
18406
18465
  </mat-form-field>
18407
18466
 
18408
18467
  <mat-form-field appearance="outline">
18409
- <mat-labelcone do menu (três pontos)</mat-label>
18468
+ <mat-label>Ícone do menu (três pontos)</mat-label>
18410
18469
  @if (toolbarForm.value.rowActionsMenuIcon) { <span matPrefix>
18411
18470
  <mat-icon aria-hidden="true" [praxisIcon]="toolbarForm.value.rowActionsMenuIcon"></mat-icon>
18412
18471
  </span> }
18413
18472
  <input matInput formControlName="rowActionsMenuIcon" placeholder="ex.: more_vert, more_horiz" />
18414
- <button mat-icon-button matSuffix type="button" (click)="pickRowMenuIcon()" matTooltip="Escolher ícone">
18473
+ <button mat-icon-button matSuffix type="button" (click)="pickRowMenuIcon()" matTooltip="Escolher ícone">
18415
18474
  <mat-icon [praxisIcon]="'search'"></mat-icon>
18416
18475
  </button>
18417
18476
  @if (toolbarForm.value.rowActionsMenuIcon) { <button mat-icon-button matSuffix type="button" (click)="toolbarForm.get('rowActionsMenuIcon')?.setValue('')" matTooltip="Limpar">
@@ -18420,9 +18479,9 @@ class ToolbarActionsEditorComponent {
18420
18479
  </mat-form-field>
18421
18480
 
18422
18481
  <mat-form-field appearance="outline">
18423
- <mat-label>Cor do botão do menu</mat-label>
18482
+ <mat-label>Cor do botão do menu</mat-label>
18424
18483
  <mat-select formControlName="rowActionsMenuButtonColor">
18425
- <mat-option value="basic">Padrão</mat-option>
18484
+ <mat-option value="basic">Padrão</mat-option>
18426
18485
  <mat-option value="primary">Primary</mat-option>
18427
18486
  <mat-option value="accent">Accent</mat-option>
18428
18487
  <mat-option value="warn">Warn</mat-option>
@@ -18430,20 +18489,20 @@ class ToolbarActionsEditorComponent {
18430
18489
  </mat-form-field>
18431
18490
 
18432
18491
  <div class="subsection" style="grid-column: 1 / -1;">
18433
- <h4> Cabeçalho da coluna de ações </h4>
18492
+ <h4> Cabeçalho da coluna de ações </h4>
18434
18493
  <div class="action-form">
18435
18494
  <mat-form-field appearance="outline">
18436
18495
  <mat-label>Label</mat-label>
18437
- <input matInput formControlName="rowActionsHeaderLabel" placeholder="Ex.: Ações" />
18496
+ <input matInput formControlName="rowActionsHeaderLabel" placeholder="Ex.: Ações" />
18438
18497
  </mat-form-field>
18439
18498
 
18440
18499
  <mat-form-field appearance="outline">
18441
- <mat-labelcone</mat-label>
18500
+ <mat-label>Ícone</mat-label>
18442
18501
  @if (toolbarForm.value.rowActionsHeaderIcon) { <span matPrefix>
18443
18502
  <mat-icon aria-hidden="true" [praxisIcon]="toolbarForm.value.rowActionsHeaderIcon"></mat-icon>
18444
18503
  </span> }
18445
18504
  <input matInput formControlName="rowActionsHeaderIcon" placeholder="ex.: more_horiz, build" />
18446
- <button mat-icon-button matSuffix type="button" (click)="pickRowHeaderIcon()" matTooltip="Escolher ícone">
18505
+ <button mat-icon-button matSuffix type="button" (click)="pickRowHeaderIcon()" matTooltip="Escolher ícone">
18447
18506
  <mat-icon [praxisIcon]="'search'"></mat-icon>
18448
18507
  </button>
18449
18508
  @if (toolbarForm.value.rowActionsHeaderIcon) { <button mat-icon-button matSuffix type="button" (click)="toolbarForm.get('rowActionsHeaderIcon')?.setValue('')" matTooltip="Limpar">
@@ -18453,13 +18512,13 @@ class ToolbarActionsEditorComponent {
18453
18512
 
18454
18513
  <mat-form-field appearance="outline">
18455
18514
  <mat-label>Tooltip</mat-label>
18456
- <input matInput formControlName="rowActionsHeaderTooltip" placeholder="Ex.: Ações disponíveis" />
18515
+ <input matInput formControlName="rowActionsHeaderTooltip" placeholder="Ex.: Ações disponíveis" />
18457
18516
  </mat-form-field>
18458
18517
 
18459
18518
  <mat-form-field appearance="outline">
18460
18519
  <mat-label>Alinhamento</mat-label>
18461
18520
  <mat-select formControlName="rowActionsHeaderAlign">
18462
- <mat-option value="start">Início</mat-option>
18521
+ <mat-option value="start">Início</mat-option>
18463
18522
  <mat-option value="center">Centro</mat-option>
18464
18523
  <mat-option value="end">Fim</mat-option>
18465
18524
  </mat-select>
@@ -18475,7 +18534,7 @@ class ToolbarActionsEditorComponent {
18475
18534
  type="button"
18476
18535
  >
18477
18536
  <mat-icon [praxisIcon]="'add'"></mat-icon>
18478
- Adicionar Ação de Linha
18537
+ Adicionar Ação de Linha
18479
18538
  </button>
18480
18539
  <button mat-stroked-button [matMenuTriggerFor]="rowTplMenu" type="button" style="margin-left:8px">
18481
18540
  <mat-icon [praxisIcon]="'bolt'"></mat-icon>
@@ -18484,7 +18543,7 @@ class ToolbarActionsEditorComponent {
18484
18543
  <mat-menu #rowTplMenu="matMenu">
18485
18544
  <button mat-menu-item [matMenuTriggerFor]="rowCrudTpl">
18486
18545
  <mat-icon [praxisIcon]="'list'"></mat-icon>
18487
- <span>CRUD padrão (ver/editar/excluir)</span>
18546
+ <span>CRUD padrão (ver/editar/excluir)</span>
18488
18547
  </button>
18489
18548
  <button mat-menu-item [matMenuTriggerFor]="rowEditDeleteTpl">
18490
18549
  <mat-icon [praxisIcon]="'edit'"></mat-icon>
@@ -18531,7 +18590,7 @@ class ToolbarActionsEditorComponent {
18531
18590
  <mat-icon class="drag-handle" [praxisIcon]="'drag_indicator'"></mat-icon>
18532
18591
  <mat-icon [praxisIcon]="action.icon"></mat-icon>
18533
18592
  <span class="action-label">{{
18534
- action.label || 'Nova Ação'
18593
+ action.label || 'Nova Ação'
18535
18594
  }}</span>
18536
18595
  <div class="action-controls">
18537
18596
  <button
@@ -18558,7 +18617,7 @@ class ToolbarActionsEditorComponent {
18558
18617
  >
18559
18618
  <div class="action-form">
18560
18619
  <mat-form-field appearance="outline">
18561
- <mat-label>ID da ação</mat-label>
18620
+ <mat-label>ID da ação</mat-label>
18562
18621
  <input
18563
18622
  matInput
18564
18623
  [(ngModel)]="action.id"
@@ -18578,7 +18637,7 @@ class ToolbarActionsEditorComponent {
18578
18637
  </mat-form-field>
18579
18638
 
18580
18639
  <mat-form-field appearance="outline">
18581
- <mat-labelcone</mat-label>
18640
+ <mat-label>Ícone</mat-label>
18582
18641
  @if (action.icon) { <span matPrefix>
18583
18642
  <mat-icon aria-hidden="true" [praxisIcon]="action.icon"></mat-icon>
18584
18643
  </span> }
@@ -18598,7 +18657,7 @@ class ToolbarActionsEditorComponent {
18598
18657
  >
18599
18658
  <mat-icon>help_outline</mat-icon>
18600
18659
  </button>
18601
- <button mat-icon-button matSuffix type="button" (click)="pickRowActionIcon(i)" matTooltip="Escolher ícone">
18660
+ <button mat-icon-button matSuffix type="button" (click)="pickRowActionIcon(i)" matTooltip="Escolher ícone">
18602
18661
  <mat-icon [praxisIcon]="'search'"></mat-icon>
18603
18662
  </button>
18604
18663
  @if (action.icon) { <button mat-icon-button matSuffix type="button" (click)="action.icon=''; updateRowActions()" matTooltip="Limpar">
@@ -18607,7 +18666,7 @@ class ToolbarActionsEditorComponent {
18607
18666
  </mat-form-field>
18608
18667
 
18609
18668
  <mat-form-field appearance="outline">
18610
- <mat-label>Ação</mat-label>
18669
+ <mat-label>Ação</mat-label>
18611
18670
  <mat-select
18612
18671
  [ngModel]="getActionSelectValue(action.action)"
18613
18672
  (ngModelChange)="onActionSelectChange(action, $event, 'row')"
@@ -18616,12 +18675,12 @@ class ToolbarActionsEditorComponent {
18616
18675
  <mat-option [value]="customActionValue">Customizada</mat-option>
18617
18676
  <mat-optgroup label="Acoes internas">
18618
18677
  @for (spec of internalActionCatalog; track spec.id) {
18619
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
18678
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
18620
18679
  }
18621
18680
  </mat-optgroup>
18622
18681
  <mat-optgroup label="Acoes globais">
18623
18682
  @for (spec of globalActionCatalog; track spec.id) {
18624
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
18683
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
18625
18684
  }
18626
18685
  </mat-optgroup>
18627
18686
  </mat-select>
@@ -18630,7 +18689,7 @@ class ToolbarActionsEditorComponent {
18630
18689
  matSuffix
18631
18690
  type="button"
18632
18691
  class="help-icon-button"
18633
- matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
18692
+ matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
18634
18693
  >
18635
18694
  <mat-icon>help_outline</mat-icon>
18636
18695
  </button>
@@ -18638,7 +18697,7 @@ class ToolbarActionsEditorComponent {
18638
18697
 
18639
18698
  @if (getActionSelectValue(action.action) === customActionValue) {
18640
18699
  <mat-form-field appearance="outline">
18641
- <mat-label>Ação customizada</mat-label>
18700
+ <mat-label>Ação customizada</mat-label>
18642
18701
  <input
18643
18702
  matInput
18644
18703
  [ngModel]="getActionCustomValue(action.action)"
@@ -18657,7 +18716,7 @@ class ToolbarActionsEditorComponent {
18657
18716
  @if (getActionSpecById(getActionSelectValue(action.action)); as actionSpec) {
18658
18717
  @if (actionSpec.param) {
18659
18718
  <mat-form-field appearance="outline">
18660
- <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
18719
+ <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
18661
18720
  <input
18662
18721
  matInput
18663
18722
  [ngModel]="getActionParam(action.action)"
@@ -18670,7 +18729,7 @@ class ToolbarActionsEditorComponent {
18670
18729
  matSuffix
18671
18730
  type="button"
18672
18731
  class="help-icon-button"
18673
- [matTooltip]="actionSpec.param.hint || actionSpec.description"
18732
+ [matTooltip]="getGlobalActionSpecHint(actionSpec)"
18674
18733
  >
18675
18734
  <mat-icon>help_outline</mat-icon>
18676
18735
  </button>
@@ -18684,13 +18743,13 @@ class ToolbarActionsEditorComponent {
18684
18743
  }
18685
18744
 
18686
18745
  <mat-form-field appearance="outline">
18687
- <mat-label>Cor do botão</mat-label>
18746
+ <mat-label>Cor do botão</mat-label>
18688
18747
  <mat-select
18689
18748
  [(ngModel)]="action.color"
18690
18749
  (ngModelChange)="updateRowActions()"
18691
18750
  [ngModelOptions]="{ standalone: true }"
18692
18751
  >
18693
- <mat-option value="">Padrão</mat-option>
18752
+ <mat-option value="">Padrão</mat-option>
18694
18753
  <mat-option value="primary">Primary</mat-option>
18695
18754
  <mat-option value="accent">Accent</mat-option>
18696
18755
  <mat-option value="warn">Warn</mat-option>
@@ -18713,7 +18772,7 @@ class ToolbarActionsEditorComponent {
18713
18772
  [ngModelOptions]="{ standalone: true }"
18714
18773
  class="toggle-field"
18715
18774
  >
18716
- Requer confirmação
18775
+ Requer confirmação
18717
18776
  </mat-slide-toggle>
18718
18777
 
18719
18778
  @if (action.action === 'delete') { <mat-slide-toggle
@@ -18731,7 +18790,7 @@ class ToolbarActionsEditorComponent {
18731
18790
  [ngModelOptions]="{ standalone: true }"
18732
18791
  class="toggle-field"
18733
18792
  >
18734
- Separador após esta ação
18793
+ Separador após esta ação
18735
18794
  </mat-slide-toggle>
18736
18795
  </div>
18737
18796
  </div>
@@ -18741,15 +18800,15 @@ class ToolbarActionsEditorComponent {
18741
18800
  </div>
18742
18801
  </mat-expansion-panel>
18743
18802
 
18744
- <!-- Ações em Lote -->
18803
+ <!-- Ações em Lote -->
18745
18804
  @if (isV2) { <mat-expansion-panel>
18746
18805
  <mat-expansion-panel-header>
18747
18806
  <mat-panel-title>
18748
18807
  <mat-icon class="section-icon" [praxisIcon]="'select_all'"></mat-icon>
18749
- Ações em Lote
18808
+ Ações em Lote
18750
18809
  </mat-panel-title>
18751
18810
  <mat-panel-description>
18752
- Ações para múltiplas seleções (V2 only)
18811
+ Ações para múltiplas seleções (V2 only)
18753
18812
  </mat-panel-description>
18754
18813
  </mat-expansion-panel-header>
18755
18814
 
@@ -18758,14 +18817,14 @@ class ToolbarActionsEditorComponent {
18758
18817
  formControlName="bulkActionsEnabled"
18759
18818
  class="toggle-field"
18760
18819
  >
18761
- Habilitar ações em lote
18820
+ Habilitar ações em lote
18762
18821
  </mat-slide-toggle>
18763
18822
 
18764
18823
  @if (toolbarForm.get('bulkActionsEnabled')?.value) { <div
18765
18824
  class="config-fields"
18766
18825
  >
18767
18826
  <mat-form-field appearance="outline">
18768
- <mat-label>Posição das ações em lote</mat-label>
18827
+ <mat-label>Posição das ações em lote</mat-label>
18769
18828
  <mat-select formControlName="bulkActionsPosition">
18770
18829
  <mat-option value="toolbar"
18771
18830
  >Na barra de ferramentas</mat-option
@@ -18783,7 +18842,7 @@ class ToolbarActionsEditorComponent {
18783
18842
  type="button"
18784
18843
  >
18785
18844
  <mat-icon [praxisIcon]="'add'"></mat-icon>
18786
- Adicionar Ação em Lote
18845
+ Adicionar Ação em Lote
18787
18846
  </button>
18788
18847
  </div>
18789
18848
 
@@ -18801,7 +18860,7 @@ class ToolbarActionsEditorComponent {
18801
18860
  <mat-icon class="drag-handle">drag_indicator</mat-icon>
18802
18861
  <mat-icon>{{ action.icon }}</mat-icon>
18803
18862
  <span class="action-label">{{
18804
- action.label || 'Nova Ação'
18863
+ action.label || 'Nova Ação'
18805
18864
  }}</span>
18806
18865
  <div class="action-controls">
18807
18866
  <button
@@ -18828,7 +18887,7 @@ class ToolbarActionsEditorComponent {
18828
18887
  >
18829
18888
  <div class="action-form">
18830
18889
  <mat-form-field appearance="outline">
18831
- <mat-label>ID da ação</mat-label>
18890
+ <mat-label>ID da ação</mat-label>
18832
18891
  <input
18833
18892
  matInput
18834
18893
  [(ngModel)]="action.id"
@@ -18848,7 +18907,7 @@ class ToolbarActionsEditorComponent {
18848
18907
  </mat-form-field>
18849
18908
 
18850
18909
  <mat-form-field appearance="outline">
18851
- <mat-labelcone</mat-label>
18910
+ <mat-label>Ícone</mat-label>
18852
18911
  <span matPrefix *ngIf="action.icon">
18853
18912
  <mat-icon aria-hidden="true">{{ action.icon }}</mat-icon>
18854
18913
  </span>
@@ -18868,7 +18927,7 @@ class ToolbarActionsEditorComponent {
18868
18927
  >
18869
18928
  <mat-icon>help_outline</mat-icon>
18870
18929
  </button>
18871
- <button mat-icon-button matSuffix type="button" (click)="pickBulkActionIcon(i)" matTooltip="Escolher ícone">
18930
+ <button mat-icon-button matSuffix type="button" (click)="pickBulkActionIcon(i)" matTooltip="Escolher ícone">
18872
18931
  <mat-icon>search</mat-icon>
18873
18932
  </button>
18874
18933
  <button mat-icon-button matSuffix type="button" (click)="action.icon=''; updateBulkActions()" matTooltip="Limpar" *ngIf="action.icon">
@@ -18877,7 +18936,7 @@ class ToolbarActionsEditorComponent {
18877
18936
  </mat-form-field>
18878
18937
 
18879
18938
  <mat-form-field appearance="outline">
18880
- <mat-label>Ação</mat-label>
18939
+ <mat-label>Ação</mat-label>
18881
18940
  <mat-select
18882
18941
  [ngModel]="getActionSelectValue(action.action)"
18883
18942
  (ngModelChange)="onActionSelectChange(action, $event, 'bulk')"
@@ -18886,12 +18945,12 @@ class ToolbarActionsEditorComponent {
18886
18945
  <mat-option [value]="customActionValue">Customizada</mat-option>
18887
18946
  <mat-optgroup label="Acoes internas">
18888
18947
  @for (spec of internalActionCatalog; track spec.id) {
18889
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
18948
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
18890
18949
  }
18891
18950
  </mat-optgroup>
18892
18951
  <mat-optgroup label="Acoes globais">
18893
18952
  @for (spec of globalActionCatalog; track spec.id) {
18894
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
18953
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
18895
18954
  }
18896
18955
  </mat-optgroup>
18897
18956
  </mat-select>
@@ -18900,7 +18959,7 @@ class ToolbarActionsEditorComponent {
18900
18959
  matSuffix
18901
18960
  type="button"
18902
18961
  class="help-icon-button"
18903
- matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
18962
+ matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
18904
18963
  >
18905
18964
  <mat-icon>help_outline</mat-icon>
18906
18965
  </button>
@@ -18908,7 +18967,7 @@ class ToolbarActionsEditorComponent {
18908
18967
 
18909
18968
  @if (getActionSelectValue(action.action) === customActionValue) {
18910
18969
  <mat-form-field appearance="outline">
18911
- <mat-label>Ação customizada</mat-label>
18970
+ <mat-label>Ação customizada</mat-label>
18912
18971
  <input
18913
18972
  matInput
18914
18973
  [ngModel]="getActionCustomValue(action.action)"
@@ -18927,7 +18986,7 @@ class ToolbarActionsEditorComponent {
18927
18986
  @if (getActionSpecById(getActionSelectValue(action.action)); as actionSpec) {
18928
18987
  @if (actionSpec.param) {
18929
18988
  <mat-form-field appearance="outline">
18930
- <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
18989
+ <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
18931
18990
  <input
18932
18991
  matInput
18933
18992
  [ngModel]="getActionParam(action.action)"
@@ -18940,7 +18999,7 @@ class ToolbarActionsEditorComponent {
18940
18999
  matSuffix
18941
19000
  type="button"
18942
19001
  class="help-icon-button"
18943
- [matTooltip]="actionSpec.param.hint || actionSpec.description"
19002
+ [matTooltip]="getGlobalActionSpecHint(actionSpec)"
18944
19003
  >
18945
19004
  <mat-icon>help_outline</mat-icon>
18946
19005
  </button>
@@ -18954,13 +19013,13 @@ class ToolbarActionsEditorComponent {
18954
19013
  }
18955
19014
 
18956
19015
  <mat-form-field appearance="outline">
18957
- <mat-label>Cor do botão</mat-label>
19016
+ <mat-label>Cor do botão</mat-label>
18958
19017
  <mat-select
18959
19018
  [(ngModel)]="action.color"
18960
19019
  (ngModelChange)="updateBulkActions()"
18961
19020
  [ngModelOptions]="{ standalone: true }"
18962
19021
  >
18963
- <mat-option value="">Padrão</mat-option>
19022
+ <mat-option value="">Padrão</mat-option>
18964
19023
  <mat-option value="primary">Primary</mat-option>
18965
19024
  <mat-option value="accent">Accent</mat-option>
18966
19025
  <mat-option value="warn">Warn</mat-option>
@@ -18968,7 +19027,7 @@ class ToolbarActionsEditorComponent {
18968
19027
  </mat-form-field>
18969
19028
 
18970
19029
  <mat-form-field appearance="outline">
18971
- <mat-label>Mínimo de seleções</mat-label>
19030
+ <mat-label>Mínimo de seleções</mat-label>
18972
19031
  <input
18973
19032
  matInput
18974
19033
  type="number"
@@ -18980,7 +19039,7 @@ class ToolbarActionsEditorComponent {
18980
19039
  </mat-form-field>
18981
19040
 
18982
19041
  <mat-form-field appearance="outline">
18983
- <mat-label>Máximo de seleções</mat-label>
19042
+ <mat-label>Máximo de seleções</mat-label>
18984
19043
  <input
18985
19044
  matInput
18986
19045
  type="number"
@@ -18997,7 +19056,7 @@ class ToolbarActionsEditorComponent {
18997
19056
  [ngModelOptions]="{ standalone: true }"
18998
19057
  class="toggle-field"
18999
19058
  >
19000
- Requer confirmação
19059
+ Requer confirmação
19001
19060
  </mat-slide-toggle>
19002
19061
 
19003
19062
  <mat-slide-toggle
@@ -19017,15 +19076,15 @@ class ToolbarActionsEditorComponent {
19017
19076
  </div>
19018
19077
  </mat-expansion-panel>
19019
19078
 
19020
- <!-- Exportação -->
19079
+ <!-- Exportação -->
19021
19080
  <mat-expansion-panel *ngIf="isV2">
19022
19081
  <mat-expansion-panel-header>
19023
19082
  <mat-panel-title>
19024
19083
  <mat-icon class="section-icon">download</mat-icon>
19025
- Exportação
19084
+ Exportação
19026
19085
  </mat-panel-title>
19027
19086
  <mat-panel-description>
19028
- Configurações de exportação de dados (V2 only)
19087
+ Configurações de exportação de dados (V2 only)
19029
19088
  </mat-panel-description>
19030
19089
  </mat-expansion-panel-header>
19031
19090
 
@@ -19034,14 +19093,14 @@ class ToolbarActionsEditorComponent {
19034
19093
  formControlName="exportEnabled"
19035
19094
  class="toggle-field"
19036
19095
  >
19037
- Habilitar exportação
19096
+ Habilitar exportação
19038
19097
  </mat-slide-toggle>
19039
19098
 
19040
19099
  @if (toolbarForm.get('exportEnabled')?.value) { <div
19041
19100
  class="config-fields"
19042
19101
  >
19043
19102
  <mat-form-field appearance="outline">
19044
- <mat-label>Formatos disponíveis</mat-label>
19103
+ <mat-label>Formatos disponíveis</mat-label>
19045
19104
  <mat-select formControlName="exportFormats" multiple>
19046
19105
  <mat-option value="excel">Excel (.xlsx)</mat-option>
19047
19106
  <mat-option value="csv">CSV</mat-option>
@@ -19053,14 +19112,14 @@ class ToolbarActionsEditorComponent {
19053
19112
  matSuffix
19054
19113
  type="button"
19055
19114
  class="help-icon-button"
19056
- matTooltip="Segure Ctrl para selecionar múltiplos formatos."
19115
+ matTooltip="Segure Ctrl para selecionar múltiplos formatos."
19057
19116
  >
19058
19117
  <mat-icon>help_outline</mat-icon>
19059
19118
  </button>
19060
19119
  </mat-form-field>
19061
19120
 
19062
19121
  <mat-form-field appearance="outline">
19063
- <mat-label>Nome padrão do arquivo</mat-label>
19122
+ <mat-label>Nome padrão do arquivo</mat-label>
19064
19123
  <input
19065
19124
  matInput
19066
19125
  formControlName="exportFileName"
@@ -19072,7 +19131,7 @@ class ToolbarActionsEditorComponent {
19072
19131
  formControlName="exportIncludeHeaders"
19073
19132
  class="toggle-field"
19074
19133
  >
19075
- Incluir cabeçalhos
19134
+ Incluir cabeçalhos
19076
19135
  </mat-slide-toggle>
19077
19136
 
19078
19137
  <mat-slide-toggle
@@ -19090,7 +19149,7 @@ class ToolbarActionsEditorComponent {
19090
19149
  </mat-slide-toggle>
19091
19150
 
19092
19151
  <mat-form-field appearance="outline">
19093
- <mat-label>Máximo de linhas</mat-label>
19152
+ <mat-label>Máximo de linhas</mat-label>
19094
19153
  <input
19095
19154
  matInput
19096
19155
  type="number"
@@ -19113,11 +19172,11 @@ class ToolbarActionsEditorComponent {
19113
19172
  </mat-expansion-panel> }
19114
19173
  </form>
19115
19174
  </div>
19116
- `, isInline: true, styles: [":host{--tae-primary: var(--md-sys-color-primary);--tae-surface: var(--md-sys-color-surface);--tae-surface-low: var(--md-sys-color-surface-container-low);--tae-surface-variant: var(--md-sys-color-surface-variant);--tae-outline-variant: var(--md-sys-color-outline-variant);--tae-on-surface: var(--md-sys-color-on-surface);--tae-on-surface-variant: var(--md-sys-color-on-surface-variant)}.toolbar-actions-container{width:100%;padding:8px}.config-section{padding:16px}.section-hint{color:var(--tae-on-surface-variant);font-size:12px;margin-bottom:12px}.config-fields{display:flex;flex-direction:column;gap:16px;margin-top:16px}.nested-fields{display:flex;flex-direction:column;gap:12px;margin-left:24px;margin-top:12px;padding:16px;background-color:var(--tae-surface-variant);border-radius:8px}.action-section-title{width:100%;margin:12px 0 4px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--tae-on-surface-variant)}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.help-icon-button mat-icon{font-size:18px;line-height:18px;width:18px;height:18px}.action-global-fields .mat-mdc-form-field-icon-suffix{align-self:center}.toggle-field{display:flex;align-items:center;gap:8px}.section-icon{margin-right:8px;color:var(--tae-primary)}.subsection{margin-top:24px;padding:16px;border:1px solid var(--tae-outline-variant);border-radius:8px}.subsection h4{margin:0 0 16px;color:var(--tae-on-surface);font-weight:500}.actions-header{margin:16px 0;display:flex;justify-content:flex-start}.actions-list{display:flex;flex-direction:column;gap:8px;min-height:60px}.action-item{border:1px solid var(--tae-outline-variant);border-radius:8px;background-color:var(--tae-surface);overflow:hidden}.action-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--tae-surface-low);cursor:move}.drag-handle{margin-right:8px;color:var(--tae-on-surface-variant);cursor:grab}.drag-handle:active{cursor:grabbing}.action-label{flex:1;margin-left:8px;font-weight:500}.action-controls{display:flex;gap:4px}.action-details{padding:16px;border-top:1px solid var(--tae-outline-variant);background-color:var(--tae-surface)}.action-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}.action-global-fields{grid-column:1 / -1;padding:12px 14px;border:1px dashed var(--tae-outline-variant);border-radius:10px;background:var(--md-sys-color-surface-container)}.action-global-title{font-size:12px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--tae-on-surface-variant);margin-bottom:10px}.action-global-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px 16px}mat-form-field{width:100%}mat-expansion-panel{margin-bottom:8px;border-radius:8px;overflow:hidden}mat-expansion-panel-header{min-height:56px}mat-panel-description{color:var(--tae-on-surface-variant)}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:var(--md-sys-elevation-level3)}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.actions-list.cdk-drop-list-dragging .action-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i5$1.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i8.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i8.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i8.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i8.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i17.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i17.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i12.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i12.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i12.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
19175
+ `, isInline: true, styles: [":host{--tae-primary: var(--md-sys-color-primary);--tae-surface: var(--md-sys-color-surface);--tae-surface-low: var(--md-sys-color-surface-container-low);--tae-surface-variant: var(--md-sys-color-surface-variant);--tae-outline-variant: var(--md-sys-color-outline-variant);--tae-on-surface: var(--md-sys-color-on-surface);--tae-on-surface-variant: var(--md-sys-color-on-surface-variant)}.toolbar-actions-container{width:100%;padding:8px}.config-section{padding:16px}.section-hint{color:var(--tae-on-surface-variant);font-size:12px;margin-bottom:12px}.config-fields{display:flex;flex-direction:column;gap:16px;margin-top:16px}.nested-fields{display:flex;flex-direction:column;gap:12px;margin-left:24px;margin-top:12px;padding:16px;background-color:var(--tae-surface-variant);border-radius:8px}.action-section-title{width:100%;margin:12px 0 4px;font-size:12px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--tae-on-surface-variant)}.help-icon-button{--mdc-icon-button-state-layer-size: 28px;--mdc-icon-button-icon-size: 18px;width:28px;height:28px;padding:0;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.help-icon-button mat-icon{font-size:18px;line-height:18px;width:18px;height:18px}.action-global-fields .mat-mdc-form-field-icon-suffix{align-self:center}.toggle-field{display:flex;align-items:center;gap:8px}.section-icon{margin-right:8px;color:var(--tae-primary)}.subsection{margin-top:24px;padding:16px;border:1px solid var(--tae-outline-variant);border-radius:8px}.subsection h4{margin:0 0 16px;color:var(--tae-on-surface);font-weight:500}.actions-header{margin:16px 0;display:flex;justify-content:flex-start}.actions-list{display:flex;flex-direction:column;gap:8px;min-height:60px}.action-item{border:1px solid var(--tae-outline-variant);border-radius:8px;background-color:var(--tae-surface);overflow:hidden}.action-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--tae-surface-low);cursor:move}.drag-handle{margin-right:8px;color:var(--tae-on-surface-variant);cursor:grab}.drag-handle:active{cursor:grabbing}.action-label{flex:1;margin-left:8px;font-weight:500}.action-controls{display:flex;gap:4px}.action-details{padding:16px;border-top:1px solid var(--tae-outline-variant);background-color:var(--tae-surface)}.action-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:16px}.action-global-fields{grid-column:1 / -1;padding:12px 14px;border:1px dashed var(--tae-outline-variant);border-radius:10px;background:var(--md-sys-color-surface-container)}.action-global-title{font-size:12px;font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--tae-on-surface-variant);margin-bottom:10px}.action-global-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px 16px}mat-form-field{width:100%}mat-expansion-panel{margin-bottom:8px;border-radius:8px;overflow:hidden}mat-expansion-panel-header{min-height:56px}mat-panel-description{color:var(--tae-on-surface-variant)}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:var(--md-sys-elevation-level3)}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.actions-list.cdk-drop-list-dragging .action-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i5$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i5$1.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i6$1.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i8.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i8.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i8.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i8.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i17.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i17.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i12.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i12.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i12.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: SurfaceOpenActionEditorComponent, selector: "praxis-surface-open-action-editor", inputs: ["value", "hostKind"], outputs: ["valueChange"] }] });
19117
19176
  }
19118
19177
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: ToolbarActionsEditorComponent, decorators: [{
19119
19178
  type: Component,
19120
- args: [{ selector: 'toolbar-actions-editor', standalone: true, imports: [
19179
+ args: [{ selector: 'toolbar-actions-editor', standalone: true, providers: [providePraxisI18nConfig(SURFACE_OPEN_I18N_CONFIG)], imports: [
19121
19180
  CommonModule,
19122
19181
  FormsModule,
19123
19182
  ReactiveFormsModule,
@@ -19135,12 +19194,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19135
19194
  MatMenuModule,
19136
19195
  DragDropModule,
19137
19196
  PraxisIconDirective,
19197
+ SurfaceOpenActionEditorComponent,
19138
19198
  ], template: `
19139
19199
  <div class="toolbar-actions-container">
19140
19200
  <ng-template #globalActionFields let-action let-kind="kind">
19141
19201
  @if (getGlobalActionSchema(action); as schema) {
19142
19202
  <div class="action-global-fields">
19143
- <div class="action-global-title">Configuração da ação global</div>
19203
+ <div class="action-global-title">Configuração da ação global</div>
19204
+ @if (schema.editorMode === 'surface-open') {
19205
+ <praxis-surface-open-action-editor
19206
+ [value]="getSurfaceOpenActionPayload(action)"
19207
+ hostKind="table"
19208
+ (valueChange)="onSurfaceOpenActionPayloadChange(action, $event, kind)"
19209
+ ></praxis-surface-open-action-editor>
19210
+ } @else {
19144
19211
  <div class="action-global-grid">
19145
19212
  @for (field of schema.fields; track field.key) {
19146
19213
  @if (shouldShowGlobalActionField(action, field)) {
@@ -19148,7 +19215,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19148
19215
  <div class="action-section-title">Essencial</div>
19149
19216
  }
19150
19217
  @if (schema.id === 'showAlert' && field.key === 'title') {
19151
- <div class="action-section-title">Diálogo (opcional)</div>
19218
+ <div class="action-section-title">Diálogo (opcional)</div>
19152
19219
  }
19153
19220
  @if (field.type === 'toggle') {
19154
19221
  <mat-slide-toggle
@@ -19207,7 +19274,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19207
19274
  matSuffix
19208
19275
  type="button"
19209
19276
  class="help-icon-button"
19210
- matTooltip="Informe um JSON válido."
19277
+ matTooltip="Informe um JSON válido."
19211
19278
  >
19212
19279
  <mat-icon>help_outline</mat-icon>
19213
19280
  </button>
@@ -19266,6 +19333,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19266
19333
  }
19267
19334
  }
19268
19335
  </div>
19336
+ }
19269
19337
  </div>
19270
19338
  }
19271
19339
  </ng-template>
@@ -19294,43 +19362,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19294
19362
  class="config-fields"
19295
19363
  >
19296
19364
  <mat-form-field appearance="outline">
19297
- <mat-label>Título da barra</mat-label>
19365
+ <mat-label>Título da barra</mat-label>
19298
19366
  <input
19299
19367
  matInput
19300
19368
  formControlName="toolbarTitle"
19301
- placeholder="Ex: Gerenciar Usuários"
19369
+ placeholder="Ex: Gerenciar Usuários"
19302
19370
  />
19303
19371
  <button
19304
19372
  mat-icon-button
19305
19373
  matSuffix
19306
19374
  type="button"
19307
19375
  class="help-icon-button"
19308
- matTooltip="Título exibido na barra de ferramentas."
19376
+ matTooltip="Título exibido na barra de ferramentas."
19309
19377
  >
19310
19378
  <mat-icon>help_outline</mat-icon>
19311
19379
  </button>
19312
19380
  </mat-form-field>
19313
19381
 
19314
19382
  <mat-form-field appearance="outline">
19315
- <mat-label>Subtítulo</mat-label>
19383
+ <mat-label>Subtítulo</mat-label>
19316
19384
  <input
19317
19385
  matInput
19318
19386
  formControlName="toolbarSubtitle"
19319
- placeholder="Ex: Lista completa de usuários do sistema"
19387
+ placeholder="Ex: Lista completa de usuários do sistema"
19320
19388
  />
19321
19389
  <button
19322
19390
  mat-icon-button
19323
19391
  matSuffix
19324
19392
  type="button"
19325
19393
  class="help-icon-button"
19326
- matTooltip="Texto de apoio abaixo do título."
19394
+ matTooltip="Texto de apoio abaixo do título."
19327
19395
  >
19328
19396
  <mat-icon>help_outline</mat-icon>
19329
19397
  </button>
19330
19398
  </mat-form-field>
19331
19399
 
19332
19400
  <mat-form-field appearance="outline">
19333
- <mat-label>Posição das ações</mat-label>
19401
+ <mat-label>Posição das ações</mat-label>
19334
19402
  <mat-select formControlName="toolbarActionsPosition">
19335
19403
  <mat-option value="top">Acima da tabela</mat-option>
19336
19404
  <mat-option value="bottom">Abaixo da tabela</mat-option>
@@ -19359,12 +19427,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19359
19427
  </mat-form-field>
19360
19428
 
19361
19429
  <mat-form-field appearance="outline">
19362
- <mat-label>Cor de fundo das ações</mat-label>
19430
+ <mat-label>Cor de fundo das ações</mat-label>
19363
19431
  <mat-select
19364
19432
  [value]="toolbarForm.get('toolbarActionsBackgroundColor')?.value || ''"
19365
19433
  (selectionChange)="toolbarForm.get('toolbarActionsBackgroundColor')?.setValue($event.value)"
19366
19434
  >
19367
- <mat-option value="">Padrão do tema</mat-option>
19435
+ <mat-option value="">Padrão do tema</mat-option>
19368
19436
  <mat-option value="var(--p-table-header-bg)">Header da tabela</mat-option>
19369
19437
  <mat-option value="var(--md-sys-color-surface)">Surface</mat-option>
19370
19438
  <mat-option value="var(--md-sys-color-surface-container)">Surface container</mat-option>
@@ -19376,7 +19444,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19376
19444
  matSuffix
19377
19445
  type="button"
19378
19446
  class="help-icon-button"
19379
- matTooltip="Preset de fundo para a barra de ações."
19447
+ matTooltip="Preset de fundo para a barra de ações."
19380
19448
  >
19381
19449
  <mat-icon>help_outline</mat-icon>
19382
19450
  </button>
@@ -19414,26 +19482,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19414
19482
  </div>
19415
19483
  </mat-expansion-panel>
19416
19484
 
19417
- <!-- Ações da Toolbar -->
19485
+ <!-- Ações da Toolbar -->
19418
19486
  <mat-expansion-panel>
19419
19487
  <mat-expansion-panel-header>
19420
19488
  <mat-panel-title>
19421
19489
  <mat-icon class="section-icon">add_circle</mat-icon>
19422
- Ações da Toolbar
19490
+ Ações da Toolbar
19423
19491
  </mat-panel-title>
19424
19492
  <mat-panel-description>
19425
- Botões e menus personalizados na barra
19493
+ Botões e menus personalizados na barra
19426
19494
  </mat-panel-description>
19427
19495
  </mat-expansion-panel-header>
19428
19496
 
19429
19497
  <div class="config-section">
19430
19498
  <div class="section-hint">
19431
- Ações internas disparam eventos do componente. Ações globais exigem ActionResolver no app.
19499
+ Ações internas disparam eventos do componente. Ações globais exigem ActionResolver no app.
19432
19500
  </div>
19433
- <!-- Atalho rápido: Botão Adicionar (create) -->
19501
+ <!-- Atalho rápido: Botão Adicionar (create) -->
19434
19502
  <div class="quick-add">
19435
19503
  <mat-slide-toggle formControlName="addButtonEnabled" class="toggle-field">
19436
- Exibir botão "Adicionar"
19504
+ Exibir botão "Adicionar"
19437
19505
  </mat-slide-toggle>
19438
19506
 
19439
19507
  @if (toolbarForm.get('addButtonEnabled')?.value) { <div class="config-fields">
@@ -19443,7 +19511,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19443
19511
  </mat-form-field>
19444
19512
 
19445
19513
  <mat-form-field appearance="outline">
19446
- <mat-labelcone</mat-label>
19514
+ <mat-label>Ícone</mat-label>
19447
19515
  @if (toolbarForm.value.addButtonIcon) { <span matPrefix>
19448
19516
  <mat-icon aria-hidden="true">{{ toolbarForm.value.addButtonIcon }}</mat-icon>
19449
19517
  </span> }
@@ -19457,7 +19525,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19457
19525
  >
19458
19526
  <mat-icon>help_outline</mat-icon>
19459
19527
  </button>
19460
- <button mat-icon-button matSuffix type="button" (click)="pickAddButtonIcon()" matTooltip="Escolher ícone">
19528
+ <button mat-icon-button matSuffix type="button" (click)="pickAddButtonIcon()" matTooltip="Escolher ícone">
19461
19529
  <mat-icon>search</mat-icon>
19462
19530
  </button>
19463
19531
  @if (toolbarForm.value.addButtonIcon) { <button mat-icon-button matSuffix type="button" (click)="toolbarForm.get('addButtonIcon')?.setValue('')" matTooltip="Limpar">
@@ -19466,7 +19534,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19466
19534
  </mat-form-field>
19467
19535
 
19468
19536
  <mat-form-field appearance="outline">
19469
- <mat-label>Cor do botão</mat-label>
19537
+ <mat-label>Cor do botão</mat-label>
19470
19538
  <mat-select formControlName="addButtonColor">
19471
19539
  <mat-option value="primary">Primary</mat-option>
19472
19540
  <mat-option value="accent">Accent</mat-option>
@@ -19475,15 +19543,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19475
19543
  </mat-form-field>
19476
19544
 
19477
19545
  <mat-form-field appearance="outline">
19478
- <mat-label>Posição do botão</mat-label>
19546
+ <mat-label>Posição do botão</mat-label>
19479
19547
  <mat-select formControlName="addButtonPosition">
19480
- <mat-option value="start">Início</mat-option>
19548
+ <mat-option value="start">Início</mat-option>
19481
19549
  <mat-option value="end">Fim</mat-option>
19482
19550
  </mat-select>
19483
19551
  </mat-form-field>
19484
19552
 
19485
19553
  <mat-form-field appearance="outline">
19486
- <mat-label>Aparência</mat-label>
19554
+ <mat-label>Aparência</mat-label>
19487
19555
  <mat-select formControlName="addButtonAppearance">
19488
19556
  <mat-option value="filled">Preenchido</mat-option>
19489
19557
  <mat-option value="outlined">Contornado</mat-option>
@@ -19503,7 +19571,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19503
19571
  type="button"
19504
19572
  >
19505
19573
  <mat-icon [praxisIcon]="'add'"></mat-icon>
19506
- Adicionar Ação
19574
+ Adicionar Ação
19507
19575
  </button>
19508
19576
  <button mat-stroked-button [matMenuTriggerFor]="toolbarTplMenu" type="button" style="margin-left:8px">
19509
19577
  <mat-icon [praxisIcon]="'bolt'"></mat-icon>
@@ -19512,7 +19580,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19512
19580
  <mat-menu #toolbarTplMenu="matMenu">
19513
19581
  <button mat-menu-item [matMenuTriggerFor]="toolbarCrudTpl">
19514
19582
  <mat-icon [praxisIcon]="'add_circle'"></mat-icon>
19515
- <span>CRUD: botão Adicionar</span>
19583
+ <span>CRUD: botão Adicionar</span>
19516
19584
  </button>
19517
19585
  </mat-menu>
19518
19586
  <mat-menu #toolbarCrudTpl="matMenu">
@@ -19535,7 +19603,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19535
19603
  <mat-icon class="drag-handle" [praxisIcon]="'drag_indicator'"></mat-icon>
19536
19604
  <mat-icon [praxisIcon]="action.icon"></mat-icon>
19537
19605
  <span class="action-label">{{
19538
- action.label || 'Nova Ação'
19606
+ action.label || 'Nova Ação'
19539
19607
  }}</span>
19540
19608
  <div class="action-controls">
19541
19609
  <button
@@ -19561,7 +19629,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19561
19629
  >
19562
19630
  <div class="action-form">
19563
19631
  <mat-form-field appearance="outline">
19564
- <mat-label>ID da ação</mat-label>
19632
+ <mat-label>ID da ação</mat-label>
19565
19633
  <input
19566
19634
  matInput
19567
19635
  [(ngModel)]="action.id"
@@ -19581,7 +19649,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19581
19649
  </mat-form-field>
19582
19650
 
19583
19651
  <mat-form-field appearance="outline">
19584
- <mat-labelcone</mat-label>
19652
+ <mat-label>Ícone</mat-label>
19585
19653
  @if (action.icon) { <span matPrefix>
19586
19654
  <mat-icon aria-hidden="true" [praxisIcon]="action.icon"></mat-icon>
19587
19655
  </span> }
@@ -19601,7 +19669,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19601
19669
  >
19602
19670
  <mat-icon>help_outline</mat-icon>
19603
19671
  </button>
19604
- <button mat-icon-button matSuffix type="button" (click)="pickActionIcon(i)" matTooltip="Escolher ícone">
19672
+ <button mat-icon-button matSuffix type="button" (click)="pickActionIcon(i)" matTooltip="Escolher ícone">
19605
19673
  <mat-icon [praxisIcon]="'search'"></mat-icon>
19606
19674
  </button>
19607
19675
  @if (action.icon) { <button mat-icon-button matSuffix type="button" (click)="action.icon=''; updateToolbarActions()" matTooltip="Limpar">
@@ -19616,7 +19684,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19616
19684
  (ngModelChange)="updateToolbarActions()"
19617
19685
  [ngModelOptions]="{ standalone: true }"
19618
19686
  >
19619
- <mat-option value="button">Botão</mat-option>
19687
+ <mat-option value="button">Botão</mat-option>
19620
19688
  <mat-option value="menu">Menu</mat-option>
19621
19689
  <mat-option value="toggle">Toggle</mat-option>
19622
19690
  <mat-option value="input">Input</mat-option>
@@ -19624,7 +19692,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19624
19692
  </mat-form-field>
19625
19693
 
19626
19694
  @if (action.type === 'button') { <mat-form-field appearance="outline">
19627
- <mat-label>Aparência</mat-label>
19695
+ <mat-label>Aparência</mat-label>
19628
19696
  <mat-select
19629
19697
  [(ngModel)]="action.appearance"
19630
19698
  (ngModelChange)="updateToolbarActions()"
@@ -19641,14 +19709,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19641
19709
  matSuffix
19642
19710
  type="button"
19643
19711
  class="help-icon-button"
19644
- matTooltip="Compatível com Angular Material: filled/raised/stroked/text; tonal usa estilo custom."
19712
+ matTooltip="Compatível com Angular Material: filled/raised/stroked/text; tonal usa estilo custom."
19645
19713
  >
19646
19714
  <mat-icon>help_outline</mat-icon>
19647
19715
  </button>
19648
19716
  </mat-form-field> }
19649
19717
 
19650
19718
  <mat-form-field appearance="outline">
19651
- <mat-label>Ação</mat-label>
19719
+ <mat-label>Ação</mat-label>
19652
19720
  <mat-select
19653
19721
  [ngModel]="getActionSelectValue(action.action)"
19654
19722
  (ngModelChange)="onActionSelectChange(action, $event, 'toolbar')"
@@ -19657,12 +19725,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19657
19725
  <mat-option [value]="customActionValue">Customizada</mat-option>
19658
19726
  <mat-optgroup label="Acoes internas">
19659
19727
  @for (spec of internalActionCatalog; track spec.id) {
19660
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
19728
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
19661
19729
  }
19662
19730
  </mat-optgroup>
19663
19731
  <mat-optgroup label="Acoes globais">
19664
19732
  @for (spec of globalActionCatalog; track spec.id) {
19665
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
19733
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
19666
19734
  }
19667
19735
  </mat-optgroup>
19668
19736
  </mat-select>
@@ -19671,7 +19739,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19671
19739
  matSuffix
19672
19740
  type="button"
19673
19741
  class="help-icon-button"
19674
- matTooltip="Ações internas disparam eventos do componente. Ações globais precisam de executor no app (ActionResolver). Cor/posição afetam o botão."
19742
+ matTooltip="Ações internas disparam eventos do componente. Ações globais precisam de executor no app (ActionResolver). Cor/posição afetam o botão."
19675
19743
  >
19676
19744
  <mat-icon>help_outline</mat-icon>
19677
19745
  </button>
@@ -19679,7 +19747,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19679
19747
 
19680
19748
  @if (getActionSelectValue(action.action) === customActionValue) {
19681
19749
  <mat-form-field appearance="outline">
19682
- <mat-label>Ação customizada</mat-label>
19750
+ <mat-label>Ação customizada</mat-label>
19683
19751
  <input
19684
19752
  matInput
19685
19753
  [ngModel]="getActionCustomValue(action.action)"
@@ -19692,7 +19760,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19692
19760
  matSuffix
19693
19761
  type="button"
19694
19762
  class="help-icon-button"
19695
- matTooltip="Informe o ID da ação a ser emitida."
19763
+ matTooltip="Informe o ID da ação a ser emitida."
19696
19764
  >
19697
19765
  <mat-icon>help_outline</mat-icon>
19698
19766
  </button>
@@ -19707,7 +19775,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19707
19775
  @if (getActionSpecById(getActionSelectValue(action.action)); as actionSpec) {
19708
19776
  @if (actionSpec.param) {
19709
19777
  <mat-form-field appearance="outline">
19710
- <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
19778
+ <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
19711
19779
  <input
19712
19780
  matInput
19713
19781
  [ngModel]="getActionParam(action.action)"
@@ -19720,7 +19788,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19720
19788
  matSuffix
19721
19789
  type="button"
19722
19790
  class="help-icon-button"
19723
- [matTooltip]="actionSpec.param.hint || actionSpec.description"
19791
+ [matTooltip]="getGlobalActionSpecHint(actionSpec)"
19724
19792
  >
19725
19793
  <mat-icon>help_outline</mat-icon>
19726
19794
  </button>
@@ -19734,13 +19802,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19734
19802
  }
19735
19803
 
19736
19804
  <mat-form-field appearance="outline">
19737
- <mat-label>Posição do botão</mat-label>
19805
+ <mat-label>Posição do botão</mat-label>
19738
19806
  <mat-select
19739
19807
  [(ngModel)]="action.position"
19740
19808
  (ngModelChange)="updateToolbarActions()"
19741
19809
  [ngModelOptions]="{ standalone: true }"
19742
19810
  >
19743
- <mat-option value="start">Início</mat-option>
19811
+ <mat-option value="start">Início</mat-option>
19744
19812
  <mat-option value="end">Fim</mat-option>
19745
19813
  </mat-select>
19746
19814
  <button
@@ -19748,20 +19816,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19748
19816
  matSuffix
19749
19817
  type="button"
19750
19818
  class="help-icon-button"
19751
- matTooltip="Posição do botão na toolbar (início/fim)."
19819
+ matTooltip="Posição do botão na toolbar (início/fim)."
19752
19820
  >
19753
19821
  <mat-icon>help_outline</mat-icon>
19754
19822
  </button>
19755
19823
  </mat-form-field>
19756
19824
 
19757
19825
  <mat-form-field appearance="outline">
19758
- <mat-label>Cor do botão</mat-label>
19826
+ <mat-label>Cor do botão</mat-label>
19759
19827
  <mat-select
19760
19828
  [(ngModel)]="action.color"
19761
19829
  (ngModelChange)="updateToolbarActions()"
19762
19830
  [ngModelOptions]="{ standalone: true }"
19763
19831
  >
19764
- <mat-option value="">Padrão</mat-option>
19832
+ <mat-option value="">Padrão</mat-option>
19765
19833
  <mat-option value="primary">Primary</mat-option>
19766
19834
  <mat-option value="accent">Accent</mat-option>
19767
19835
  <mat-option value="warn">Warn</mat-option>
@@ -19771,7 +19839,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19771
19839
  matSuffix
19772
19840
  type="button"
19773
19841
  class="help-icon-button"
19774
- matTooltip="Cor do botão (não altera o alerta)."
19842
+ matTooltip="Cor do botão (não altera o alerta)."
19775
19843
  >
19776
19844
  <mat-icon>help_outline</mat-icon>
19777
19845
  </button>
@@ -19803,7 +19871,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19803
19871
  matSuffix
19804
19872
  type="button"
19805
19873
  class="help-icon-button"
19806
- matTooltip="Define se o atalho vale para a toolbar em foco ou globalmente."
19874
+ matTooltip="Define se o atalho vale só para a toolbar em foco ou globalmente."
19807
19875
  >
19808
19876
  <mat-icon>help_outline</mat-icon>
19809
19877
  </button>
@@ -19825,15 +19893,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19825
19893
  </div>
19826
19894
  </mat-expansion-panel>
19827
19895
 
19828
- <!-- Ações por Linha -->
19896
+ <!-- Ações por Linha -->
19829
19897
  <mat-expansion-panel>
19830
19898
  <mat-expansion-panel-header>
19831
19899
  <mat-panel-title>
19832
19900
  <mat-icon class="section-icon" [praxisIcon]="'more_vert'"></mat-icon>
19833
- Ações por Linha
19901
+ Ações por Linha
19834
19902
  </mat-panel-title>
19835
19903
  <mat-panel-description>
19836
- Ações específicas para cada registro
19904
+ Ações específicas para cada registro
19837
19905
  </mat-panel-description>
19838
19906
  </mat-expansion-panel-header>
19839
19907
 
@@ -19842,19 +19910,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19842
19910
  formControlName="rowActionsEnabled"
19843
19911
  class="toggle-field"
19844
19912
  >
19845
- Habilitar ações por linha
19913
+ Habilitar ações por linha
19846
19914
  </mat-slide-toggle>
19847
19915
 
19848
19916
  @if (toolbarForm.get('rowActionsEnabled')?.value) { <div
19849
19917
  class="config-fields"
19850
19918
  >
19851
19919
  <mat-form-field appearance="outline">
19852
- <mat-label>Modo de exibição</mat-label>
19920
+ <mat-label>Modo de exibição</mat-label>
19853
19921
  <mat-select formControlName="rowActionsDisplay">
19854
19922
  <mat-option value="menu">Menu suspenso</mat-option>
19855
- <mat-option value="buttons">Botões individuais</mat-option>
19923
+ <mat-option value="buttons">Botões individuais</mat-option>
19856
19924
  <mat-option value="hybrid"
19857
- >Híbrido (botões + menu)</mat-option
19925
+ >Híbrido (botões + menu)</mat-option
19858
19926
  >
19859
19927
  </mat-select>
19860
19928
  </mat-form-field>
@@ -19862,14 +19930,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19862
19930
  <mat-form-field appearance="outline">
19863
19931
  <mat-label>Quando mostrar</mat-label>
19864
19932
  <mat-select formControlName="rowActionsTrigger">
19865
- <mat-option value="always">Sempre visível</mat-option>
19933
+ <mat-option value="always">Sempre visível</mat-option>
19866
19934
  <mat-option value="hover">Apenas no hover</mat-option>
19867
19935
  <mat-option value="focus">Apenas com foco</mat-option>
19868
19936
  </mat-select>
19869
19937
  </mat-form-field>
19870
19938
 
19871
19939
  <mat-form-field appearance="outline">
19872
- <mat-label>Máximo de ações visíveis</mat-label>
19940
+ <mat-label>Máximo de ações visíveis</mat-label>
19873
19941
  <input
19874
19942
  matInput
19875
19943
  type="number"
@@ -19882,31 +19950,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19882
19950
  matSuffix
19883
19951
  type="button"
19884
19952
  class="help-icon-button"
19885
- matTooltip="Demais ações ficam no menu Mais”."
19953
+ matTooltip="Demais ações ficam no menu “Mais”."
19886
19954
  >
19887
19955
  <mat-icon>help_outline</mat-icon>
19888
19956
  </button>
19889
19957
  </mat-form-field>
19890
19958
 
19891
19959
  <mat-form-field appearance="outline">
19892
- <mat-label>Largura da coluna de ações</mat-label>
19960
+ <mat-label>Largura da coluna de ações</mat-label>
19893
19961
  <input matInput formControlName="rowActionsWidth" placeholder="ex.: 96px, 6rem" />
19894
19962
  <button
19895
19963
  mat-icon-button
19896
19964
  matSuffix
19897
19965
  type="button"
19898
19966
  class="help-icon-button"
19899
- matTooltip="Aplica no header e nas células."
19967
+ matTooltip="Aplica no header e nas células."
19900
19968
  >
19901
19969
  <mat-icon>help_outline</mat-icon>
19902
19970
  </button>
19903
19971
  </mat-form-field>
19904
19972
 
19905
19973
  <mat-form-field appearance="outline">
19906
- <mat-label>Fixar coluna de ações</mat-label>
19974
+ <mat-label>Fixar coluna de ações</mat-label>
19907
19975
  <mat-select formControlName="rowActionsSticky">
19908
19976
  <mat-option [value]="null">Nenhum</mat-option>
19909
- <mat-option value="start">Início</mat-option>
19977
+ <mat-option value="start">Início</mat-option>
19910
19978
  <mat-option value="end">Fim</mat-option>
19911
19979
  </mat-select>
19912
19980
  <button
@@ -19914,19 +19982,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19914
19982
  matSuffix
19915
19983
  type="button"
19916
19984
  class="help-icon-button"
19917
- matTooltip="Fixar coluna de ações (início/fim)."
19985
+ matTooltip="Fixar coluna de ações (início/fim)."
19918
19986
  >
19919
19987
  <mat-icon>help_outline</mat-icon>
19920
19988
  </button>
19921
19989
  </mat-form-field>
19922
19990
 
19923
19991
  <mat-form-field appearance="outline">
19924
- <mat-labelcone do menu (três pontos)</mat-label>
19992
+ <mat-label>Ícone do menu (três pontos)</mat-label>
19925
19993
  @if (toolbarForm.value.rowActionsMenuIcon) { <span matPrefix>
19926
19994
  <mat-icon aria-hidden="true" [praxisIcon]="toolbarForm.value.rowActionsMenuIcon"></mat-icon>
19927
19995
  </span> }
19928
19996
  <input matInput formControlName="rowActionsMenuIcon" placeholder="ex.: more_vert, more_horiz" />
19929
- <button mat-icon-button matSuffix type="button" (click)="pickRowMenuIcon()" matTooltip="Escolher ícone">
19997
+ <button mat-icon-button matSuffix type="button" (click)="pickRowMenuIcon()" matTooltip="Escolher ícone">
19930
19998
  <mat-icon [praxisIcon]="'search'"></mat-icon>
19931
19999
  </button>
19932
20000
  @if (toolbarForm.value.rowActionsMenuIcon) { <button mat-icon-button matSuffix type="button" (click)="toolbarForm.get('rowActionsMenuIcon')?.setValue('')" matTooltip="Limpar">
@@ -19935,9 +20003,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19935
20003
  </mat-form-field>
19936
20004
 
19937
20005
  <mat-form-field appearance="outline">
19938
- <mat-label>Cor do botão do menu</mat-label>
20006
+ <mat-label>Cor do botão do menu</mat-label>
19939
20007
  <mat-select formControlName="rowActionsMenuButtonColor">
19940
- <mat-option value="basic">Padrão</mat-option>
20008
+ <mat-option value="basic">Padrão</mat-option>
19941
20009
  <mat-option value="primary">Primary</mat-option>
19942
20010
  <mat-option value="accent">Accent</mat-option>
19943
20011
  <mat-option value="warn">Warn</mat-option>
@@ -19945,20 +20013,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19945
20013
  </mat-form-field>
19946
20014
 
19947
20015
  <div class="subsection" style="grid-column: 1 / -1;">
19948
- <h4> Cabeçalho da coluna de ações </h4>
20016
+ <h4> Cabeçalho da coluna de ações </h4>
19949
20017
  <div class="action-form">
19950
20018
  <mat-form-field appearance="outline">
19951
20019
  <mat-label>Label</mat-label>
19952
- <input matInput formControlName="rowActionsHeaderLabel" placeholder="Ex.: Ações" />
20020
+ <input matInput formControlName="rowActionsHeaderLabel" placeholder="Ex.: Ações" />
19953
20021
  </mat-form-field>
19954
20022
 
19955
20023
  <mat-form-field appearance="outline">
19956
- <mat-labelcone</mat-label>
20024
+ <mat-label>Ícone</mat-label>
19957
20025
  @if (toolbarForm.value.rowActionsHeaderIcon) { <span matPrefix>
19958
20026
  <mat-icon aria-hidden="true" [praxisIcon]="toolbarForm.value.rowActionsHeaderIcon"></mat-icon>
19959
20027
  </span> }
19960
20028
  <input matInput formControlName="rowActionsHeaderIcon" placeholder="ex.: more_horiz, build" />
19961
- <button mat-icon-button matSuffix type="button" (click)="pickRowHeaderIcon()" matTooltip="Escolher ícone">
20029
+ <button mat-icon-button matSuffix type="button" (click)="pickRowHeaderIcon()" matTooltip="Escolher ícone">
19962
20030
  <mat-icon [praxisIcon]="'search'"></mat-icon>
19963
20031
  </button>
19964
20032
  @if (toolbarForm.value.rowActionsHeaderIcon) { <button mat-icon-button matSuffix type="button" (click)="toolbarForm.get('rowActionsHeaderIcon')?.setValue('')" matTooltip="Limpar">
@@ -19968,13 +20036,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19968
20036
 
19969
20037
  <mat-form-field appearance="outline">
19970
20038
  <mat-label>Tooltip</mat-label>
19971
- <input matInput formControlName="rowActionsHeaderTooltip" placeholder="Ex.: Ações disponíveis" />
20039
+ <input matInput formControlName="rowActionsHeaderTooltip" placeholder="Ex.: Ações disponíveis" />
19972
20040
  </mat-form-field>
19973
20041
 
19974
20042
  <mat-form-field appearance="outline">
19975
20043
  <mat-label>Alinhamento</mat-label>
19976
20044
  <mat-select formControlName="rowActionsHeaderAlign">
19977
- <mat-option value="start">Início</mat-option>
20045
+ <mat-option value="start">Início</mat-option>
19978
20046
  <mat-option value="center">Centro</mat-option>
19979
20047
  <mat-option value="end">Fim</mat-option>
19980
20048
  </mat-select>
@@ -19990,7 +20058,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19990
20058
  type="button"
19991
20059
  >
19992
20060
  <mat-icon [praxisIcon]="'add'"></mat-icon>
19993
- Adicionar Ação de Linha
20061
+ Adicionar Ação de Linha
19994
20062
  </button>
19995
20063
  <button mat-stroked-button [matMenuTriggerFor]="rowTplMenu" type="button" style="margin-left:8px">
19996
20064
  <mat-icon [praxisIcon]="'bolt'"></mat-icon>
@@ -19999,7 +20067,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19999
20067
  <mat-menu #rowTplMenu="matMenu">
20000
20068
  <button mat-menu-item [matMenuTriggerFor]="rowCrudTpl">
20001
20069
  <mat-icon [praxisIcon]="'list'"></mat-icon>
20002
- <span>CRUD padrão (ver/editar/excluir)</span>
20070
+ <span>CRUD padrão (ver/editar/excluir)</span>
20003
20071
  </button>
20004
20072
  <button mat-menu-item [matMenuTriggerFor]="rowEditDeleteTpl">
20005
20073
  <mat-icon [praxisIcon]="'edit'"></mat-icon>
@@ -20046,7 +20114,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20046
20114
  <mat-icon class="drag-handle" [praxisIcon]="'drag_indicator'"></mat-icon>
20047
20115
  <mat-icon [praxisIcon]="action.icon"></mat-icon>
20048
20116
  <span class="action-label">{{
20049
- action.label || 'Nova Ação'
20117
+ action.label || 'Nova Ação'
20050
20118
  }}</span>
20051
20119
  <div class="action-controls">
20052
20120
  <button
@@ -20073,7 +20141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20073
20141
  >
20074
20142
  <div class="action-form">
20075
20143
  <mat-form-field appearance="outline">
20076
- <mat-label>ID da ação</mat-label>
20144
+ <mat-label>ID da ação</mat-label>
20077
20145
  <input
20078
20146
  matInput
20079
20147
  [(ngModel)]="action.id"
@@ -20093,7 +20161,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20093
20161
  </mat-form-field>
20094
20162
 
20095
20163
  <mat-form-field appearance="outline">
20096
- <mat-labelcone</mat-label>
20164
+ <mat-label>Ícone</mat-label>
20097
20165
  @if (action.icon) { <span matPrefix>
20098
20166
  <mat-icon aria-hidden="true" [praxisIcon]="action.icon"></mat-icon>
20099
20167
  </span> }
@@ -20113,7 +20181,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20113
20181
  >
20114
20182
  <mat-icon>help_outline</mat-icon>
20115
20183
  </button>
20116
- <button mat-icon-button matSuffix type="button" (click)="pickRowActionIcon(i)" matTooltip="Escolher ícone">
20184
+ <button mat-icon-button matSuffix type="button" (click)="pickRowActionIcon(i)" matTooltip="Escolher ícone">
20117
20185
  <mat-icon [praxisIcon]="'search'"></mat-icon>
20118
20186
  </button>
20119
20187
  @if (action.icon) { <button mat-icon-button matSuffix type="button" (click)="action.icon=''; updateRowActions()" matTooltip="Limpar">
@@ -20122,7 +20190,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20122
20190
  </mat-form-field>
20123
20191
 
20124
20192
  <mat-form-field appearance="outline">
20125
- <mat-label>Ação</mat-label>
20193
+ <mat-label>Ação</mat-label>
20126
20194
  <mat-select
20127
20195
  [ngModel]="getActionSelectValue(action.action)"
20128
20196
  (ngModelChange)="onActionSelectChange(action, $event, 'row')"
@@ -20131,12 +20199,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20131
20199
  <mat-option [value]="customActionValue">Customizada</mat-option>
20132
20200
  <mat-optgroup label="Acoes internas">
20133
20201
  @for (spec of internalActionCatalog; track spec.id) {
20134
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
20202
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
20135
20203
  }
20136
20204
  </mat-optgroup>
20137
20205
  <mat-optgroup label="Acoes globais">
20138
20206
  @for (spec of globalActionCatalog; track spec.id) {
20139
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
20207
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
20140
20208
  }
20141
20209
  </mat-optgroup>
20142
20210
  </mat-select>
@@ -20145,7 +20213,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20145
20213
  matSuffix
20146
20214
  type="button"
20147
20215
  class="help-icon-button"
20148
- matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
20216
+ matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
20149
20217
  >
20150
20218
  <mat-icon>help_outline</mat-icon>
20151
20219
  </button>
@@ -20153,7 +20221,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20153
20221
 
20154
20222
  @if (getActionSelectValue(action.action) === customActionValue) {
20155
20223
  <mat-form-field appearance="outline">
20156
- <mat-label>Ação customizada</mat-label>
20224
+ <mat-label>Ação customizada</mat-label>
20157
20225
  <input
20158
20226
  matInput
20159
20227
  [ngModel]="getActionCustomValue(action.action)"
@@ -20172,7 +20240,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20172
20240
  @if (getActionSpecById(getActionSelectValue(action.action)); as actionSpec) {
20173
20241
  @if (actionSpec.param) {
20174
20242
  <mat-form-field appearance="outline">
20175
- <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
20243
+ <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
20176
20244
  <input
20177
20245
  matInput
20178
20246
  [ngModel]="getActionParam(action.action)"
@@ -20185,7 +20253,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20185
20253
  matSuffix
20186
20254
  type="button"
20187
20255
  class="help-icon-button"
20188
- [matTooltip]="actionSpec.param.hint || actionSpec.description"
20256
+ [matTooltip]="getGlobalActionSpecHint(actionSpec)"
20189
20257
  >
20190
20258
  <mat-icon>help_outline</mat-icon>
20191
20259
  </button>
@@ -20199,13 +20267,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20199
20267
  }
20200
20268
 
20201
20269
  <mat-form-field appearance="outline">
20202
- <mat-label>Cor do botão</mat-label>
20270
+ <mat-label>Cor do botão</mat-label>
20203
20271
  <mat-select
20204
20272
  [(ngModel)]="action.color"
20205
20273
  (ngModelChange)="updateRowActions()"
20206
20274
  [ngModelOptions]="{ standalone: true }"
20207
20275
  >
20208
- <mat-option value="">Padrão</mat-option>
20276
+ <mat-option value="">Padrão</mat-option>
20209
20277
  <mat-option value="primary">Primary</mat-option>
20210
20278
  <mat-option value="accent">Accent</mat-option>
20211
20279
  <mat-option value="warn">Warn</mat-option>
@@ -20228,7 +20296,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20228
20296
  [ngModelOptions]="{ standalone: true }"
20229
20297
  class="toggle-field"
20230
20298
  >
20231
- Requer confirmação
20299
+ Requer confirmação
20232
20300
  </mat-slide-toggle>
20233
20301
 
20234
20302
  @if (action.action === 'delete') { <mat-slide-toggle
@@ -20246,7 +20314,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20246
20314
  [ngModelOptions]="{ standalone: true }"
20247
20315
  class="toggle-field"
20248
20316
  >
20249
- Separador após esta ação
20317
+ Separador após esta ação
20250
20318
  </mat-slide-toggle>
20251
20319
  </div>
20252
20320
  </div>
@@ -20256,15 +20324,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20256
20324
  </div>
20257
20325
  </mat-expansion-panel>
20258
20326
 
20259
- <!-- Ações em Lote -->
20327
+ <!-- Ações em Lote -->
20260
20328
  @if (isV2) { <mat-expansion-panel>
20261
20329
  <mat-expansion-panel-header>
20262
20330
  <mat-panel-title>
20263
20331
  <mat-icon class="section-icon" [praxisIcon]="'select_all'"></mat-icon>
20264
- Ações em Lote
20332
+ Ações em Lote
20265
20333
  </mat-panel-title>
20266
20334
  <mat-panel-description>
20267
- Ações para múltiplas seleções (V2 only)
20335
+ Ações para múltiplas seleções (V2 only)
20268
20336
  </mat-panel-description>
20269
20337
  </mat-expansion-panel-header>
20270
20338
 
@@ -20273,14 +20341,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20273
20341
  formControlName="bulkActionsEnabled"
20274
20342
  class="toggle-field"
20275
20343
  >
20276
- Habilitar ações em lote
20344
+ Habilitar ações em lote
20277
20345
  </mat-slide-toggle>
20278
20346
 
20279
20347
  @if (toolbarForm.get('bulkActionsEnabled')?.value) { <div
20280
20348
  class="config-fields"
20281
20349
  >
20282
20350
  <mat-form-field appearance="outline">
20283
- <mat-label>Posição das ações em lote</mat-label>
20351
+ <mat-label>Posição das ações em lote</mat-label>
20284
20352
  <mat-select formControlName="bulkActionsPosition">
20285
20353
  <mat-option value="toolbar"
20286
20354
  >Na barra de ferramentas</mat-option
@@ -20298,7 +20366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20298
20366
  type="button"
20299
20367
  >
20300
20368
  <mat-icon [praxisIcon]="'add'"></mat-icon>
20301
- Adicionar Ação em Lote
20369
+ Adicionar Ação em Lote
20302
20370
  </button>
20303
20371
  </div>
20304
20372
 
@@ -20316,7 +20384,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20316
20384
  <mat-icon class="drag-handle">drag_indicator</mat-icon>
20317
20385
  <mat-icon>{{ action.icon }}</mat-icon>
20318
20386
  <span class="action-label">{{
20319
- action.label || 'Nova Ação'
20387
+ action.label || 'Nova Ação'
20320
20388
  }}</span>
20321
20389
  <div class="action-controls">
20322
20390
  <button
@@ -20343,7 +20411,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20343
20411
  >
20344
20412
  <div class="action-form">
20345
20413
  <mat-form-field appearance="outline">
20346
- <mat-label>ID da ação</mat-label>
20414
+ <mat-label>ID da ação</mat-label>
20347
20415
  <input
20348
20416
  matInput
20349
20417
  [(ngModel)]="action.id"
@@ -20363,7 +20431,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20363
20431
  </mat-form-field>
20364
20432
 
20365
20433
  <mat-form-field appearance="outline">
20366
- <mat-labelcone</mat-label>
20434
+ <mat-label>Ícone</mat-label>
20367
20435
  <span matPrefix *ngIf="action.icon">
20368
20436
  <mat-icon aria-hidden="true">{{ action.icon }}</mat-icon>
20369
20437
  </span>
@@ -20383,7 +20451,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20383
20451
  >
20384
20452
  <mat-icon>help_outline</mat-icon>
20385
20453
  </button>
20386
- <button mat-icon-button matSuffix type="button" (click)="pickBulkActionIcon(i)" matTooltip="Escolher ícone">
20454
+ <button mat-icon-button matSuffix type="button" (click)="pickBulkActionIcon(i)" matTooltip="Escolher ícone">
20387
20455
  <mat-icon>search</mat-icon>
20388
20456
  </button>
20389
20457
  <button mat-icon-button matSuffix type="button" (click)="action.icon=''; updateBulkActions()" matTooltip="Limpar" *ngIf="action.icon">
@@ -20392,7 +20460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20392
20460
  </mat-form-field>
20393
20461
 
20394
20462
  <mat-form-field appearance="outline">
20395
- <mat-label>Ação</mat-label>
20463
+ <mat-label>Ação</mat-label>
20396
20464
  <mat-select
20397
20465
  [ngModel]="getActionSelectValue(action.action)"
20398
20466
  (ngModelChange)="onActionSelectChange(action, $event, 'bulk')"
@@ -20401,12 +20469,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20401
20469
  <mat-option [value]="customActionValue">Customizada</mat-option>
20402
20470
  <mat-optgroup label="Acoes internas">
20403
20471
  @for (spec of internalActionCatalog; track spec.id) {
20404
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
20472
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
20405
20473
  }
20406
20474
  </mat-optgroup>
20407
20475
  <mat-optgroup label="Acoes globais">
20408
20476
  @for (spec of globalActionCatalog; track spec.id) {
20409
- <mat-option [value]="spec.id">{{ spec.label }}</mat-option>
20477
+ <mat-option [value]="spec.id">{{ getGlobalActionSpecLabel(spec) }}</mat-option>
20410
20478
  }
20411
20479
  </mat-optgroup>
20412
20480
  </mat-select>
@@ -20415,7 +20483,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20415
20483
  matSuffix
20416
20484
  type="button"
20417
20485
  class="help-icon-button"
20418
- matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
20486
+ matTooltip="Ações internas disparam eventos da tabela. Ações globais precisam do ActionResolver no app."
20419
20487
  >
20420
20488
  <mat-icon>help_outline</mat-icon>
20421
20489
  </button>
@@ -20423,7 +20491,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20423
20491
 
20424
20492
  @if (getActionSelectValue(action.action) === customActionValue) {
20425
20493
  <mat-form-field appearance="outline">
20426
- <mat-label>Ação customizada</mat-label>
20494
+ <mat-label>Ação customizada</mat-label>
20427
20495
  <input
20428
20496
  matInput
20429
20497
  [ngModel]="getActionCustomValue(action.action)"
@@ -20442,7 +20510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20442
20510
  @if (getActionSpecById(getActionSelectValue(action.action)); as actionSpec) {
20443
20511
  @if (actionSpec.param) {
20444
20512
  <mat-form-field appearance="outline">
20445
- <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
20513
+ <mat-label>{{ actionSpec.param.label || 'Parâmetro' }}</mat-label>
20446
20514
  <input
20447
20515
  matInput
20448
20516
  [ngModel]="getActionParam(action.action)"
@@ -20455,7 +20523,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20455
20523
  matSuffix
20456
20524
  type="button"
20457
20525
  class="help-icon-button"
20458
- [matTooltip]="actionSpec.param.hint || actionSpec.description"
20526
+ [matTooltip]="getGlobalActionSpecHint(actionSpec)"
20459
20527
  >
20460
20528
  <mat-icon>help_outline</mat-icon>
20461
20529
  </button>
@@ -20469,13 +20537,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20469
20537
  }
20470
20538
 
20471
20539
  <mat-form-field appearance="outline">
20472
- <mat-label>Cor do botão</mat-label>
20540
+ <mat-label>Cor do botão</mat-label>
20473
20541
  <mat-select
20474
20542
  [(ngModel)]="action.color"
20475
20543
  (ngModelChange)="updateBulkActions()"
20476
20544
  [ngModelOptions]="{ standalone: true }"
20477
20545
  >
20478
- <mat-option value="">Padrão</mat-option>
20546
+ <mat-option value="">Padrão</mat-option>
20479
20547
  <mat-option value="primary">Primary</mat-option>
20480
20548
  <mat-option value="accent">Accent</mat-option>
20481
20549
  <mat-option value="warn">Warn</mat-option>
@@ -20483,7 +20551,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20483
20551
  </mat-form-field>
20484
20552
 
20485
20553
  <mat-form-field appearance="outline">
20486
- <mat-label>Mínimo de seleções</mat-label>
20554
+ <mat-label>Mínimo de seleções</mat-label>
20487
20555
  <input
20488
20556
  matInput
20489
20557
  type="number"
@@ -20495,7 +20563,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20495
20563
  </mat-form-field>
20496
20564
 
20497
20565
  <mat-form-field appearance="outline">
20498
- <mat-label>Máximo de seleções</mat-label>
20566
+ <mat-label>Máximo de seleções</mat-label>
20499
20567
  <input
20500
20568
  matInput
20501
20569
  type="number"
@@ -20512,7 +20580,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20512
20580
  [ngModelOptions]="{ standalone: true }"
20513
20581
  class="toggle-field"
20514
20582
  >
20515
- Requer confirmação
20583
+ Requer confirmação
20516
20584
  </mat-slide-toggle>
20517
20585
 
20518
20586
  <mat-slide-toggle
@@ -20532,15 +20600,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20532
20600
  </div>
20533
20601
  </mat-expansion-panel>
20534
20602
 
20535
- <!-- Exportação -->
20603
+ <!-- Exportação -->
20536
20604
  <mat-expansion-panel *ngIf="isV2">
20537
20605
  <mat-expansion-panel-header>
20538
20606
  <mat-panel-title>
20539
20607
  <mat-icon class="section-icon">download</mat-icon>
20540
- Exportação
20608
+ Exportação
20541
20609
  </mat-panel-title>
20542
20610
  <mat-panel-description>
20543
- Configurações de exportação de dados (V2 only)
20611
+ Configurações de exportação de dados (V2 only)
20544
20612
  </mat-panel-description>
20545
20613
  </mat-expansion-panel-header>
20546
20614
 
@@ -20549,14 +20617,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20549
20617
  formControlName="exportEnabled"
20550
20618
  class="toggle-field"
20551
20619
  >
20552
- Habilitar exportação
20620
+ Habilitar exportação
20553
20621
  </mat-slide-toggle>
20554
20622
 
20555
20623
  @if (toolbarForm.get('exportEnabled')?.value) { <div
20556
20624
  class="config-fields"
20557
20625
  >
20558
20626
  <mat-form-field appearance="outline">
20559
- <mat-label>Formatos disponíveis</mat-label>
20627
+ <mat-label>Formatos disponíveis</mat-label>
20560
20628
  <mat-select formControlName="exportFormats" multiple>
20561
20629
  <mat-option value="excel">Excel (.xlsx)</mat-option>
20562
20630
  <mat-option value="csv">CSV</mat-option>
@@ -20568,14 +20636,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20568
20636
  matSuffix
20569
20637
  type="button"
20570
20638
  class="help-icon-button"
20571
- matTooltip="Segure Ctrl para selecionar múltiplos formatos."
20639
+ matTooltip="Segure Ctrl para selecionar múltiplos formatos."
20572
20640
  >
20573
20641
  <mat-icon>help_outline</mat-icon>
20574
20642
  </button>
20575
20643
  </mat-form-field>
20576
20644
 
20577
20645
  <mat-form-field appearance="outline">
20578
- <mat-label>Nome padrão do arquivo</mat-label>
20646
+ <mat-label>Nome padrão do arquivo</mat-label>
20579
20647
  <input
20580
20648
  matInput
20581
20649
  formControlName="exportFileName"
@@ -20587,7 +20655,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20587
20655
  formControlName="exportIncludeHeaders"
20588
20656
  class="toggle-field"
20589
20657
  >
20590
- Incluir cabeçalhos
20658
+ Incluir cabeçalhos
20591
20659
  </mat-slide-toggle>
20592
20660
 
20593
20661
  <mat-slide-toggle
@@ -20605,7 +20673,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
20605
20673
  </mat-slide-toggle>
20606
20674
 
20607
20675
  <mat-form-field appearance="outline">
20608
- <mat-label>Máximo de linhas</mat-label>
20676
+ <mat-label>Máximo de linhas</mat-label>
20609
20677
  <input
20610
20678
  matInput
20611
20679
  type="number"
@@ -34518,6 +34586,26 @@ function normalizeCorporateLoggerEnvironment(candidate) {
34518
34586
  }
34519
34587
  return 'prod';
34520
34588
  }
34589
+ function resolvePraxisFilterCriteriaBridge(filterCriteria, queryContext) {
34590
+ const normalizeRecord = (record) => {
34591
+ if (!record || typeof record !== 'object')
34592
+ return {};
34593
+ return Object.entries(record).reduce((acc, [key, value]) => {
34594
+ if (value === null || value === undefined)
34595
+ return acc;
34596
+ if (Array.isArray(value) && value.length === 0)
34597
+ return acc;
34598
+ if (typeof value === 'string' && value.trim() === '')
34599
+ return acc;
34600
+ acc[key] = value;
34601
+ return acc;
34602
+ }, {});
34603
+ };
34604
+ return {
34605
+ ...normalizeRecord(filterCriteria),
34606
+ ...normalizeRecord(queryContext?.filters),
34607
+ };
34608
+ }
34521
34609
  function createPraxisTableFallbackLogger(environment) {
34522
34610
  return new LoggerService(createCorporateLoggerConfig(normalizeCorporateLoggerEnvironment(environment)), [new ConsoleLoggerSink()]);
34523
34611
  }
@@ -34573,6 +34661,7 @@ class PraxisTable {
34573
34661
  crudContext;
34574
34662
  dslFunctionRegistry = null;
34575
34663
  filterCriteria = {};
34664
+ queryContext = null;
34576
34665
  rowClick = new EventEmitter();
34577
34666
  rowDoubleClick = new EventEmitter();
34578
34667
  rowExpansionChange = new EventEmitter();
@@ -35100,7 +35189,6 @@ class PraxisTable {
35100
35189
  });
35101
35190
  resizeObserver;
35102
35191
  removeViewportChangeListeners = null;
35103
- warnedMissingId = false;
35104
35192
  warnedUnsupportedFeatures = new Set();
35105
35193
  warnedStrictCspStyleMode = false;
35106
35194
  fallbackLogger;
@@ -35288,7 +35376,7 @@ class PraxisTable {
35288
35376
  : 10;
35289
35377
  const result = computeLocalViewPipeline({
35290
35378
  source,
35291
- criteria: this.filterCriteria || {},
35379
+ criteria: this.getEffectiveFilterCriteria(),
35292
35380
  sort: {
35293
35381
  active: this.sortState?.active || '',
35294
35382
  direction: this.sortState?.direction || '',
@@ -35414,7 +35502,6 @@ class PraxisTable {
35414
35502
  const legacyId = typeof this.tableId === 'string' ? this.tableId.trim() : '';
35415
35503
  if (legacyId)
35416
35504
  return legacyId;
35417
- this.warnMissingId();
35418
35505
  return null;
35419
35506
  }
35420
35507
  storageKey(prefix) {
@@ -35430,12 +35517,6 @@ class PraxisTable {
35430
35517
  }
35431
35518
  return null;
35432
35519
  }
35433
- warnMissingId() {
35434
- if (this.warnedMissingId)
35435
- return;
35436
- this.warnedMissingId = true;
35437
- this.warnOnceLog('[PraxisTable] tableId is required for config persistence.', { tableId: this.tableId, componentInstanceId: this.componentInstanceId }, { dedupeKey: 'praxis-table:missing-table-id' });
35438
- }
35439
35520
  ensureConfigDefaults() {
35440
35521
  if (!this.config) {
35441
35522
  this.config = createDefaultTableConfig();
@@ -35648,7 +35729,7 @@ class PraxisTable {
35648
35729
  try {
35649
35730
  const storedConfig = await firstValueFrom(this.asyncConfigStorage.loadConfig(cfgKey));
35650
35731
  if (storedConfig) {
35651
- this.config = storedConfig;
35732
+ this.config = fillUndefined(storedConfig, this.config);
35652
35733
  }
35653
35734
  }
35654
35735
  catch (e) {
@@ -35762,10 +35843,10 @@ class PraxisTable {
35762
35843
  this.debugLog('[PraxisTable] Toolbar visibility on config change', this.showToolbar);
35763
35844
  }
35764
35845
  }
35765
- if (changes['filterCriteria'] && this.isRemoteMode()) {
35846
+ if ((changes['filterCriteria'] || changes['queryContext']) && this.isRemoteMode()) {
35766
35847
  this.fetchData();
35767
35848
  }
35768
- if (changes['data'] || changes['resourcePath'] || changes['config']) {
35849
+ if (changes['data'] || changes['resourcePath'] || changes['config'] || changes['queryContext']) {
35769
35850
  this.clearCellAnimationChangeState();
35770
35851
  if (changes['data'] && this.isLocalDataModeActive()) {
35771
35852
  this.applyExpansionCollapsePolicy('dataRefresh');
@@ -39623,8 +39704,9 @@ class PraxisTable {
39623
39704
  pageable.sort = sortList;
39624
39705
  }
39625
39706
  }
39707
+ const effectiveFilterCriteria = this.getEffectiveFilterCriteria();
39626
39708
  this.crudService
39627
- .filter(this.filterCriteria || {}, pageable, { httpContext })
39709
+ .filter(effectiveFilterCriteria, pageable, { httpContext })
39628
39710
  .pipe(take$1(1))
39629
39711
  .subscribe({
39630
39712
  next: (page) => {
@@ -39659,6 +39741,9 @@ class PraxisTable {
39659
39741
  },
39660
39742
  });
39661
39743
  }
39744
+ getEffectiveFilterCriteria() {
39745
+ return resolvePraxisFilterCriteriaBridge(this.filterCriteria, this.queryContext);
39746
+ }
39662
39747
  // Public wrappers for template actions (AOT-safe)
39663
39748
  retryData() {
39664
39749
  if (this.isRemoteMode())
@@ -39701,7 +39786,9 @@ class PraxisTable {
39701
39786
  }
39702
39787
  // Step 3: Apply data formatting if defined
39703
39788
  const effectiveType = hasComputedExpression ? computed?.outputType || column.type : column.type;
39704
- const effectiveFormat = hasComputedExpression ? computed?.format || column.format : column.format;
39789
+ const effectiveFormat = hasComputedExpression
39790
+ ? computed?.format || column.format
39791
+ : column.format || this.resolveImplicitFormat(column);
39705
39792
  if (effectiveType &&
39706
39793
  effectiveFormat &&
39707
39794
  this.formattingService.needsFormatting(effectiveType, effectiveFormat)) {
@@ -39716,6 +39803,15 @@ class PraxisTable {
39716
39803
  }
39717
39804
  return value;
39718
39805
  }
39806
+ resolveImplicitFormat(column) {
39807
+ if (!column?.type || !supportsImplicitValuePresentation(column.type)) {
39808
+ return undefined;
39809
+ }
39810
+ return resolveValuePresentation({ type: column.type }, {
39811
+ localization: this.config?.localization,
39812
+ appLocale: this.formattingService.getHostLocale(),
39813
+ }).format;
39814
+ }
39719
39815
  // =============================
39720
39816
  // Conditional Styles (per cell)
39721
39817
  // =============================
@@ -40733,7 +40829,7 @@ class PraxisTable {
40733
40829
  selectedRows,
40734
40830
  selectedCount: selectedRows.length,
40735
40831
  hasSelection: selectedRows.length > 0,
40736
- filterCriteria: this.filterCriteria || {},
40832
+ filterCriteria: this.getEffectiveFilterCriteria(),
40737
40833
  sort: this.sortState || { active: '', direction: '' },
40738
40834
  page: {
40739
40835
  index: this.pageIndex,
@@ -42598,7 +42694,7 @@ class PraxisTable {
42598
42694
  disposePraxisTableDslRuntimeRegistry(this.dslRuntimeContextKey);
42599
42695
  }
42600
42696
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisTable, deps: [{ token: i0.ChangeDetectorRef }, { token: i3$1.SettingsPanelService }, { token: i1.GenericCrudService }, { token: TableDefaultsProvider }, { token: FilterConfigService }, { token: DataFormattingService }, { token: i6$3.PraxisDialog }, { token: i2$2.MatSnackBar }, { token: ASYNC_CONFIG_STORAGE }, { token: CONNECTION_STORAGE }, { token: i0.ElementRef }, { token: i1.GlobalConfigService }, { token: i1.ComponentKeyService }, { token: i1.LoadingOrchestrator }, { token: PRAXIS_LOADING_RENDERER, optional: true }, { token: i6$2.ActivatedRoute, optional: true }, { token: i1.LoggerService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
42601
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: PraxisTable, isStandalone: true, selector: "praxis-table", inputs: { config: "config", resourcePath: "resourcePath", data: "data", tableId: "tableId", componentInstanceId: "componentInstanceId", title: "title", subtitle: "subtitle", icon: "icon", autoDelete: "autoDelete", notifyIfOutdated: "notifyIfOutdated", snoozeMs: "snoozeMs", autoOpenSettingsOnOutdated: "autoOpenSettingsOnOutdated", crudContext: "crudContext", dslFunctionRegistry: "dslFunctionRegistry", filterCriteria: "filterCriteria", enableCustomization: ["enableCustomization", "enableCustomization", booleanAttribute], dense: "dense" }, outputs: { rowClick: "rowClick", rowDoubleClick: "rowDoubleClick", rowExpansionChange: "rowExpansionChange", rowAction: "rowAction", toolbarAction: "toolbarAction", bulkAction: "bulkAction", columnReorder: "columnReorder", columnReorderAttempt: "columnReorderAttempt", beforeDelete: "beforeDelete", afterDelete: "afterDelete", deleteError: "deleteError", beforeBulkDelete: "beforeBulkDelete", afterBulkDelete: "afterBulkDelete", bulkDeleteError: "bulkDeleteError", schemaStatusChange: "schemaStatusChange", metadataChange: "metadataChange", loadingStateChange: "loadingStateChange" }, host: { properties: { "class.density-compact": "this.hostDensityCompactClass", "class.density-comfortable": "this.hostDensityComfortableClass", "class.density-spacious": "this.hostDensitySpaciousClass", "class.row-borders": "this.hostRowBordersClass", "class.col-borders": "this.hostColumnBordersClass" } }, providers: [
42697
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: PraxisTable, isStandalone: true, selector: "praxis-table", inputs: { config: "config", resourcePath: "resourcePath", data: "data", tableId: "tableId", componentInstanceId: "componentInstanceId", title: "title", subtitle: "subtitle", icon: "icon", autoDelete: "autoDelete", notifyIfOutdated: "notifyIfOutdated", snoozeMs: "snoozeMs", autoOpenSettingsOnOutdated: "autoOpenSettingsOnOutdated", crudContext: "crudContext", dslFunctionRegistry: "dslFunctionRegistry", filterCriteria: "filterCriteria", queryContext: "queryContext", enableCustomization: ["enableCustomization", "enableCustomization", booleanAttribute], dense: "dense" }, outputs: { rowClick: "rowClick", rowDoubleClick: "rowDoubleClick", rowExpansionChange: "rowExpansionChange", rowAction: "rowAction", toolbarAction: "toolbarAction", bulkAction: "bulkAction", columnReorder: "columnReorder", columnReorderAttempt: "columnReorderAttempt", beforeDelete: "beforeDelete", afterDelete: "afterDelete", deleteError: "deleteError", beforeBulkDelete: "beforeBulkDelete", afterBulkDelete: "afterBulkDelete", bulkDeleteError: "bulkDeleteError", schemaStatusChange: "schemaStatusChange", metadataChange: "metadataChange", loadingStateChange: "loadingStateChange" }, host: { properties: { "class.density-compact": "this.hostDensityCompactClass", "class.density-comfortable": "this.hostDensityComfortableClass", "class.density-spacious": "this.hostDensitySpaciousClass", "class.row-borders": "this.hostRowBordersClass", "class.col-borders": "this.hostColumnBordersClass" } }, providers: [
42602
42698
  GenericCrudService,
42603
42699
  TableDefaultsProvider,
42604
42700
  FilterConfigService,
@@ -42681,6 +42777,8 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "20.3.17", n
42681
42777
  type: Input
42682
42778
  }], filterCriteria: [{
42683
42779
  type: Input
42780
+ }], queryContext: [{
42781
+ type: Input
42684
42782
  }], rowClick: [{
42685
42783
  type: Output
42686
42784
  }], rowDoubleClick: [{
@@ -42861,11 +42959,18 @@ const PRAXIS_TABLE_COMPONENT_METADATA = {
42861
42959
  description: 'Dataset local para modo client-side quando não há resourcePath',
42862
42960
  default: null,
42863
42961
  },
42962
+ {
42963
+ name: 'queryContext',
42964
+ type: 'PraxisDataQueryContext | null',
42965
+ label: 'Contexto de consulta',
42966
+ description: 'Contrato semantico primario de consulta para orquestracao declarativa por pagina dinamica. A tabela compoe queryContext.filters sobre o pipeline de filtro efetivo existente e respeita sort, limit e page quando aplicavel.',
42967
+ default: null,
42968
+ },
42864
42969
  {
42865
42970
  name: 'filterCriteria',
42866
42971
  type: 'Record<string, any>',
42867
42972
  label: 'Criterios de filtro',
42868
- description: 'Criterios declarativos aplicados a consulta efetiva da tabela, reutilizando o mesmo pipeline de filtro ja usado pelo runtime interno.',
42973
+ description: 'Bridge legada de compatibilidade para filtros declarativos. Para novo authoring, prefira queryContext.',
42869
42974
  default: {},
42870
42975
  },
42871
42976
  {
@@ -43880,11 +43985,17 @@ const TABLE_COMPONENT_AI_CAPABILITIES = {
43880
43985
  valueKind: 'string',
43881
43986
  description: 'Endpoint base para operacoes de dados.',
43882
43987
  },
43988
+ {
43989
+ path: 'inputs.queryContext',
43990
+ category: 'data',
43991
+ valueKind: 'object',
43992
+ description: 'Contrato semantico primario para consulta declarativa; nesta fase a tabela consome filters, sort, limit e page com foco principal em queryContext.filters.',
43993
+ },
43883
43994
  {
43884
43995
  path: 'inputs.filterCriteria',
43885
43996
  category: 'data',
43886
43997
  valueKind: 'object',
43887
- description: 'Filtros aplicados as consultas.',
43998
+ description: 'Bridge legada de compatibilidade. Para novo authoring, prefira inputs.queryContext.',
43888
43999
  },
43889
44000
  {
43890
44001
  path: 'inputs.showToolbar',