Add context menu

This commit is contained in:
Nathan Gray 2011-06-02 16:50:41 +00:00
parent 91f133a049
commit 8820c41c3d
7 changed files with 298 additions and 39 deletions

View File

@ -92,38 +92,62 @@ class importexport_definitions_ui
} }
} }
$bodefinitions = new importexport_definitions_bo(false, true);
if (is_array($content)) if (is_array($content))
{ {
if (isset($content['rows']['delete'])) // Handle legacy actions
if (isset($content['nm']['rows']['delete']))
{ {
$bodefinitions->delete(array_keys($content['delete'],'pressed')); $content['nm']['action'] = 'delete';
$content['nm']['selected'] = array_keys($content['nm']['rows']['delete'],'pressed');
} }
elseif(($button = array_search('pressed',$content['nm']['rows'])) !== false) elseif(($button = array_search('pressed',$content['nm']['rows'])) !== false)
{ {
$selected = $content['nm']['rows']['selected']; $selected = $content['nm']['rows']['selected'];
if(count($selected) < 1 || !is_array($selected)) exit(); if(count($selected) < 1 || !is_array($selected)) common::egw_exit();
switch ($button) switch ($button)
{ {
case 'delete_selected' : case 'delete_selected' :
$bodefinitions->delete($selected); $content['nm']['selected'] = $selected;
$content['nm']['action'] = 'delete';
break; break;
case 'export_selected': case 'export_selected':
$mime_type = ($GLOBALS['egw']->html->user_agent == 'msie' || $GLOBALS['egw']->html->user_agent == 'opera') ? $content['nm']['selected'] = $selected;
'application/octetstream' : 'application/octet-stream'; $content['nm']['action'] = 'export';
$name = 'importexport_definition.xml';
header('Content-Type: ' . $mime_type);
header('Content-Disposition: attachment; filename="'.$name.'"');
echo $bodefinitions->export($selected);
exit();
break; break;
default:
} }
} }
if ($content['nm']['action'])
{
if (!count($content['nm']['selected']) && !$content['nm']['select_all'])
{
$msg = lang('You need to select some entries first!');
}
else
{
// Action has an additional parameter
if(in_array($content['nm']['action'], array('owner', 'allowed')))
{
if($content['nm']['action'] == 'allowed' && $content['allowed_private'])
{
$content['allowed'] = null;
}
if(is_array($content[$content['nm']['action']]))
{
$content[$content['nm']['action']] = implode(',',$content[$content['nm']['action']]);
}
$content['nm']['action'] .= '_' . $content[$content['nm']['action']];
}
if ($this->action($content['nm']['action'],$content['nm']['selected'],$content['nm']['select_all'],
$success,$failed,$action_msg,'index',$msg))
{
$msg .= lang('%1 definition(s) %2',$success,$action_msg);
}
elseif(empty($msg))
{
$msg .= lang('%1 definition(s) %2, %3 failed because of insufficent rights !!!',$success,$action_msg,$failed);
}
}
}
} }
if(!is_array($content['nm'])) { if(!is_array($content['nm'])) {
@ -134,13 +158,14 @@ class importexport_definitions_ui
'no_filter2' => true, 'no_filter2' => true,
'header_right' => 'importexport.definition_index.add', 'header_right' => 'importexport.definition_index.add',
'csv_fields' => false, // Disable CSV export, uses own export 'csv_fields' => false, // Disable CSV export, uses own export
'row_id' => 'id', 'default_cols' => '!actions', // switch legacy actions column and row off by default
'actions' => $this->get_actions() 'row_id' => 'definition_id',
); );
} }
if(egw_session::appsession('index', 'importexport')) { if(egw_session::appsession('index', 'importexport')) {
$content['nm'] = array_merge($content['nm'], egw_session::appsession('index', 'importexport')); $content['nm'] = array_merge($content['nm'], egw_session::appsession('index', 'importexport'));
} }
$content['nm']['actions'] = $this->get_actions();
$sel_options = array( $sel_options = array(
'type' => array( 'type' => array(
'import' => lang('import'), 'import' => lang('import'),
@ -154,29 +179,191 @@ class importexport_definitions_ui
$sel_options['application'][$appname] = lang($appname); $sel_options['application'][$appname] = lang($appname);
} }
} }
if($msg) $content['msg'] = $msg;
$etpl = new etemplate(self::_appname.'.definition_index'); $etpl = new etemplate(self::_appname.'.definition_index');
return $etpl->exec( self::_appname.'.importexport_definitions_ui.index', $content, $sel_options, $readonlys, $preserv ); return $etpl->exec( self::_appname.'.importexport_definitions_ui.index', $content, $sel_options, $readonlys, $preserv );
} }
private function get_actions() { private function get_actions() {
$group = 1; $group = 0;
$actions = array( $actions = array(
'edit' => array( 'edit' => array(
'caption' => 'Edit', 'caption' => 'Open',
'default' => true,
'allowOnMultiple' => false, 'allowOnMultiple' => false,
'url' => 'menuaction=addressbook.addressbook_ui.edit&contact_id=$id', 'url' => 'menuaction=importexport.importexport_definitions_ui.edit&definition=$id',
'popup' => egw_link::get_registry('addressbook', 'add_popup'), 'popup' => 'width=500,height=500',
'group' => $group, 'group' => $group,
'disableClass' => 'rowNoEdit', 'disableClass' => 'rowNoEdit',
), ),
); 'add' => array(
$actions['select_all'] = array( 'caption' => 'Add',
'url' => 'menuaction=importexport.importexport_definitions_ui.edit',
'popup' => 'width=500,height=500',
'group' => $group,
),
'execute' => array(
'caption' => 'Execute',
'icon' => 'importexport/navbar',
'allowOnMultiple' => false,
'group' => $group,
),
'schedule' => array(
'caption' => 'Schedule',
'icon' => 'schedule',
'allowOnMultiple' => false,
'url' => 'menuaction=importexport.importexport_schedule_ui.edit&definition=$id',
'popup' => 'width=500,height=500',
'group' => $group,
),
'change' => array(
'caption' => 'Change',
'icon' => 'edit',
'children' => array(
'owner' => array(
'caption' => 'Owner',
'group' => 1,
'nm_action' => 'open_popup',
),
'allowed' => array(
'caption' => 'Allowed users',
'group' => 1,
'nm_action' => 'open_popup',
)
),
),
'select_all' => array(
'caption' => 'Whole query', 'caption' => 'Whole query',
'checkbox' => true, 'checkbox' => true,
'hint' => 'Apply the action on the whole query, NOT only the shown contacts!!!', 'hint' => 'Apply the action on the whole query, NOT only the shown contacts!!!',
'group' => ++$group, 'group' => ++$group,
),
'copy' => array(
'caption' => 'Copy',
'group' => ++$group,
),
'export' => array(
'caption' => 'Export',
'group' => $group,
),
'delete' => array(
'caption' => 'Delete',
'confirm' => 'Delete this entry',
'confirm_multiple' => 'Delete these entries',
'group' => ++$group,
'disableClass' => 'rowNoDelete',
),
); );
// Unset admin actions
if(!$GLOBALS['egw_info']['user']['apps']['admin'])
{
unset($actions['schedule']);
}
return $actions;
}
/**
* apply an action to multiple entries
*
* @param string/int $action 'delete', 'export', etc.
* @param array $selected id's to use if !$use_all
* @param boolean $use_all if true use all entries of the current selection (in the session)
* @param int &$success number of succeded actions
* @param int &$failed number of failed actions (not enought permissions)
* @param string &$action_msg translated verb for the actions, to be used in a message like %1 contacts 'deleted'
* @param string/array $session_name 'index' or 'email', or array with session-data depending if we are in the main list or the popup
* @return boolean true if all actions succeded, false otherwise
*/
function action($action,$selected,$use_all,&$success,&$failed,&$action_msg,$session_name,&$msg)
{
//echo __METHOD__."('$action', ".array2string($selected).', '.array2string($use_all).",,, '$session_name')";
if ($use_all)
{
// get the whole selection
$old_query = $query = is_array($session_name) ? $session_name : egw_session::appsession($session_name,'importexport');
@set_time_limit(0); // switch off the execution time limit, as it's for big selections to small
$query['num_rows'] = -1; // all
$this->get_rows($query,$rows,$readonlys);
$selected = array();
foreach($rows as $row) {
$selected[] = $row['definition_id'];
}
if(!is_array($session_name))
{
// Restore old query
egw_session::appsession($session_name, 'importexport',$old_query);
}
}
// Dialogs to get options
list($action, $settings) = explode('_', $action, 2);
$bodefinitions = new importexport_definitions_bo(false, true);
switch($action) {
case 'execute':
// There's probably a way to do this in just JS, all the info should be there...
foreach($selected as $id) {
$definition = $bodefinitions->read((int)$id);
$link = egw::link('/index.php', array(
'menuaction' => 'importexport.importexport_'.$definition['type'].'_ui.'.$definition['type'].'_dialog',
'appname' => $definition['application'],
'definition' => $definition['name']
));
egw_framework::set_onload("egw_openWindowCentered2('$link','_blank',850,440,'yes');");
}
break;
case 'allowed':
$action = 'allowed_users';// Field is allowed_users, popup doesn't like _
case 'owner':
$action_msg = lang('changed'. ' ' . $action);
foreach($selected as $id) {
$definition = $bodefinitions->read((int)$id);
if($definition['definition_id']) {
// Prevent private with no owner
if(!$definition['owner'] && !$settings) $definition['owner'] = $GLOBALS['egw_info']['user']['account_id'];
$definition[$action] = $settings;
$bodefinitions->save($definition);
$success++;
}
}
break;
case 'delete':
$bodefinitions->delete($selected);
$action_msg = lang('deleted');
break;
case 'export' :
$action_msg = lang('exported');
$mime_type = ($GLOBALS['egw']->html->user_agent == 'msie' || $GLOBALS['egw']->html->user_agent == 'opera') ?
'application/octetstream' : 'application/octet-stream';
$name = 'importexport_definition.xml';
header('Content-Type: ' . $mime_type);
header('Content-Disposition: attachment; filename="'.$name.'"');
echo $bodefinitions->export($selected);
common::egw_exit();
break;
case 'copy':
$action_msg = lang('copied');
// Should only be one selected
foreach($selected as $id) {
$definition = $bodefinitions->read((int)$id);
if($definition['definition_id']) {
unset($definition['definition_id']);
$definition['name'] = $settings ? $settings : $definition['name'] . ' copy';
$bodefinitions->save($definition);
$success++;
}
}
break;
}
return !$failed;
} }
public function get_rows(&$query, &$rows, &$readonlys) { public function get_rows(&$query, &$rows, &$readonlys) {
@ -473,7 +660,7 @@ class importexport_definitions_ui
{ {
try { try {
$check_definition = new importexport_definition($content['name']); $check_definition = new importexport_definition($content['name']);
if($check_definition && $check_definition->definition_id != $content['definition_id']) if($check_definition && $check_definition->definition_id && $check_definition->definition_id != $content['definition_id'])
{ {
throw new Exception('Already exists'); throw new Exception('Already exists');
} }

View File

@ -62,6 +62,8 @@
public function edit($content = array()) { public function edit($content = array()) {
$id = $_GET['id'] ? $_GET['id'] : $content['id']; $id = $_GET['id'] ? $_GET['id'] : $content['id'];
$definition_id = $_GET['definition'];
unset($content['id']); unset($content['id']);
$data = $content; $data = $content;
@ -103,6 +105,17 @@
} }
} else { } else {
$data['type'] = $content['type'] ? $content['type'] : 'import'; $data['type'] = $content['type'] ? $content['type'] : 'import';
if((int)$definition_id) {
$bo = new importexport_definitions_bo();
$definition = $bo->read($definition_id);
if($definition['definition_id']) {
$data['type'] = $definition['type'];
$data['appname'] = $definition['application'];
$data['plugin'] = $definition['plugin'];
$data['definition'] = $definition['name'];
}
}
} }
if($data['target'] && $data['type']) { if($data['target'] && $data['type']) {

View File

@ -11,3 +11,4 @@ function clear_options(id) {
list.options[count] = null; list.options[count] = null;
} }
} }

View File

@ -10,6 +10,8 @@ admin disabled exporting importexport en Admin disabled exporting
allowed users importexport en Allowed users allowed users importexport en Allowed users
automatically created by importexport importexport en Automatically created by importexport automatically created by importexport importexport en Automatically created by importexport
basic csv import importexport en Basic CSV import basic csv import importexport en Basic CSV import
changed allowed_users importexport en changed allowed users
changed owner importexport en changed owner
charset of file importexport en Charset of file charset of file importexport en Charset of file
check all importexport en Check all check all importexport en Check all
choose a name for this definition importexport en Choose a name for this definition choose a name for this definition importexport en Choose a name for this definition

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,25 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="importexport.import_definition" template="" lang="" group="0" version="1.9.001">
<grid>
<columns>
<column/>
</columns>
<rows>
<row>
<description value="Import definitions (Attension: Existing definitions with equal names will be overwritten!!!)"/>
</row>
<row>
<file id="import_file"/>
</row>
<row>
<hbox>
<button label="Import" id="import"/>
<button label="Update default-definitions" id="update"/>
</hbox>
</row>
</rows>
</grid>
</template>
</overlay>