@kaizen/components 0.0.0-canary-guidance-block-codemod-20251215033932 → 0.0.0-canary-01-titleblock-20251216220648

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 (40) hide show
  1. package/codemods/migrateGuidanceBlockActionsToActionsSlot/transformActionsToActionsSlot.spec.ts +105 -0
  2. package/codemods/utils/transformV1ButtonPropsToButtonOrLinkButton.ts +4 -14
  3. package/dist/cjs/src/MenuV1/index.cjs +4 -3
  4. package/dist/cjs/src/TitleBlock/TitleBlock.cjs +32 -36
  5. package/dist/cjs/src/TitleBlock/TitleBlock.module.scss.cjs +5 -1
  6. package/dist/cjs/src/TitleBlock/subcomponents/MainActions.cjs +90 -45
  7. package/dist/cjs/src/TitleBlock/subcomponents/MainActions.module.scss.cjs +3 -1
  8. package/dist/cjs/src/TitleBlock/subcomponents/SecondaryActions.cjs +51 -14
  9. package/dist/esm/src/MenuV1/index.mjs +5 -3
  10. package/dist/esm/src/TitleBlock/TitleBlock.mjs +33 -37
  11. package/dist/esm/src/TitleBlock/TitleBlock.module.scss.mjs +5 -1
  12. package/dist/esm/src/TitleBlock/subcomponents/MainActions.mjs +92 -47
  13. package/dist/esm/src/TitleBlock/subcomponents/MainActions.module.scss.mjs +3 -1
  14. package/dist/esm/src/TitleBlock/subcomponents/SecondaryActions.mjs +51 -14
  15. package/dist/styles.css +89 -210
  16. package/dist/types/TitleBlock/TitleBlock.d.ts +1 -1
  17. package/dist/types/TitleBlock/subcomponents/MainActions.d.ts +4 -3
  18. package/package.json +1 -1
  19. package/src/Avatar/Avatar.module.css +1 -0
  20. package/src/TitleBlock/TitleBlock.module.scss +63 -19
  21. package/src/TitleBlock/TitleBlock.spec.tsx +33 -461
  22. package/src/TitleBlock/TitleBlock.tsx +7 -24
  23. package/src/TitleBlock/_docs/TitleBlock.stories.tsx +59 -12
  24. package/src/TitleBlock/_mixins.scss +6 -0
  25. package/src/TitleBlock/subcomponents/MainActions.module.scss +20 -2
  26. package/src/TitleBlock/subcomponents/MainActions.tsx +127 -70
  27. package/src/TitleBlock/subcomponents/SecondaryActions.tsx +105 -45
  28. package/src/TitleBlock/subcomponents/Toolbar.tsx +1 -0
  29. package/dist/cjs/src/MenuV1/subcomponents/MenuHeading/MenuHeading.cjs +0 -27
  30. package/dist/cjs/src/MenuV1/subcomponents/MenuHeading/MenuHeading.module.scss.cjs +0 -6
  31. package/dist/cjs/src/TitleBlock/subcomponents/MobileActions.cjs +0 -306
  32. package/dist/cjs/src/TitleBlock/subcomponents/MobileActions.module.scss.cjs +0 -16
  33. package/dist/esm/src/MenuV1/subcomponents/MenuHeading/MenuHeading.mjs +0 -21
  34. package/dist/esm/src/MenuV1/subcomponents/MenuHeading/MenuHeading.module.scss.mjs +0 -4
  35. package/dist/esm/src/TitleBlock/subcomponents/MobileActions.mjs +0 -300
  36. package/dist/esm/src/TitleBlock/subcomponents/MobileActions.module.scss.mjs +0 -14
  37. package/dist/types/TitleBlock/subcomponents/MobileActions.d.ts +0 -14
  38. package/src/TitleBlock/subcomponents/MobileActions.module.scss +0 -208
  39. package/src/TitleBlock/subcomponents/MobileActions.spec.tsx +0 -210
  40. package/src/TitleBlock/subcomponents/MobileActions.tsx +0 -472
@@ -194,4 +194,109 @@ describe('transformActionsToActionsSlot()', () => {
194
194
  printAst(outputAst).replace(/\s+/g, ' '),
195
195
  )
196
196
  })
197
+
198
+ it('removes primary: true and applies variantOverride as secondary for primary actions', () => {
199
+ const inputAst = parseJsx(`
200
+ <GuidanceBlock
201
+ actions={{
202
+ primary: {
203
+ label: 'Action',
204
+ onClick: () => {},
205
+ primary: true,
206
+ },
207
+ }}
208
+ />`)
209
+ const outputAst = parseJsx(`
210
+ <GuidanceBlock
211
+ actionsSlot={<><Button onPress={() => {}} variant="secondary" size="large" icon={<Icon name="arrow_forward" shouldMirrorInRTL isPresentational/>} iconPosition="end">Action</Button></>}
212
+ />
213
+ `)
214
+
215
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
216
+ })
217
+
218
+ it('removes secondary: true and applies variantOverride as secondary for primary actions', () => {
219
+ const inputAst = parseJsx(`
220
+ <GuidanceBlock
221
+ actions={{
222
+ primary: {
223
+ label: 'Action',
224
+ onClick: () => {},
225
+ secondary: true,
226
+ },
227
+ }}
228
+ />`)
229
+ const outputAst = parseJsx(`
230
+ <GuidanceBlock
231
+ actionsSlot={<><Button onPress={() => {}} variant="secondary" size="large" icon={<Icon name="arrow_forward" shouldMirrorInRTL isPresentational/>} iconPosition="end">Action</Button></>}
232
+ />
233
+ `)
234
+
235
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
236
+ })
237
+
238
+ it('removes primary: true and applies variantOverride as tertiary for secondary actions', () => {
239
+ const inputAst = parseJsx(`
240
+ <GuidanceBlock
241
+ actions={{
242
+ secondary: {
243
+ label: 'Secondary Action',
244
+ onClick: () => {},
245
+ primary: true,
246
+ },
247
+ }}
248
+ />`)
249
+ const outputAst = parseJsx(`
250
+ <GuidanceBlock
251
+ actionsSlot={<><Button onPress={() => {}} variant="tertiary" size="large">Secondary Action</Button></>}
252
+ />
253
+ `)
254
+
255
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
256
+ })
257
+
258
+ it('removes secondary: true and applies variantOverride as tertiary for secondary actions', () => {
259
+ const inputAst = parseJsx(`
260
+ <GuidanceBlock
261
+ actions={{
262
+ secondary: {
263
+ label: 'Secondary Action',
264
+ onClick: () => {},
265
+ secondary: true,
266
+ },
267
+ }}
268
+ />`)
269
+ const outputAst = parseJsx(`
270
+ <GuidanceBlock
271
+ actionsSlot={<><Button onPress={() => {}} variant="tertiary" size="large">Secondary Action</Button></>}
272
+ />
273
+ `)
274
+
275
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
276
+ })
277
+
278
+ it('applies correct variants for both primary and secondary actions with primary: true', () => {
279
+ const inputAst = parseJsx(`
280
+ <GuidanceBlock
281
+ actions={{
282
+ primary: {
283
+ label: 'Primary',
284
+ onClick: () => {},
285
+ primary: true,
286
+ },
287
+ secondary: {
288
+ label: 'Secondary',
289
+ onClick: () => {},
290
+ primary: true,
291
+ },
292
+ }}
293
+ />`)
294
+ const outputAst = parseJsx(`
295
+ <GuidanceBlock
296
+ actionsSlot={<><Button onPress={() => {}} variant="secondary" size="large" icon={<Icon name="arrow_forward" shouldMirrorInRTL isPresentational/>} iconPosition="end">Primary</Button><Button onPress={() => {}} variant="tertiary" size="large">Secondary</Button></>}
297
+ />
298
+ `)
299
+
300
+ expect(transformInput(inputAst)).toBe(printAst(outputAst))
301
+ })
197
302
  })
@@ -64,9 +64,9 @@ export const transformButtonProp = (
64
64
  return oldValue ? createStringProp('size', buttonSizeMap[oldValue]) : undefined
65
65
  }
66
66
  case 'primary':
67
- return createStringProp('variant', 'primary')
67
+ return null
68
68
  case 'secondary':
69
- return createStringProp('variant', 'tertiary')
69
+ return null
70
70
  case 'destructive':
71
71
  return null
72
72
  default:
@@ -89,7 +89,6 @@ export const transformV1ButtonPropsToButtonOrLinkButton = (
89
89
  ): TransformButtonProp => {
90
90
  let childrenValue: ts.JsxAttributeValue | undefined
91
91
  let hasSizeProp = false
92
- let hasVariant = false
93
92
  let hasLinkAttr = false
94
93
  let hasIconProp = false
95
94
 
@@ -122,10 +121,6 @@ export const transformV1ButtonPropsToButtonOrLinkButton = (
122
121
  ]
123
122
  }
124
123
 
125
- if (propName === 'primary' || propName === 'secondary' || variantOverride) {
126
- hasVariant = true
127
- }
128
-
129
124
  if (propName === 'size') {
130
125
  hasSizeProp = true
131
126
  }
@@ -179,13 +174,8 @@ export const transformV1ButtonPropsToButtonOrLinkButton = (
179
174
  return acc
180
175
  }, [])
181
176
 
182
- if (!hasVariant) {
183
- newProps.push(createStringProp('variant', 'secondary'))
184
- }
185
-
186
- if (variantOverride) {
187
- newProps.push(createStringProp('variant', variantOverride))
188
- }
177
+ // Always add variant from variantOverride, or default to 'secondary'
178
+ newProps.push(createStringProp('variant', variantOverride ?? 'secondary'))
189
179
 
190
180
  if (!hasSizeProp) {
191
181
  newProps.push(createStringProp('size', 'large'))
@@ -1,17 +1,18 @@
1
1
  'use strict';
2
2
 
3
3
  var Menu$1 = require('./Menu.cjs');
4
- var MenuHeading$1 = require('./subcomponents/MenuHeading/MenuHeading.cjs');
4
+ require('tslib');
5
+ require('react');
6
+ require('classnames');
7
+ require('../Heading/Heading.cjs');
5
8
  var MenuItem$1 = require('./subcomponents/MenuItem/MenuItem.cjs');
6
9
  var MenuList$1 = require('./subcomponents/MenuList/MenuList.cjs');
7
10
  require('./subcomponents/StatelessMenu/StatelessMenu.cjs');
8
11
 
9
12
  // Since we can't add a deprecation flag on a * export
10
13
  var Menu = Menu$1.Menu;
11
- var MenuHeading = MenuHeading$1.MenuHeading;
12
14
  var MenuItem = MenuItem$1.MenuItem;
13
15
  var MenuList = MenuList$1.MenuList;
14
16
  exports.Menu = Menu;
15
- exports.MenuHeading = MenuHeading;
16
17
  exports.MenuItem = MenuItem;
17
18
  exports.MenuList = MenuList;
@@ -12,7 +12,6 @@ var Select = require('../Select/Select.cjs');
12
12
  var Tag = require('../Tag/Tag.cjs');
13
13
  var useMediaQueries = require('../utils/useMediaQueries.cjs');
14
14
  var MainActions = require('./subcomponents/MainActions.cjs');
15
- var MobileActions = require('./subcomponents/MobileActions.cjs');
16
15
  var SecondaryActions = require('./subcomponents/SecondaryActions.cjs');
17
16
  var utils = require('./utils.cjs');
18
17
  var TitleBlock_module = require('./TitleBlock.module.scss.cjs');
@@ -117,6 +116,12 @@ var Breadcrumb = function (_a) {
117
116
  name: "arrow_back",
118
117
  isPresentational: true,
119
118
  shouldMirrorInRTL: true
119
+ })), React__default.default.createElement("div", {
120
+ className: TitleBlock_module.staticIcon
121
+ }, React__default.default.createElement(Icon.Icon, {
122
+ name: "arrow_back",
123
+ isPresentational: true,
124
+ shouldMirrorInRTL: true
120
125
  })), React__default.default.createElement("span", {
121
126
  className: TitleBlock_module.breadcrumbTextLink,
122
127
  "data-automation-id": textAutomationId,
@@ -172,7 +177,7 @@ var renderNavigationTabs = function (navigationTabs, collapse, ariaLabel) {
172
177
  * {@link https://cultureamp.design/?path=/docs/components-titleblock-api-specification--docs Storybook}
173
178
  */
174
179
  var TitleBlock = function (_a) {
175
- var _b, _c, _d, _e;
180
+ var _b, _c, _d;
176
181
  var title = _a.title,
177
182
  variant = _a.variant,
178
183
  breadcrumb = _a.breadcrumb,
@@ -188,32 +193,30 @@ var TitleBlock = function (_a) {
188
193
  secondaryActions = _a.secondaryActions,
189
194
  secondaryOverflowMenuItems = _a.secondaryOverflowMenuItems,
190
195
  navigationTabs = _a.navigationTabs,
191
- _f = _a.collapseNavigationAreaWhenPossible,
192
- collapseNavigationAreaWhenPossible = _f === void 0 ? false : _f,
196
+ _e = _a.collapseNavigationAreaWhenPossible,
197
+ collapseNavigationAreaWhenPossible = _e === void 0 ? false : _e,
193
198
  textDirection = _a.textDirection,
194
199
  surveyStatus = _a.surveyStatus,
195
200
  id = _a.id,
196
- _g = _a.titleAutomationId,
197
- titleAutomationId = _g === void 0 ? 'TitleBlock__Title' : _g,
198
- _h = _a.avatarAutomationId,
199
- avatarAutomationId = _h === void 0 ? 'TitleBlock__Avatar' : _h,
200
- _j = _a.subtitleAutomationId,
201
- subtitleAutomationId = _j === void 0 ? 'TitleBlock__Subtitle' : _j,
202
- _k = _a.sectionTitleAutomationId,
203
- sectionTitleAutomationId = _k === void 0 ? 'TitleBlock__SectionTitle' : _k,
204
- _l = _a.sectionTitleDescriptionAutomationId,
205
- sectionTitleDescriptionAutomationId = _l === void 0 ? 'TitleBlock__SectionTitleDescription' : _l,
206
- _m = _a.breadcrumbAutomationId,
207
- breadcrumbAutomationId = _m === void 0 ? 'TitleBlock__Breadcrumb' : _m,
208
- _o = _a.breadcrumbTextAutomationId,
209
- breadcrumbTextAutomationId = _o === void 0 ? 'TitleBlock__BreadcrumbText' : _o,
210
- _p = _a.autoHideMobileActionsMenu,
211
- autoHideMobileActionsMenu = _p === void 0 ? false : _p;
201
+ _f = _a.titleAutomationId,
202
+ titleAutomationId = _f === void 0 ? 'TitleBlock__Title' : _f,
203
+ _g = _a.avatarAutomationId,
204
+ avatarAutomationId = _g === void 0 ? 'TitleBlock__Avatar' : _g,
205
+ _h = _a.subtitleAutomationId,
206
+ subtitleAutomationId = _h === void 0 ? 'TitleBlock__Subtitle' : _h,
207
+ _j = _a.sectionTitleAutomationId,
208
+ sectionTitleAutomationId = _j === void 0 ? 'TitleBlock__SectionTitle' : _j,
209
+ _k = _a.sectionTitleDescriptionAutomationId,
210
+ sectionTitleDescriptionAutomationId = _k === void 0 ? 'TitleBlock__SectionTitleDescription' : _k,
211
+ _l = _a.breadcrumbAutomationId,
212
+ breadcrumbAutomationId = _l === void 0 ? 'TitleBlock__Breadcrumb' : _l,
213
+ _m = _a.breadcrumbTextAutomationId,
214
+ breadcrumbTextAutomationId = _m === void 0 ? 'TitleBlock__BreadcrumbText' : _m;
212
215
  var hasNavigationTabs = navigationTabs && navigationTabs.length > 0;
213
216
  var collapseNavigationArea = collapseNavigationAreaWhenPossible && !hasNavigationTabs && secondaryActions === undefined;
214
- var _q = useMediaQueries.useMediaQueries().queries,
215
- isSmall = _q.isSmall,
216
- isMedium = _q.isMedium;
217
+ var _o = useMediaQueries.useMediaQueries().queries,
218
+ isSmall = _o.isSmall,
219
+ isMedium = _o.isMedium;
217
220
  var isSmallOrMediumViewport = isMedium || isSmall;
218
221
  return React__default.default.createElement(React__default.default.Fragment, null, React__default.default.createElement("div", {
219
222
  id: id,
@@ -266,19 +269,19 @@ var TitleBlock = function (_a) {
266
269
  variant: "secondary",
267
270
  reversed: true,
268
271
  fullWidth: true
269
- })))))), ((_d = (_c = primaryAction !== null && primaryAction !== void 0 ? primaryAction : defaultAction) !== null && _c !== void 0 ? _c : secondaryActions) !== null && _d !== void 0 ? _d : secondaryOverflowMenuItems) && React__default.default.createElement(MainActions.MainActions, {
272
+ })))))), ((_c = primaryAction !== null && primaryAction !== void 0 ? primaryAction : defaultAction) !== null && _c !== void 0 ? _c : secondaryActions) && React__default.default.createElement(MainActions.MainActions, {
270
273
  primaryAction: primaryAction,
271
274
  defaultAction: defaultAction,
272
- reversed: utils.isReversed(variant),
273
- overflowMenuItems: utils.createTabletOverflowMenuItems(secondaryActions, secondaryOverflowMenuItems),
274
- showOverflowMenu: isSmallOrMediumViewport
275
+ secondaryActions: secondaryActions,
276
+ secondaryOverflowMenuItems: secondaryOverflowMenuItems,
277
+ reversed: utils.isReversed(variant)
275
278
  })))), React__default.default.createElement("div", {
276
279
  className: TitleBlock_module.rowBelowSeparator
277
280
  }, React__default.default.createElement("div", {
278
281
  className: TitleBlock_module.rowBelowSeparatorInner
279
282
  }, React__default.default.createElement("div", {
280
283
  className: TitleBlock_module.rowBelowSeparatorInnerContent
281
- }, ((_e = sectionTitle !== null && sectionTitle !== void 0 ? sectionTitle : sectionTitleDescription) !== null && _e !== void 0 ? _e : renderSectionTitle) && React__default.default.createElement("div", {
284
+ }, ((_d = sectionTitle !== null && sectionTitle !== void 0 ? sectionTitle : sectionTitleDescription) !== null && _d !== void 0 ? _d : renderSectionTitle) && React__default.default.createElement("div", {
282
285
  className: TitleBlock_module.sectionTitleContainer
283
286
  }, React__default.default.createElement("div", {
284
287
  className: TitleBlock_module.sectionTitleInner
@@ -291,14 +294,7 @@ var TitleBlock = function (_a) {
291
294
  secondaryActions: secondaryActions,
292
295
  secondaryOverflowMenuItems: secondaryOverflowMenuItems,
293
296
  reversed: utils.isReversed(variant)
294
- })))), React__default.default.createElement(MobileActions.MobileActions, {
295
- primaryAction: primaryAction,
296
- defaultAction: defaultAction,
297
- secondaryActions: secondaryActions,
298
- secondaryOverflowMenuItems: secondaryOverflowMenuItems,
299
- drawerHandleLabelIconPosition: primaryAction && 'iconPosition' in primaryAction ? primaryAction.iconPosition : undefined,
300
- autoHide: autoHideMobileActionsMenu
301
- })));
297
+ }))))));
302
298
  };
303
299
  TitleBlock.displayName = 'TitleBlock';
304
300
  exports.TitleBlock = TitleBlock;
@@ -47,9 +47,13 @@ var styles = {
47
47
  "navigationTabEdgeShadowRight": "TitleBlock-module_navigationTabEdgeShadowRight__xkIWc",
48
48
  "navigationTabEdgeShadowLeft": "TitleBlock-module_navigationTabEdgeShadowLeft__9pGhR",
49
49
  "secondaryActionsContainer": "TitleBlock-module_secondaryActionsContainer__-4q0l",
50
+ "secondaryOverflowCombinedMenu": "TitleBlock-module_secondaryOverflowCombinedMenu__CTddK",
51
+ "secondaryButtonContainer": "TitleBlock-module_secondaryButtonContainer__xFL9X",
52
+ "secondaryOverflowMenu": "TitleBlock-module_secondaryOverflowMenu__gvmgW",
50
53
  "slide-fade": "TitleBlock-module_slide-fade__o5TnP",
51
54
  "reverse-slide-fade": "TitleBlock-module_reverse-slide-fade__LZZ98",
52
55
  "breadcrumbText": "TitleBlock-module_breadcrumbText__vDi0k",
53
- "circle": "TitleBlock-module_circle__68z-T"
56
+ "circle": "TitleBlock-module_circle__68z-T",
57
+ "staticIcon": "TitleBlock-module_staticIcon__5jeBS"
54
58
  };
55
59
  module.exports = styles;
@@ -6,6 +6,8 @@ var Button = require('../../ButtonV1/Button/Button.cjs');
6
6
  var IconButton = require('../../ButtonV1/IconButton/IconButton.cjs');
7
7
  var Icon = require('../../Icon/Icon.cjs');
8
8
  var index = require('../../MenuV1/index.cjs');
9
+ require('../TitleBlock.cjs');
10
+ require('./NavigationTabs.cjs');
9
11
  var constants = require('../constants.cjs');
10
12
  var utils = require('../utils.cjs');
11
13
  var TitleBlockMenuItem = require('./TitleBlockMenuItem.cjs');
@@ -17,16 +19,94 @@ function _interopDefault(e) {
17
19
  };
18
20
  }
19
21
  var React__default = /*#__PURE__*/_interopDefault(React);
22
+ var renderSecondaryAndOverflowMenu = function (secondaryOverflowMenuItems, reversed) {
23
+ if (!secondaryOverflowMenuItems) return undefined;
24
+ return React__default.default.createElement(index.Menu, {
25
+ align: "right",
26
+ button: React__default.default.createElement(IconButton.IconButton, {
27
+ label: 'Open secondary and overflow menu',
28
+ reversed: reversed,
29
+ icon: React__default.default.createElement(Icon.Icon, {
30
+ name: "more_horiz",
31
+ isPresentational: true
32
+ }),
33
+ id: constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID,
34
+ classNameOverride: MainActions_module.overflowMenuButton
35
+ })
36
+ }, React__default.default.createElement(index.MenuList, null, secondaryOverflowMenuItems.map(function (menuItem, i) {
37
+ return React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({
38
+ key: i
39
+ }, menuItem));
40
+ })));
41
+ };
20
42
  var MainActions = function (_a) {
21
- var _b, _c, _d, _e;
43
+ var _b, _c, _d;
22
44
  var primaryAction = _a.primaryAction,
23
45
  defaultAction = _a.defaultAction,
24
- _f = _a.reversed,
25
- reversed = _f === void 0 ? false : _f,
26
- overflowMenuItems = _a.overflowMenuItems,
27
- _g = _a.showOverflowMenu,
28
- showOverflowMenu = _g === void 0 ? false : _g;
46
+ secondaryActions = _a.secondaryActions,
47
+ secondaryOverflowMenuItems = _a.secondaryOverflowMenuItems,
48
+ _e = _a.reversed,
49
+ reversed = _e === void 0 ? false : _e;
29
50
  var items;
51
+ // Build combined secondary + overflow menu items once, to be spread into the toolbar items
52
+ var secondaryAndOverflowMenu = [];
53
+ // Convert defaultAction to menu item format and prepend to combined list
54
+ var defaultActionMenuItem;
55
+ if (defaultAction) {
56
+ if ('component' in defaultAction) {
57
+ defaultActionMenuItem = defaultAction;
58
+ } else if ('onClick' in defaultAction) {
59
+ defaultActionMenuItem = {
60
+ label: defaultAction.label,
61
+ icon: defaultAction.icon,
62
+ onClick: defaultAction.onClick,
63
+ disabled: defaultAction.disabled
64
+ };
65
+ } else if ('href' in defaultAction) {
66
+ defaultActionMenuItem = {
67
+ label: defaultAction.label,
68
+ icon: defaultAction.icon,
69
+ href: defaultAction.href,
70
+ disabled: defaultAction.disabled
71
+ };
72
+ }
73
+ }
74
+ var combinedSecondaryOverflowItems = utils.createTabletOverflowMenuItems(secondaryActions, secondaryOverflowMenuItems);
75
+ // Prepend defaultAction to the combined list if it exists
76
+ var allMenuItems = defaultActionMenuItem ? tslib.__spreadArray([defaultActionMenuItem], combinedSecondaryOverflowItems, true) : combinedSecondaryOverflowItems;
77
+ if (allMenuItems.length > 0) {
78
+ secondaryAndOverflowMenu.push({
79
+ key: 'overflowMenu',
80
+ node: renderSecondaryAndOverflowMenu(allMenuItems, reversed)
81
+ });
82
+ }
83
+ var defaultActionItem = defaultAction ? [{
84
+ key: 'defaultAction',
85
+ node: React__default.default.createElement(Button.Button, tslib.__assign({
86
+ classNameOverride: MainActions_module.defaultActionButton
87
+ }, defaultAction, {
88
+ reversed: (_b = defaultAction.reversed) !== null && _b !== void 0 ? _b : reversed,
89
+ "data-automation-id": "title-block-default-action-button",
90
+ "data-testid": "title-block-default-action-button"
91
+ }))
92
+ }] : [];
93
+ var defaultActionItemMinimized = defaultAction ? [{
94
+ key: 'defaultActionMinimized',
95
+ node: React__default.default.createElement("div", {
96
+ className: MainActions_module.defaultActionButtonMinimized
97
+ }, React__default.default.createElement(index.Menu, {
98
+ align: "right",
99
+ button: React__default.default.createElement(IconButton.IconButton, {
100
+ label: 'Open default action overflow menu',
101
+ reversed: reversed,
102
+ icon: React__default.default.createElement(Icon.Icon, {
103
+ name: "more_horiz",
104
+ isPresentational: true
105
+ }),
106
+ id: constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID
107
+ })
108
+ }, React__default.default.createElement(index.MenuList, null, defaultActionMenuItem && React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({}, defaultActionMenuItem)))))
109
+ }] : [];
30
110
  if (primaryAction && utils.isMenuGroupNotButton(primaryAction)) {
31
111
  var menuContent = primaryAction.menuItems.map(function (item, idx) {
32
112
  return React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({}, item, {
@@ -35,14 +115,7 @@ var MainActions = function (_a) {
35
115
  "data-testid": "main-action-primary-menu-item-".concat(idx)
36
116
  }));
37
117
  });
38
- items = tslib.__spreadArray(tslib.__spreadArray([], defaultAction ? [{
39
- key: 'defaultAction',
40
- node: React__default.default.createElement(Button.Button, tslib.__assign({}, defaultAction, {
41
- reversed: (_b = defaultAction.reversed) !== null && _b !== void 0 ? _b : reversed,
42
- "data-automation-id": "title-block-default-action-button",
43
- "data-testid": "title-block-default-action-button"
44
- }))
45
- }] : [], true), primaryAction ? [{
118
+ items = tslib.__spreadArray(tslib.__spreadArray(tslib.__spreadArray([], defaultActionItem, true), defaultActionItemMinimized, true), primaryAction ? [{
46
119
  key: 'primaryAction',
47
120
  node: React__default.default.createElement(index.Menu, {
48
121
  align: "right",
@@ -64,18 +137,11 @@ var MainActions = function (_a) {
64
137
  }, React__default.default.createElement(index.MenuList, null, menuContent))
65
138
  }] : [], true);
66
139
  } else {
67
- items = tslib.__spreadArray(tslib.__spreadArray([], defaultAction ? [{
68
- key: 'defaultAction',
69
- node: React__default.default.createElement(Button.Button, tslib.__assign({}, defaultAction, {
70
- reversed: (_c = defaultAction.reversed) !== null && _c !== void 0 ? _c : reversed,
71
- "data-automation-id": "title-block-default-action-button",
72
- "data-testid": "title-block-default-action-button"
73
- }))
74
- }] : [], true), primaryAction ? [{
140
+ items = tslib.__spreadArray(tslib.__spreadArray(tslib.__spreadArray([], defaultActionItem, true), defaultActionItemMinimized, true), primaryAction ? [{
75
141
  key: 'primaryAction',
76
142
  node: React__default.default.createElement(Button.Button, tslib.__assign({}, primaryAction, {
77
- primary: (_d = primaryAction.primary) !== null && _d !== void 0 ? _d : true,
78
- reversed: (_e = primaryAction.reversed) !== null && _e !== void 0 ? _e : reversed,
143
+ primary: (_c = primaryAction.primary) !== null && _c !== void 0 ? _c : true,
144
+ reversed: (_d = primaryAction.reversed) !== null && _d !== void 0 ? _d : reversed,
79
145
  "data-automation-id": "title-block-primary-action-button",
80
146
  "data-testid": "title-block-primary-action-button",
81
147
  badge: primaryAction.badge ? tslib.__assign(tslib.__assign({}, primaryAction.badge), {
@@ -84,27 +150,6 @@ var MainActions = function (_a) {
84
150
  }))
85
151
  }] : [], true);
86
152
  }
87
- if (overflowMenuItems && showOverflowMenu && overflowMenuItems.length > 0) {
88
- items = tslib.__spreadArray([{
89
- key: 'overflowMenu',
90
- node: React__default.default.createElement(index.Menu, {
91
- align: "right",
92
- button: React__default.default.createElement(IconButton.IconButton, {
93
- id: constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID,
94
- label: "Open secondary menu",
95
- reversed: reversed,
96
- icon: React__default.default.createElement(Icon.Icon, {
97
- name: "more_horiz",
98
- isPresentational: true
99
- })
100
- })
101
- }, React__default.default.createElement(index.MenuList, null, overflowMenuItems.map(function (menuItem, idx) {
102
- return React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({}, menuItem, {
103
- key: "main-action-overflow-item-menu-item-".concat(idx)
104
- }));
105
- })))
106
- }], items, true);
107
- }
108
153
  return React__default.default.createElement("div", {
109
154
  className: MainActions_module.mainActionsContainer
110
155
  }, React__default.default.createElement(Toolbar.Toolbar, {
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var styles = {
4
- "mainActionsContainer": "MainActions-module_mainActionsContainer__pk-78"
4
+ "mainActionsContainer": "MainActions-module_mainActionsContainer__pk-78",
5
+ "defaultActionButtonMinimized": "MainActions-module_defaultActionButtonMinimized__XePRS",
6
+ "defaultActionButton": "MainActions-module_defaultActionButton__VbER1"
5
7
  };
6
8
  module.exports = styles;
@@ -8,6 +8,7 @@ var Icon = require('../../Icon/Icon.cjs');
8
8
  var index = require('../../MenuV1/index.cjs');
9
9
  var TitleBlock_module = require('../TitleBlock.module.scss.cjs');
10
10
  var constants = require('../constants.cjs');
11
+ var utils = require('../utils.cjs');
11
12
  var TitleBlockMenuItem = require('./TitleBlockMenuItem.cjs');
12
13
  var Toolbar = require('./Toolbar.cjs');
13
14
  function _interopDefault(e) {
@@ -17,23 +18,53 @@ function _interopDefault(e) {
17
18
  }
18
19
  var React__default = /*#__PURE__*/_interopDefault(React);
19
20
  var renderSecondaryOverflowMenu = function (secondaryOverflowMenuItems, reversed) {
20
- if (!secondaryOverflowMenuItems) return undefined;
21
- return React__default.default.createElement(index.Menu, {
21
+ if (!secondaryOverflowMenuItems || secondaryOverflowMenuItems.length === 0) return undefined;
22
+ return React__default.default.createElement("div", {
23
+ className: TitleBlock_module.secondaryOverflowMenu
24
+ }, React__default.default.createElement(index.Menu, {
25
+ align: "right",
26
+ button: React__default.default.createElement(Button.Button, {
27
+ secondary: true,
28
+ reversed: reversed,
29
+ label: "Menu",
30
+ "data-automation-id": constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID,
31
+ "data-testid": constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID,
32
+ icon: React__default.default.createElement(Icon.Icon, {
33
+ name: "keyboard_arrow_down",
34
+ isPresentational: true
35
+ }),
36
+ iconPosition: 'end'
37
+ })
38
+ }, React__default.default.createElement(index.MenuList, null, secondaryOverflowMenuItems.map(function (menuItem, i) {
39
+ return React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({
40
+ key: i
41
+ }, menuItem));
42
+ }))));
43
+ };
44
+ // New: combined overflow menu (secondary actions converted + overflow menu items)
45
+ var renderCombinedSecondaryOverflowMenu = function (secondaryActions, secondaryOverflowMenuItems, reversed) {
46
+ var secondaryConverted = secondaryActions ? utils.convertSecondaryActionsToMenuItems(secondaryActions) : [];
47
+ var overflowItems = secondaryOverflowMenuItems !== null && secondaryOverflowMenuItems !== void 0 ? secondaryOverflowMenuItems : [];
48
+ if (secondaryConverted.length === 0 && overflowItems.length === 0) return undefined;
49
+ var combined = tslib.__spreadArray(tslib.__spreadArray([], secondaryConverted, true), overflowItems, true);
50
+ return React__default.default.createElement("div", {
51
+ className: TitleBlock_module.secondaryOverflowCombinedMenu
52
+ }, React__default.default.createElement(index.Menu, {
22
53
  align: "right",
23
54
  button: React__default.default.createElement(IconButton.IconButton, {
24
- label: "Open secondary menu",
55
+ label: "Open combined secondary + overflow menu",
25
56
  reversed: reversed,
26
57
  icon: React__default.default.createElement(Icon.Icon, {
27
58
  name: "more_horiz",
28
59
  isPresentational: true
29
60
  }),
30
- id: constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID
61
+ id: "".concat(constants.TITLE_BLOCK_ZEN_SECONDARY_MENU_HTML_ID, "__combined")
31
62
  })
32
- }, React__default.default.createElement(index.MenuList, null, secondaryOverflowMenuItems.map(function (menuItem, i) {
63
+ }, React__default.default.createElement(index.MenuList, null, combined.map(function (menuItem, i) {
33
64
  return React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({
34
65
  key: i
35
66
  }, menuItem));
36
- })));
67
+ }))));
37
68
  };
38
69
  // Unfortunately, you'll notice below, that I needed to use the array index,
39
70
  // against react best practices (https://reactjs.org/docs/lists-and-keys.html)
@@ -47,9 +78,10 @@ var SecondaryActions = function (_a) {
47
78
  var secondaryActionsAsToolbarItems = secondaryActions ? secondaryActions.map(function (action, i) {
48
79
  if ('menuItems' in action) {
49
80
  return {
50
- key: "".concat(i),
51
- // We shouldn't use an index here, see note above
52
- node: React__default.default.createElement(index.Menu, {
81
+ key: "titleblock_secondary_action_".concat(i),
82
+ node: React__default.default.createElement("div", {
83
+ className: TitleBlock_module.secondaryButtonContainer
84
+ }, React__default.default.createElement(index.Menu, {
53
85
  align: "right",
54
86
  button: React__default.default.createElement(Button.Button, {
55
87
  secondary: true,
@@ -65,7 +97,7 @@ var SecondaryActions = function (_a) {
65
97
  return React__default.default.createElement(TitleBlockMenuItem.TitleBlockMenuItem, tslib.__assign({
66
98
  key: i2
67
99
  }, menuItem));
68
- })))
100
+ }))))
69
101
  };
70
102
  } else {
71
103
  if ('onClick' in action && 'href' in action) {
@@ -74,21 +106,26 @@ var SecondaryActions = function (_a) {
74
106
  }
75
107
  return {
76
108
  key: "".concat(i),
77
- // We shouldn't use an index here, see note above
78
- node: React__default.default.createElement(Button.Button, tslib.__assign({
109
+ node: React__default.default.createElement("div", {
110
+ className: TitleBlock_module.secondaryButtonContainer
111
+ }, React__default.default.createElement(Button.Button, tslib.__assign({
79
112
  secondary: true,
80
113
  reversed: reversed
81
114
  }, action, {
82
115
  "data-automation-id": "title-block-secondary-actions-button",
83
116
  "data-testid": "title-block-secondary-actions-button"
84
- }))
117
+ })))
85
118
  };
86
119
  }
87
120
  }) : [];
88
121
  var overflowMenu = renderSecondaryOverflowMenu(secondaryOverflowMenuItems, reversed);
89
- var toolbarItems = tslib.__spreadArray(tslib.__spreadArray([], secondaryActionsAsToolbarItems, true), overflowMenu ? [{
122
+ var combinedOverflowMenu = renderCombinedSecondaryOverflowMenu(secondaryActions, secondaryOverflowMenuItems, reversed);
123
+ var toolbarItems = tslib.__spreadArray(tslib.__spreadArray(tslib.__spreadArray([], secondaryActionsAsToolbarItems, true), overflowMenu ? [{
90
124
  key: 'overflowMenu',
91
125
  node: overflowMenu
126
+ }] : [], true), combinedOverflowMenu ? [{
127
+ key: 'combinedOverflowMenu',
128
+ node: combinedOverflowMenu
92
129
  }] : [], true);
93
130
  return React__default.default.createElement("div", {
94
131
  className: TitleBlock_module.secondaryActionsContainer
@@ -1,12 +1,14 @@
1
1
  import { Menu as Menu$1 } from './Menu.mjs';
2
- import { MenuHeading as MenuHeading$1 } from './subcomponents/MenuHeading/MenuHeading.mjs';
2
+ import 'tslib';
3
+ import 'react';
4
+ import 'classnames';
5
+ import '../Heading/Heading.mjs';
3
6
  import { MenuItem as MenuItem$1 } from './subcomponents/MenuItem/MenuItem.mjs';
4
7
  import { MenuList as MenuList$1 } from './subcomponents/MenuList/MenuList.mjs';
5
8
  import './subcomponents/StatelessMenu/StatelessMenu.mjs';
6
9
 
7
10
  // Since we can't add a deprecation flag on a * export
8
11
  var Menu = Menu$1;
9
- var MenuHeading = MenuHeading$1;
10
12
  var MenuItem = MenuItem$1;
11
13
  var MenuList = MenuList$1;
12
- export { Menu, MenuHeading, MenuItem, MenuList };
14
+ export { Menu, MenuItem, MenuList };