@adaptabletools/adaptable 23.0.0-canary.0 → 23.0.0-canary.2

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.
Files changed (59) hide show
  1. package/index.css +88 -67
  2. package/package.json +1 -1
  3. package/src/AdaptableOptions/ColumnMenuOptions.d.ts +3 -3
  4. package/src/AdaptableOptions/ContextMenuOptions.d.ts +3 -3
  5. package/src/AdaptableState/LayoutState.d.ts +5 -4
  6. package/src/AdaptableState/StyledColumnState.d.ts +7 -16
  7. package/src/AdaptableState/StyledColumnState.js +9 -1
  8. package/src/Strategy/ExportModule.js +13 -1
  9. package/src/View/Alert/Wizard/AlertNotificationWizardSection.js +1 -1
  10. package/src/View/Alert/Wizard/AlertRulesWizardSection.js +2 -2
  11. package/src/View/Alert/Wizard/AlertWizard.js +3 -3
  12. package/src/View/Components/ColumnFilter/AdaptableColumnFilter.d.ts +3 -1
  13. package/src/View/Components/ColumnFilter/AdaptableColumnFilter.js +7 -1
  14. package/src/View/Components/ColumnFilter/ColumnFilter.d.ts +2 -1
  15. package/src/View/Components/ColumnFilter/ColumnFilter.js +3 -2
  16. package/src/View/Components/ColumnFilter/columnFilterLocation.d.ts +2 -0
  17. package/src/View/Components/ColumnFilter/columnFilterLocation.js +1 -0
  18. package/src/View/Components/FilterForm/ListBoxFilterForm.js +2 -1
  19. package/src/View/Export/Wizard/ExportPopupWizardRouter.js +10 -1
  20. package/src/View/Export/Wizard/ScheduledReportSettings.d.ts +3 -1
  21. package/src/View/Export/Wizard/ScheduledReportSettings.js +8 -1
  22. package/src/View/Export/Wizard/ScheduledReportWizard.js +8 -3
  23. package/src/View/Export/Wizard/isReportScheduledSettingsValid.d.ts +1 -1
  24. package/src/View/Export/Wizard/isReportScheduledSettingsValid.js +3 -0
  25. package/src/View/Layout/Wizard/LayoutWizard.js +7 -2
  26. package/src/View/Layout/Wizard/sections/ColumnsSection.js +1 -1
  27. package/src/View/Layout/Wizard/sections/RowGroupingSection.js +6 -2
  28. package/src/View/renderWithAdaptableContext.js +1 -1
  29. package/src/agGrid/AdaptableAgGrid.js +2 -2
  30. package/src/agGrid/AdaptableFrameworkComponent.d.ts +25 -3
  31. package/src/agGrid/AgGridFilterAdapter.js +3 -1
  32. package/src/components/Combobox/index.js +1 -1
  33. package/src/components/Datepicker/index.js +4 -4
  34. package/src/components/NewDropdownButton/index.js +1 -1
  35. package/src/components/NewSelect/index.js +2 -2
  36. package/src/components/NewTooltip/index.js +1 -1
  37. package/src/components/ui/button.js +1 -1
  38. package/src/components/ui/calendar.d.ts +1 -1
  39. package/src/components/ui/calendar.js +2 -2
  40. package/src/components/ui/combobox.js +3 -3
  41. package/src/components/ui/dropdown-menu.js +1 -1
  42. package/src/components/ui/input-group.d.ts +1 -1
  43. package/src/components/ui/input-group.js +4 -4
  44. package/src/components/ui/input.js +1 -1
  45. package/src/components/ui/popover.js +1 -1
  46. package/src/components/ui/select.js +1 -1
  47. package/src/components/ui/textarea.js +1 -1
  48. package/src/components/ui/tooltip.js +1 -1
  49. package/src/env.js +2 -2
  50. package/src/layout-manager/src/LayoutManagerModel.d.ts +2 -2
  51. package/src/layout-manager/src/index.js +5 -4
  52. package/src/layout-manager/src/normalizeLayoutModel.js +5 -1
  53. package/src/layout-manager/src/rowGroupDisplayType.d.ts +6 -0
  54. package/src/layout-manager/src/rowGroupDisplayType.js +24 -0
  55. package/src/metamodel/adaptable.metamodel.d.ts +12 -24
  56. package/src/metamodel/adaptable.metamodel.js +1 -1
  57. package/src/types.d.ts +1 -1
  58. package/themes/dark.css +10 -2
  59. package/tsconfig.esm.tsbuildinfo +1 -1
package/index.css CHANGED
@@ -1443,6 +1443,14 @@
1443
1443
  border-bottom-color: color-mix(in oklab, var(--ab-color-foreground) 20%, transparent);
1444
1444
  }
1445
1445
  }
1446
+ .twa\:border-b-text-on-defaultbackground\/20 {
1447
+ border-bottom-color: var(--ab-color-text-on-defaultbackground);
1448
+ }
1449
+ @supports (color: color-mix(in lab, red, red)) {
1450
+ .twa\:border-b-text-on-defaultbackground\/20 {
1451
+ border-bottom-color: color-mix(in oklab, var(--ab-color-text-on-defaultbackground) 20%, transparent);
1452
+ }
1453
+ }
1446
1454
  .twa\:bg-\(--ab-cmp-input--disabled__background\) {
1447
1455
  background-color: var(--ab-cmp-input--disabled__background);
1448
1456
  }
@@ -1509,7 +1517,7 @@
1509
1517
  background-color: currentcolor;
1510
1518
  }
1511
1519
  .twa\:bg-defaultbackground {
1512
- background-color: var(--ab-color-background);
1520
+ background-color: var(--ab-color-defaultbackground);
1513
1521
  }
1514
1522
  .twa\:bg-destructive\/10 {
1515
1523
  background-color: var(--ab-color-destructive);
@@ -5497,8 +5505,8 @@
5497
5505
  --ab-focus__outline: none;
5498
5506
  --ab-color-background: var(--ab-color-defaultbackground, oklch(1 0 0));
5499
5507
  --ab-color-foreground: var(--ab-color-text-on-defaultbackground);
5500
- --ab-color-popover: var(--ab-color-background);
5501
- --ab-color-popover-foreground: var(--ab-color-foreground);
5508
+ --ab-color-popover: var(--ab-color-defaultbackground);
5509
+ --ab-color-popover-foreground: var(--ab-color-text-on-defaultbackground);
5502
5510
  --ab-color-secondary: oklch(0.97 0 0);
5503
5511
  --ab-color-secondary-foreground: oklch(0.205 0 0);
5504
5512
  --ab-color-muted: var(--ab-color-primarylight);
@@ -5704,6 +5712,10 @@
5704
5712
  --ab-cmp-tabs__padding: calc(var(--ab-base-space) * 2);
5705
5713
  --ab-cmp-tabs-strip__background: var(--ab-color-defaultbackground);
5706
5714
  --ab-cmp-tabs-active__background: var(--ab-color-primarylight);
5715
+ --ab-cmp-tabs__font-weight: 400;
5716
+ --ab-cmp-tabs__color: inherit;
5717
+ --ab-cmp-tabs-inactive__opacity: 0.72;
5718
+ --ab-cmp-tabs-inactive-separator__color: var(--ab-color-primarydark);
5707
5719
  }
5708
5720
  :root {
5709
5721
  --ab-cmp-panel_header__background: var(--ab-color-primary);
@@ -6392,18 +6404,29 @@
6392
6404
  z-index: 10;
6393
6405
  overflow: visible;
6394
6406
  }
6407
+ .ab-Tabs__Tab {
6408
+ font-weight: var(--ab-cmp-tabs__font-weight);
6409
+ color: var(--ab-cmp-tabs__color);
6410
+ }
6395
6411
  .ab-Tabs__Tab:focus:after {
6396
6412
  box-shadow: var(--ab-focus__box-shadow);
6397
6413
  }
6398
6414
  .ab-Tabs__Tab:focus {
6399
6415
  outline: none;
6400
6416
  }
6417
+ .ab-Tabs__Tab:not(.ab-Tabs__Tab--active) {
6418
+ opacity: var(--ab-cmp-tabs-inactive__opacity);
6419
+ }
6420
+ .ab-Tabs__Tab:not(.ab-Tabs__Tab--active) + .ab-Tabs__Tab:not(.ab-Tabs__Tab--active) {
6421
+ box-shadow: inset 1px 0 0 var(--ab-cmp-tabs-inactive-separator__color);
6422
+ }
6401
6423
  .ab-Tabs__Tab--active + .ab-Tabs__Filler, .ab-Tabs__Tab--active + .ab-Tabs__Tab {
6402
6424
  border-bottom-left-radius: var(--ab-border-radius);
6403
6425
  }
6404
6426
  .ab-Tabs__Tab--active {
6405
6427
  position: relative;
6406
6428
  z-index: 30;
6429
+ opacity: 1;
6407
6430
  }
6408
6431
  .ab-Tabs__Tab--active:after {
6409
6432
  content: '';
@@ -6952,93 +6975,43 @@
6952
6975
  .ab-Datepicker-Overlay .rdp-focusable {
6953
6976
  cursor: pointer;
6954
6977
  }
6955
- .ab-Datepicker-Overlay {
6956
- @keyframes rdp-slide_in_left {
6957
- 0% {
6958
- transform: translateX(-100%);
6959
- }
6960
- 100% {
6961
- transform: translateX(0);
6962
- }
6963
- }
6964
- @keyframes rdp-slide_in_right {
6965
- 0% {
6966
- transform: translateX(100%);
6967
- }
6968
- 100% {
6969
- transform: translateX(0);
6970
- }
6971
- }
6972
- @keyframes rdp-slide_out_left {
6973
- 0% {
6974
- transform: translateX(0);
6975
- }
6976
- 100% {
6977
- transform: translateX(-100%);
6978
- }
6979
- }
6980
- @keyframes rdp-slide_out_right {
6981
- 0% {
6982
- transform: translateX(0);
6983
- }
6984
- 100% {
6985
- transform: translateX(100%);
6986
- }
6987
- }
6988
- }
6978
+ .ab-Datepicker-Overlay {}
6989
6979
  .ab-Datepicker-Overlay .rdp-weeks_before_enter {
6990
- animation: rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6980
+ animation: ab-rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6991
6981
  }
6992
6982
  .ab-Datepicker-Overlay .rdp-weeks_before_exit {
6993
- animation: rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6983
+ animation: ab-rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6994
6984
  }
6995
6985
  .ab-Datepicker-Overlay .rdp-weeks_after_enter {
6996
- animation: rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6986
+ animation: ab-rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6997
6987
  }
6998
6988
  .ab-Datepicker-Overlay .rdp-weeks_after_exit {
6999
- animation: rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6989
+ animation: ab-rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7000
6990
  }
7001
6991
  .ab-Datepicker-Overlay .rdp-root[dir="rtl"] .rdp-weeks_after_enter {
7002
- animation: rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6992
+ animation: ab-rdp-slide_in_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7003
6993
  }
7004
6994
  .ab-Datepicker-Overlay .rdp-root[dir="rtl"] .rdp-weeks_before_exit {
7005
- animation: rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6995
+ animation: ab-rdp-slide_out_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7006
6996
  }
7007
6997
  .ab-Datepicker-Overlay .rdp-root[dir="rtl"] .rdp-weeks_before_enter {
7008
- animation: rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
6998
+ animation: ab-rdp-slide_in_right var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7009
6999
  }
7010
7000
  .ab-Datepicker-Overlay .rdp-root[dir="rtl"] .rdp-weeks_after_exit {
7011
- animation: rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7012
- }
7013
- .ab-Datepicker-Overlay {
7014
- @keyframes rdp-fade_in {
7015
- from {
7016
- opacity: 0;
7017
- }
7018
- to {
7019
- opacity: 1;
7020
- }
7021
- }
7022
- @keyframes rdp-fade_out {
7023
- from {
7024
- opacity: 1;
7025
- }
7026
- to {
7027
- opacity: 0;
7028
- }
7029
- }
7001
+ animation: ab-rdp-slide_out_left var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7030
7002
  }
7003
+ .ab-Datepicker-Overlay {}
7031
7004
  .ab-Datepicker-Overlay .rdp-caption_after_enter {
7032
- animation: rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7005
+ animation: ab-rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7033
7006
  }
7034
7007
  .ab-Datepicker-Overlay .rdp-caption_after_exit {
7035
- animation: rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7008
+ animation: ab-rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7036
7009
  }
7037
7010
  .ab-Datepicker-Overlay .rdp-caption_before_enter {
7038
- animation: rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7011
+ animation: ab-rdp-fade_in var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7039
7012
  }
7040
7013
  .ab-Datepicker-Overlay .rdp-caption_before_exit {
7041
- animation: rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7014
+ animation: ab-rdp-fade_out var(--rdp-animation_duration) var(--rdp-animation_timing) forwards;
7042
7015
  }
7043
7016
  .ab-Datepicker-Overlay {
7044
7017
  border: var(--ab-cmp-datepicker__border);
@@ -8678,3 +8651,51 @@
8678
8651
  }
8679
8652
  }
8680
8653
  }
8654
+ @keyframes ab-rdp-slide_in_left {
8655
+ 0% {
8656
+ transform: translateX(-100%);
8657
+ }
8658
+ 100% {
8659
+ transform: translateX(0);
8660
+ }
8661
+ }
8662
+ @keyframes ab-rdp-slide_in_right {
8663
+ 0% {
8664
+ transform: translateX(100%);
8665
+ }
8666
+ 100% {
8667
+ transform: translateX(0);
8668
+ }
8669
+ }
8670
+ @keyframes ab-rdp-slide_out_left {
8671
+ 0% {
8672
+ transform: translateX(0);
8673
+ }
8674
+ 100% {
8675
+ transform: translateX(-100%);
8676
+ }
8677
+ }
8678
+ @keyframes ab-rdp-slide_out_right {
8679
+ 0% {
8680
+ transform: translateX(0);
8681
+ }
8682
+ 100% {
8683
+ transform: translateX(100%);
8684
+ }
8685
+ }
8686
+ @keyframes ab-rdp-fade_in {
8687
+ from {
8688
+ opacity: 0;
8689
+ }
8690
+ to {
8691
+ opacity: 1;
8692
+ }
8693
+ }
8694
+ @keyframes ab-rdp-fade_out {
8695
+ from {
8696
+ opacity: 1;
8697
+ }
8698
+ to {
8699
+ opacity: 0;
8700
+ }
8701
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable",
3
- "version": "23.0.0-canary.0",
3
+ "version": "23.0.0-canary.2",
4
4
  "description": "Powerful data-agnostic HTML5 AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements",
5
5
  "keywords": [
6
6
  "web-components",
@@ -1,6 +1,6 @@
1
1
  import { AdaptableColumnMenuItemName, AdaptableMenuItem, AgGridMenuItem, ColumnMenuContext, MenuSeparator } from '../AdaptableState/Common/Menu';
2
2
  import { AdaptableIcon } from '../types';
3
- import { AdaptableFrameworkComponent } from '../agGrid/AdaptableFrameworkComponent';
3
+ import { MenuItemFrameworkComponent } from '../agGrid/AdaptableFrameworkComponent';
4
4
  /**
5
5
  * Options for managing menus in AdapTable – provided using 2 collections
6
6
  */
@@ -115,12 +115,12 @@ export interface UserColumnMenuItem {
115
115
  * The `onSetup` callback on `AngularFrameworkComponent` is NOT honoured
116
116
  * for menu items because AG Grid owns the component lifecycle.
117
117
  */
118
- frameworkComponent?: AdaptableFrameworkComponent;
118
+ frameworkComponent?: MenuItemFrameworkComponent<ColumnMenuContext>;
119
119
  /**
120
120
  * Extra parameters passed through to the Framework Component (alongside
121
121
  * `adaptableApi` and `menuContext`).
122
122
  */
123
- menuItemParams?: any;
123
+ menuItemParams?: Record<string, unknown>;
124
124
  }
125
125
  /**
126
126
  * Defines AG Grid Column Menu Items
@@ -1,7 +1,7 @@
1
1
  import { MenuSeparator } from '@infinite-table/infinite-react';
2
2
  import { AdaptableContextMenuItemName, AdaptableMenuItem, AgGridMenuItem, ContextMenuContext } from '../AdaptableState/Common/Menu';
3
3
  import { AdaptableIcon } from '../types';
4
- import { AdaptableFrameworkComponent } from '../agGrid/AdaptableFrameworkComponent';
4
+ import { MenuItemFrameworkComponent } from '../agGrid/AdaptableFrameworkComponent';
5
5
  /**
6
6
  * Options for managing menus in AdapTable – provided using 2 collections
7
7
  */
@@ -110,12 +110,12 @@ export interface UserContextMenuItem {
110
110
  * The `onSetup` callback on `AngularFrameworkComponent` is NOT honoured
111
111
  * for menu items because AG Grid owns the component lifecycle.
112
112
  */
113
- frameworkComponent?: AdaptableFrameworkComponent;
113
+ frameworkComponent?: MenuItemFrameworkComponent<ContextMenuContext>;
114
114
  /**
115
115
  * Extra parameters passed through to the Framework Component (alongside
116
116
  * `adaptableApi` and `menuContext`).
117
117
  */
118
- menuItemParams?: any;
118
+ menuItemParams?: Record<string, unknown>;
119
119
  }
120
120
  /**
121
121
  * Defines AG Grid Context Menu Items
@@ -44,6 +44,10 @@ export interface LayoutState extends BaseState {
44
44
  /**
45
45
  * Base object for both Table and Pivot Layouts
46
46
  */
47
+ /**
48
+ * How row groups are displayed in a Layout (maps to AG Grid `groupDisplayType`).
49
+ */
50
+ export type RowGroupDisplayType = 'single' | 'multi' | 'groupRows';
47
51
  export interface LayoutBase extends AdaptableObject {
48
52
  /**
49
53
  * Name of the Layout as it appears in the Layout toolbar and tool panel
@@ -101,10 +105,7 @@ export interface LayoutBase extends AdaptableObject {
101
105
  * Position of the Grand Total Row in the Layout
102
106
  */
103
107
  GrandTotalRow?: 'top' | 'bottom' | 'pinnedTop' | 'pinnedBottom' | boolean;
104
- /**
105
- * Display Row Grouped Columns as 'single' or 'multi' column
106
- */
107
- RowGroupDisplayType?: 'single' | 'multi';
108
+ RowGroupDisplayType?: RowGroupDisplayType;
108
109
  }
109
110
  /**
110
111
  * Defines a Table-based Layout
@@ -1,6 +1,6 @@
1
1
  import { BaseState } from './BaseState';
2
2
  import { AdaptablePredicate, AdaptableBooleanQuery, AdaptableIcon } from '../types';
3
- import { CellBoxStyle, CellFontStyle } from './Common/AdaptableStyle';
3
+ import { AdaptableStyle, CellBoxStyle, CellFontStyle } from './Common/AdaptableStyle';
4
4
  import { TypeHint } from './Common/Types';
5
5
  import { RowScope } from './Common/RowScope';
6
6
  import { AgSparklineOptions } from 'ag-charts-types';
@@ -367,23 +367,14 @@ export type SystemBadgeStylePredicateIds = SystemBadgeStylePredicateId[];
367
367
  export interface BadgeStylePredicate extends AdaptablePredicate {
368
368
  PredicateId: TypeHint<string, SystemBadgeStylePredicateId>;
369
369
  }
370
+ /** Keys copied from legacy `BadgeStyleDefinition.Style` (`AdaptableStyle`) into `PillStyle`. */
371
+ export declare const BADGE_PILL_STYLE_KEYS: readonly ["BackColor", "ForeColor", "BorderColor", "FontWeight", "FontStyle", "TextDecoration"];
370
372
  /**
371
- * Visual styling applied to a single Badge "pill" (subset of `AdaptableStyle`)
373
+ * Visual styling applied to a single Badge pill — an explicit subset of
374
+ * {@link AdaptableStyle}. Not used: `BorderRadius` ({@link BadgeShape}),
375
+ * `Alignment` / `FontSize` / `ClassName` (column-level or unsupported).
372
376
  */
373
- export interface BadgePillStyle {
374
- /** Pill background colour. */
375
- BackColor?: string;
376
- /** Pill text/icon colour. */
377
- ForeColor?: string;
378
- /** Pill border colour (a subtle 1px border is drawn when set). */
379
- BorderColor?: string;
380
- /** Whether the pill text is bold. */
381
- FontWeight?: 'Normal' | 'Bold';
382
- /** Whether the pill text is italic. */
383
- FontStyle?: 'Normal' | 'Italic';
384
- /** Optional decoration (underline / line-through / overline). */
385
- TextDecoration?: 'None' | 'Underline' | 'Overline' | 'LineThrough';
386
- }
377
+ export type BadgePillStyle = Pick<AdaptableStyle, (typeof BADGE_PILL_STYLE_KEYS)[number]>;
387
378
  /**
388
379
  * Visual shape of a Badge; convenience shorthand that resolves to a border radius without having to pick a pixel value
389
380
  */
@@ -1 +1,9 @@
1
- export {};
1
+ /** Keys copied from legacy `BadgeStyleDefinition.Style` (`AdaptableStyle`) into `PillStyle`. */
2
+ export const BADGE_PILL_STYLE_KEYS = [
3
+ 'BackColor',
4
+ 'ForeColor',
5
+ 'BorderColor',
6
+ 'FontWeight',
7
+ 'FontStyle',
8
+ 'TextDecoration',
9
+ ];
@@ -178,7 +178,19 @@ export class ExportModule extends AdaptableModuleBase {
178
178
  render: ExportSchedulesTab,
179
179
  },
180
180
  ],
181
- newTooltipText: 'Create New Report',
181
+ abObjectTypes: [
182
+ {
183
+ name: 'Report',
184
+ label: 'New Report',
185
+ accessLevel: this.AccessLevel,
186
+ },
187
+ {
188
+ name: 'Schedule',
189
+ label: 'New Schedule',
190
+ accessLevel: this.AccessLevel,
191
+ },
192
+ ],
193
+ newTooltipText: 'Create new Export item',
182
194
  actions: [ReportListItem],
183
195
  getDeleteAction: ExportRedux.ReportDelete,
184
196
  getDeleteConfirmationMsg: (abObject) => {
@@ -82,7 +82,7 @@ export const AlertNotificationWizardSection = (props) => {
82
82
  },
83
83
  });
84
84
  };
85
- return (_jsxs(_Fragment, { children: [_jsxs(Tabs, { "data-name": "display-options", className: "twa:mt-2 twa:mb-3", autoFocus: false, children: [_jsx(Tabs.Tab, { children: "Notification Options" }), _jsxs(Tabs.Content, { children: [_jsxs(Flex, { flexDirection: "column", alignItems: "flex-start", className: isScheduled ? 'twa:gap-2' : undefined, children: [_jsx(CheckBox, { className: isScheduled ? 'twa:my-0' : undefined, checked: data.AlertProperties?.DisplayNotification, onChange: (DisplayNotification) => {
85
+ return (_jsxs(_Fragment, { children: [_jsxs(Tabs, { "data-name": "display-options", className: "twa:mt-2 twa:mb-3", autoFocus: false, children: [_jsx(Tabs.Tab, { children: "Notification Options" }), _jsxs(Tabs.Content, { children: [_jsxs(Flex, { flexDirection: "column", alignItems: "flex-start", className: isScheduled ? 'twa:gap-4' : undefined, children: [_jsx(CheckBox, { className: isScheduled ? 'twa:my-0' : undefined, checked: data.AlertProperties?.DisplayNotification, onChange: (DisplayNotification) => {
86
86
  if (isScheduled && scheduledData) {
87
87
  updateScheduledProperties({ DisplayNotification });
88
88
  return;
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { isRuleBasedAlertDefinition } from '../../../Utilities/Helpers/ScheduledAlertHelper';
3
3
  import { EntityRulesEditor, EntityRulesSummary } from '../../Components/EntityRulesEditor';
4
4
  import { Tag } from '../../../components/Tag';
@@ -11,7 +11,7 @@ import { Box } from '../../../components/Flex';
11
11
  export const getRuleStepDescription = (alertType) => {
12
12
  switch (alertType) {
13
13
  case 'DataChange':
14
- return (_jsxs(_Fragment, { children: ["Build the Rule ", _jsx("b", { children: "when" }), " the Alert should trigger (using a Predicate or a Query)"] }));
14
+ return (_jsx(_Fragment, { children: "Build the Rule for when the Alert should trigger (using a Predicate or a Query)" }));
15
15
  case 'RowChange':
16
16
  return _jsx(_Fragment, { children: "Specify which type of Row Change will trigger the Alert" });
17
17
  case 'Validation':
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useState, useCallback } from 'react';
3
3
  import { OnePageAdaptableWizard, OnePageWizardSummary } from '../../Wizard/OnePageAdaptableWizard';
4
4
  import { cloneObject } from '../../../Utilities/Helpers/Helper';
@@ -81,7 +81,7 @@ export const AlertWizard = (props) => {
81
81
  {
82
82
  title: 'Name & Type',
83
83
  isValid: isSettingsValid,
84
- details: (_jsxs(_Fragment, { children: ["Enter Name and select ", _jsx("b", { children: "what" }), " type of change in AdapTable will cause the Alert to fire"] })),
84
+ details: (_jsx(_Fragment, { children: "Enter Name and select and select an Alert Type" })),
85
85
  render: () => (_jsx(Box, { className: "twa:p-2", children: _jsx(AlertTypeWizardSection, { alertType: alertType, onAlertTypeChange: handleAlertTypeChange, onChange: setAlertDefinition }) })),
86
86
  renderSummary: () => renderAlertTypeSummary(alertType),
87
87
  },
@@ -95,7 +95,7 @@ export const AlertWizard = (props) => {
95
95
  {
96
96
  title: 'Trigger',
97
97
  isVisible: () => alertType === AlertType.DataChange || alertType == AlertType.Validation,
98
- details: (_jsxs(_Fragment, { children: ["Specify ", _jsx("b", { children: "where" }), " data changes should trigger the Alert"] })),
98
+ details: (_jsx(_Fragment, { children: "Specify which columns should trigger the Alert" })),
99
99
  isValid: (data) => isRuleBasedAlertDefinition(data) ? isScopeValid(data) : true,
100
100
  render: () => (_jsx(AlertScopeWizardSection, { alertType: alertType, onChange: setAlertDefinition })),
101
101
  renderSummary: renderScopeSummary,
@@ -1,5 +1,7 @@
1
1
  import * as React from 'react';
2
- export type ColumnFilterLocation = 'columnMenu' | 'filterForm';
2
+ import { ColumnFilterLocation } from './columnFilterLocation';
3
+ export type { ColumnFilterLocation } from './columnFilterLocation';
4
+ export { isEmbeddedColumnFilterLocation } from './columnFilterLocation';
3
5
  export declare const ColumnFilterLocationProvider: React.Provider<ColumnFilterLocation>;
4
6
  export declare const useColumnFilterLocation: () => ColumnFilterLocation;
5
7
  export interface AdaptableColumnFilterProps {
@@ -2,6 +2,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
3
  import { ColumnFilterComponent } from './ColumnFilter';
4
4
  import { useAdaptableFilterWrapper } from './useAdaptableFilterWrapper';
5
+ import Panel from '../../../components/Panel';
6
+ export { isEmbeddedColumnFilterLocation } from './columnFilterLocation';
5
7
  const ColumnFilterLocationContext = React.createContext(null);
6
8
  export const ColumnFilterLocationProvider = ColumnFilterLocationContext.Provider;
7
9
  export const useColumnFilterLocation = () => {
@@ -13,7 +15,11 @@ export const useColumnFilterLocation = () => {
13
15
  */
14
16
  export const AdaptableColumnFilter = (props) => {
15
17
  const { qlPredicate, qlPredicateDefs, columnFilter, handlePredicateChange } = useAdaptableFilterWrapper(props.columnId, 'FilterForm');
16
- return (_jsx(ColumnFilterLocationProvider, { value: props.location, children: _jsx(ColumnFilterComponent, { location: props.location, wrapperProps: props.wrapperProps, columnId: props.columnId, predicate: qlPredicate, predicateDefs: qlPredicateDefs, disabled: columnFilter?.IsSuspended, onPredicateChange: React.useCallback((predicate) => {
18
+ const filterContent = (_jsx(ColumnFilterLocationProvider, { value: props.location, children: _jsx(ColumnFilterComponent, { location: props.location, wrapperProps: props.wrapperProps, columnId: props.columnId, predicate: qlPredicate, predicateDefs: qlPredicateDefs, disabled: columnFilter?.IsSuspended, onPredicateChange: React.useCallback((predicate) => {
17
19
  handlePredicateChange(predicate);
18
20
  }, [handlePredicateChange]) }) }));
21
+ if (props.location === 'filtersToolPanel') {
22
+ return (_jsx(Panel, { className: "twa:mb-2", bodyProps: { className: 'twa:p-0' }, children: filterContent }));
23
+ }
24
+ return filterContent;
19
25
  };
@@ -1,7 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { QlPredicate, QlPredicateDef } from '../../../parser/src/predicate';
3
+ import { ColumnFilterLocation } from './columnFilterLocation';
3
4
  interface ColumnFilterComponentProps {
4
- location: 'columnMenu' | 'filterForm';
5
+ location: ColumnFilterLocation;
5
6
  hideActionButtons?: boolean;
6
7
  columnId: string;
7
8
  disabled?: boolean;
@@ -10,6 +10,7 @@ import { Box, Flex } from '../../../components/Flex';
10
10
  import clsx from 'clsx';
11
11
  import { twMerge } from '../../../twMerge';
12
12
  import { SingleSelect } from '../../../components/NewSelect';
13
+ import { isEmbeddedColumnFilterLocation } from './columnFilterLocation';
13
14
  const ColumnFilterPredicateDropdown = (props) => {
14
15
  const predicateDef = usePredicateDef(props.predicate?.operator, props.predicateDefs);
15
16
  const options = props.predicateDefs.map((predicateDef) => {
@@ -129,10 +130,10 @@ export const ColumnFilterComponent = (props) => {
129
130
  .some((adaptablePredicate) => adaptable.api.predicateApi.isValidPredicate(adaptablePredicate));
130
131
  };
131
132
  return (_jsxs(_Fragment, { children: [_jsxs(Flex, { flexDirection: "column", className: clsx({
132
- 'twa:bg-primarylight': true,
133
133
  'twa:pb-2': !props.hideActionButtons,
134
- 'twa:mb-2': props.location === 'filterForm',
134
+ 'twa:mb-2': isEmbeddedColumnFilterLocation(props.location),
135
135
  'twa:mt-2 twa:ml-2 twa:mr-2': props.location === 'columnMenu',
136
+ 'twa:mx-2': props.location === 'filtersToolPanel',
136
137
  'twa:rounded-standard': true,
137
138
  }), children: [_jsx(Flex, { className: "twa:m-2", children: _jsx(AndOrInput, { onChange: onCombineChange, operator: currentPredicate.operator }) }), !props.hideActionButtons && (_jsxs(Flex, { className: "ab-ColumnFilter-actions twa:ml-2 twa:mr-2", justifyContent: "space-between", children: [_jsx(Box, { className: "ab-ColumnFilter-action-clearall", children: _jsx(SimpleButton, { "aria-label": 'Clear All Filters', onClick: () => clearAllFilters(), children: "Clear All" }) }), manuallyApplyColumnFilter ? (_jsxs(_Fragment, { children: [_jsx(Box, { className: "twa:flex-1", "data-name": "spacer" }), _jsx(Box, { className: "ab-ColumnFilter-action-reset twa:mr-2", children: _jsx(SimpleButton, { "aria-label": 'Reset All', tone: "neutral", variant: "raised", onClick: () => {
138
139
  setPredicateNotYetApplied(props.predicate);
@@ -0,0 +1,2 @@
1
+ export type ColumnFilterLocation = 'columnMenu' | 'filterForm' | 'filtersToolPanel';
2
+ export declare const isEmbeddedColumnFilterLocation: (location: ColumnFilterLocation) => boolean;
@@ -0,0 +1 @@
1
+ export const isEmbeddedColumnFilterLocation = (location) => location === 'filterForm' || location === 'filtersToolPanel';
@@ -8,6 +8,7 @@ import { toDisplayValueDefault, toDisplayValueFromOptionTree, } from '../../../c
8
8
  import { AG_GRID_GROUPED_COLUMN } from '../../../Utilities/Constants/GeneralConstants';
9
9
  import { useMemo } from 'react';
10
10
  import { GridFilterCombobox } from '../../../components/Combobox';
11
+ import { isEmbeddedColumnFilterLocation } from '../ColumnFilter/columnFilterLocation';
11
12
  import { useColumnFilterLocation } from '../ColumnFilter/AdaptableColumnFilter';
12
13
  import { GridFilterTreeDropdown } from '../../../components/Tree/TreeDropdown';
13
14
  const baseClassName = 'ab-ListBoxFilterForm';
@@ -161,7 +162,7 @@ export const ColumnValuesSelect = (props) => {
161
162
  : props.onChange, items: options,
162
163
  // for dates, the treeDateOptions have ids that are numbers
163
164
  // so we have to add the `toDateValue` function to convert the values to the correct format
164
- value: selectedColumnValues, primaryKey: 'value', isLoading: props.isLoading, onOpenChange: onOpenChange, showClear: location === 'filterForm' })) : (_jsx(GridFilterCombobox, { disabled: props.disabled, ...selectProps, onOpenChange: onOpenChange, items: options, value: value, isLoading: props.isLoading, onValueChange: props.onChange, showClear: location === 'filterForm' }, "select"));
165
+ value: selectedColumnValues, primaryKey: 'value', isLoading: props.isLoading, onOpenChange: onOpenChange, showClear: isEmbeddedColumnFilterLocation(location) })) : (_jsx(GridFilterCombobox, { disabled: props.disabled, ...selectProps, onOpenChange: onOpenChange, items: options, value: value, isLoading: props.isLoading, onValueChange: props.onChange, showClear: isEmbeddedColumnFilterLocation(location) }, "select"));
165
166
  return (_jsx("div", { className: join(baseClassName, 'twa:relative', props.isLoading && `${baseClassName}--loading`, !value.length && `${baseClassName}--empty`), onKeyDownCapture: (e) => {
166
167
  if (e.key === 'Tab') {
167
168
  // Prevent AG Grid from hijacking Tab; keep browser default focus navigation.
@@ -1,8 +1,17 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { NewReportWizard } from './NewReportWizard';
3
3
  import { ScheduledReportWizard } from './ScheduledReportWizard';
4
- export const ExportPopupWizardRouter = (props) => {
4
+ const isScheduledReportWizard = (props) => {
5
5
  if (props.popupParams?.action === 'NewSchedule') {
6
+ return true;
7
+ }
8
+ if (props.data != null && 'Schedule' in props.data) {
9
+ return true;
10
+ }
11
+ return props.abObjectType?.name === 'Schedule';
12
+ };
13
+ export const ExportPopupWizardRouter = (props) => {
14
+ if (isScheduledReportWizard(props)) {
6
15
  const scheduleProps = props;
7
16
  return _jsx(ScheduledReportWizard, { ...scheduleProps });
8
17
  }
@@ -1,11 +1,13 @@
1
1
  import * as React from 'react';
2
2
  import { ExportDestinationType } from '../../../AdaptableOptions/ExportOptions';
3
- import { ReportFormatType, ReportSchedule } from '../../../AdaptableState/ExportState';
3
+ import { ReportFormatType, ReportNameType, ReportSchedule } from '../../../AdaptableState/ExportState';
4
4
  interface ScheduledReportSettingsProps {
5
5
  reportSchedule: ReportSchedule;
6
6
  onChange: (reportSchedule: ReportSchedule) => void;
7
7
  allFormats: ReportFormatType[];
8
8
  allDestinations: ExportDestinationType[];
9
+ /** When set, the user picks which report this schedule exports (Export popup → New Schedule). */
10
+ allReportNames?: ReportNameType[];
9
11
  }
10
12
  export declare const ScheduledReportSettings: React.FunctionComponent<ScheduledReportSettingsProps>;
11
13
  export {};
@@ -19,7 +19,14 @@ export const ScheduledReportSettings = (props) => {
19
19
  label: destination,
20
20
  value: destination,
21
21
  }));
22
- return (_jsx(Box, { "data-name": "scheduled-report-settings", children: _jsxs(Tabs, { autoFocus: false, className: "twa:mb-3", children: [_jsx(Tabs.Tab, { children: "Settings" }), _jsx(Tabs.Content, { children: _jsxs(FormLayout, { children: [_jsx(FormRow, { label: "Name", children: _jsx(Input, { "data-name": "schedule-name", className: "twa:w-[300px]", onChange: handleNameChange, placeholder: "Enter Schedule Name", type: "string", value: props.reportSchedule?.Name ?? '' }) }), _jsx(FormRow, { label: "Format", children: _jsx(Box, { className: "twa:max-w-[300px]", children: _jsx(SingleSelect, { className: "twa:w-full", "data-name": "select-format", items: formatOptions, value: props.reportSchedule?.ReportFormat, placeholder: "Select Format", onValueChange: (value) => props.onChange({
22
+ const reportOptions = (props.allReportNames ?? []).map((reportName) => ({
23
+ label: reportName,
24
+ value: reportName,
25
+ }));
26
+ return (_jsx(Box, { "data-name": "scheduled-report-settings", children: _jsxs(Tabs, { autoFocus: false, className: "twa:mb-3", children: [_jsx(Tabs.Tab, { children: "Settings" }), _jsx(Tabs.Content, { children: _jsxs(FormLayout, { children: [props.allReportNames && (_jsx(FormRow, { label: "Report", children: _jsx(Box, { className: "twa:max-w-[300px]", children: _jsx(SingleSelect, { className: "twa:w-full", "data-name": "select-report", items: reportOptions, value: props.reportSchedule?.ReportName || undefined, placeholder: "Select Report", onValueChange: (value) => props.onChange({
27
+ ...props.reportSchedule,
28
+ ReportName: value,
29
+ }) }) }) })), _jsx(FormRow, { label: "Name", children: _jsx(Input, { "data-name": "schedule-name", className: "twa:w-[300px]", onChange: handleNameChange, placeholder: "Enter Schedule Name", type: "string", value: props.reportSchedule?.Name ?? '' }) }), _jsx(FormRow, { label: "Format", children: _jsx(Box, { className: "twa:max-w-[300px]", children: _jsx(SingleSelect, { className: "twa:w-full", "data-name": "select-format", items: formatOptions, value: props.reportSchedule?.ReportFormat, placeholder: "Select Format", onValueChange: (value) => props.onChange({
23
30
  ...props.reportSchedule,
24
31
  ReportFormat: value,
25
32
  }) }) }) }), _jsx(FormRow, { label: "Destination", children: _jsx(Box, { className: "twa:max-w-[300px]", children: _jsx(SingleSelect, { className: "twa:w-full", "data-name": "select-destination", items: destinationOptions, value: props.reportSchedule?.ExportDestination, placeholder: "Select Destination", onValueChange: (value) => props.onChange({
@@ -24,10 +24,11 @@ export const ScheduledReportWizard = (props) => {
24
24
  });
25
25
  const dispatch = useDispatch();
26
26
  const handleFinish = () => {
27
- if (!reportName) {
27
+ const resolvedReportName = reportName ?? reportSchedule.ReportName;
28
+ if (!resolvedReportName?.trim()) {
28
29
  return;
29
30
  }
30
- const scheduleToSave = { ...reportSchedule, ReportName: reportName };
31
+ const scheduleToSave = { ...reportSchedule, ReportName: resolvedReportName };
31
32
  const action = isNew
32
33
  ? ExportRedux.ScheduledReportAdd(scheduleToSave)
33
34
  : ExportRedux.ScheduledReportEdit(scheduleToSave);
@@ -71,5 +72,9 @@ const ScheduledReportSettingsSection = (props) => {
71
72
  const { data, api } = useOnePageAdaptableWizardContext();
72
73
  const allFormats = api.exportApi.getAvailableSystemFormats();
73
74
  const allDestinations = api.exportApi.getAllExportDestinations();
74
- return (_jsxs(_Fragment, { children: [props.reportName && (_jsxs(SummaryText, { children: ["Report: ", _jsx(Tag, { children: props.reportName })] })), _jsx(ScheduledReportSettings, { reportSchedule: data, onChange: props.onChange, allFormats: allFormats ?? [], allDestinations: allDestinations ?? [] })] }));
75
+ const fixedReportName = props.reportName;
76
+ const allReportNames = fixedReportName
77
+ ? undefined
78
+ : api.exportApi.internalApi.getAllAvailableReportNames();
79
+ return (_jsxs(_Fragment, { children: [fixedReportName && (_jsxs(SummaryText, { children: ["Report: ", _jsx(Tag, { children: fixedReportName })] })), _jsx(ScheduledReportSettings, { reportSchedule: data, onChange: props.onChange, allFormats: allFormats ?? [], allDestinations: allDestinations ?? [], allReportNames: allReportNames })] }));
75
80
  };
@@ -1,3 +1,3 @@
1
1
  import { AdaptableApi } from '../../../Api/AdaptableApi';
2
2
  import { ReportSchedule } from '../../../AdaptableState/ExportState';
3
- export declare const isReportScheduleSettingsValid: (reportSchedule: ReportSchedule, api: AdaptableApi) => true | "A name is required." | "A scheduled export with this name already exists." | "Please select a report format.";
3
+ export declare const isReportScheduleSettingsValid: (reportSchedule: ReportSchedule, api: AdaptableApi) => true | "A name is required." | "A scheduled export with this name already exists." | "Please select a report." | "Please select a report format.";
@@ -8,6 +8,9 @@ export const isReportScheduleSettingsValid = (reportSchedule, api) => {
8
8
  if (isDuplicateName) {
9
9
  return 'A scheduled export with this name already exists.';
10
10
  }
11
+ if (StringExtensions.IsNullOrEmpty(reportSchedule?.ReportName?.trim())) {
12
+ return 'Please select a report.';
13
+ }
11
14
  if (StringExtensions.IsNullOrEmpty(reportSchedule?.ReportFormat)) {
12
15
  return 'Please select a report format.';
13
16
  }