Import/Export fixes from trunk

This commit is contained in:
Nathan Gray 2014-07-21 15:21:08 +00:00
parent 1b61cc04bb
commit 25f4984ab4
9 changed files with 101 additions and 23 deletions

View File

@ -100,8 +100,8 @@ class addressbook_export_contacts_csv implements importexport_iface_export_plugi
} }
continue; continue;
} }
// Custom fields & listed are not filtered with contact_ prefix // Custom fields & listed exceptions are not filtered with contact_ prefix
if(strpos($field, '#') !== 0 && !in_array($field, array('tid'))) if(strpos($field, '#') !== 0 && !in_array($field, array('tid','owner')))
{ {
$field = 'contact_'.$field; $field = 'contact_'.$field;
} }
@ -119,6 +119,10 @@ class addressbook_export_contacts_csv implements importexport_iface_export_plugi
{ {
$selection = explode(',',$options['selection']); $selection = explode(',',$options['selection']);
} }
if(!is_array($selection))
{
$selection = array();
}
$GLOBALS['egw_info']['flags']['currentapp'] = $old_app; $GLOBALS['egw_info']['flags']['currentapp'] = $old_app;
if(bo_merge::hasExportLimit($export_limit) && !$limit_exception) { if(bo_merge::hasExportLimit($export_limit) && !$limit_exception) {

View File

@ -59,6 +59,23 @@ class importexport_definitions_bo {
$query['col_filter'][] = $sql; $query['col_filter'][] = $sql;
} }
// Handle allowed filter
if($query['col_filter']['allowed_users'])
{
$allowed = array();
foreach((array)$query['col_filter']['allowed_users'] as $id)
{
$allowed[] = 'allowed_users '.
$GLOBALS['egw']->db->capabilities['case_insensitive_like'].' '.
$GLOBALS['egw']->db->quote('%,'.str_replace('_','\\_',$id) .',%');
}
if($allowed)
{
unset($query['col_filter']['allowed_users']);
$query['col_filter'][] = '('.implode(' OR ', $allowed) . ')';
}
}
$total = $this->so_sql->get_rows($query, $rows, $readonlys); $total = $this->so_sql->get_rows($query, $rows, $readonlys);
$ro_count = 0; $ro_count = 0;
foreach($rows as &$row) { foreach($rows as &$row) {

View File

@ -170,11 +170,12 @@ class importexport_definitions_ui
'csv_fields' => false, // Disable CSV export, uses own export 'csv_fields' => false, // Disable CSV export, uses own export
'default_cols' => '!actions', // switch legacy actions column and row off by default 'default_cols' => '!actions', // switch legacy actions column and row off by default
'row_id' => 'definition_id', 'row_id' => 'definition_id',
'placeholder_actions' => array('add') 'placeholder_actions' => array('add')
); );
if($_GET['application']) $content['nm']['col_filter']['application'] = $_GET['application']; if($_GET['application']) $content['nm']['col_filter']['application'] = $_GET['application'];
} }
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(); $content['nm']['actions'] = $this->get_actions();
@ -183,7 +184,10 @@ class importexport_definitions_ui
'import' => lang('import'), 'import' => lang('import'),
'export' => lang('export'), 'export' => lang('export'),
), ),
'allowed_users' => array(null => lang('Private'), 'all' => lang('all')) 'allowed_users' => array(
array('value' => 'private', 'label' => lang('Private')),
array('value' => 'all', 'label' => lang('all'))
)
); );
foreach ($this->plugins as $appname => $options) foreach ($this->plugins as $appname => $options)
{ {
@ -435,6 +439,13 @@ class importexport_definitions_ui
public function get_rows(&$query, &$rows, &$readonlys) { public function get_rows(&$query, &$rows, &$readonlys) {
$rows = array(); $rows = array();
egw_session::appsession('index','importexport',$query); egw_session::appsession('index','importexport',$query);
// Special handling for allowed users 'private'
if($query['col_filter']['allowed_users'] == 'private')
{
unset($query['col_filter']['allowed_users']);
$query['col_filter'][] = 'allowed_users = ' . $GLOBALS['egw']->db->quote(',,');
}
$bodefinitions = new importexport_definitions_bo($query['col_filter'], true); $bodefinitions = new importexport_definitions_bo($query['col_filter'], true);
// We don't care about readonlys for the UI // We don't care about readonlys for the UI
return $bodefinitions->get_rows($query, $rows, $discard); return $bodefinitions->get_rows($query, $rows, $discard);
@ -842,7 +853,7 @@ class importexport_definitions_ui
// Set owner for non-admins // Set owner for non-admins
$content['just_me'] = ((!$content['allowed_users'] || !$content['allowed_users'][0] && count($content['allowed_users']) ==1) && $content['owner']); $content['just_me'] = ((!$content['allowed_users'] || !$content['allowed_users'][0] && count($content['allowed_users']) ==1) && $content['owner']);
$content['all_users'] = is_array($content['allowed_users']) && array_key_exists('0',$content['allowed_users']) && $content['allowed_users'][0] == 'all' || $content['all_users'] = is_array($content['allowed_users']) && array_key_exists('0',$content['allowed_users']) && $content['allowed_users'][0] == 'all' ||
$content['allowed_users'] == 'all'; $content['allowed_users'] == 'all';
if(!$GLOBALS['egw']->acl->check('share_definition', EGW_ACL_READ, 'importexport') && !$GLOBALS['egw_info']['user']['apps']['admin']) if(!$GLOBALS['egw']->acl->check('share_definition', EGW_ACL_READ, 'importexport') && !$GLOBALS['egw_info']['user']['apps']['admin'])
{ {
$content['allowed_users'] = array(); $content['allowed_users'] = array();
@ -852,6 +863,12 @@ class importexport_definitions_ui
$content['just_me'] = true; $content['just_me'] = true;
} }
$sel_options = array(
'allowed_users' => array(
array('value' => null, 'label' => lang('Just me')),
array('value' => 'all', 'label' => lang('all users'))
)
);
// Hide 'just me' checkbox, users get confused by read-only // Hide 'just me' checkbox, users get confused by read-only
if($readonlys['just_me'] || !$this->can_edit($content)) if($readonlys['just_me'] || !$this->can_edit($content))
{ {

View File

@ -224,6 +224,8 @@ class importexport_export_ui {
$content['filter'][$field] = importexport_helper_functions::date_rel2abs($content['filter'][$field]); $content['filter'][$field] = importexport_helper_functions::date_rel2abs($content['filter'][$field]);
} }
} }
// Filter is used twice in template, but can't have the same ID
$content['filter_html'] = $content['filter_tpl'] = $content['filter'];
} }
} }
@ -286,6 +288,7 @@ class importexport_export_ui {
// Set filter // Set filter
// Note that because not all dates are DB dates, the plugin has to handle them // Note that because not all dates are DB dates, the plugin has to handle them
$filter = array(); $filter = array();
$_content['filter'] = $_content['filter_html'] ? $_content['filter_html'] : $_content['filter_tpl'];
if(is_array($_content['filter'])) if(is_array($_content['filter']))
{ {
foreach($_content['filter'] as $key => $value) foreach($_content['filter'] as $key => $value)

View File

@ -54,7 +54,7 @@ class importexport_widget_filter extends etemplate_widget_transformer
error_log("$this has no fields"); error_log("$this has no fields");
self::$transformation = array( self::$transformation = array(
'type' => 'label', 'type' => 'label',
'label' => 'No fields' 'value' => 'No fields'
); );
return parent::beforeSendToClient($cname); return parent::beforeSendToClient($cname);
} }

View File

@ -88,9 +88,9 @@ app.classes.importexport = AppJS.extend(
.show(100, jQuery.proxy(function() { .show(100, jQuery.proxy(function() {
widget.clicked = true; widget.clicked = true;
widget.getInstanceManager().submit(false, true); widget.getInstanceManager().submit(false, true);
widget.clicked = false; widget.clicked = false;
$j(widget.getRoot().getWidgetById('preview_box').getDOMNode()) $j(widget.getRoot().getWidgetById('preview_box').getDOMNode())
.removeClass('loading'); .removeClass('loading');
},this)); },this));
return false; return false;
}, },
@ -114,5 +114,48 @@ app.classes.importexport = AppJS.extend(
appname: data.application, appname: data.application,
definition: data.definition_id definition: data.definition_id
}), false, '850x440', app); }), false, '850x440', app);
},
/**
* Allowed users widget has been changed, if 'All users' or 'Just me'
* was selected, turn off any other options.
*/
allowed_users_change: function(node, widget)
{
var value = widget.getValue();
// Only 1 selected, no checking needed
if(value.length <= 1) return;
// Don't jump it to the top, it's weird
widget.selected_first = false;
var index = null;
var specials = ['','all']
for(var i = 0; i < specials.length; i++)
{
var special = specials[i];
if((index = value.indexOf(special)) >= 0)
{
if(window.event.target.value == special)
{
// Just clicked all/private, clear the others
value = [special];
}
else
{
// Just added another, clear special
value.splice(index,1);
}
// A little highlight to call attention to the change
$j('input[value="'+special+'"]',node).parent().parent().effect('highlight',{},500);
break;
}
}
if(index >= 0)
{
widget.set_value(value);
}
} }
}); });

View File

@ -17,14 +17,14 @@
<nextmatch-filterheader id="type" options="importexport" class="lr_padding"/> <nextmatch-filterheader id="type" options="importexport" class="lr_padding"/>
<nextmatch-sortheader label="Name" id="name" class="lr_padding"/> <nextmatch-sortheader label="Name" id="name" class="lr_padding"/>
<nextmatch-filterheader id="application" options="Application" class="lr_padding"/> <nextmatch-filterheader id="application" options="Application" class="lr_padding"/>
<nextmatch-accountfilter align="center" label="Allowed users" id="allowed_users" options="All,groups" class="lr_padding"/> <nextmatch-accountfilter align="center" id="allowed_users" options="Allowed users,groups" class="lr_padding"/>
<nextmatch-accountfilter label="Owner" id="owner"/> <nextmatch-accountfilter empty_label="Owner" id="owner"/>
</row> </row>
<row class="row $row_cont[class]"> <row class="row $row_cont[class]">
<image src="${row}[type]" no_lang="1" onclick="window.open(egw::link('/index.php','menuaction=importexport.importexport_${row_cont[type]}_ui.{$row_cont[type]}_dialog&amp;appname=${row_cont[application]}&amp;definition=${row_cont[name]}'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;" class="lr_padding button"/> <image src="${row}[type]" no_lang="1" onclick="window.open(egw::link('/index.php','menuaction=importexport.importexport_${row_cont[type]}_ui.{$row_cont[type]}_dialog&amp;appname=${row_cont[application]}&amp;definition=${row_cont[name]}'),'_blank','dependent=yes,width=850,height=440,scrollbars=yes,status=yes'); return false;" class="lr_padding button"/>
<description id="${row}[name]" no_lang="1" class="lr_padding"/> <description id="${row}[name]" no_lang="1" class="lr_padding"/>
<description id="${row}[application]" class="lr_padding"/> <description id="${row}[application]" class="lr_padding"/>
<listbox type="select-account" id="${row}[allowed_users]" no_lang="1" readonly="true" rows="5" options="both" class="lr_padding"/> <listbox type="select-account" id="${row}[allowed_users]" no_lang="1" readonly="true" rows="5" empty_label='Private' class="lr_padding"/>
<menulist> <menulist>
<menupopup type="select-account" id="${row}[owner]" readonly="true"/> <menupopup type="select-account" id="${row}[owner]" readonly="true"/>
</menulist> </menulist>

View File

@ -65,7 +65,7 @@
<row valign="top" disabled="@plugin_selectors_template"> <row valign="top" disabled="@plugin_selectors_template">
<html id="plugin_selectors_html" no_lang="1"/> <html id="plugin_selectors_html" no_lang="1"/>
<box class="filters"> <box class="filters">
<filter id="filter"/> <filter id="filter_html"/>
</box> </box>
</row> </row>
<row class="th" height="20" disabled="!@plugin_selectors_template"> <row class="th" height="20" disabled="!@plugin_selectors_template">
@ -75,7 +75,7 @@
<row valign="top" disabled="!@plugin_selectors_template"> <row valign="top" disabled="!@plugin_selectors_template">
<template id="@plugin_selectors_template"/> <template id="@plugin_selectors_template"/>
<box onclick="jQuery('input[value=\'filter\']').not(':checked').attr('checked',true).parent().effect('highlight',{},2000);" class="filters"> <box onclick="jQuery('input[value=\'filter\']').not(':checked').attr('checked',true).parent().effect('highlight',{},2000);" class="filters">
<filter id="filter"/> <filter id="filter_tpl"/>
</box> </box>
</row> </row>
</rows> </rows>

View File

@ -10,14 +10,8 @@
<row> <row>
<description id="msg" no_lang="1"/> <description id="msg" no_lang="1"/>
</row> </row>
<row disabled="@no_just_me">
<checkbox label="%s Just me" id="just_me"/>
</row>
<row disabled="@no_all_users">
<checkbox label="%s All users" id="all_users"/>
</row>
<row> <row>
<listbox type="select-account" id="allowed_users" rows="5" account_type="groups"/> <listbox type="select-account" id="allowed_users" rows="5" account_type="groups" onchange="app.importexport.allowed_users_change"/>
</row> </row>
</rows> </rows>
</grid> </grid>