Infolog - Simplify UI by allowing free text in Contact field, and removing custom contact / phone from details tab.

Anything in address field is concatenated into contact.
This commit is contained in:
nathangray 2017-09-13 10:21:50 -06:00
parent 95e66730c4
commit 900fc840f2
22 changed files with 268 additions and 79 deletions

View File

@ -460,17 +460,16 @@ class infolog_bo
{
$info['old_pm_id'] = $info['pm_id'] = $id;
}
$info['info_link'] = array(
$info['info_link'] = $info['info_contact'] = array(
'app' => $app,
'id' => $id,
'title' => (!empty($info['info_from']) ? $info['info_from'] : $title),
);
$info['info_contact'] = $app.':'.$id;
//echo " title='$title'</p>\n";
return $info['blur_title'] = $title;
}
$info['info_link'] = array('title' => $info['info_from']);
$info['info_link'] = $info['info_contact'] = array('id' => 'none', 'title' => $info['info_from']);
$info['info_link_id'] = 0; // link might have been deleted
$info['info_custom_from'] = (int)!!$info['info_from'];
@ -959,13 +958,14 @@ class infolog_bo
Link::link('infolog',$info_id,$to_write['link_to']['to_id']);
$values['link_to']['to_id'] = $info_id;
}
$this->write_check_links($to_write);
$this->write_check_links($to_write);
if(!$values['info_link_id'] || $values['info_link_id'] != $to_write['info_link_id'])
{
// Just got a link ID, need to save it
$this->so->write($to_write);
$values['info_link_id'] = $to_write['info_link_id'];
$values['info_contact'] = $to_write['info_contact'];
$values['info_from'] = $to_write['info_from'];
$this->link_id2from($values);
}
@ -1057,7 +1057,8 @@ class infolog_bo
{
// eTemplate2 returns the array all ready
$app = $values['info_contact']['app'];
$id = $values['info_contact']['id'];
$id = (int)$values['info_contact']['id'];
$from = $values['info_contact']['search'];
}
else if ($values['info_contact'])
{
@ -1068,7 +1069,7 @@ class infolog_bo
{
unset($values['info_link_id'], $id, $values['info_contact']);
}
elseif ($app && $id)
else if ($app && $id)
{
if(!is_array($values['link_to']))
{
@ -1079,10 +1080,16 @@ class infolog_bo
$values['info_id'],
$app,$id
));
$values['info_from'] = Link::title($app, $id);
}
else if ($from)
{
$values['info_from'] = $from;
}
else
{
unset($values['info_link_id']);
$values['info_from'] = null;
}
}
else if ($values['pm_id'] && $values['info_id'] && !$values['old_pm_id'])
@ -1269,8 +1276,7 @@ class infolog_bo
$info = array(
'info_id' => 0,
'info_type' => $type,
'info_from' => implode(', ',$names),
'info_addr' => implode(', ',$emails),
'info_from' => implode(', ',$names) . implode(', ', $emails),
'info_subject' => $_subject,
'info_des' => $_message,
'info_startdate' => Api\DateTime::server2user($_date),
@ -1297,7 +1303,7 @@ class infolog_bo
}
if (!$contacts || !is_array($contacts) || !is_array($contacts[0]))
{
$info['msg'] = lang('Attention: No Contact with address %1 found.',$info['info_addr']);
$info['msg'] = lang('Attention: No Contact with address %1 found.',$info['info_from']);
$info['info_custom_from'] = true; // show the info_from line and NOT only the link
}
else

View File

@ -884,7 +884,7 @@ class infolog_so
if ($query['query']) $query['search'] = $query['query']; // allow both names
if ($query['search']) // we search in _from, _subject, _des and _extra_value for $query
{
$columns = array('info_from','info_addr','info_location','info_subject','info_extra_value');
$columns = array('info_from','info_location','info_subject','info_extra_value');
// at the moment MaxDB 7.5 cant cast nor search text columns, it's suppost to change in 7.6
if ($this->db->capabilities['like_on_text']) $columns[] = 'info_des';

View File

@ -50,7 +50,6 @@ class infolog_tracking extends Api\Storage\Tracking
var $field2history = array(
'info_type' => 'Ty',
'info_from' => 'Fr',
'info_addr' => 'Ad',
'info_link_id' => 'Li',
'info_id_parent' => 'parent',
'info_cat' => 'Ca',
@ -88,7 +87,6 @@ class infolog_tracking extends Api\Storage\Tracking
'info_from' => 'Contact',
'info_subject' => 'Subject',
'info_des' => 'Description',
'info_addr' => 'Phone/Email',
'info_link_id' => 'primary link',
'info_id_parent' => 'Parent',
'info_cat' => 'Category',
@ -218,7 +216,6 @@ class infolog_tracking extends Api\Storage\Tracking
foreach(array(
'info_type' => lang($this->infolog->enums['type'][$data['info_type']]).$id,
'info_from' => $data['info_from'],
'info_addr' => $data['info_addr'],
'info_cat' => $data['info_cat'] ? $GLOBALS['egw']->categories->id2name($data['info_cat']) : '',
'info_priority' => lang($this->infolog->enums['priority'][$data['info_priority']]),
'info_owner' => Api\Accounts::username($data['info_owner']),

View File

@ -480,7 +480,6 @@ class infolog_ui
// Check to see if we need to remove description
foreach($infos as $id => $info)
{
if (!(strpos($info['info_addr'],',')===false) && strpos($info['info_addr'],', ')===false) $info['info_addr'] = str_replace(',',', ',$info['info_addr']);
if (!$query['csv_export'] || !is_array($query['csv_export']))
{
$info['links'] =& $links[$id];
@ -1765,14 +1764,6 @@ class infolog_ui
{
$content['info_link_id'] = 0; // as field has to be int
}
if (is_array($content['info_contact']) && $content['info_contact']['id'])
{
$content['info_contact'] = $content['info_contact']['app'] . ':' . $content['info_contact']['id'];
}
else
{
$content['info_contact'] = false;
}
$active_tab = $content['tabs'];
if (!($info_id = $this->bo->write($content, true, true, true, $content['no_notifications'])))
{
@ -1921,7 +1912,6 @@ class infolog_ui
{
Framework::window_close(lang('Permission denied!'));
}
if (!(strpos($content['info_addr'],',')===false) && strpos($content['info_addr'],', ')===false) $content['info_addr'] = str_replace(',',', ',$content['info_addr']);
foreach(array('info_subject', 'info_des') as $key)
{
if(!isset($content[$key]) || strlen($content[$key]) < 75)
@ -2041,7 +2031,7 @@ class infolog_ui
$action_ids = explode(',',$action_id);
if(count($action_ids) == 1)
{
$content['info_contact'] = $action.':'.$action_id;
$content['info_contact'] = array('app' => $action, 'id' => $action_id);
}
foreach ($action_ids as $n => $id)
{
@ -2357,8 +2347,13 @@ class infolog_ui
if (!isset($content['info_contact']) || empty($content['info_contact']) || $content['info_contact'] === 'copy:')
{
$linkinfos = Link::get_link($info_link_id);
$content['info_contact'] = $linkinfos['link_app1']=='infolog'? $linkinfos['link_app2'].':'.$linkinfos['link_id2']:$linkinfos['link_app1'].':'.$linkinfos['link_id1'];
if (stripos($content['info_contact'],'projectmanager')!==false) $content['pm_id'] = $linkinfos['link_app1']=='projectmanager'? $linkinfos['link_id1']:$linkinfos['link_id2'];
$content['info_contact'] = $linkinfos['link_app1']=='infolog'?
array('app' => $linkinfos['link_app2'], 'id' => $linkinfos['link_id2']):
array('app' => $linkinfos['link_app1'], 'id' => $linkinfos['link_id1']);
if ($content['info_contact']['app'] == 'projectmanager')
{
$content['pm_id'] = $linkinfos['link_app1']=='projectmanager'? $linkinfos['link_id1']:$linkinfos['link_id2'];
}
}
unset($content['info_link_id']);
}
@ -2412,7 +2407,6 @@ class infolog_ui
$fields = array(
'info_cat' => 'Category',
'info_from' => 'Contact',
'info_addr' => 'Phone/Email',
'info_subject' => 'Subject',
'info_des' => 'Description',
'link_to' => 'Links',
@ -2424,7 +2418,6 @@ class infolog_ui
$excludefields = array(
'info_cat' => 'Category',
'info_from' => 'Contact',
'info_addr' => 'Phone/Email',
'info_subject' => 'Subject',
'info_des' => 'Description',
'link_to' => 'Links',
@ -2633,7 +2626,6 @@ class infolog_ui
$fields = array(
'info_type' => lang('Type'),
'info_from' => lang('Contact'),
'info_addr' => lang('Phone/Email'),
// 'info_link_id' => lang('primary link'),
'info_cat' => array('label' => lang('Category'),'type' => 'select-cat'),
'info_priority' => lang('Priority'),

View File

@ -109,7 +109,6 @@ class infolog_widget extends Etemplate\Widget\Entry
'info_des' => lang('Description'),
'info_cat' => lang('Category'),
'info_from' => lang('Contact'),
'info_addr' => lang('Phone/Email'),
'info_responsible' => lang('Responsible'),
'info_startdate' => lang('Startdate'),
'info_enddate' => lang('Enddate'),

View File

@ -21,7 +21,6 @@
<entry type="string" name="info_from">Contact</entry>
<entry type="string" name="info_subject">Subject</entry>
<entry type="string" name="info_des">Description</entry>
<entry type="string" name="info_addr">Phone/Email</entry>
<entry type="string" name="info_link_id">primary link</entry>
<entry type="string" name="info_cat">Category</entry>
<entry type="string" name="info_priority">Priority</entry>
@ -95,7 +94,6 @@
<entry type="string" name="2">info_from</entry>
<entry type="string" name="3">info_subject</entry>
<entry type="string" name="4">info_des</entry>
<entry type="string" name="5">info_addr</entry>
<entry type="string" name="6">info_link_id</entry>
<entry type="string" name="7">info_cat</entry>
<entry type="string" name="8">info_priority</entry>

View File

@ -12,7 +12,7 @@
*/
$setup_info['infolog']['name'] = 'infolog';
$setup_info['infolog']['version'] = '16.1.003';
$setup_info['infolog']['version'] = '16.1.004';
$setup_info['infolog']['app_order'] = 5;
$setup_info['infolog']['tables'] = array('egw_infolog','egw_infolog_extra','egw_infolog_users');
$setup_info['infolog']['enable'] = 1;

View File

@ -17,7 +17,6 @@ $phpgw_baseline = array(
'info_id' => array('type' => 'auto','nullable' => False,'comment' => 'id of the infolog-entry'),
'info_type' => array('type' => 'varchar','precision' => '40','nullable' => False,'default' => 'task','comment' => 'infolog-type e.g. task, phone, email or note'),
'info_from' => array('type' => 'varchar','precision' => '255','comment' => 'text of the primary link'),
'info_addr' => array('type' => 'varchar','precision' => '255','comment' => 'textfield for phone-number or email of the primary contact'),
'info_subject' => array('type' => 'varchar','precision' => '255','comment' => 'title of the infolog-entry'),
'info_des' => array('type' => 'longtext','comment' => 'desciption of the infolog-entry'),
'info_owner' => array('type' => 'int','meta' => 'account','precision' => '4','nullable' => False,'comment' => 'owner of the entry, can be account or group'),

View File

@ -932,3 +932,59 @@ function infolog_upgrade16_1_002()
return $GLOBALS['setup_info']['infolog']['currentver'] = '16.1.003';
}
/**
* Copy info_addr contents into info_from, contatinating if there is anything there
* already, then drop the info_addr column.
* @return string
*/
function infolog_upgrade16_1_003()
{
$GLOBALS['egw_setup']->db->query("UPDATE egw_infolog SET info_from = CONCAT(info_from, ', ', info_addr)".
" WHERE info_from IS NOT NULL AND info_addr IS NOT NULL", __LINE__, __FILE__);
$GLOBALS['egw_setup']->db->query("UPDATE egw_infolog SET info_from = info_addr".
" WHERE info_from IS NULL AND info_addr IS NOT NULL", __LINE__, __FILE__);
$GLOBALS['egw_setup']->oProc->DropColumn('egw_infolog',array(
'fd' => array(
'info_id' => array('type' => 'auto','nullable' => False,'comment' => 'id of the infolog-entry'),
'info_type' => array('type' => 'varchar','precision' => '40','nullable' => False,'default' => 'task','comment' => 'infolog-type e.g. task, phone, email or note'),
'info_from' => array('type' => 'varchar','precision' => '255','comment' => 'text of the primary link'),
'info_subject' => array('type' => 'varchar','precision' => '255','comment' => 'title of the infolog-entry'),
'info_des' => array('type' => 'longtext','comment' => 'desciption of the infolog-entry'),
'info_owner' => array('type' => 'int','meta' => 'account','precision' => '4','nullable' => False,'comment' => 'owner of the entry, can be account or group'),
'info_access' => array('type' => 'ascii','precision' => '10','default' => 'public','comment' => 'public or privat'),
'info_cat' => array('type' => 'int','meta' => 'category','precision' => '4','nullable' => False,'default' => '0','comment' => 'category id'),
'info_datemodified' => array('type' => 'int','meta' => 'timestamp','precision' => '8','nullable' => False,'comment' => 'timestamp of the last mofification'),
'info_startdate' => array('type' => 'int','meta' => 'timestamp','precision' => '8','nullable' => False,'default' => '0','comment' => 'timestamp of the startdate'),
'info_enddate' => array('type' => 'int','meta' => 'timestamp','precision' => '8','nullable' => False,'default' => '0','comment' => 'timestamp of the enddate'),
'info_id_parent' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0','comment' => 'id of the parent infolog'),
'info_planned_time' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0','comment' => 'pm-field: planned time'),
'info_replanned_time' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0','comment' => 'pm-field: replanned time'),
'info_used_time' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0','comment' => 'pm-field: used time'),
'info_status' => array('type' => 'varchar','precision' => '40','default' => 'done','comment' => 'status e.g. ongoing, done ...'),
'info_confirm' => array('type' => 'ascii','precision' => '10','default' => 'not'),
'info_modifier' => array('type' => 'int','meta' => 'user','precision' => '4','nullable' => False,'default' => '0','comment' => 'account id of the last modifier'),
'info_link_id' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0','comment' => 'id of the primary link'),
'info_priority' => array('type' => 'int','precision' => '2','default' => '1','comment' => '0=Low, 1=Normal, 2=High, 3=Urgent'),
'pl_id' => array('type' => 'int','precision' => '4','comment' => 'pm-field: id of the pricelist'),
'info_price' => array('type' => 'float','precision' => '8','comment' => 'pm-field: price-field'),
'info_percent' => array('type' => 'int','meta' => 'percent','precision' => '2','default' => '0','comment' => 'percentage of completion'),
'info_datecompleted' => array('type' => 'int','meta' => 'timestamp','precision' => '8','comment' => 'timestamp of completion'),
'info_location' => array('type' => 'varchar','precision' => '255','comment' => 'textfield location'),
'info_custom_from' => array('type' => 'int','precision' => '1','comment' => 'tick-box to show infolog_from'),
'info_uid' => array('type' => 'ascii','precision' => '128','comment' => 'unique id of the infolog-entry'),
'info_cc' => array('type' => 'varchar','precision' => '255','comment' => 'textfield for email-adress to be notified via email of changes'),
'caldav_name' => array('type' => 'ascii','precision' => '128','comment' => 'name part of CalDAV URL, if specified by client'),
'info_etag' => array('type' => 'int','precision' => '4','default' => '0','comment' => 'etag, not yet used'),
'info_created' => array('type' => 'int','meta' => 'timestamp','precision' => '8','comment' => 'timestamp of the creation date'),
'info_creator' => array('type' => 'int','meta' => 'user','precision' => '4','comment' => 'account id of the creator')
),
'pk' => array('info_id'),
'fk' => array(),
'ix' => array('caldav_name','info_owner','info_datemodified','info_id_parent'),
'uc' => array()
),'info_addr');
return $GLOBALS['setup_info']['infolog']['currentver'] = '16.1.004';
}

View File

@ -65,7 +65,7 @@
<image label="$row_cont[info_percent2]" src="{$row}[info_percent2]" onclick="window.open(egw::link('/index.php','menuaction=infolog.infolog_ui.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox options="0,0" class="infolog_fullWidth">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<link label="%s $row_cont[info_from]" id="${row}[info_link]" options="b"/>
<hbox options="0,0">
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description no_lang="1" align="right" id="{$row}[info_number]" class="infolog_infoId"/>
@ -190,7 +190,7 @@
<image label="$row_cont[info_percent2]" src="{$row}[info_percent2]" onclick="window.open(egw::link('/index.php','menuaction=infolog.infolog_ui.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox options="0,0" class="infolog_fullWidth">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<link label="%s $row_cont[info_from]" id="${row}[info_link]" options="b"/>
<hbox options="0,0">
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description no_lang="1" align="right" id="{$row}[info_number]" class="infolog_infoId"/>

View File

@ -136,8 +136,6 @@
</hbox>
<textbox size="36" maxlength="255" id="info_from" statustext="Custom contact-information, leave emtpy to use information from most recent link" blur="@blur_title" class="$cont[hide_from_css]" readonly="true"/>
</vbox>
<description options=",,,info_addr" value="Phone/Email"/>
<textbox size="30" maxlength="255" id="info_addr" statustext="Custom contact-address, leave empty to use information from most recent link" class="inputFullWidth" readonly="true"/>
</row>
<row class="row">
<description value="Subject" options=",,,info_subject"/>

View File

@ -141,16 +141,6 @@
<description value="Location" for="info_location"/>
<textbox id="info_location" size="60" maxlength="255" class="et2_fullWidth"/>
</row>
<row>
<description value="Contact" for="info_from"/>
<textbox blur="@blur_title" class="et2_fullWidth" statustext="Custom contact-information, leave emtpy to use information from most recent link" id="info_from" size="60" maxlength="255"/>
</row>
<row>
<description value="Phone/Email" for="info_addr"/>
<hbox>
<textbox statustext="Custom contact-address, leave empty to use information from most recent link" id="info_addr" size="60" maxlength="255" class="et2_fullWidth _inputFullWidth"/>
</hbox>
</row>
<row>
<description value="Private" for="info_access"/>
<checkbox statustext="should this entry only be visible to you and people you grant privat access via the ACL" id="info_access" options="private,public"/>
@ -190,7 +180,7 @@
</row>
<row class="dialogHeader3">
<description value="Contact"/>
<link-entry id="info_contact"/>
<link-entry id="info_contact" app_icons="true"/>
<description/>
<description value="Enddate" for="info_enddate"/>
<date-time statustext="til when should the ToDo or Phonecall be finished" id="info_enddate" class="et2_fullWidth" span="4"/>

View File

@ -18,7 +18,7 @@
</columns>
<rows>
<row>
<link label="%s $cont[info_addr]" id="info_link" options="b" span="all"/>
<link label="%s $cont[info_from]" id="info_link" options="b" span="all"/>
</row>
<row>
<description id="info_des" no_lang="1" span="all"/>

View File

@ -72,7 +72,6 @@
<progress label="$row_cont[info_percent]" id="{$row}[info_percent2]" href="javascript:egw.open($row_cont[info_id],'infolog');"/>
</hbox>
<vbox class="infolog_fullWidth">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<hbox>
<description id="${row}[info_subject]" no_lang="1" class="$row_cont[sub_class]"/>
<description align="right" id="{$row}[info_number]" no_lang="1" class="infolog_infoId"/>

View File

@ -72,7 +72,6 @@
<progress label="$row_cont[info_percent]" id="{$row}[info_percent2]" href="javascript:egw.open($row_cont[info_id],'infolog');"/>
</hbox>
<vbox class="infolog_fullWidth">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<hbox>
<description id="${row}[info_subject]" no_lang="1" class="$row_cont[sub_class]"/>
<description align="right" id="{$row}[info_number]" no_lang="1" class="infolog_infoId"/>

View File

@ -81,7 +81,6 @@
<progress label="$row_cont[info_percent]" id="{$row}[info_percent2]" href="javascript:egw.open($row_cont[info_id],'infolog');"/>
</hbox>
<vbox class="infolog_fullWidth">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<hbox>
<description id="${row}[info_subject]" no_lang="1" class="$row_cont[sub_class] et2_ellipsis" overflow="hidden" width="85%"/>
<description align="right" id="{$row}[info_number]" no_lang="1" class="infolog_infoId"/>

View File

@ -116,12 +116,6 @@
<description value="Contact" for="info_from"/>
<textbox blur="@blur_title" class="et2_fullWidth" statustext="Custom contact-information, leave emtpy to use information from most recent link" id="info_from" size="60" maxlength="255"/>
</row>
<row>
<description value="Phone/Email" for="info_addr"/>
<hbox>
<textbox statustext="Custom contact-address, leave empty to use information from most recent link" id="info_addr" size="60" maxlength="255" class="et2_fullWidth _inputFullWidth"/>
</hbox>
</row>
</rows>
</grid>
</template>

View File

@ -33,11 +33,6 @@
<description id="${row}[info_des]" no_lang="1" activate_links="1"/>
</box>
<hbox class ="infoLinksRow infoDetails" overflow="hidden">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b" class="infoDetails"/>
</hbox>
</vbox>
<vbox class="infolog_CompletedClmn">
<time_or_date id="${row}[info_startdate]" readonly="true" options=",8"/>

View File

@ -113,12 +113,6 @@
<description value="Contact" for="info_from"/>
<textbox blur="@blur_title" class="et2_fullWidth" statustext="Custom contact-information, leave emtpy to use information from most recent link" id="info_from" size="60" maxlength="255"/>
</row>
<row>
<description value="Phone/Email" for="info_addr"/>
<hbox>
<textbox statustext="Custom contact-address, leave empty to use information from most recent link" id="info_addr" size="60" maxlength="255" class="et2_fullWidth _inputFullWidth"/>
</hbox>
</row>
</rows>
</grid>
</template>

View File

@ -39,7 +39,7 @@
}
.normal,
.normal_done {
color: black;
color: #000000;
}
.high {
color: #cc0000;
@ -198,7 +198,7 @@ div#infolog-edit_infolog-edit-description {
height: auto;
}
div#infolog-edit_info_contact input.ui-autocomplete-input span.ui-icon-close {
background-color: #FFFFFF;
background-color: #ffffff;
background-size: contain;
background-position: 5px 5px;
top: 9px !important;

View File

@ -92,13 +92,6 @@ div.et2_box_widget {}
//
input.infolog-edit_info_custom_from {}
// Phone + Email
td.inputFullWidth{
input#infolog-edit_info_addr{}
}
// Kategorie

View File

@ -0,0 +1,181 @@
<?php
/**
* Test the contact field - If there is a free-text in info_contact, its content
* would be stored in info_from. If info_link_id is greater then 0, link-title
* of that id would be stored in info_from allowing regular search to find the
* entry.
*
* @link http://www.egroupware.org
* @author Nathan Gray
* @package infolog
* @copyright (c) 2017 Nathan Gray
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
namespace EGroupware\Infolog;
require_once realpath(__DIR__.'/../../api/src/test/AppTest.php'); // Application test base
use Egroupware\Api\Contacts;
class ContactTest extends \EGroupware\Api\AppTest
{
protected $ui;
protected $bo;
// Infolog under test
protected $info_id = null;
public function setUp()
{
$this->ui = new \infolog_ui();
$this->ui->tmpl = $this->getMockBuilder('\\Egroupware\\Api\\Etemplate')
->disableOriginalConstructor()
->setMethods(array('exec', 'read'))
->getMock($this->ui);
$this->bo = $this->ui->bo;
$this->mockTracking($this->bo, 'infolog_tracking');
}
public function tearDown()
{
// Double delete to make sure it's gone, not preserved due to history setting
$this->bo->delete($this->info_id);
$this->bo->delete($this->info_id);
$this->bo = null;
}
/**
* Test that free text in the info_contact field winds up in info_from, and
* when loaded again it is put into the search of info_contact for display.
*/
public function testFreeText()
{
$content = array(
'contact' => array(
'app' => 'addressbook',
'id' => Null,
'search'=> 'Free text'
)
);
$info = $this->getTestInfolog($content);
// Skipping notifications - save initial state
$this->info_id = $this->bo->write($info, true, true, true, true);
// Read it back to check
$saved = $this->bo->read($this->info_id);
$this->assertEquals($content['contact']['search'], $saved['info_from']);
$this->assertEquals(0, $saved['info_link_id']);
// Mock the etemplate call to check the results
$this->ui->tmpl->expects($this->once())
->method('exec')
->will(
$this->returnCallback(function($method, $info) {
$this->assertNotNull($info['info_id']);
$this->assertEquals('Free text', $info['info_contact']['title']);
return true;
})
);
// Make a call to edit, looks like initial load
$_REQUEST['info_id'] = $this->info_id;
$this->ui->edit();
// Change it
$saved['info_contact']['search'] = 'Totally different';
// Skipping notifications - save initial state
$this->bo->write($saved, true, true, true, true);
// Read it back to check
$resaved = $this->bo->read($this->info_id);
$this->assertEquals('Totally different', $resaved['info_from'], 'Did not change free text');
$this->assertEquals(0, $resaved['info_link_id']);
// Now clear it
$saved = $resaved;
$saved['info_contact']['search'] = '';
// Skipping notifications - save initial state
$this->bo->write($saved, false, false);
// Read it back to check
$resaved = $this->bo->read($this->info_id);
$this->assertEquals('', $resaved['info_from'], 'Did not clear free text');
$this->assertEquals(0, $resaved['info_link_id']);
}
/**
* Test that a selected entry is put into info_link_id, and its link title
* is put into info_from (not the search text)
*/
public function testLinkedEntry()
{
$content = array(
'contact' => array(
'app' => 'addressbook',
// Linking to current user's contact
'id' => $GLOBALS['egw_info']['user']['person_id'],
'search'=> 'Free text'
)
);
$link_title = $GLOBALS['egw']->contacts->link_title($content['contact']['id']);
$info = $this->getTestInfolog($content);
// Skipping notifications - save initial state
$this->info_id = $this->bo->write($info, true, true, true, true);
// Read it back to check
$saved = $this->bo->read($this->info_id);
$this->assertEquals($link_title, $saved['info_contact']['title'], 'Link title was missing');
$this->assertNotEquals(0, $saved['info_link_id']);
// Mock the etemplate call to check the results
$this->ui->tmpl->expects($this->once())
->method('exec')
->will(
$this->returnCallback(function($method, $info) use($link_title) {
$this->assertNotNull($info['info_id']);
$this->assertEquals('', $info['contact']['search']);
$this->assertEquals($GLOBALS['egw_info']['user']['person_id'], $info['info_contact']['id']);
$this->assertEquals($link_title, $info['info_contact']['title']);
})
);
// Make a call to edit, looks like initial load
$_REQUEST['info_id'] = $this->info_id;
$this->ui->edit();
}
/**
* Set up a basic infolog entry for testing with the specified fields
* set.
*
* @param Array $fields Fields to be set for initial conditions
* @return Array
*/
protected function getTestInfolog($fields)
{
$info = array(
'info_subject' => 'Test Infolog Entry for ' . $this->getName()
);
foreach($fields as $field => $value)
{
$info["info_{$field}"] = $value;
}
return $info;
}
}