You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
14 KiB

9 months ago
/**
* Definition of the contextmenu for Jspreadsheet on the "Edit" screen.
*
* @package TablePress
* @subpackage Views JavaScript
* @author Tobias Bäthge
* @since 2.0.0
*/
/* globals tp */
/* eslint-disable jsdoc/check-param-names, jsdoc/valid-types, jsdoc/no-undefined-types */
/**
* WordPress dependencies.
*/
import { __, _x, _n, sprintf } from '@wordpress/i18n';
/**
* Returns the entries for the table editor's context menu.
*
* @param {[type]} obj [description]
* @param {[type]} x [description]
* @param {[type]} y [description]
* @param {[type]} e [description]
* @return {Array} Context menu items.
*/
const contextMenu = ( obj /*, x, y, e */ ) => {
const num_rows = tp.editor.options.data.length;
const num_columns = tp.editor.options.columns.length;
const num_selected_rows = tp.helpers.selection.rows.length;
const num_selected_columns = tp.helpers.selection.columns.length;
const is_mac = window?.navigator?.platform?.includes( 'Mac' );
const meta_key = is_mac ?
_x( '⌘', 'keyboard shortcut modifier key on a Mac keyboard', 'tablepress' ) :
_x( 'Ctrl+', 'keyboard shortcut modifier key on a non-Mac keyboard', 'tablepress' );
const option_key = is_mac ?
_x( '⌥', 'keyboard shortcut option key on a Mac keyboard', 'tablepress' ) :
_x( 'Alt+', 'keyboard shortcut Alt key on a non-Mac keyboard', 'tablepress' );
// Call-by-reference object for the cell_merge_allowed() call.
const error_message = {
text: ''
};
tp.helpers.visibility.update();
const items = [
// Undo/Redo.
{
title: __( 'Undo', 'tablepress' ),
shortcut: sprintf( _x( '%1$sZ', 'keyboard shortcut for Undo', 'tablepress' ), meta_key ),
onclick: obj.undo,
disabled: ( -1 === obj.historyIndex ),
},
{
title: __( 'Redo', 'tablepress' ),
shortcut: sprintf( _x( '%1$sY', 'keyboard shortcut for Redo', 'tablepress' ), meta_key ),
onclick: obj.redo,
disabled: ( obj.historyIndex === obj.history.length - 1 ),
},
// Cut/Copy/Paste.
{
type: 'divisor',
},
{
title: __( 'Cut', 'tablepress' ),
shortcut: sprintf( _x( '%1$sX', 'keyboard shortcut for Cut', 'tablepress' ), meta_key ),
onclick() {
/* eslint-disable @wordpress/no-global-active-element */
if ( 'TEXTAREA' === document.activeElement.tagName && document.activeElement.selectionStart !== document.activeElement.selectionEnd ) {
document.execCommand( 'copy' ); // If text is selected in the actively edited cell, only copy that.
const cursorPosition = document.activeElement.selectionStart;
document.activeElement.value = document.activeElement.value.slice( 0, document.activeElement.selectionStart ) + document.activeElement.value.slice( document.activeElement.selectionEnd ); // Cut the selected content.
document.activeElement.selectionEnd = cursorPosition;
} else {
obj.copy( true ); // Otherwise, copy highlighted cells.
obj.setValue( obj.highlighted, '' ); // Make cell content empty.
}
/* eslint-enable @wordpress/no-global-active-element */
},
},
{
title: __( 'Copy', 'tablepress' ),
shortcut: sprintf( _x( '%1$sC', 'keyboard shortcut for Copy', 'tablepress' ), meta_key ),
onclick() {
if ( 'TEXTAREA' === document.activeElement.tagName && document.activeElement.selectionStart !== document.activeElement.selectionEnd ) { // eslint-disable-line @wordpress/no-global-active-element
document.execCommand( 'copy' ); // If text is selected in the actively edited cell, only copy that.
} else {
obj.copy( true ); // Otherwise, copy highlighted cells.
}
},
},
{
title: __( 'Paste', 'tablepress' ),
shortcut: sprintf( _x( '%1$sV', 'keyboard shortcut for Paste', 'tablepress' ), meta_key ),
onclick() {
/* eslint-disable @wordpress/no-global-active-element */
if ( 'TEXTAREA' === document.activeElement.tagName ) {
window.navigator.clipboard.readText().then( ( text ) => {
if ( text ) {
const cursorPosition = document.activeElement.selectionStart + text.length;
document.activeElement.value = document.activeElement.value.slice( 0, document.activeElement.selectionStart ) + text + document.activeElement.value.slice( document.activeElement.selectionEnd ); // Paste at the selection.
document.activeElement.selectionEnd = cursorPosition;
}
} );
} else if ( obj.selectedCell ) {
window.navigator.clipboard.readText().then( ( text ) => {
if ( text ) {
obj.paste( obj.selectedCell[0], obj.selectedCell[1], text );
}
} );
}
/* eslint-enable @wordpress/no-global-active-element */
},
// Firefox does not offer the readText() method, so "Paste" needs to be disabled.
disabled: ! window?.navigator?.clipboard?.readText,
tooltip: ! window?.navigator?.clipboard?.readText ? __( 'Your browser does not allow pasting via the context menu. Use the keyboard shortcut instead.', 'tablepress' ) : '',
},
// Insert Link, Insert Image, Open Advanced Editor.
{
type: 'divisor',
},
{
title: __( 'Insert Link', 'tablepress' ),
shortcut: sprintf( _x( '%1$sL', 'keyboard shortcut for Insert Link', 'tablepress' ), meta_key ),
onclick: tp.callbacks.insert_link.open_dialog.bind( null, ( 'TEXTAREA' === document.activeElement.tagName ) ? document.activeElement : null ), // eslint-disable-line @wordpress/no-global-active-element
},
{
title: __( 'Insert Image', 'tablepress' ),
shortcut: sprintf( _x( '%1$sI', 'keyboard shortcut for Insert Image', 'tablepress' ), meta_key ),
onclick: tp.callbacks.insert_image.open_dialog.bind( null, ( 'TEXTAREA' === document.activeElement.tagName ) ? document.activeElement : null ), // eslint-disable-line @wordpress/no-global-active-element
},
{
title: __( 'Advanced Editor', 'tablepress' ),
shortcut: sprintf( _x( '%1$sE', 'keyboard shortcut for Advanced Editor', 'tablepress' ), meta_key ),
onclick: tp.callbacks.advanced_editor.open_dialog.bind( null, ( 'TEXTAREA' === document.activeElement.tagName ) ? document.activeElement : null ), // eslint-disable-line @wordpress/no-global-active-element
},
// Duplicate/Insert/Append/Delete.
{
type: 'divisor',
},
{
title: __( 'Duplicate …', 'tablepress' ),
submenu: [
{
title: _n( 'Duplicate row', 'Duplicate rows', num_selected_rows, 'tablepress' ),
onclick: tp.callbacks.insert_duplicate.bind( null, 'duplicate', 'rows' ),
},
{
title: _n( 'Duplicate column', 'Duplicate columns', num_selected_columns, 'tablepress' ),
onclick: tp.callbacks.insert_duplicate.bind( null, 'duplicate', 'columns' ),
},
],
},
{
title: __( 'Insert …', 'tablepress' ),
submenu: [
{
title: _n( 'Insert row above', 'Insert rows above', num_selected_rows, 'tablepress' ),
onclick: tp.callbacks.insert_duplicate.bind( null, 'insert', 'rows', 'before' ),
},
{
title: _n( 'Insert row below', 'Insert rows below', num_selected_rows, 'tablepress' ),
onclick: tp.callbacks.insert_duplicate.bind( null, 'insert', 'rows', 'after' ),
},
{
title: _n( 'Insert column on the left', 'Insert columns on the left', num_selected_columns, 'tablepress' ),
onclick: tp.callbacks.insert_duplicate.bind( null, 'insert', 'columns', 'before' ),
},
{
title: _n( 'Insert column on the right', 'Insert columns on the right', num_selected_columns, 'tablepress' ),
onclick: tp.callbacks.insert_duplicate.bind( null, 'insert', 'columns', 'after' ),
},
],
},
{
title: __( 'Append …', 'tablepress' ),
submenu: [
{
title: __( 'Append row', 'tablepress' ),
onclick: tp.callbacks.append.bind( null, 'rows', 1 ),
},
{
title: __( 'Append column', 'tablepress' ),
onclick: tp.callbacks.append.bind( null, 'columns', 1 ),
},
],
},
{
title: __( 'Delete …', 'tablepress' ),
submenu: [
{
title: _n( 'Delete row', 'Delete rows', num_selected_rows, 'tablepress' ),
onclick: tp.callbacks.remove.bind( null, 'rows' ),
disabled: num_rows === num_selected_rows,
tooltip: num_rows === num_selected_rows ? __( 'This option is disabled.', 'tablepress' ) + ' ' + __( 'You can not delete all table rows!', 'tablepress' ) : '',
},
{
title: _n( 'Delete column', 'Delete columns', num_selected_columns, 'tablepress' ),
onclick: tp.callbacks.remove.bind( null, 'columns' ),
disabled: num_columns === num_selected_columns,
tooltip: num_columns === num_selected_columns ? __( 'This option is disabled.', 'tablepress' ) + ' ' + __( 'You can not delete all table columns!', 'tablepress' ) : '',
},
],
},
// Move rows/columns, Sort by column.
{
type: 'divisor',
},
{
title: __( 'Move …', 'tablepress' ),
submenu: [
{
title: _n( 'Move row up', 'Move rows up', num_selected_rows, 'tablepress' ),
shortcut: sprintf( _x( '%1$s⇧↑', 'keyboard shortcut for Move up', 'tablepress' ), meta_key ),
onclick: tp.callbacks.move.bind( null, 'up', 'rows' ),
disabled: ! tp.helpers.move_allowed( 'rows', 'up' ),
},
{
title: _n( 'Move row down', 'Move rows down', num_selected_rows, 'tablepress' ),
shortcut: sprintf( _x( '%1$s⇧↓', 'keyboard shortcut for Move down', 'tablepress' ), meta_key ),
onclick: tp.callbacks.move.bind( null, 'down', 'rows' ),
disabled: ! tp.helpers.move_allowed( 'rows', 'down' ),
},
{
title: _n( 'Move column left', 'Move columns left', num_selected_columns, 'tablepress' ),
shortcut: sprintf( _x( '%1$s⇧←', 'keyboard shortcut for Move left', 'tablepress' ), meta_key ),
onclick: tp.callbacks.move.bind( null, 'left', 'columns' ),
disabled: ! tp.helpers.move_allowed( 'columns', 'left' ),
},
{
title: _n( 'Move column right', 'Move columns right', num_selected_columns, 'tablepress' ),
shortcut: sprintf( _x( '%1$s⇧→', 'keyboard shortcut for Move right', 'tablepress' ), meta_key ),
onclick: tp.callbacks.move.bind( null, 'right', 'columns' ),
disabled: ! tp.helpers.move_allowed( 'columns', 'right' ),
},
{
type: 'divisor',
},
{
title: _n( 'Move row to the top', 'Move rows to the top', num_selected_rows, 'tablepress' ),
shortcut: sprintf( _x( '%1$s%2$s⇧↑', 'keyboard shortcut for Move to the top', 'tablepress' ), meta_key, option_key ),
onclick: tp.callbacks.move.bind( null, 'top', 'rows' ),
disabled: ! tp.helpers.move_allowed( 'rows', 'top' ),
},
{
title: _n( 'Move row to the bottom', 'Move rows to the bottom', num_selected_rows, 'tablepress' ),
shortcut: sprintf( _x( '%1$s%2$s⇧↓', 'keyboard shortcut for Move to the bottom', 'tablepress' ), meta_key, option_key ),
onclick: tp.callbacks.move.bind( null, 'bottom', 'rows' ),
disabled: ! tp.helpers.move_allowed( 'rows', 'bottom' ),
},
{
title: _n( 'Move column to first', 'Move columns to first', num_selected_columns, 'tablepress' ),
shortcut: sprintf( _x( '%1$s%2$s⇧←', 'keyboard shortcut for Move to first', 'tablepress' ), meta_key, option_key ),
onclick: tp.callbacks.move.bind( null, 'first', 'columns' ),
disabled: ! tp.helpers.move_allowed( 'columns', 'first' ),
},
{
title: _n( 'Move column to last', 'Move columns to last', num_selected_columns, 'tablepress' ),
shortcut: sprintf( _x( '%1$s%2$s⇧→', 'keyboard shortcut for Move to last', 'tablepress' ), meta_key, option_key ),
onclick: tp.callbacks.move.bind( null, 'last', 'columns' ),
disabled: ! tp.helpers.move_allowed( 'columns', 'last' ),
},
],
},
{
title: __( 'Sort by column …', 'tablepress' ),
submenu: [
{
title: __( 'Sort by column ascending', 'tablepress' ),
onclick: tp.callbacks.sort.bind( null, 'asc' ),
disabled: 1 !== num_selected_columns,
tooltip: 1 !== num_selected_columns ? __( 'This option is disabled because more than one column was selected.', 'tablepress' ) : '',
},
{
title: __( 'Sort by column descending', 'tablepress' ),
onclick: tp.callbacks.sort.bind( null, 'desc' ),
disabled: 1 !== num_selected_columns,
tooltip: 1 !== num_selected_columns ? __( 'This option is disabled because more than one column was selected.', 'tablepress' ) : '',
},
],
},
// Hide/Show rows/columns.
{
type: 'divisor',
},
{
title: __( 'Hide/Show …', 'tablepress' ),
submenu: [
{
title: _n( 'Hide row', 'Hide rows', num_selected_rows, 'tablepress' ),
onclick: tp.callbacks.hide_unhide.bind( null, 'hide', 'rows' ),
disabled: ! tp.helpers.visibility.selection_contains( 'rows', 1 ),
tooltip: ! tp.helpers.visibility.selection_contains( 'rows', 1 ) ? __( 'This option is disabled because no visible rows were selected.', 'tablepress' ) : '',
},
{
title: _n( 'Hide column', 'Hide columns', num_selected_columns, 'tablepress' ),
onclick: tp.callbacks.hide_unhide.bind( null, 'hide', 'columns' ),
disabled: ! tp.helpers.visibility.selection_contains( 'columns', 1 ),
tooltip: ! tp.helpers.visibility.selection_contains( 'columns', 1 ) ? __( 'This option is disabled because no visible columns were selected.', 'tablepress' ) : '',
},
{
title: _n( 'Show row', 'Show rows', num_selected_rows, 'tablepress' ),
onclick: tp.callbacks.hide_unhide.bind( null, 'unhide', 'rows' ),
disabled: ! tp.helpers.visibility.selection_contains( 'rows', 0 ),
tooltip: ! tp.helpers.visibility.selection_contains( 'rows', 0 ) ? __( 'This option is disabled because no hidden rows were selected.', 'tablepress' ) : '',
},
{
title: _n( 'Show column', 'Show columns', num_selected_columns, 'tablepress' ),
onclick: tp.callbacks.hide_unhide.bind( null, 'unhide', 'columns' ),
disabled: ! tp.helpers.visibility.selection_contains( 'columns', 0 ),
tooltip: ! tp.helpers.visibility.selection_contains( 'columns', 0 ) ? __( 'This option is disabled because no hidden columns were selected.', 'tablepress' ) : '',
},
],
},
// Merging/Unmerging cells.
{
type: 'divisor',
},
{
title: __( 'Combine/Merge cells', 'tablepress' ),
onclick: tp.callbacks.merge_cells,
disabled: ( 1 === num_selected_rows && 1 === num_selected_columns ) || ! tp.helpers.cell_merge_allowed( 'no-alert' ),
tooltip: ( 1 === num_selected_rows && 1 === num_selected_columns ) || ! tp.helpers.cell_merge_allowed( 'no-alert', error_message ) ? __( 'This option is disabled.', 'tablepress' ) + ' ' + error_message.text : '',
}
];
return items;
};
export default contextMenu;