@praxisui/table 9.0.0-beta.80 → 9.0.0-beta.82

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-19T22:17:32.055Z",
3
+ "generatedAt": "2026-07-20T13:31:18.568Z",
4
4
  "packageName": "@praxisui/table",
5
- "packageVersion": "9.0.0-beta.80",
5
+ "packageVersion": "9.0.0-beta.82",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 3,
@@ -18844,6 +18844,36 @@
18844
18844
  ],
18845
18845
  "default": "button"
18846
18846
  },
18847
+ "target": {
18848
+ "type": "object",
18849
+ "required": [
18850
+ "scope"
18851
+ ],
18852
+ "properties": {
18853
+ "scope": {
18854
+ "enum": [
18855
+ "collection",
18856
+ "selection"
18857
+ ]
18858
+ },
18859
+ "cardinality": {
18860
+ "type": "object",
18861
+ "required": [
18862
+ "min"
18863
+ ],
18864
+ "properties": {
18865
+ "min": {
18866
+ "type": "number",
18867
+ "minimum": 0
18868
+ },
18869
+ "max": {
18870
+ "type": "number",
18871
+ "minimum": 0
18872
+ }
18873
+ }
18874
+ }
18875
+ }
18876
+ },
18847
18877
  "visibleWhen": {
18848
18878
  "type": "object",
18849
18879
  "description": "AST Json Logic"
@@ -18905,6 +18935,7 @@
18905
18935
  ],
18906
18936
  "affectedPaths": [
18907
18937
  "toolbar.actions[]",
18938
+ "toolbar.actions[].target",
18908
18939
  "toolbar.actions[].visibleWhen",
18909
18940
  "toolbar.actions[].effects"
18910
18941
  ],
@@ -22922,9 +22953,9 @@
22922
22953
  {
22923
22954
  "chunkIndex": 20,
22924
22955
  "chunkKind": "authoring_manifest",
22925
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"2.0.0\",\"componentId\":\"praxis-table\",\"ownerPackage\":\"@praxisui/table\",\"configSchemaId\":\"TableConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"toolbar.action.add\",\"title\":\"Adicionar ação na toolbar\",\"scope\":\"global\",\"targetKind\":\"toolbarAction\",\"target\":{\"kind\":\"toolbarAction\",\"resolver\":\"action-in-toolbar-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"label\",\"action\"],\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"action\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"type\":{\"enum\":[\"button\",\"icon\",\"menu\"],\"default\":\"button\"},\"visibleWhen\":{\"type\":\"object\",\"description\":\"AST Json Logic\"},\"globalAction\":{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\",\"enum\":[\"toast.success\",\"toast.error\",\"dialog.alert\",\"dialog.open\",\"navigation.openExternal\",\"navigation.openRoute\",\"api.post\",\"api.patch\"]},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"}}},\"effects\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"kind\",\"globalAction\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]}}}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"toolbar.actions[]\",\"key\":\"id\"}],\"validators\":[\"toolbar-action-id-unique\"],\"affectedPaths\":[\"toolbar.actions[]\",\"toolbar.actions[].visibleWhen\",\"toolbar.actions[].effects\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"rowAction.add\",\"title\":\"Adicionar ação de linha\",\"scope\":\"global\",\"targetKind\":\"rowAction\",\"target\":{\"kind\":\"rowAction\",\"resolver\":\"action-in-row-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"label\",\"action\"],\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"action\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"color\":{\"type\":\"string\"},\"visibleWhen\":{\"type\":\"object\",\"description\":\"AST Json Logic\"},\"disabledWhen\":{\"type\":\"object\",\"description\":\"AST Json Logic\"},\"recordSurface\":{\"type\":\"object\",\"description\":\"ResourceSurfaceCatalogItem canonico preservado para abrir uma superficie relacionada ao registro da linha clicada.\"},\"effects\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"actions.row.actions[]\",\"key\":\"id\"}],\"validators\":[\"row-action-id-unique\"],\"affectedPaths\":[\"actions.row.actions[]\",\"actions.row.actions[].visibleWhen\",\"actions.row.actions[].disabledWhen\",\"actions.row.actions[].effects\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"bulkAction.add\",\"title\":\"Adicionar ação em lote\",\"scope\":\"global\",\"targetKind\":\"bulkAction\",\"target\":{\"kind\":\"bulkAction\",\"resolver\":\"action-in-bulk-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"label\",\"action\"],\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"action\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"color\":{\"type\":\"string\"},\"effects\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"actions.bulk.actions[]\",\"key\":\"id\"}],\"validators\":[\"bulk-action-id-unique\"],\"affectedPaths\":[\"actions.bulk.actions[]\",\"actions.bulk.actions[].effects\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"export.enabled.set\",\"title\":\"Habilitar exportação\",\"scope\":\"global\",\"targetKind\":\"export\",\"target\":{\"kind\":\"export\",\"resolver\":\"export-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"formats\":{\"type\":\"array\",\"items\":{\"enum\":[\"excel\",\"pdf\",\"csv\",\"json\"]}}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"export\"}],\"affectedPaths\":[\"export.enabled\",\"export.formats\"],\"validators\":[\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"filter.advanced.configure\",\"title\":\"Configurar filtros avançados\",\"scope\":\"global\",\"targetKind\":\"filter\",\"target\":{\"kind\":\"filter\",\"resolver\":\"filter-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"queryBuilder\":{\"type\":\"boolean\"},\"savePresets\":{\"type\":\"boolean\"},\"settings\":{\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"filter\"]},\"showAdvanced\":{\"type\":\"boolean\"},\"allowSaveTags\":{\"type\":\"boolean\"},\"alwaysVisibleFields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"selectedFieldIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"alwaysVisibleFieldMetadataOverrides\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"object\"}},\"changeDebounceMs\":{\"type\":\"number\",\"minimum\":0},\"useInlineSearchableSelectVariant\":{\"type\":\"boolean\"},\"useInlineRangeVariant\":{\"type\":\"boolean\"},\"useInlineDateVariant\":{\"type\":\"boolean\"},\"useInlineDateRangeVariant\":{\"type\":\"boolean\"}}}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"behavior.filtering.enabled\",\"value\":true},{\"kind\":\"merge-object\",\"path\":\"behavior.filtering.advancedFilters\"}],\"affectedPaths\":[\"behavior.filtering.enabled\",\"behavior.filtering.advancedFilters.enabled\",\"behavior.filtering.advancedFilters.settings\"],\"validators\":[\"filter-fields-exist\",\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"filter.advanced.fields.add\",\"title\":\"Adicionar campos aos filtros avançados\",\"scope\":\"global\",\"targetKind\":\"filter\",\"target\":{\"kind\":\"filter\",\"resolver\":\"filter-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fields\"],\"properties\":{\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"selected\":{\"type\":\"boolean\"},\"alwaysVisible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"behavior.filtering.enabled\",\"value\":true},{\"kind\":\"merge-object\",\"path\":\"behavior.filtering.advancedFilters\"}],\"affectedPaths\":[\"behavior.filtering.enabled\",\"behavior.filtering.advancedFilters.enabled\",\"behavior.filtering.advancedFilters.settings\"],\"validators\":[\"filter-fields-exist\",\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"filter.advanced.fields.remove\",\"title\":\"Remover campos dos filtros avançados\",\"scope\":\"global\",\"targetKind\":\"filter\",\"target\":{\"kind\":\"filter\",\"resolver\":\"filter-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fields\"],\"properties\":{\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"selected\":{\"type\":\"boolean\"},\"alwaysVisible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"behavior.filtering.enabled\",\"value\":true},{\"kind\":\"merge-object\",\"path\":\"behavior.filtering.advancedFilters\"}],\"affectedPaths\":[\"behavior.filtering.enabled\",\"behavior.filtering.advancedFilters.enabled\",\"behavior.filtering.advancedFilters.settings\"],\"validators\":[\"filter-fields-exist\",\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"grouping.set\",\"title\":\"Definir agrupamento\",\"scope\":\"global\",\"targetKind\":\"grouping\",\"target\":{\"kind\":\"grouping\",\"resolver\":\"grouping-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"expanded\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"behavior.grouping\"}],\"validators\":[\"grouping-fields-exist\"],\"affectedPaths\":[\"behavior.grouping\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]}]}",
22956
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"2.0.0\",\"componentId\":\"praxis-table\",\"ownerPackage\":\"@praxisui/table\",\"configSchemaId\":\"TableConfig\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"toolbar.action.add\",\"title\":\"Adicionar ação na toolbar\",\"scope\":\"global\",\"targetKind\":\"toolbarAction\",\"target\":{\"kind\":\"toolbarAction\",\"resolver\":\"action-in-toolbar-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"label\",\"action\"],\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"action\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"type\":{\"enum\":[\"button\",\"icon\",\"menu\"],\"default\":\"button\"},\"target\":{\"type\":\"object\",\"required\":[\"scope\"],\"properties\":{\"scope\":{\"enum\":[\"collection\",\"selection\"]},\"cardinality\":{\"type\":\"object\",\"required\":[\"min\"],\"properties\":{\"min\":{\"type\":\"number\",\"minimum\":0},\"max\":{\"type\":\"number\",\"minimum\":0}}}}},\"visibleWhen\":{\"type\":\"object\",\"description\":\"AST Json Logic\"},\"globalAction\":{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"actionId\":{\"type\":\"string\",\"enum\":[\"toast.success\",\"toast.error\",\"dialog.alert\",\"dialog.open\",\"navigation.openExternal\",\"navigation.openRoute\",\"api.post\",\"api.patch\"]},\"payload\":{\"type\":\"object\"},\"payloadExpr\":{\"type\":\"string\"}}},\"effects\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"kind\",\"globalAction\"],\"additionalProperties\":false,\"properties\":{\"kind\":{\"enum\":[\"global-action\"]}}}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"toolbar.actions[]\",\"key\":\"id\"}],\"validators\":[\"toolbar-action-id-unique\"],\"affectedPaths\":[\"toolbar.actions[]\",\"toolbar.actions[].target\",\"toolbar.actions[].visibleWhen\",\"toolbar.actions[].effects\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"rowAction.add\",\"title\":\"Adicionar ação de linha\",\"scope\":\"global\",\"targetKind\":\"rowAction\",\"target\":{\"kind\":\"rowAction\",\"resolver\":\"action-in-row-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"label\",\"action\"],\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"action\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"color\":{\"type\":\"string\"},\"visibleWhen\":{\"type\":\"object\",\"description\":\"AST Json Logic\"},\"disabledWhen\":{\"type\":\"object\",\"description\":\"AST Json Logic\"},\"recordSurface\":{\"type\":\"object\",\"description\":\"ResourceSurfaceCatalogItem canonico preservado para abrir uma superficie relacionada ao registro da linha clicada.\"},\"effects\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"actions.row.actions[]\",\"key\":\"id\"}],\"validators\":[\"row-action-id-unique\"],\"affectedPaths\":[\"actions.row.actions[]\",\"actions.row.actions[].visibleWhen\",\"actions.row.actions[].disabledWhen\",\"actions.row.actions[].effects\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"bulkAction.add\",\"title\":\"Adicionar ação em lote\",\"scope\":\"global\",\"targetKind\":\"bulkAction\",\"target\":{\"kind\":\"bulkAction\",\"resolver\":\"action-in-bulk-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"label\",\"action\"],\"properties\":{\"id\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"action\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"color\":{\"type\":\"string\"},\"effects\":{\"type\":\"array\"}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"actions.bulk.actions[]\",\"key\":\"id\"}],\"validators\":[\"bulk-action-id-unique\"],\"affectedPaths\":[\"actions.bulk.actions[]\",\"actions.bulk.actions[].effects\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"export.enabled.set\",\"title\":\"Habilitar exportação\",\"scope\":\"global\",\"targetKind\":\"export\",\"target\":{\"kind\":\"export\",\"resolver\":\"export-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"formats\":{\"type\":\"array\",\"items\":{\"enum\":[\"excel\",\"pdf\",\"csv\",\"json\"]}}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"export\"}],\"affectedPaths\":[\"export.enabled\",\"export.formats\"],\"validators\":[\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"filter.advanced.configure\",\"title\":\"Configurar filtros avançados\",\"scope\":\"global\",\"targetKind\":\"filter\",\"target\":{\"kind\":\"filter\",\"resolver\":\"filter-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"queryBuilder\":{\"type\":\"boolean\"},\"savePresets\":{\"type\":\"boolean\"},\"settings\":{\"type\":\"object\",\"properties\":{\"mode\":{\"enum\":[\"filter\"]},\"showAdvanced\":{\"type\":\"boolean\"},\"allowSaveTags\":{\"type\":\"boolean\"},\"alwaysVisibleFields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"selectedFieldIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"alwaysVisibleFieldMetadataOverrides\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"object\"}},\"changeDebounceMs\":{\"type\":\"number\",\"minimum\":0},\"useInlineSearchableSelectVariant\":{\"type\":\"boolean\"},\"useInlineRangeVariant\":{\"type\":\"boolean\"},\"useInlineDateVariant\":{\"type\":\"boolean\"},\"useInlineDateRangeVariant\":{\"type\":\"boolean\"}}}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"behavior.filtering.enabled\",\"value\":true},{\"kind\":\"merge-object\",\"path\":\"behavior.filtering.advancedFilters\"}],\"affectedPaths\":[\"behavior.filtering.enabled\",\"behavior.filtering.advancedFilters.enabled\",\"behavior.filtering.advancedFilters.settings\"],\"validators\":[\"filter-fields-exist\",\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"filter.advanced.fields.add\",\"title\":\"Adicionar campos aos filtros avançados\",\"scope\":\"global\",\"targetKind\":\"filter\",\"target\":{\"kind\":\"filter\",\"resolver\":\"filter-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fields\"],\"properties\":{\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"selected\":{\"type\":\"boolean\"},\"alwaysVisible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"behavior.filtering.enabled\",\"value\":true},{\"kind\":\"merge-object\",\"path\":\"behavior.filtering.advancedFilters\"}],\"affectedPaths\":[\"behavior.filtering.enabled\",\"behavior.filtering.advancedFilters.enabled\",\"behavior.filtering.advancedFilters.settings\"],\"validators\":[\"filter-fields-exist\",\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"filter.advanced.fields.remove\",\"title\":\"Remover campos dos filtros avançados\",\"scope\":\"global\",\"targetKind\":\"filter\",\"target\":{\"kind\":\"filter\",\"resolver\":\"filter-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"fields\"],\"properties\":{\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"minItems\":1},\"selected\":{\"type\":\"boolean\"},\"alwaysVisible\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"behavior.filtering.enabled\",\"value\":true},{\"kind\":\"merge-object\",\"path\":\"behavior.filtering.advancedFilters\"}],\"affectedPaths\":[\"behavior.filtering.enabled\",\"behavior.filtering.advancedFilters.enabled\",\"behavior.filtering.advancedFilters.settings\"],\"validators\":[\"filter-fields-exist\",\"editor-round-trip-preserve\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"grouping.set\",\"title\":\"Definir agrupamento\",\"scope\":\"global\",\"targetKind\":\"grouping\",\"target\":{\"kind\":\"grouping\",\"resolver\":\"grouping-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"fields\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"expanded\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"behavior.grouping\"}],\"validators\":[\"grouping-fields-exist\"],\"affectedPaths\":[\"behavior.grouping\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]}]}",
22926
22957
  "sourcePointer": "projects/praxis-table/src/lib/ai/praxis-table-authoring-manifest.ts",
22927
- "contentHash": "4a1161f36644211ab325d3ecc406d9fbc7fba0b0e860541feb18057d9313591d",
22958
+ "contentHash": "87c30aaf1c46f56101a2e5610a90eba884bb4e218c3d5be55dc46741bc8107b2",
22928
22959
  "sourceKind": "component_definition",
22929
22960
  "sourceId": "praxis-table",
22930
22961
  "corpusVersion": "1.0.0"
@@ -133,6 +133,7 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
133
133
  'table.chrome.actions.disabled.noSelection': 'Selecione ao menos um registro para executar esta ação.',
134
134
  'table.chrome.actions.disabled.minSelection': 'Selecione ao menos {min} registros para executar esta ação.',
135
135
  'table.chrome.actions.disabled.maxSelection': 'A seleção atual excede o limite permitido para esta ação.',
136
+ 'table.chrome.actions.disabled.singleSelection': 'Selecione somente um registro para executar esta ação.',
136
137
  'table.chrome.actions.disabled.generic': 'Ação indisponível no contexto atual.',
137
138
  'table.analytics.comparison.current': 'Atual',
138
139
  'table.analytics.comparison.previous': 'Anterior',
@@ -280,6 +281,7 @@ const PRAXIS_TABLE_RUNTIME_I18N_CONFIG = {
280
281
  'table.chrome.actions.disabled.noSelection': 'Select at least one record to run this action.',
281
282
  'table.chrome.actions.disabled.minSelection': 'Select at least {min} records to run this action.',
282
283
  'table.chrome.actions.disabled.maxSelection': 'The current selection exceeds the allowed limit for this action.',
284
+ 'table.chrome.actions.disabled.singleSelection': 'Select exactly one record to run this action.',
283
285
  'table.chrome.actions.disabled.generic': 'Action unavailable in the current context.',
284
286
  'table.analytics.comparison.current': 'Current',
285
287
  'table.analytics.comparison.previous': 'Previous',
@@ -1029,7 +1031,16 @@ class PraxisTableToolbar {
1029
1031
  return true;
1030
1032
  if (action.disabled === true)
1031
1033
  return true;
1032
- if (this.isBulkToolbarAction(action)) {
1034
+ if (this.isSelectionTargetAction(action)) {
1035
+ const selectedCount = this.getSelectedCount();
1036
+ const minSelections = this.getTargetMinSelections(action);
1037
+ if (selectedCount < minSelections)
1038
+ return true;
1039
+ const maxSelections = this.getTargetMaxSelections(action);
1040
+ if (maxSelections !== null && selectedCount > maxSelections)
1041
+ return true;
1042
+ }
1043
+ else if (this.isBulkToolbarAction(action)) {
1033
1044
  const selectedCount = this.getSelectedCount();
1034
1045
  const minSelections = this.getBulkActionMinSelections(action);
1035
1046
  if (selectedCount < minSelections)
@@ -1252,8 +1263,34 @@ class PraxisTableToolbar {
1252
1263
  return null;
1253
1264
  return Math.max(0, Math.floor(value));
1254
1265
  }
1266
+ isSelectionTargetAction(action) {
1267
+ return action?.target?.scope === 'selection';
1268
+ }
1269
+ getTargetMinSelections(action) {
1270
+ const value = Number(action?.target?.cardinality?.min);
1271
+ return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : 1;
1272
+ }
1273
+ getTargetMaxSelections(action) {
1274
+ const value = Number(action?.target?.cardinality?.max);
1275
+ return Number.isFinite(value) ? Math.max(0, Math.floor(value)) : null;
1276
+ }
1255
1277
  resolveDisabledActionReason(action) {
1256
- if (this.isBulkToolbarAction(action)) {
1278
+ if (this.isSelectionTargetAction(action)) {
1279
+ const selectedCount = this.getSelectedCount();
1280
+ const minSelections = this.getTargetMinSelections(action);
1281
+ if (selectedCount < minSelections) {
1282
+ return minSelections > 1
1283
+ ? this.tx('table.chrome.actions.disabled.minSelection', 'Selecione ao menos {min} registros para executar esta ação.', { min: minSelections })
1284
+ : this.tx('table.chrome.actions.disabled.noSelection', 'Selecione ao menos um registro para executar esta ação.');
1285
+ }
1286
+ const maxSelections = this.getTargetMaxSelections(action);
1287
+ if (maxSelections !== null && selectedCount > maxSelections) {
1288
+ return maxSelections === 1
1289
+ ? this.tx('table.chrome.actions.disabled.singleSelection', 'Selecione somente um registro para executar esta ação.')
1290
+ : this.tx('table.chrome.actions.disabled.maxSelection', 'A seleção atual excede o limite permitido para esta ação.');
1291
+ }
1292
+ }
1293
+ else if (this.isBulkToolbarAction(action)) {
1257
1294
  const selectedCount = this.getSelectedCount();
1258
1295
  const minSelections = this.getBulkActionMinSelections(action);
1259
1296
  if (selectedCount < minSelections) {
@@ -20780,6 +20817,36 @@ class ToolbarActionsEditorComponent {
20780
20817
  action.shortcutScope = this.sanitizeShortcutScope(value, action);
20781
20818
  this.updateToolbarActions();
20782
20819
  }
20820
+ onToolbarActionTargetScopeChange(action, scope) {
20821
+ action.target = scope === 'selection'
20822
+ ? { scope, cardinality: action.target?.cardinality || { min: 1 } }
20823
+ : { scope };
20824
+ this.updateToolbarActions();
20825
+ }
20826
+ onToolbarActionTargetMinChange(action, value) {
20827
+ const min = Number.isFinite(Number(value)) ? Math.max(0, Math.floor(Number(value))) : 1;
20828
+ action.target = {
20829
+ scope: 'selection',
20830
+ cardinality: { min, ...(action.target?.cardinality?.max !== undefined
20831
+ ? { max: action.target.cardinality.max }
20832
+ : {}) },
20833
+ };
20834
+ this.updateToolbarActions();
20835
+ }
20836
+ onToolbarActionTargetMaxChange(action, value) {
20837
+ const rawMax = Number(value);
20838
+ const max = value === null || value === '' || !Number.isFinite(rawMax)
20839
+ ? undefined
20840
+ : Math.max(0, Math.floor(rawMax));
20841
+ action.target = {
20842
+ scope: 'selection',
20843
+ cardinality: {
20844
+ min: action.target?.cardinality?.min ?? 1,
20845
+ ...(max !== undefined ? { max } : {}),
20846
+ },
20847
+ };
20848
+ this.updateToolbarActions();
20849
+ }
20783
20850
  // Toolbar Actions Management
20784
20851
  addToolbarAction() {
20785
20852
  const newAction = {
@@ -21836,6 +21903,50 @@ class ToolbarActionsEditorComponent {
21836
21903
  <mat-icon>help_outline</mat-icon>
21837
21904
  </button>
21838
21905
  </mat-form-field>
21906
+ <mat-form-field appearance="outline">
21907
+ <mat-label>{{ tx('toolbar.action.target.scope', 'Action target') }}</mat-label>
21908
+ <mat-select
21909
+ [ngModel]="action.target?.scope || 'collection'"
21910
+ (ngModelChange)="onToolbarActionTargetScopeChange(action, $event)"
21911
+ [ngModelOptions]="{ standalone: true }"
21912
+ >
21913
+ <mat-option value="collection">{{ tx('toolbar.action.target.collection', 'Collection') }}</mat-option>
21914
+ <mat-option value="selection">{{ tx('toolbar.action.target.selection', 'Selected records') }}</mat-option>
21915
+ </mat-select>
21916
+ <button
21917
+ mat-icon-button
21918
+ matSuffix
21919
+ type="button"
21920
+ class="help-icon-button"
21921
+ [matTooltip]="tx('toolbar.action.target.hint', 'Defines what the action operates on. Its toolbar position does not make it a bulk action.')"
21922
+ >
21923
+ <mat-icon>help_outline</mat-icon>
21924
+ </button>
21925
+ </mat-form-field>
21926
+ @if (action.target?.scope === 'selection') {
21927
+ <mat-form-field appearance="outline">
21928
+ <mat-label>{{ tx('toolbar.action.target.min', 'Minimum selections') }}</mat-label>
21929
+ <input
21930
+ matInput
21931
+ type="number"
21932
+ min="0"
21933
+ [ngModel]="action.target?.cardinality?.min ?? 1"
21934
+ (ngModelChange)="onToolbarActionTargetMinChange(action, $event)"
21935
+ [ngModelOptions]="{ standalone: true }"
21936
+ />
21937
+ </mat-form-field>
21938
+ <mat-form-field appearance="outline">
21939
+ <mat-label>{{ tx('toolbar.action.target.max', 'Maximum selections') }}</mat-label>
21940
+ <input
21941
+ matInput
21942
+ type="number"
21943
+ min="0"
21944
+ [ngModel]="action.target?.cardinality?.max ?? null"
21945
+ (ngModelChange)="onToolbarActionTargetMaxChange(action, $event)"
21946
+ [ngModelOptions]="{ standalone: true }"
21947
+ />
21948
+ </mat-form-field>
21949
+ }
21839
21950
  <mat-form-field appearance="outline">
21840
21951
  <mat-label>{{ tx('toolbar.action.color', 'Button color') }}</mat-label>
21841
21952
  <mat-select
@@ -23498,6 +23609,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
23498
23609
  <mat-icon>help_outline</mat-icon>
23499
23610
  </button>
23500
23611
  </mat-form-field>
23612
+ <mat-form-field appearance="outline">
23613
+ <mat-label>{{ tx('toolbar.action.target.scope', 'Action target') }}</mat-label>
23614
+ <mat-select
23615
+ [ngModel]="action.target?.scope || 'collection'"
23616
+ (ngModelChange)="onToolbarActionTargetScopeChange(action, $event)"
23617
+ [ngModelOptions]="{ standalone: true }"
23618
+ >
23619
+ <mat-option value="collection">{{ tx('toolbar.action.target.collection', 'Collection') }}</mat-option>
23620
+ <mat-option value="selection">{{ tx('toolbar.action.target.selection', 'Selected records') }}</mat-option>
23621
+ </mat-select>
23622
+ <button
23623
+ mat-icon-button
23624
+ matSuffix
23625
+ type="button"
23626
+ class="help-icon-button"
23627
+ [matTooltip]="tx('toolbar.action.target.hint', 'Defines what the action operates on. Its toolbar position does not make it a bulk action.')"
23628
+ >
23629
+ <mat-icon>help_outline</mat-icon>
23630
+ </button>
23631
+ </mat-form-field>
23632
+ @if (action.target?.scope === 'selection') {
23633
+ <mat-form-field appearance="outline">
23634
+ <mat-label>{{ tx('toolbar.action.target.min', 'Minimum selections') }}</mat-label>
23635
+ <input
23636
+ matInput
23637
+ type="number"
23638
+ min="0"
23639
+ [ngModel]="action.target?.cardinality?.min ?? 1"
23640
+ (ngModelChange)="onToolbarActionTargetMinChange(action, $event)"
23641
+ [ngModelOptions]="{ standalone: true }"
23642
+ />
23643
+ </mat-form-field>
23644
+ <mat-form-field appearance="outline">
23645
+ <mat-label>{{ tx('toolbar.action.target.max', 'Maximum selections') }}</mat-label>
23646
+ <input
23647
+ matInput
23648
+ type="number"
23649
+ min="0"
23650
+ [ngModel]="action.target?.cardinality?.max ?? null"
23651
+ (ngModelChange)="onToolbarActionTargetMaxChange(action, $event)"
23652
+ [ngModelOptions]="{ standalone: true }"
23653
+ />
23654
+ </mat-form-field>
23655
+ }
23501
23656
  <mat-form-field appearance="outline">
23502
23657
  <mat-label>{{ tx('toolbar.action.color', 'Button color') }}</mat-label>
23503
23658
  <mat-select
@@ -42168,7 +42323,7 @@ class PraxisTable {
42168
42323
  if (this.aiAdapter || this.aiAdapterLoadStarted)
42169
42324
  return;
42170
42325
  this.aiAdapterLoadStarted = true;
42171
- import('./praxisui-table-table-ai.adapter-Bg9O1G6L.mjs')
42326
+ import('./praxisui-table-table-ai.adapter-B46F-SpL.mjs')
42172
42327
  .then(({ TableAiAdapter }) => {
42173
42328
  if (!this.isAiAssistantEnabled()) {
42174
42329
  this.aiAssistantOpenAfterAdapterLoad = false;
@@ -42914,7 +43069,7 @@ class PraxisTable {
42914
43069
  initializeAiAssistantController() {
42915
43070
  if (!this.aiAdapter || this.aiAssistantController)
42916
43071
  return;
42917
- import('./praxisui-table-table-agentic-authoring-turn-flow-BzVyW6RG.mjs')
43072
+ import('./praxisui-table-table-agentic-authoring-turn-flow-Cl8C90zm.mjs')
42918
43073
  .then(({ TableAgenticAuthoringTurnFlow }) => {
42919
43074
  if (this.aiAssistantController || !this.aiAdapter)
42920
43075
  return;
@@ -47870,14 +48025,34 @@ class PraxisTable {
47870
48025
  }
47871
48026
  const toolbarActionConfig = event.actionConfig ||
47872
48027
  this.config?.toolbar?.actions?.find((a) => this.getActionId(a) === action);
48028
+ const selectedRows = this.selection.selected.slice();
48029
+ if (!this.hasValidToolbarTargetSelection(toolbarActionConfig, selectedRows.length)) {
48030
+ return;
48031
+ }
48032
+ const selectedIds = selectedRows
48033
+ .map((row) => this.getRowId(row))
48034
+ .filter((id) => id !== undefined && id !== null);
48035
+ const selectedRow = selectedRows.length === 1 ? selectedRows[0] : undefined;
47873
48036
  const payload = {
47874
48037
  action,
48038
+ selectedRows: this.cloneForEmit(selectedRows),
48039
+ selectedIds: this.cloneForEmit(selectedIds),
48040
+ selectedCount: selectedRows.length,
48041
+ ...(selectedRow
48042
+ ? {
48043
+ row: this.cloneForEmit(selectedRow),
48044
+ selectedRow: this.cloneForEmit(selectedRow),
48045
+ }
48046
+ : {}),
48047
+ ...(toolbarActionConfig?.target
48048
+ ? { target: this.cloneForEmit(toolbarActionConfig.target) }
48049
+ : {}),
47875
48050
  ...(toolbarActionConfig
47876
48051
  ? { actionConfig: this.cloneForEmit(toolbarActionConfig) }
47877
48052
  : {}),
47878
48053
  };
47879
48054
  this.debugLogWithMeta('[PraxisTable] onToolbarAction: emitting toolbarAction', payload, { actionId: action, throttleKey: `praxis-table:toolbar-action-emit:${action}` });
47880
- if (this.resolveActionGlobalActionRef(toolbarActionConfig)) {
48055
+ if (toolbarActionConfig && this.resolveActionGlobalActionRef(toolbarActionConfig)) {
47881
48056
  await this.executeConfiguredGlobalAction(toolbarActionConfig, {
47882
48057
  sourceId: this.tableId || this.componentInstanceId || 'praxis-table',
47883
48058
  output: 'toolbarAction',
@@ -47895,6 +48070,26 @@ class PraxisTable {
47895
48070
  sourceOutput: 'toolbarAction',
47896
48071
  });
47897
48072
  }
48073
+ hasValidToolbarTargetSelection(action, selectedCount) {
48074
+ if (action?.target?.scope !== 'selection')
48075
+ return true;
48076
+ const min = Number.isFinite(Number(action.target.cardinality?.min))
48077
+ ? Math.max(0, Math.floor(Number(action.target.cardinality?.min)))
48078
+ : 1;
48079
+ const rawMax = Number(action.target.cardinality?.max);
48080
+ const max = Number.isFinite(rawMax) ? Math.max(0, Math.floor(rawMax)) : null;
48081
+ if (selectedCount >= min && (max === null || selectedCount <= max))
48082
+ return true;
48083
+ const message = selectedCount < min
48084
+ ? (min > 1
48085
+ ? translateTableRuntimeText(this.i18n, 'table.chrome.actions.disabled.minSelection', 'Selecione ao menos {min} registros para executar esta ação.', { min })
48086
+ : translateTableRuntimeText(this.i18n, 'table.chrome.actions.disabled.noSelection', 'Selecione ao menos um registro para executar esta ação.'))
48087
+ : (max === 1
48088
+ ? translateTableRuntimeText(this.i18n, 'table.chrome.actions.disabled.singleSelection', 'Selecione somente um registro para executar esta ação.')
48089
+ : translateTableRuntimeText(this.i18n, 'table.chrome.actions.disabled.maxSelection', 'A seleção atual excede o limite permitido para esta ação.'));
48090
+ this.snackBar.open(message, undefined, { duration: 3000 });
48091
+ return false;
48092
+ }
47898
48093
  async tryHandleCollectionCreateToolbarAction(action, actionConfig) {
47899
48094
  if (String(action || '').trim().toLowerCase() !== 'create') {
47900
48095
  return false;
@@ -59154,6 +59349,21 @@ const PRAXIS_TABLE_AUTHORING_MANIFEST = {
59154
59349
  action: { type: 'string' },
59155
59350
  icon: { type: 'string' },
59156
59351
  type: { enum: ['button', 'icon', 'menu'], default: 'button' },
59352
+ target: {
59353
+ type: 'object',
59354
+ required: ['scope'],
59355
+ properties: {
59356
+ scope: { enum: ['collection', 'selection'] },
59357
+ cardinality: {
59358
+ type: 'object',
59359
+ required: ['min'],
59360
+ properties: {
59361
+ min: { type: 'number', minimum: 0 },
59362
+ max: { type: 'number', minimum: 0 },
59363
+ },
59364
+ },
59365
+ },
59366
+ },
59157
59367
  visibleWhen: { type: 'object', description: 'AST Json Logic' },
59158
59368
  globalAction: globalActionRefSchema,
59159
59369
  effects: { type: 'array', items: globalActionEffectSchema },
@@ -59161,7 +59371,7 @@ const PRAXIS_TABLE_AUTHORING_MANIFEST = {
59161
59371
  },
59162
59372
  effects: [{ kind: 'append-unique', path: 'toolbar.actions[]', key: 'id' }],
59163
59373
  validators: ['toolbar-action-id-unique'],
59164
- affectedPaths: ['toolbar.actions[]', 'toolbar.actions[].visibleWhen', 'toolbar.actions[].effects'],
59374
+ affectedPaths: ['toolbar.actions[]', 'toolbar.actions[].target', 'toolbar.actions[].visibleWhen', 'toolbar.actions[].effects'],
59165
59375
  submissionImpact: 'config-only',
59166
59376
  preconditions: ['config-initialized']
59167
59377
  },
@@ -64835,6 +65045,24 @@ function validateToolbarActionValue(rawValue) {
64835
65045
  failureCodes.push('toolbar action label is required');
64836
65046
  if (!action)
64837
65047
  failureCodes.push('toolbar action action is required');
65048
+ const target = coerceRecord(value['target']);
65049
+ if (target) {
65050
+ const scope = normalizeText(target['scope']);
65051
+ if (scope !== 'collection' && scope !== 'selection') {
65052
+ failureCodes.push('toolbar action target scope must be collection or selection');
65053
+ }
65054
+ const cardinality = coerceRecord(target['cardinality']);
65055
+ if (scope === 'selection' && cardinality) {
65056
+ const min = Number(cardinality['min']);
65057
+ const max = cardinality['max'] === undefined ? undefined : Number(cardinality['max']);
65058
+ if (!Number.isFinite(min) || min < 0) {
65059
+ failureCodes.push('toolbar action target cardinality min must be a non-negative number');
65060
+ }
65061
+ if (max !== undefined && (!Number.isFinite(max) || max < min)) {
65062
+ failureCodes.push('toolbar action target cardinality max must be greater than or equal to min');
65063
+ }
65064
+ }
65065
+ }
64838
65066
  if (failureCodes.length > 0) {
64839
65067
  return { failureCodes };
64840
65068
  }
@@ -1,6 +1,6 @@
1
1
  import { Observable, firstValueFrom } from 'rxjs';
2
2
  import { withAuthoringScopePolicy } from '@praxisui/ai';
3
- import { ad as setTableActionGlobalActionRef } from './praxisui-table-praxisui-table-D1byLHAp.mjs';
3
+ import { ad as setTableActionGlobalActionRef } from './praxisui-table-praxisui-table-7iWPoCFj.mjs';
4
4
 
5
5
  class TableAgenticAuthoringTurnFlow {
6
6
  adapter;
@@ -1,7 +1,7 @@
1
1
  import { firstValueFrom } from 'rxjs';
2
2
  import { BaseAiAdapter, sanitizePraxisAssistantText, createComponentAuthoringContext } from '@praxisui/ai';
3
3
  import { PRAXIS_GLOBAL_ACTION_CATALOG, deepMerge } from '@praxisui/core';
4
- import { I as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, l as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, Z as coerceTableComponentEditPlans, $ as compileTableComponentEditPlans, L as TASK_PRESETS, a4 as getTableComponentEditPlanCapabilities, E as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, y as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, G as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, K as TABLE_COMPONENT_EDIT_PLAN_VERSION, z as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, H as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-D1byLHAp.mjs';
4
+ import { I as TABLE_COMPONENT_EDIT_PLAN_OPERATION_IDS, l as PRAXIS_TABLE_AUTHORING_MANIFEST, T as TABLE_AI_CAPABILITIES, Z as coerceTableComponentEditPlans, $ as compileTableComponentEditPlans, L as TASK_PRESETS, a4 as getTableComponentEditPlanCapabilities, E as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, y as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, G as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, K as TABLE_COMPONENT_EDIT_PLAN_VERSION, z as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, H as TABLE_COMPONENT_EDIT_PLAN_KIND } from './praxisui-table-praxisui-table-7iWPoCFj.mjs';
5
5
 
6
6
  const TABLE_ROW_EXPRESSION_CONTEXT_OPTION = {
7
7
  mode: 'expression',
@@ -1 +1 @@
1
- export { A as ANALYTICS_TABLE_ROW_KEY_FIELD, a as AnalyticsTableConfigAdapterService, b as AnalyticsTableContractService, c as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, d as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, e as ColumnsConfigEditorComponent, D as DATE_PRESETS, f as DataFormatterComponent, g as DataFormattingService, F as FORMULA_TEMPLATES, h as FilterConfigService, i as FilterSettingsComponent, j as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, k as PRAXIS_FILTER_COMPONENT_METADATA, l as PRAXIS_TABLE_AUTHORING_MANIFEST, m as PRAXIS_TABLE_COMPONENT_METADATA, n as PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, o as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, p as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, q as PraxisFilter, r as PraxisFilterWidgetConfigEditor, s as PraxisTable, t as PraxisTableConfigEditor, u as PraxisTableInlineAuthoringEditorComponent, v as PraxisTableToolbar, w as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, x as TABLE_COMPONENT_AI_CAPABILITIES, y as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, z as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, E as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, G as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, H as TABLE_COMPONENT_EDIT_PLAN_KIND, K as TABLE_COMPONENT_EDIT_PLAN_VERSION, L as TASK_PRESETS, O as TableDefaultsProvider, Q as TableRulesEditorComponent, R as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, U as VisualFormulaBuilderComponent, W as analyticsComparisonMetricField, X as buildTableApplyPlan, Y as coerceTableComponentEditPlan, Z as coerceTableComponentEditPlans, _ as compileTableComponentEditPlan, $ as compileTableComponentEditPlans, a0 as createTableAuthoringDocument, a1 as getActionId, a2 as getEnum, a3 as getTableCapabilities, a4 as getTableComponentEditPlanCapabilities, a5 as isTableRendererSupportedByRichContentP0, a6 as mapTableRendererToRichContentP0, a7 as normalizeTableAuthoringDocument, a8 as parseLegacyOrTableDocument, a9 as providePraxisFilterMetadata, aa as providePraxisTableMetadata, ab as providePraxisTableToolbarAppearance, ac as serializeTableAuthoringDocument, ae as toCanonicalTableConfig, af as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-D1byLHAp.mjs';
1
+ export { A as ANALYTICS_TABLE_ROW_KEY_FIELD, a as AnalyticsTableConfigAdapterService, b as AnalyticsTableContractService, c as AnalyticsTableStatsApiService, B as BOOLEAN_PRESETS, d as BehaviorConfigEditorComponent, C as CURRENCY_PRESETS, e as ColumnsConfigEditorComponent, D as DATE_PRESETS, f as DataFormatterComponent, g as DataFormattingService, F as FORMULA_TEMPLATES, h as FilterConfigService, i as FilterSettingsComponent, j as FormulaGeneratorService, J as JsonConfigEditorComponent, M as MessagesLocalizationEditorComponent, N as NUMBER_PRESETS, P as PERCENTAGE_PRESETS, k as PRAXIS_FILTER_COMPONENT_METADATA, l as PRAXIS_TABLE_AUTHORING_MANIFEST, m as PRAXIS_TABLE_COMPONENT_METADATA, n as PRAXIS_TABLE_TOOLBAR_APPEARANCE_PRESETS, o as PRAXIS_TABLE_TOOLBAR_DEFAULT_APPEARANCE, p as PRAXIS_TABLE_TOOLBAR_TOKEN_PRESETS, q as PraxisFilter, r as PraxisFilterWidgetConfigEditor, s as PraxisTable, t as PraxisTableConfigEditor, u as PraxisTableInlineAuthoringEditorComponent, v as PraxisTableToolbar, w as PraxisTableWidgetConfigEditor, S as STRING_PRESETS, T as TABLE_AI_CAPABILITIES, x as TABLE_COMPONENT_AI_CAPABILITIES, y as TABLE_COMPONENT_EDIT_PLAN_ALLOWED_CHANGE_KINDS, z as TABLE_COMPONENT_EDIT_PLAN_BATCH_KIND, E as TABLE_COMPONENT_EDIT_PLAN_EXPECTED_PATHS, G as TABLE_COMPONENT_EDIT_PLAN_JSON_SCHEMA, H as TABLE_COMPONENT_EDIT_PLAN_KIND, K as TABLE_COMPONENT_EDIT_PLAN_VERSION, L as TASK_PRESETS, O as TableDefaultsProvider, Q as TableRulesEditorComponent, R as ToolbarActionsEditorComponent, V as ValueMappingEditorComponent, U as VisualFormulaBuilderComponent, W as analyticsComparisonMetricField, X as buildTableApplyPlan, Y as coerceTableComponentEditPlan, Z as coerceTableComponentEditPlans, _ as compileTableComponentEditPlan, $ as compileTableComponentEditPlans, a0 as createTableAuthoringDocument, a1 as getActionId, a2 as getEnum, a3 as getTableCapabilities, a4 as getTableComponentEditPlanCapabilities, a5 as isTableRendererSupportedByRichContentP0, a6 as mapTableRendererToRichContentP0, a7 as normalizeTableAuthoringDocument, a8 as parseLegacyOrTableDocument, a9 as providePraxisFilterMetadata, aa as providePraxisTableMetadata, ab as providePraxisTableToolbarAppearance, ac as serializeTableAuthoringDocument, ae as toCanonicalTableConfig, af as validateTableAuthoringDocument } from './praxisui-table-praxisui-table-7iWPoCFj.mjs';
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@praxisui/table",
3
- "version": "9.0.0-beta.80",
3
+ "version": "9.0.0-beta.82",
4
4
  "description": "Advanced data table for Angular (Praxis UI) with editing, filtering, sorting, virtualization, and settings panel integration.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/platform-browser": "^21.0.0",
9
- "@praxisui/ai": "^9.0.0-beta.80",
10
- "@praxisui/core": "^9.0.0-beta.80",
11
- "@praxisui/dynamic-fields": "^9.0.0-beta.80",
12
- "@praxisui/dynamic-form": "^9.0.0-beta.80",
13
- "@praxisui/metadata-editor": "^9.0.0-beta.80",
14
- "@praxisui/rich-content": "^9.0.0-beta.80",
15
- "@praxisui/settings-panel": "^9.0.0-beta.80",
16
- "@praxisui/table-rule-builder": "^9.0.0-beta.80",
9
+ "@praxisui/ai": "^9.0.0-beta.82",
10
+ "@praxisui/core": "^9.0.0-beta.82",
11
+ "@praxisui/dynamic-fields": "^9.0.0-beta.82",
12
+ "@praxisui/dynamic-form": "^9.0.0-beta.82",
13
+ "@praxisui/metadata-editor": "^9.0.0-beta.82",
14
+ "@praxisui/rich-content": "^9.0.0-beta.82",
15
+ "@praxisui/settings-panel": "^9.0.0-beta.82",
16
+ "@praxisui/table-rule-builder": "^9.0.0-beta.82",
17
17
  "@angular/cdk": "^21.0.0",
18
18
  "@angular/forms": "^21.0.0",
19
19
  "@angular/material": "^21.0.0",
20
20
  "@angular/router": "^21.0.0",
21
- "@praxisui/dialog": "^9.0.0-beta.80",
21
+ "@praxisui/dialog": "^9.0.0-beta.82",
22
22
  "rxjs": "~7.8.0"
23
23
  },
24
24
  "dependencies": {
@@ -1,5 +1,5 @@
1
1
  import * as _praxisui_core from '@praxisui/core';
2
- import { TableToolbarAppearanceConfig, TableConfig, PraxisExportScope, LoggerService, PraxisI18nService, TableToolbarAppearanceVariant, TableToolbarAppearanceDensity, TableToolbarAppearanceShape, TableToolbarAppearanceDivider, TableToolbarTokenName, GlobalConfigService, AsyncConfigStorage, LocalStorageConfigService, ApiUrlEntry, FieldMetadata, SchemaIdParams, FormConfig, GenericCrudService, DynamicFormService, SchemaNormalizerService, ComponentKeyService, ComponentDocMeta, PraxisTextValue, PraxisAnalyticsProjection, PraxisDataQueryContext, ApiUrlConfig, PraxisQueryFilterExpression, RecordRelatedSurfaceContextPack, PraxisResourceEvent, LoadingState, RestApiLinks, ColumnDefinition, RichBlockNode, ResourceCapabilityDigest, ConnectionStorage, LoadingOrchestrator, GlobalActionService, EnterpriseRuntimeContextService, PraxisLoadingRenderer, PraxisRuntimeComponentObservationEnvelope, TableDetailRichListNode, TableDetailCardGridNode, TableDetailCardGridCardNode, TableDetailTimelineNode, JsonLogicDataRecord, TableDetailListItemAction, TableDetailActionBarNode, TableDetailActionBarAction, TableDetailRefNode, TableDetailTemplateRefNode, TableDetailDiagramEmbedNode, TableDetailEmbedAction, GlobalActionRef, PraxisRuntimeGlobalActionEffect, ResourceActionCatalogItem, ResourceSurfaceCatalogItem, ResourceCapabilityOperation, JsonLogicExpression, GlobalActionCatalogEntry, IconPickerService, SurfaceOpenPayload, GlobalActionField, FieldDefinition, PraxisRuntimeConditionalEffectRule, PraxisJsonLogicService, TableConfigService, SettingsValueProvider as SettingsValueProvider$1, AnalyticsSchemaContractService, AnalyticsPresentationResolver, RichPresenterNode, RichComposeNode, ComponentAuthoringManifest, AiCapability, AiCapabilityCategory, AiValueKind, AiCapabilityCatalog } from '@praxisui/core';
2
+ import { TableToolbarAppearanceConfig, TableConfig, ToolbarActionEvent, PraxisExportScope, LoggerService, PraxisI18nService, TableToolbarAppearanceVariant, TableToolbarAppearanceDensity, TableToolbarAppearanceShape, TableToolbarAppearanceDivider, TableToolbarTokenName, ToolbarAction as ToolbarAction$1, GlobalConfigService, AsyncConfigStorage, LocalStorageConfigService, ApiUrlEntry, FieldMetadata, SchemaIdParams, FormConfig, GenericCrudService, DynamicFormService, SchemaNormalizerService, ComponentKeyService, ComponentDocMeta, PraxisTextValue, PraxisAnalyticsProjection, PraxisDataQueryContext, ApiUrlConfig, PraxisQueryFilterExpression, RecordRelatedSurfaceContextPack, PraxisResourceEvent, LoadingState, RestApiLinks, ColumnDefinition, RichBlockNode, ResourceCapabilityDigest, ConnectionStorage, LoadingOrchestrator, GlobalActionService, EnterpriseRuntimeContextService, PraxisLoadingRenderer, PraxisRuntimeComponentObservationEnvelope, TableDetailRichListNode, TableDetailCardGridNode, TableDetailCardGridCardNode, TableDetailTimelineNode, JsonLogicDataRecord, TableDetailListItemAction, TableDetailActionBarNode, TableDetailActionBarAction, TableDetailRefNode, TableDetailTemplateRefNode, TableDetailDiagramEmbedNode, TableDetailEmbedAction, GlobalActionRef, PraxisRuntimeGlobalActionEffect, ResourceActionCatalogItem, ResourceSurfaceCatalogItem, ResourceCapabilityOperation, JsonLogicExpression, GlobalActionCatalogEntry, IconPickerService, SurfaceOpenPayload, GlobalActionField, FieldDefinition, PraxisRuntimeConditionalEffectRule, PraxisJsonLogicService, TableConfigService, SettingsValueProvider as SettingsValueProvider$1, AnalyticsSchemaContractService, AnalyticsPresentationResolver, RichPresenterNode, RichComposeNode, ComponentAuthoringManifest, AiCapability, AiCapabilityCategory, AiValueKind, AiCapabilityCatalog } from '@praxisui/core';
3
3
  import * as i0 from '@angular/core';
4
4
  import { InjectionToken, OnDestroy, EventEmitter, ElementRef, Provider, OnInit, OnChanges, AfterViewInit, DoCheck, DestroyRef, ChangeDetectorRef, NgZone, SimpleChanges, ComponentRef, AfterContentInit, Injector, Type } from '@angular/core';
5
5
  import { ActivatedRoute } from '@angular/router';
@@ -58,10 +58,7 @@ declare class PraxisTableToolbar implements OnDestroy {
58
58
  evaluationContext: Record<string, any> | null;
59
59
  /** @internal Used by PraxisTable so toolbar menu decisions materialize through the table runtime. */
60
60
  columnVisibilityController?: (field: string, visible: boolean) => void;
61
- toolbarAction: EventEmitter<{
62
- action: string;
63
- actionConfig?: any;
64
- }>;
61
+ toolbarAction: EventEmitter<Pick<ToolbarActionEvent<Record<string, unknown>>, "action" | "actionConfig">>;
65
62
  exportAction: EventEmitter<{
66
63
  format: string;
67
64
  scope?: PraxisExportScope;
@@ -133,7 +130,7 @@ declare class PraxisTableToolbar implements OnDestroy {
133
130
  private cloneForEmit;
134
131
  private getLogger;
135
132
  private warnLog;
136
- emitToolbarAction(event: Event, action: string, actionConfig?: any): void;
133
+ emitToolbarAction(event: Event, action: string, actionConfig?: ToolbarAction$1): void;
137
134
  getStartActions(): any[];
138
135
  getNonStartActions(): any[];
139
136
  getOverflowActions(): any[];
@@ -164,6 +161,9 @@ declare class PraxisTableToolbar implements OnDestroy {
164
161
  private getSelectedCount;
165
162
  private getBulkActionMinSelections;
166
163
  private getBulkActionMaxSelections;
164
+ private isSelectionTargetAction;
165
+ private getTargetMinSelections;
166
+ private getTargetMaxSelections;
167
167
  private resolveDisabledActionReason;
168
168
  private warnVisibleWhenFallback;
169
169
  private warnDisabledWhenFallback;
@@ -1192,7 +1192,7 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
1192
1192
  rowDoubleClick: EventEmitter<any>;
1193
1193
  rowExpansionChange: EventEmitter<RowExpansionChangeEvent>;
1194
1194
  rowAction: EventEmitter<any>;
1195
- toolbarAction: EventEmitter<any>;
1195
+ toolbarAction: EventEmitter<ToolbarActionEvent<any>>;
1196
1196
  bulkAction: EventEmitter<any>;
1197
1197
  exportAction: EventEmitter<any>;
1198
1198
  columnReorder: EventEmitter<any>;
@@ -1844,8 +1844,9 @@ declare class PraxisTable implements OnInit, OnChanges, AfterViewInit, AfterCont
1844
1844
  private showBulkConfirmDialog;
1845
1845
  onToolbarAction(event: {
1846
1846
  action: string;
1847
- actionConfig?: any;
1847
+ actionConfig?: ToolbarAction$1;
1848
1848
  }): Promise<void>;
1849
+ private hasValidToolbarTargetSelection;
1849
1850
  private tryHandleCollectionCreateToolbarAction;
1850
1851
  private resolveBulkExportFormat;
1851
1852
  private isBulkExportActionKey;
@@ -3059,6 +3060,13 @@ interface ToolbarAction {
3059
3060
  /** Material button appearance: filled (flat), outlined (stroked), elevated (raised), text, tonal */
3060
3061
  appearance?: 'filled' | 'outlined' | 'elevated' | 'text' | 'tonal';
3061
3062
  action: string;
3063
+ target?: {
3064
+ scope: 'collection' | 'selection';
3065
+ cardinality?: {
3066
+ min: number;
3067
+ max?: number;
3068
+ };
3069
+ };
3062
3070
  globalAction?: GlobalActionRef;
3063
3071
  effects?: PraxisRuntimeGlobalActionEffect[];
3064
3072
  position: 'start' | 'end';
@@ -3216,6 +3224,9 @@ declare class ToolbarActionsEditorComponent implements OnInit, OnDestroy, OnChan
3216
3224
  private buildGlobalActionPayload;
3217
3225
  getToolbarActionShortcutScope(action: ToolbarAction): ToolbarShortcutScope;
3218
3226
  onToolbarActionShortcutScopeChange(action: ToolbarAction, value: ToolbarShortcutScope | string): void;
3227
+ onToolbarActionTargetScopeChange(action: ToolbarAction, scope: 'collection' | 'selection'): void;
3228
+ onToolbarActionTargetMinChange(action: ToolbarAction, value: unknown): void;
3229
+ onToolbarActionTargetMaxChange(action: ToolbarAction, value: unknown): void;
3219
3230
  addToolbarAction(): void;
3220
3231
  editToolbarAction(index: number): void;
3221
3232
  removeToolbarAction(index: number): void;