Closed ChrisLincoln closed 3 years ago
Hi,
Currently, no. it is either the default contextmenu or the custom contextmenu. in code of Jexcel it's writed like this :
if (options && options.contextMenu != null) {
obj.options.contextMenu = options.contextMenu;
} else {
obj.options.contextMenu = function(el, x, y, e) {
var items = [];
/* .... */
}
}
}
On pro version you have access to default items for add/edit items.
here default items for CE
contextMenu: function(el, x, y, e) {
var items = [];
var obj = el.jexcel;
if (y == null) {
// Insert a new column
if (obj.options.allowInsertColumn == true) {
items.push({
title:obj.options.text.insertANewColumnBefore,
onclick:function() {
obj.insertColumn(1, parseInt(x), 1);
}
});
}
if (obj.options.allowInsertColumn == true) {
items.push({
title:obj.options.text.insertANewColumnAfter,
onclick:function() {
obj.insertColumn(1, parseInt(x), 0);
}
});
}
// Delete a column
if (obj.options.allowDeleteColumn == true) {
items.push({
title:obj.options.text.deleteSelectedColumns,
onclick:function() {
obj.deleteColumn(obj.getSelectedColumns().length ? undefined : parseInt(x));
}
});
}
// Rename column
if (obj.options.allowRenameColumn == true) {
items.push({
title:obj.options.text.renameThisColumn,
onclick:function() {
obj.setHeader(x);
}
});
}
// Sorting
if (obj.options.columnSorting == true) {
// Line
items.push({ type:'line' });
items.push({
title:obj.options.text.orderAscending,
onclick:function() {
obj.orderBy(x, 0);
}
});
items.push({
title:obj.options.text.orderDescending,
onclick:function() {
obj.orderBy(x, 1);
}
});
}
} else {
// Insert new row
if (obj.options.allowInsertRow == true) {
items.push({
title:obj.options.text.insertANewRowBefore,
onclick:function() {
obj.insertRow(1, parseInt(y), 1);
}
});
items.push({
title:obj.options.text.insertANewRowAfter,
onclick:function() {
obj.insertRow(1, parseInt(y));
}
});
}
if (obj.options.allowDeleteRow == true) {
items.push({
title:obj.options.text.deleteSelectedRows,
onclick:function() {
obj.deleteRow(obj.getSelectedRows().length ? undefined : parseInt(y));
}
});
}
if (x) {
if (obj.options.allowComments == true) {
items.push({ type:'line' });
var title = obj.records[y][x].getAttribute('title') || '';
items.push({
title: title ? obj.options.text.editComments : obj.options.text.addComments,
onclick:function() {
var comment = prompt(obj.options.text.comments, title);
if (comment) {
obj.setComments([ x, y ], comment);
}
}
});
if (title) {
items.push({
title:obj.options.text.clearComments,
onclick:function() {
obj.setComments([ x, y ], '');
}
});
}
}
}
}
// Line
items.push({ type:'line' });
// Copy
items.push({
title:obj.options.text.copy,
shortcut:'Ctrl + C',
onclick:function() {
obj.copy(true);
}
});
// Paste
if (navigator && navigator.clipboard) {
items.push({
title:obj.options.text.paste,
shortcut:'Ctrl + V',
onclick:function() {
if (obj.selectedCell) {
navigator.clipboard.readText().then(function(text) {
if (text) {
jexcel.current.paste(obj.selectedCell[0], obj.selectedCell[1], text);
}
});
}
}
});
}
// Save
if (obj.options.allowExport) {
items.push({
title: obj.options.text.saveAs,
shortcut: 'Ctrl + S',
onclick: function () {
obj.download();
}
});
}
// About
if (obj.options.about) {
items.push({
title:obj.options.text.about,
onclick:function() {
alert(obj.options.about);
}
});
}
return items;
},
That will be possible using plugins. That is not currently available on the CE, but it would be in future releases.
In 4.6.0, if one wants to replace the functionality of a single context menu choice, they must replicate the entire context menu function from the library code, and replace the behavior of the item they want to change.
I currently want to implement the "Rename this column" menu item with one that does not use prompt().
I thought I saw mention of "major release" coming forth. (I may have my libraries and/or years mixed up. I couldn't find the issue to reference it). If not, would you be interested in a PR that takes a stab at providing the above ability?