Skip to content

Commit 193dc4d

Browse files
committed
Closed mar10#21 : 'action' option
1 parent 293a33c commit 193dc4d

7 files changed

+95
-11
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# 1.0.1 / Unreleased
1+
# 1.1.0 / 2013-06-30
2+
3+
* [FEATURE] Added `action` option for menu entries.
24

35
# 1.0.0 / 2013-06-12
46

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ $("#container").contextmenu({
4343
delegate: ".hasmenu",
4444
menu: [
4545
{title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy"},
46-
{title: "Paste", cmd: "paste", disabled: true },
4746
{title: "----"},
4847
{title: "More", children: [
4948
{title: "Sub 1", cmd: "sub1"},
@@ -56,6 +55,22 @@ $("#container").contextmenu({
5655
});
5756
```
5857

58+
59+
Instead of handling all menu commands in the `select` event, it is also possible
60+
to attach callbacks to single menu entries using the `action` property:
61+
```js
62+
$(document).contextmenu({
63+
delegate: ".hasmenu",
64+
menu: [
65+
{title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy", action: function(event, ui){
66+
alert("Copy " + ui.target.text());
67+
}
68+
},
69+
...
70+
});
71+
```
72+
73+
5974
To attach menus to *all* elements on the page that have `class="hasmenu"`,
6075
we use `document` as context:
6176
```js

jquery.ui-contextmenu.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
$.widget("moogle.contextmenu", {
21-
version: "1.0.0",
21+
version: "1.1.0",
2222
options: {
2323
delegate: null, // selector
2424
hide: { effect: "fadeOut", duration: "fast"},
@@ -126,12 +126,20 @@
126126
create: $.proxy(this.options.createMenu, this),
127127
focus: $.proxy(this.options.focus, this),
128128
select: $.proxy(function(event, ui){
129-
var isParent = (ui.item.has(">a[aria-haspopup='true']").length > 0);
130-
ui.cmd = normCommand(ui.item.find(">a").attr("href"));
129+
// User selected a menu entry
130+
var retval,
131+
isParent = (ui.item.has(">a[aria-haspopup='true']").length > 0),
132+
$a = ui.item.find(">a"),
133+
actionHandler = $a.data("actionHandler");
134+
ui.cmd = normCommand($a.attr("href"));
131135
ui.target = $(this.currentTarget);
132136
// ignore clicks, if they only open a sub-menu
133137
if( !isParent || !this.options.ignoreParentSelect){
134-
if( this._trigger.call(this, "select", event, ui) !== false ){
138+
retval = this._trigger.call(this, "select", event, ui);
139+
if( actionHandler ){
140+
retval = actionHandler.call(this, event, ui);
141+
}
142+
if( retval !== false ){
135143
this._closeMenu.call(this);
136144
}
137145
event.preventDefault();
@@ -289,6 +297,9 @@ $.extend($.moogle.contextmenu, {
289297
text: "" + entry.title,
290298
href: "#" + normCommand(entry.cmd)
291299
}).appendTo($parentLi);
300+
if( $.isFunction(entry.action) ){
301+
$a.data("actionHandler", entry.action);
302+
}
292303
if(entry.uiIcon){
293304
$a.append($("<span class='ui-icon'>").addClass(entry.uiIcon));
294305
}

jquery.ui-contextmenu.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ui-contextmenu",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44

55
"title": "jQuery UI context menu plugin",
66
"description": "Turn a jQuery UI Menu widget into a context menu.",

test/tests.js

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ var th = new TestHelpers(),
8787
{title: "----"},
8888
{title: "More", children: [
8989
{title: "Sub Item 1", cmd: "sub1"},
90-
{title: "Sub Item 2", cmd: "sub2"}
90+
{title: "Sub Item 2", cmd: "sub2" }
9191
]}
9292
],
9393
$ = jQuery;
@@ -318,4 +318,60 @@ asyncTest("UL menu", function(){
318318
});
319319

320320

321+
// ****************************************************************************
322+
323+
324+
module("'action' option", lifecycle);
325+
326+
asyncTest("Array menu", function(){
327+
var $ctx, $popup,
328+
menu = [
329+
{title: "Cut", cmd: "cut", uiIcon: "ui-icon-scissors",
330+
action: function(event, ui) {
331+
log("cut action");
332+
equal( ui.cmd, "cut", "action: ui.cmd is set" );
333+
equal( ui.target.text(), "AAA", "action: ui.target is set" );
334+
}
335+
},
336+
{title: "Copy", cmd: "copy", uiIcon: "ui-icon-copy"},
337+
{title: "Paste", cmd: "paste", uiIcon: "ui-icon-clipboard", disabled: true }
338+
];
339+
340+
expect(5);
341+
342+
$("#container").contextmenu({
343+
delegate: ".hasmenu",
344+
menu: menu,
345+
open: function(event){
346+
log("open");
347+
setTimeout(function(){
348+
click($popup, 0);
349+
}, 10);
350+
},
351+
select: function(event, ui){
352+
var t = ui.item ? $(ui.item).find("a:first").attr("href") : ui.item;
353+
log("select(" + t + ")");
354+
equal( ui.cmd, "cut", "select: ui.cmd is set" );
355+
equal( ui.target.text(), "AAA", "select: ui.target is set" );
356+
},
357+
close: function(event){
358+
log("close");
359+
}
360+
});
361+
362+
$ctx = $(":moogle-contextmenu");
363+
$popup = $ctx.contextmenu("getMenu");
364+
365+
log("open()");
366+
$ctx.contextmenu("open", $("span.hasmenu:first"));
367+
log("after open()");
368+
369+
setTimeout(function(){
370+
equal(logOutput(), "open(),after open(),open,select(#cut),cut action,close",
371+
"Event sequence OK.");
372+
start();
373+
}, 500);
374+
});
375+
376+
321377
});

ui-contextmenu.jquery.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ui-contextmenu",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44

55
"title": "jQuery UI context menu plugin",
66
"description": "Turn a jQuery UI Menu widget into a context menu.",

0 commit comments

Comments
 (0)