mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-31 19:19:43 +01:00
Override automatic paste actions with our own to add certain directories as additional paste targets
This commit is contained in:
parent
286c730d08
commit
043c079f80
@ -185,6 +185,18 @@ class filemanager_ui
|
|||||||
'group' => $group,
|
'group' => $group,
|
||||||
'children' => array(),
|
'children' => array(),
|
||||||
),
|
),
|
||||||
|
'egw_paste' => array(
|
||||||
|
'enabled' => false,
|
||||||
|
'group' => $group + 0.5,
|
||||||
|
'hideOnDisabled' => true
|
||||||
|
),
|
||||||
|
'paste' => array(
|
||||||
|
'caption' => lang('Paste'),
|
||||||
|
'acceptedTypes' => 'file',
|
||||||
|
'group' => $group + 0.5,
|
||||||
|
'order' => 10,
|
||||||
|
'children' => array()
|
||||||
|
),
|
||||||
'documents' => filemanager_merge::document_action(
|
'documents' => filemanager_merge::document_action(
|
||||||
$GLOBALS['egw_info']['user']['preferences']['filemanager']['document_dir'],
|
$GLOBALS['egw_info']['user']['preferences']['filemanager']['document_dir'],
|
||||||
++$group, 'Insert in document', 'document_',
|
++$group, 'Insert in document', 'document_',
|
||||||
@ -246,6 +258,19 @@ class filemanager_ui
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// This would be done automatically, but we're overriding
|
||||||
|
foreach($actions as $action_id => $action)
|
||||||
|
{
|
||||||
|
if($action['type'] == 'drop' && $action['caption'])
|
||||||
|
{
|
||||||
|
$action['type'] = 'popup';
|
||||||
|
if($action['acceptedTypes'] == 'file')
|
||||||
|
{
|
||||||
|
$action['enabled'] = 'javaScript:app.filemanager.drop_enabled';
|
||||||
|
}
|
||||||
|
$actions['paste']['children']["{$action_id}_paste"] = $action;
|
||||||
|
}
|
||||||
|
}
|
||||||
return $actions;
|
return $actions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -798,6 +798,80 @@ app.classes.filemanager = AppJS.extend(
|
|||||||
}), 'fileprefs', '510x425');
|
}), 'fileprefs', '510x425');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to check if the drop action is enabled. We also update the
|
||||||
|
* clipboard historical targets here as well
|
||||||
|
*
|
||||||
|
* @param {egwAction} _action drop action we're checking
|
||||||
|
* @param {egwActionObject[]} _senders selected files
|
||||||
|
* @param {egwActionObject} _target Drop or context menu activated on this one
|
||||||
|
*
|
||||||
|
* @returns boolean true if enabled, false otherwise
|
||||||
|
*/
|
||||||
|
drop_enabled: function drop_enabled(_action, _senders, _target)
|
||||||
|
{
|
||||||
|
if(_action.canHaveChildren.indexOf('drop') == -1)
|
||||||
|
{
|
||||||
|
_action.canHaveChildren.push('drop');
|
||||||
|
}
|
||||||
|
var actions = [
|
||||||
|
// Current directory
|
||||||
|
{id:_action.id+'_current', caption: this.get_path(), path: this.get_path()}
|
||||||
|
];
|
||||||
|
|
||||||
|
// Target, if directory
|
||||||
|
actions.push({
|
||||||
|
id: _action.id+'_target',
|
||||||
|
caption: this.id2path(_target.id),
|
||||||
|
path: this.id2path(_target.id),
|
||||||
|
enabled: _target && _target.iface && jQuery(_target.iface.getDOMNode()).hasClass('isDir')
|
||||||
|
});
|
||||||
|
|
||||||
|
// Last 10 folders
|
||||||
|
var previous_dsts = jQuery.extend([], egw.preference('drop_history',this.appname));
|
||||||
|
var action_index = 0;
|
||||||
|
for(var i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
var path = i < previous_dsts.length ? previous_dsts[i] : '';
|
||||||
|
actions.push({
|
||||||
|
id: _action.id+'_target_'+action_index++,
|
||||||
|
caption: path,
|
||||||
|
path: path,
|
||||||
|
group: 2,
|
||||||
|
enabled: path && !(path === actions[0].path || actions[1] && path === actions[1].path)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Common stuff, every action needs these
|
||||||
|
for(var i = 0; i < actions.length; i++)
|
||||||
|
{
|
||||||
|
//actions[i].type = 'drop',
|
||||||
|
actions[i].acceptedTypes = _action.acceptedTypes;
|
||||||
|
actions[i].no_lang = true;
|
||||||
|
actions[i].hideOnDisabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_action.updateActions(actions);
|
||||||
|
|
||||||
|
// Create paste action
|
||||||
|
// This injects the clipboard data and calls the original handler
|
||||||
|
var paste_exec = function(action, selected) {
|
||||||
|
// Add in clipboard as a sender
|
||||||
|
var clipboard = JSON.parse(egw.getSessionItem('phpgwapi', 'egw_clipboard'));
|
||||||
|
|
||||||
|
// Set a flag so apps can tell the difference, if they need to
|
||||||
|
action.set_onExecute(action.parent.onExecute.fnct);
|
||||||
|
action.execute(clipboard.selected,selected[0]);
|
||||||
|
};
|
||||||
|
for(var i = 0; i < actions.length; i++)
|
||||||
|
{
|
||||||
|
_action.getActionById(actions[i].id).onExecute = jQuery.extend(true, {}, _action.onExecute);
|
||||||
|
|
||||||
|
_action.getActionById(actions[i].id).set_onExecute(paste_exec);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File(s) droped
|
* File(s) droped
|
||||||
*
|
*
|
||||||
@ -813,10 +887,22 @@ app.classes.filemanager = AppJS.extend(
|
|||||||
|
|
||||||
// Target will be missing ID if directory is empty
|
// Target will be missing ID if directory is empty
|
||||||
// so start with the current directory
|
// so start with the current directory
|
||||||
var nm_dst = this.get_path(_action.parent.data.nextmatch.getInstanceManager().uniqueId || false);
|
var parent = _action;
|
||||||
|
var nm = _target.manager.data.nextmatch;
|
||||||
|
while(!nm && parent.parent)
|
||||||
|
{
|
||||||
|
parent = parent.parent;
|
||||||
|
if(parent.data.nextmatch) nm = parent.data.nextmatch;
|
||||||
|
}
|
||||||
|
var nm_dst = this.get_path(nm.getInstanceManager().uniqueId || false);
|
||||||
|
|
||||||
|
// Action specifies a destination, target does not matter
|
||||||
|
if(_action.data && _action.data.path)
|
||||||
|
{
|
||||||
|
dst = _action.data.path;
|
||||||
|
}
|
||||||
// File(s) were dropped on a row, they want them inside
|
// File(s) were dropped on a row, they want them inside
|
||||||
if(_target)
|
else if(_target)
|
||||||
{
|
{
|
||||||
var dst = '';
|
var dst = '';
|
||||||
var paths = this._elems2paths([_target]);
|
var paths = this._elems2paths([_target]);
|
||||||
@ -833,7 +919,16 @@ app.classes.filemanager = AppJS.extend(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._do_action(_action.id.replace("file_drop_",''), src, false, dst || nm_dst);
|
// Remember the target for next time
|
||||||
|
var previous_dsts = jQuery.extend([], egw.preference('drop_history',this.appname));
|
||||||
|
previous_dsts.unshift(dst);
|
||||||
|
previous_dsts = Array.from(new Set(previous_dsts)).slice(0,9);
|
||||||
|
egw.set_preference(this.appname, 'drop_history', previous_dsts);
|
||||||
|
|
||||||
|
// Actual action id will be something like file_drop_{move|copy|link}[_other_id],
|
||||||
|
// but we need to send move, copy or link
|
||||||
|
var action_id = _action.id.replace("file_drop_",'').split('_',1)[0];
|
||||||
|
this._do_action(action_id, src, false, dst || nm_dst);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user