Skip to content

Commit 0389b47

Browse files
authored
Merge pull request #7 from jayfreestone/option-override-toggle
Options: Allow overriding toggle handler
2 parents 2b65354 + 70c7978 commit 0389b47

File tree

5 files changed

+72
-10
lines changed

5 files changed

+72
-10
lines changed

README.md

+21-5
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,21 @@ inst.toggleOverflowNav();
170170

171171
## Options
172172

173+
### `openOnToggle`
174+
175+
You can disable the default behaviour of automatically opening the overflow when the toggle is clicked by passing `false`. If you wanted to re-implement your own toggle behaviour, you could do so by listening for the `toggleClicked` event:
176+
177+
```javascript
178+
const inst = priorityPlus(document.querySelector('.js-p-target'), {
179+
openOnToggle: false,
180+
})
181+
182+
inst.on('toggleClicked', () => {
183+
// Re-implement existing behaviour
184+
inst.toggleOverflowNav();
185+
})
186+
```
187+
173188
### `collapseAtCount`
174189

175190
If you'd like to collapse into the overflow when the primary navigation becomes depleted, you can do with the `collapseAtCount` option:
@@ -232,11 +247,12 @@ Be aware that if you alter the width of the element by changing its content, you
232247

233248
Arguments are provided via the `details` property.
234249

235-
| Name | Arguments | Description |
236-
|:------|:----------|:----------|
237-
| `showOverflow` | None | Triggered when the overflow nav becomes visible.
238-
| `hideOverflow` | None | Triggered when the overflow nav becomes invisible.
239-
| `itemsChanged` | `overflowCount` (The number of items in the overflow nav) | Triggered when the navigation items are updated (either added/removed).
250+
| Name | Arguments | Description |
251+
|:----------------|:----------------------------------------------------------|:------------------------------------------------------------------------|
252+
| `showOverflow` | None | Triggered when the overflow nav becomes visible. |
253+
| `hideOverflow` | None | Triggered when the overflow nav becomes invisible. |
254+
| `itemsChanged` | `overflowCount` (The number of items in the overflow nav) | Triggered when the navigation items are updated (either added/removed). |
255+
| `toggleClicked` | `original` (The original click event) | Triggered when the overflow toggle button is clicked. |
240256

241257
## Defining a 'mobile' breakpoint
242258

cypress/integration/pplus.js

+28-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ describe('Events', () => {
2727
event: 'itemsChanged',
2828
};
2929

30-
cy.visit(`/?titleCB=${encodeURI(JSON.stringify(titleCallback))}`);
30+
cy.visit('/', {
31+
qs: { titleCB: JSON.stringify(titleCallback) },
32+
});
3133
registerContext();
3234

3335
cy.get('@instance')
@@ -68,7 +70,7 @@ describe('Events', () => {
6870
// Force overflow so we can see the dropdown
6971
cy.viewport(768, 660);
7072
// Show dropdown by default
71-
cy.visit('/?showOverflow=true');
73+
cy.visit('/', { qs: { showOverflow: true } });
7274
registerContext();
7375

7476
// We need this get to ensure we have fully initialized
@@ -83,6 +85,30 @@ describe('Events', () => {
8385
expect(hideOverflowCB).to.be.calledOnce;
8486
});
8587
});
88+
89+
it('toggleClicked', () => {
90+
const toggleClickedCB = cy.spy();
91+
92+
// Force overflow
93+
cy.viewport(320, 660);
94+
// Disable default behaviour (opening overflow)
95+
cy.visit('/', {
96+
qs: { openOnToggle: 'false' }
97+
})
98+
registerContext();
99+
100+
cy
101+
.get('@instance')
102+
.invoke('on', 'toggleClicked', toggleClickedCB)
103+
.get('@toggle-btn')
104+
.click()
105+
// Confirm default behaviour doesn't occur
106+
.get('@overflow-nav')
107+
.should('not.be.visible')
108+
.then(() => {
109+
expect(toggleClickedCB).to.be.calledOnce;
110+
});
111+
});
86112
});
87113
});
88114

index.html

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
const queryParams = new URLSearchParams(window.location.search);
6363

6464
const inst = priorityPlus(document.querySelector('.js-p-target'), {
65+
openOnToggle: queryParams.get('openOnToggle') !== "false",
6566
defaultOverflowVisible: Boolean(queryParams.get('showOverflow')),
6667
classNames: {
6768
main: ['p-plus'],

src/events/createEvent.ts

+11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export enum Events {
22
ShowOverflow = 'showOverflow',
33
HideOverflow = 'hideOverflow',
44
ItemsChanged = 'itemsChanged',
5+
ToggleClicked = 'toggleClicked',
56
}
67

78
export interface ItemsChangedEvent {
@@ -10,6 +11,12 @@ export interface ItemsChangedEvent {
1011
};
1112
}
1213

14+
export interface ToggleClickedEvent {
15+
detail: {
16+
original: Event,
17+
};
18+
}
19+
1320
function createEvent(name: Events, payload = {}) {
1421
return new CustomEvent(name, {
1522
detail: payload,
@@ -28,4 +35,8 @@ export function createItemsChangedEvent({ overflowCount }: ItemsChangedEvent['de
2835
return createEvent(Events.ItemsChanged, { overflowCount });
2936
}
3037

38+
export function createToggleClickedEvent({ original }: ToggleClickedEvent['detail']) {
39+
return createEvent(Events.ToggleClicked, { original });
40+
}
41+
3142
export default createEvent;

src/priorityPlus.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import {
22
createHideOverflowEvent,
33
createItemsChangedEvent,
44
createShowOverflowEvent,
5+
createToggleClickedEvent,
56
Events,
6-
ItemsChangedEvent,
77
} from './events/createEvent';
88
import createEventHandler from './events/eventHandler';
99
import DeepPartial from './types/DeepPartial';
@@ -66,6 +66,7 @@ interface Options {
6666
};
6767
collapseAtCount: number;
6868
defaultOverflowVisible: boolean;
69+
openOnToggle: boolean;
6970
innerToggleTemplate: string|((args: object) => string);
7071
}
7172

@@ -80,6 +81,7 @@ const defaultOptions: Options = {
8081
[El.NavItems]: ['p-plus__primary-nav-item'],
8182
},
8283
collapseAtCount: -1,
84+
openOnToggle: true,
8385
defaultOverflowVisible: false,
8486
innerToggleTemplate: 'More',
8587
};
@@ -373,7 +375,9 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
373375
*/
374376
function onToggleClick(e: Event) {
375377
e.preventDefault();
376-
toggleOverflowNav();
378+
eventHandler.trigger(
379+
createToggleClickedEvent({ original: e })
380+
);
377381
}
378382

379383
/**
@@ -413,6 +417,10 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
413417
el.primary[El.ToggleBtn].addEventListener('click', onToggleClick);
414418

415419
eventHandler.on(Events.ItemsChanged, onItemsChanged, false);
420+
421+
if (options.openOnToggle) {
422+
eventHandler.on(Events.ToggleClicked, toggleOverflowNav, false)
423+
}
416424
}
417425

418426
/**
@@ -435,7 +443,7 @@ function priorityPlus(targetElem: HTMLElement, userOptions: DeepPartial<Options>
435443
}
436444

437445
(function init() {
438-
validateAndThrow(targetElem, userOptions, defaultOptions),
446+
validateAndThrow(targetElem, userOptions, defaultOptions);
439447
setupEl();
440448
bindListeners();
441449
if (options.defaultOverflowVisible) setOverflowNavOpen(true);

0 commit comments

Comments
 (0)