Skip to content

Commit f788b15

Browse files
committed
Merge branch 'master' of https://github.com/6pac/SlickGrid
2 parents 112eae7 + 24f30f6 commit f788b15

File tree

7 files changed

+480
-105
lines changed

7 files changed

+480
-105
lines changed

cypress/e2e/example-grid-menu.cy.ts

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,135 @@ describe('Example - Grid Menu', () => {
287287
.should('be.visible')
288288
.click({ force: true });
289289
});
290+
291+
it('should be able to open Grid Menu and click on Export->Text and expect alert triggered with Text Export', () => {
292+
const subCommands1 = ['Text', 'Excel'];
293+
const stub = cy.stub();
294+
cy.on('window:alert', stub);
295+
296+
cy.get('#myGrid')
297+
.find('button.slick-gridmenu-button')
298+
.click({ force: true });
299+
300+
cy.get('.slick-gridmenu.slick-menu-level-0 .slick-gridmenu-command-list')
301+
.find('.slick-gridmenu-item')
302+
.contains('Export')
303+
.click();
304+
305+
cy.get('.slick-gridmenu.slick-menu-level-1 .slick-gridmenu-command-list')
306+
.should('exist')
307+
.find('.slick-gridmenu-item')
308+
.each(($command, index) => expect($command.text()).to.contain(subCommands1[index]));
309+
310+
cy.get('.slick-gridmenu.slick-menu-level-1 .slick-gridmenu-command-list')
311+
.find('.slick-gridmenu-item')
312+
.contains('Text')
313+
.click()
314+
.then(() => expect(stub.getCall(0)).to.be.calledWith('Exporting as Text'));
315+
});
316+
317+
it('should be able to open Grid Menu and click on Export->Excel->xls and expect alert triggered with Excel (xls) Export', () => {
318+
const subCommands1 = ['Text', 'Excel'];
319+
const subCommands2 = ['Excel (csv)', 'Excel (xls)'];
320+
const stub = cy.stub();
321+
cy.on('window:alert', stub);
322+
323+
cy.get('#myGrid')
324+
.find('button.slick-gridmenu-button')
325+
.click({ force: true });
326+
327+
cy.get('.slick-gridmenu.slick-menu-level-0 .slick-gridmenu-command-list')
328+
.find('.slick-gridmenu-item')
329+
.contains('Export')
330+
.click();
331+
332+
cy.get('.slick-gridmenu.slick-menu-level-1 .slick-gridmenu-command-list')
333+
.should('exist')
334+
.find('.slick-gridmenu-item')
335+
.each(($command, index) => expect($command.text()).to.contain(subCommands1[index]));
336+
337+
cy.get('.slick-submenu').should('have.length', 1);
338+
cy.get('.slick-gridmenu.slick-menu-level-1 .slick-gridmenu-command-list')
339+
.find('.slick-gridmenu-item')
340+
.contains('Excel')
341+
.click();
342+
343+
cy.get('.slick-gridmenu.slick-menu-level-2 .slick-gridmenu-command-list').as('subMenuList2');
344+
345+
cy.get('@subMenuList2')
346+
.find('.slick-menu-title')
347+
.contains('available formats');
348+
349+
cy.get('@subMenuList2')
350+
.should('exist')
351+
.find('.slick-gridmenu-item')
352+
.each(($command, index) => expect($command.text()).to.contain(subCommands2[index]));
353+
cy.get('.slick-submenu').should('have.length', 2);
354+
355+
cy.get('.slick-gridmenu.slick-menu-level-2 .slick-gridmenu-command-list')
356+
.find('.slick-gridmenu-item')
357+
.contains('Excel (xls)')
358+
.click()
359+
.then(() => expect(stub.getCall(0)).to.be.calledWith('Exporting as Excel (xls)'));
360+
cy.get('.slick-submenu').should('have.length', 0);
361+
});
362+
363+
it('should open Export->Excel context sub-menu then open Feedback->ContactUs sub-menus and expect previous Export menu to no longer exists', () => {
364+
const subCommands1 = ['Text', 'Excel'];
365+
const subCommands2 = ['Request update from shipping team', '', 'Contact Us'];
366+
const subCommands2_1 = ['Email us', 'Chat with us', 'Book an appointment'];
367+
368+
const stub = cy.stub();
369+
cy.on('window:alert', stub);
370+
371+
cy.get('#myGrid')
372+
.find('button.slick-gridmenu-button')
373+
.click({ force: true });
374+
375+
cy.get('.slick-gridmenu.slick-menu-level-0 .slick-gridmenu-command-list')
376+
.find('.slick-gridmenu-item')
377+
.contains('Export')
378+
.click();
379+
380+
cy.get('.slick-gridmenu.slick-menu-level-1 .slick-gridmenu-command-list')
381+
.should('exist')
382+
.find('.slick-gridmenu-item')
383+
.each(($command, index) => expect($command.text()).to.contain(subCommands1[index]));
384+
385+
// click different sub-menu
386+
cy.get('.slick-gridmenu.slick-menu-level-0')
387+
.find('.slick-gridmenu-item')
388+
.contains('Feedback')
389+
.should('exist')
390+
.click();
391+
392+
cy.get('.slick-submenu').should('have.length', 1);
393+
cy.get('.slick-gridmenu.slick-menu-level-1')
394+
.should('exist')
395+
.find('.slick-gridmenu-item')
396+
.each(($command, index) => expect($command.text()).to.contain(subCommands2[index]));
397+
398+
// click on Feedback->ContactUs
399+
cy.get('.slick-gridmenu.slick-menu-level-1.dropleft') // left align
400+
.find('.slick-gridmenu-item')
401+
.contains('Contact Us')
402+
.should('exist')
403+
.click();
404+
405+
cy.get('.slick-submenu').should('have.length', 2);
406+
cy.get('.slick-gridmenu.slick-menu-level-2.dropright') // right align
407+
.should('exist')
408+
.find('.slick-gridmenu-item')
409+
.each(($command, index) => expect($command.text()).to.eq(subCommands2_1[index]));
410+
411+
cy.get('.slick-gridmenu.slick-menu-level-2');
412+
413+
cy.get('.slick-gridmenu.slick-menu-level-2 .slick-gridmenu-command-list')
414+
.find('.slick-gridmenu-item')
415+
.contains('Chat with us')
416+
.click()
417+
.then(() => expect(stub.getCall(0)).to.be.calledWith('Command: contact-chat'));
418+
419+
cy.get('.slick-submenu').should('have.length', 0);
420+
});
290421
});

examples/example-grid-menu.html

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@
8787
.slick-columnpicker-list input[type=checkbox]:checked + label:before {
8888
opacity: 1; /* checked icon */
8989
}
90+
.slick-gridmenu.slick-submenu {
91+
background-color: #fbfbfb;
92+
/* border-width: 2px; */
93+
box-shadow: 0 2px 4px 2px rgba(146, 152, 163, 0.4);
94+
/* min-width: 150px; */
95+
}
9096
</style>
9197
</head>
9298
<body>
@@ -175,6 +181,7 @@ <h2>View Source:</h2>
175181
// when not passed, it will act as a regular Column Picker (with default Grid Menu image of drag-handle.png)
176182
gridMenu: {
177183
useClickToRepositionMenu: false, // defaults to true (false would use the icon offset to reposition the grid menu)
184+
subItemChevronClass: 'sgi sgi-chevron-right',
178185
menuUsabilityOverride: function (args) {
179186
// we could disable the menu entirely by returning false
180187
return true;
@@ -244,6 +251,36 @@ <h2>View Source:</h2>
244251
title: "Disabled Command",
245252
disabled: true,
246253
command: "custom-command"
254+
},
255+
"divider",
256+
{
257+
// we can also have multiple nested sub-menus
258+
command: 'export', title: 'Export',
259+
customItems: [
260+
{ command: "export-txt", title: "Text" },
261+
{
262+
command: 'sub-menu', title: 'Excel', cssClass: "green", subMenuTitle: "available formats", subMenuTitleCssClass: "italic orange",
263+
customItems: [
264+
{ command: "export-csv", title: "Excel (csv)" },
265+
{ command: "export-xls", title: "Excel (xls)" },
266+
]
267+
}
268+
]
269+
},
270+
{
271+
command: 'feedback', title: 'Feedback',
272+
customItems: [
273+
{ command: "request-update", title: "Request update from shipping team", iconCssClass: "sgi sgi-tag-outline", tooltip: "this will automatically send an alert to the shipping team to contact the user for an update" },
274+
"divider",
275+
{
276+
command: 'sub-menu', title: 'Contact Us', iconCssClass: "sgi sgi-user", subMenuTitle: "contact us...", subMenuTitleCssClass: "italic",
277+
customItems: [
278+
{ command: "contact-email", title: "Email us", iconCssClass: "sgi sgi-pencil-outline" },
279+
{ command: "contact-chat", title: "Chat with us", iconCssClass: "sgi sgi-message-outline" },
280+
{ command: "contact-meeting", title: "Book an appointment", iconCssClass: "sgi sgi-coffee-outline" },
281+
]
282+
}
283+
]
247284
}
248285
]
249286
}
@@ -383,7 +420,16 @@ <h2>View Source:</h2>
383420
grid.setSortColumns([]);
384421
dataView.refresh();
385422
} else {
386-
alert("Command: " + args.command);
423+
switch (args.command) {
424+
case "export-csv":
425+
case "export-txt":
426+
case "export-xls":
427+
alert("Exporting as " + args.item.title);
428+
break;
429+
default:
430+
alert("Command: " + args.command);
431+
break;
432+
}
387433
}
388434
});
389435

@@ -404,6 +450,11 @@ <h2>View Source:</h2>
404450
gridMenuControl.onMenuClose.subscribe(function(e, args) {
405451
console.log('Menu is closing');
406452
grid.autosizeColumns();
453+
454+
// you can prevent Grid Menu from closing
455+
// e.preventDefault();
456+
// console.log('default prevented')
457+
// return false;
407458
});
408459

409460
grid.onAutosizeColumns.subscribe(function(e, args) {

0 commit comments

Comments
 (0)