Calendar: Add ability to choose target calendar when importing

This commit is contained in:
nathan 2023-01-16 15:31:25 -07:00
parent 8540977872
commit 8a43d88ffe
4 changed files with 77 additions and 17 deletions

View File

@ -12,6 +12,7 @@
*/
use EGroupware\Api;
use EGroupware\Api\Framework;
use EGroupware\Api\Link;
/**
@ -49,22 +50,22 @@ class calendar_import_csv extends importexport_basic_import_csv {
protected function init(importexport_definition $definition, importexport_import_csv $import_csv=NULL)
{
// fetch the addressbook bo
$this->bo= new calendar_boupdate();
$this->bo = new calendar_boupdate();
// Get the tracker for changes
$this->tracking = new calendar_tracking();
// Used for participants
$this->status_map = array_flip(array_map('lang',$this->bo->verbose_status));
$this->status_map = array_flip(array_map('lang', $this->bo->verbose_status));
$this->role_map = array_flip($this->bo->roles);
$this->lookups = array(
'priority' => Array(
'priority' => array(
0 => lang('None'),
1 => lang('Low'),
2 => lang('Normal'),
3 => lang('High')
),
),
'recurrence' => $this->bo->recur_types
);
}
@ -80,14 +81,30 @@ class calendar_import_csv extends importexport_basic_import_csv {
*/
public function import_record(importexport_iface_egw_record &$record, &$import_csv)
{
if (!is_a($record, calendar_egw_record::class)) throw new TypeError();
if(!is_a($record, calendar_egw_record::class))
{
throw new TypeError();
}
// set eventOwner
$options =& $this->definition->plugin_options;
$options['owner'] = $options['owner'] ? $options['owner'] : $this->user;
// Check options & set target calendar
// Make sure Owner from import dialog is not array
if(is_array($options['owner']))
{
$options['owner'] = array_pop($options['owner']);
}
if($options['owner'] == '')
{
$options['owner_from_csv'] = true;
}
$options['owner'] = $options['owner'] ?? $this->user;
// Set owner, unless it's supposed to come from CSV file
if($options['owner_from_csv']) {
if(!is_numeric($record['owner'])) {
if($options['owner_from_csv'])
{
if(!is_numeric($record->owner))
{
$this->errors[$import_csv->get_current_position()] = lang(
'Invalid owner ID: %1. Might be a bad field translation. Used %2 instead.',
$record->owner,
@ -430,7 +447,36 @@ class calendar_import_csv extends importexport_basic_import_csv {
*/
protected function row_preview(importexport_iface_egw_record &$row_entry)
{
$row_entry->participants = implode('<br />', $this->bo->participants(array('participants' => $row_entry->participants),true));
$row_entry->participants = implode('<br />', $this->bo->participants(array('participants' => $row_entry->participants), true));
}
/**
* return etemplate components for options.
* @abstract We can't deal with etemplate objects here, as an uietemplate
* objects itself are scipt orientated and not "dialog objects"
*
* @return array (
* name => string,
* content => array,
* sel_options => array,
* preserv => array,
* )
*/
public function get_options_etpl(importexport_definition &$definition = null)
{
$owner = $definition->plugin_options['owner'] ?? $GLOBALS['egw_info']['user']['account_id'];
// Make sure Owner from import dialog is not array
if(is_array($owner))
{
$owner = array_pop($owner);
}
$options = array(
'name' => 'calendar.import_csv',
'content' => array(
'owner' => $owner ? $owner : null
)
);
return $options;
}
}

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE overlay PUBLIC "-//EGroupware GmbH//eTemplate 2.0//EN" "https://www.egroupware.org/etemplate2.0.dtd">
<overlay>
<template id="calendar.import_csv" template="" lang="" group="0" version="1.9.001">
<calendar-owner id="owner" label="Import into" emptyLabel="From file" multiple="false"
class="et2-label-fixed"></calendar-owner>
<template id="importexport.import_dialog.csv"/>
</template>
</overlay>

View File

@ -249,9 +249,13 @@ use EGroupware\Api\Etemplate;
}
$data['message'] = $this->message;
Framework::includeJS('.','importexport','importexport');
Framework::includeJS('.', 'importexport', 'importexport');
Framework::includeJS('.', 'app', $data['appname']);
if($_GET['appname']) $readonlys['appname'] = true;
if($_GET['appname'])
{
$readonlys['appname'] = true;
}
$template->exec('importexport.importexport_import_ui.import_dialog', $data, $sel_options, $readonlys, $preserve, 2);
}

View File

@ -9,12 +9,13 @@
</columns>
<rows>
<row>
<et2-description value="Delimiter"></et2-description>
<et2-hbox cellpadding="0" cellspacing="0" noLang="1" >
<et2-select id="delimiter" onchange="var _this = jQuery(this); var text = _this.parent().parent().find('input'); if(_this.val() =='other') {text.val('');text.show(); text.focus();} else {text.hide();}" noLang="1"></et2-select>
<et2-textbox id="other_delimiter" maxlength="1" class="hide"></et2-textbox>
</et2-hbox>
</row>
<et2-hbox cellpadding="0" cellspacing="0" noLang="1">
<et2-select id="delimiter" label="Delimiter" class="et2-label-fixed"
onchange="let text = widget.getParent().getWidgetById('other_delimiter'); if(widget.value =='other') {text.value ='';text.classList.remove('hide'); text.focus();} else {text.classList.add('hide');}"
noLang="1"></et2-select>
<et2-textbox id="other_delimiter" maxlength="1" class="hide"></et2-textbox>
</et2-hbox>
</row>
</rows>
</grid>
</template>