link functionality is now working, the UI is not very pretty

This commit is contained in:
Ralf Becker 2002-09-03 23:09:21 +00:00
parent 94fb1f402d
commit d89bce6364
8 changed files with 314 additions and 73 deletions

View File

@ -21,7 +21,6 @@
/*! /*!
@class bolink @class bolink
@author ralfbecker @author ralfbecker
@author ralfbecker
@abstract generalized linking between entries of phpGroupware apps - BO layer @abstract generalized linking between entries of phpGroupware apps - BO layer
@discussion This class is the BO-layer of the links @discussion This class is the BO-layer of the links
@discussion Links have to ends each pointing to an entry, an entry is a double: @discussion Links have to ends each pointing to an entry, an entry is a double:
@ -78,9 +77,122 @@
$this->public_functions += array( // extend the public_functions of solink $this->public_functions += array( // extend the public_functions of solink
'query' => True, 'query' => True,
'title' => True, 'title' => True,
'view' => True
); );
} }
/*!
@function link
@syntax link( $app1,$id1,$app2,$id2='',$remark='',$user=0 )
@author ralfbecker
@abstract creats a link between $app1,$id1 and $app2,$id2 - $id1 does NOT need to exist yet
@param $app1 app of $id1
@param $id1 id of item to linkto or 0 if item not yet created or array with links of not created item
@param $app2 app of 2.linkend or array with links ($id2 not used)
@param $remark Remark to be saved with the link (defaults to '')
@param $owner Owner of the link (defaults to user)
@discussion Does NOT check if link already exists
@result db-errno or -1 (for param-error) or 0 for success
@result if $id1==0 or already an array: $id1 is array with links
*/
function link( $app1,&$id1,$app2,$id2='',$remark='',$owner=0 )
{
if ($this->debug)
{
echo "<p>bolink.link('$app1',$id1,'$app2',$id2,'$remark',$owner)</p>\n";
}
if (!$app1 || !$app2 || !$id1 && isarray($id2) || $app1 == $app2 && $id1 == $id2)
{
return -1;
}
if (is_array($id1) || !$id1) // create link only in $id1 array
{
if (!is_array($id1))
{
$id1 = array( );
}
$id1["$app2:$id2"] = array(
'app' => $app2,
'id' => $id2,
'remark' => $remark,
'owner' => $owner,
'link_id' => "$app2:$id2"
);
return 0;
}
if (is_array($app2) && !$id2)
{
reset($app2);
$err = 0;
while (!$err && list(,$link) = each($app2))
{
$err = solink::link($app1,$id1,$link['app'],$link['id'],$link['remark'],$link['owner']);
}
return $err;
}
return solink::link($app1,$id1,$app2,$id2,$remark,$owner);
}
/*!
@function get_links
@syntax get_links( $app,$id,$only_app='',$only_name='',$order='link_lastmod DESC' )
@author ralfbecker
@abstract returns array of links to $app,$id (reimplemented to deal with not yet created items)
@param $id id of entry in $app or array of links if entry not yet created
@param $only_app if set return only links from $only_app (eg. only addressbook-entries) or NOT from if $only_app[0]=='!'
@param $order defaults to newest links first
@result array of links or empty array if no matching links found
*/
function get_links( $app,$id,$only_app='',$order='link_lastmod DESC' )
{
if (is_array($id) || !$id)
{
$ids = array();
if (is_array($id))
{
if ($not_only = $only_app[0])
{
$only_app = substr(1,$only_app);
}
reset($id);
while (list($key,$link) = each($id))
{
if ($only_app && $not_only == ($link['app'] == $only_app))
{
continue;
}
$ids[$key] = $link;
}
}
return $ids;
}
return solink::get_links($app,$id,$only_app,$order);
}
/*!
@function unlink
@syntax unlink( $link_id,$app='',$id='',$owner='' )
@author ralfbecker
@abstract Remove link with $link_id or all links matching given $app,$id
@param $link_id link-id to remove if > 0
@param $app,$id,$owner if $link_id <= 0: removes all links matching the non-empty params
@discussion Note: if $link_id != '' and $id is an array: unlink removes links from that array only
@discussion unlink has to be called with &$id so see the result !!!
@result the number of links deleted
*/
function unlink($link_id,$app='',$id='',$owner='')
{
if ($link_id > 0 || !is_array($id))
{
return solink::unlink($link_id,$app,$id,$owner);
}
$result = isset($id[$link_id]);
unset($id[$link_id]);
return $result;
}
/*! /*!
@function app_list @function app_list
@syntax app_list( ) @syntax app_list( )
@ -118,8 +230,11 @@
return array(); return array();
} }
$method = $reg['query']; $method = $reg['query'];
echo "<p>bolink.query('$app','$pattern') => '$method'</p>\n";
if ($this->debug)
{
echo "<p>bolink.query('$app','$pattern') => '$method'</p>\n";
}
return strchr($method,'.') ? ExecMethod($method,$pattern) : $this->$method($pattern); return strchr($method,'.') ? ExecMethod($method,$pattern) : $this->$method($pattern);
} }
@ -132,13 +247,44 @@
*/ */
function title($app,$id) function title($app,$id)
{ {
if ($app == '' || !is_array($reg = $this->app_register[$app]) || !is_set($reg['title'])) if ($app == '' || !is_array($reg = $this->app_register[$app]) || !isset($reg['title']))
{ {
return array(); return array();
} }
$method = $reg['title']; $method = $reg['title'];
return strchr($method,'.') ? ExecuteMethod($method,$id) : $this->$method($id); return strchr($method,'.') ? ExecMethod($method,$id) : $this->$method($id);
}
/*!
@function view
@syntax view( $app,$id )
@author ralfbecker
@abstract view entry $id of $app
@result array with name-value pairs for link to view-methode of $app to view $id
*/
function view($app,$id)
{
if ($app == '' || !is_array($reg = $this->app_register[$app]) || !isset($reg['view']) || !isset($reg['view_id']))
{
return array();
}
$view = $reg['view'];
$names = explode(':',$reg['view_id']);
if (count($names) > 1)
{
$id = explode(':',$id);
while (list($n,$name) = each($names))
{
$view[$name] = $id[$n];
}
}
else
{
$view[$reg['view_id']] = $id;
}
return $view;
} }
/*! /*!

View File

@ -15,7 +15,6 @@
/*! /*!
@class linkto_widget @class linkto_widget
@author ralfbecker @author ralfbecker
@author ralfbecker
@abstract widget that enable you to make a link to an other entry of a link-aware app @abstract widget that enable you to make a link to an other entry of a link-aware app
@discussion This widget is independent of the UI as it only uses etemplate-widgets and has therefor no render-function @discussion This widget is independent of the UI as it only uses etemplate-widgets and has therefor no render-function
*/ */
@ -36,7 +35,7 @@
{ {
$search = $value['search'] ? 1 : 0; $search = $value['search'] ? 1 : 0;
$create = $value['create'] ? 1 : 0; $create = $value['create'] ? 1 : 0;
echo "<p>linkto_widget.preprocess: query='$value[query]',app='$value[app]',search=$search,create=$create</p>\n"; //echo "<p>linkto_widget.preprocess: query='$value[query]',app='$value[app]',search=$search,create=$create</p>\n";
if ($search && count($ids = $this->link->query($value['app'],$value['query']))) if ($search && count($ids = $this->link->query($value['app'],$value['query'])))
{ {
@ -76,15 +75,17 @@
$create = $value['create'] ? 1 : 0; $create = $value['create'] ? 1 : 0;
list($value['app']) = @$value['app']; // no multiselection list($value['app']) = @$value['app']; // no multiselection
list($value['id']) = @$value['id']; list($value['id']) = @$value['id'];
echo "<p>linkto_widget.postprocess: query='$value[query]',app='$value[app]',id='$value[id]', search=$search,create=$create</p>\n"; //echo "<p>linkto_widget.postprocess: query='$value[query]',app='$value[app]',id='$value[id]', search=$search,create=$create</p>\n";
$templ->loop = $search;
if ($create) if ($create)
{ {
$value = array_merge($value,$GLOBALS['phpgw_info']['etemplate']['extension_data']['linkto_widget'][$cell['name']]); $value = array_merge($value,$GLOBALS['phpgw_info']['etemplate']['extension_data']['linkto_widget'][$cell['name']]);
// make the link if ($value['to_app']) // make the link
echo "<p>linkto($value[app],$value[id],'$value[remark]')</p>\n"; {
$this->link->link($value['to_app'],$value['to_id'],$value['app'],$value['id'],$value['remark']);
echo "<p>linkto($value[app],$value[id],'$value[remark]')</p>\n";
}
} }
$templ->loop = $search || $create;
} }
} }

View File

@ -15,7 +15,6 @@
/*! /*!
@class solink @class solink
@author ralfbecker @author ralfbecker
@author ralfbecker
@abstract generalized linking between entries of phpGroupware apps - DB layer @abstract generalized linking between entries of phpGroupware apps - DB layer
@discussion This class is to access the links in the DB @discussion This class is to access the links in the DB
@discussion Links have to ends each pointing to an entry, an entry is a double: @discussion Links have to ends each pointing to an entry, an entry is a double:
@ -31,7 +30,7 @@
'unlink' => True, 'unlink' => True,
'chown' => True 'chown' => True
); );
var $db,$db2; var $db;
var $user; var $user;
var $db_name = 'phpgw_links'; var $db_name = 'phpgw_links';
var $debug = 0; var $debug = 0;
@ -50,9 +49,9 @@
/*! /*!
@function link @function link
@syntax link( $app1,$name1,$id1,$app2,$name2,$id2,$remark='',$user=0 ) @syntax link( $app1,$id1,$app2,$id2,$remark='',$user=0 )
@author ralfbecker @author ralfbecker
@abstract creats a link between $app1,$name1,$id1 and $app2,$name2,$id2 @abstract creats a link between $app1,$id1 and $app2,$id2
@param $remark Remark to be saved with the link (defaults to '') @param $remark Remark to be saved with the link (defaults to '')
@param $owner Owner of the link (defaults to user) @param $owner Owner of the link (defaults to user)
@discussion Does NOT check if link already exists @discussion Does NOT check if link already exists
@ -61,8 +60,9 @@
function link( $app1,$id1,$app2,$id2,$remark='',$owner=0 ) function link( $app1,$id1,$app2,$id2,$remark='',$owner=0 )
{ {
if ($this->debug) if ($this->debug)
echo "<p>solink.link($app1,$id1,$app2,$id2,'$remark',$owner)</p>\n"; {
echo "<p>solink.link('$app1',$id1,'$app2',$id2,'$remark',$owner)</p>\n";
}
if ($app1 == $app2 && $id1 == $id2 || if ($app1 == $app2 && $id1 == $id2 ||
$id1 == '' || $id2 == '' || $app1 == '' || $app2 == '') $id1 == '' || $id2 == '' || $app1 == '' || $app2 == '')
{ {
@ -89,10 +89,10 @@
/*! /*!
@function get_links @function get_links
@syntax get_links( $app,$name,$id,$only_app='',$only_name='',$order='link_lastmod DESC' ) @syntax get_links( $app,$id,$only_app='',$only_name='',$order='link_lastmod DESC' )
@author ralfbecker @author ralfbecker
@abstract returns array of links to $app,$name,$id @abstract returns array of links to $app,$id
@param $only_app if set return only links from $only_app (eg. only addressbook-entries) @param $only_app if set return only links from $only_app (eg. only addressbook-entries) or NOT from if $only_app[0]=='!'
@param $order defaults to newest links first @param $order defaults to newest links first
@result array of links or empty array if no matching links found @result array of links or empty array if no matching links found
*/ */
@ -111,6 +111,10 @@
} }
$this->db->query($sql); $this->db->query($sql);
if ($not_only = $only_app[0] == '!')
{
$only_app = substr($only_app,1);
}
while ($this->db->next_record()) while ($this->db->next_record())
{ {
$row = $this->db->Record; $row = $this->db->Record;
@ -129,7 +133,7 @@
'id' => stripslashes($row['link_id1']) 'id' => stripslashes($row['link_id1'])
); );
} }
if ($only_app != '' && $link['app'] != $only_app) if ($only_app && $not_only == ($link['app'] == $only_app))
{ {
continue; continue;
} }

View File

@ -711,21 +711,11 @@
return; return;
} }
$app2var = array('addressbook' => 'id_addr','projects' => 'id_project','calendar' => 'id_event' );
$linkto = get_var('linkto',Array('POST')); $linkto = get_var('linkto',Array('POST'));
if (is_array($linkto) && $linkto['create']) if (is_array($linkto) && $linkto['create'] && ($var = $app2var[$linkto['app']]))
{ {
switch ($linkto['app']) $$var = $linkto['id'];
{
case 'addressbook':
$id_addr = $linkto['id'];
break;
case 'projects':
$id_project = $linkto['id'];
break;
case 'calendar':
$id_event = $linkto['id'];
break;
}
} }
// check wether to write dates or not // check wether to write dates or not
if ($selfortoday) if ($selfortoday)
@ -897,8 +887,8 @@
$GLOBALS['phpgw']->template->set_file(array('info_edit_t' => 'form.tpl')); $GLOBALS['phpgw']->template->set_file(array('info_edit_t' => 'form.tpl'));
$GLOBALS['phpgw']->template->set_block('info_edit_t','info_edit'); $GLOBALS['phpgw']->template->set_block('info_edit_t','info_edit');
$GLOBALS['phpgw']->template->set_var('linkto',$this->link->getEntry('linkto')); $GLOBALS['phpgw']->template->set_var('linkto',$this->link->getEntry('linkto','infolog',&$info_id).
$this->link->showLinks('links','infolog',$info_id));
if (is_array($error)) if (is_array($error))
{ {
$GLOBALS['phpgw']->template->set_var('error_list',$GLOBALS['phpgw']->common->error_list($error)); $GLOBALS['phpgw']->template->set_var('error_list',$GLOBALS['phpgw']->common->error_list($error));

View File

@ -21,7 +21,6 @@
/*! /*!
@class uilink @class uilink
@author ralfbecker @author ralfbecker
@author ralfbecker
@abstract generalized linking between entries of phpGroupware apps - HTML UI layer @abstract generalized linking between entries of phpGroupware apps - HTML UI layer
@discussion This class is the UI to show/modify the links @discussion This class is the UI to show/modify the links
@discussion Links have to ends each pointing to an entry, an entry is a double: @discussion Links have to ends each pointing to an entry, an entry is a double:
@ -35,7 +34,7 @@
$this->bolink( ); // call constructor of derived class $this->bolink( ); // call constructor of derived class
$this->public_functions += array( // extend public_functions $this->public_functions += array( // extend public_functions
'getEntry' => True, 'getEntry' => True,
'show' => True 'showLinks' => True
); );
} }
@ -45,16 +44,23 @@
@author ralfbecker @author ralfbecker
@abstract HTML UI to query user for one side of a link: an entry of a supported app @abstract HTML UI to query user for one side of a link: an entry of a supported app
@param $name base-name of the input-fields @param $name base-name of the input-fields
@result html for query @result html: table-row(s) with 4 cols
*/ */
function getEntry($name) function getEntry($name,$app='',$id=0)
{ {
$value = get_var($name,array('POST')); $value = get_var($name,array('POST'));
if (!is_array($value)) if (!is_array($value))
{ {
$value = array(); $value = array();
} }
echo "<p>$name = "; _debug_array($value); if ($this->debug)
{
echo "<p>uilink.getEntry('$name','$app',$id): $name = "; _debug_array($value);
}
if ($value['create'] && $value['app'] && $value['id'] && $app)
{
$this->link($app,&$id,$value['app'],$value['id'],$value['remark']);
}
if ($value['search'] && count($ids = $this->query($value['app'],$value['query']))) if ($value['search'] && count($ids = $this->query($value['app'],$value['query'])))
{ {
$value = array( $value = array(
@ -82,14 +88,81 @@
} }
/*! /*!
@function show @function showLinks
@syntax show( $app,$id ) @syntax showLinks( $name,$app,$id,$only_app='',$show_unlink=True )
@author ralfbecker @author ralfbecker
@abstract HTML UI to show & delete existing links to $app,$id and to make new links @abstract HTML UI to show & delete existing links to $app,$id
@discussion this should be called by each link-supporting app at the bottom of its view-entry-page @param $name base-name of the input-fields
@param $only_app if set return only links from $only_app (eg. only addressbook-entries) or NOT from if $only_app[0]=='!'
@param $show_unlink boolean show unlink button for each link (default true)
@result html: table-row(s) with 4 cols
*/ */
function show($app,$id) function showLinks($name,$app,$id,$only_app='',$show_unlink=True)
{ {
$value = get_var($name,array('POST'));
if (!is_array($value))
{
$value = array();
}
list($unlink) = @each($value['unlink']);
if ($this->debug)
{
echo "<p>uilink.showLinks: app='$app',id='$id', unlink=$unlink, $name = "; _debug_array($value);
}
if ($unlink)
{
$this->unlink($unlink,$app,$id);
//echo "<p>$unlink unlinked</p>\n";
}
$etemplate = CreateObject('etemplate.etemplate','infolog.linklist_widget');
$links = $this->get_links($app,$id,$only_app);
$value = array();
for($row=$etemplate->rows-1; list(,$link) = each($links); ++$row)
{
$value[$row] = $link;
$value[$row]['title'] = $this->title($link['app'],$link['id']);
}
$value['app'] = $app;
$value['id'] = $id;
$value['title'] = $this->title($app,$id);
$out = $etemplate->show($value,'','',$name);
$out = str_replace('[]','',$out);
return eregi_replace('[</]*table[^>]*>','',$out);
}
/*!
@function viewLink
@syntax viewLink( $app,$id,$content='' )
@author ralfbecker
@abstract link to view entry $id of $app
@param $content if set result will be like "<a href=[link]>$content</a>"
@result link to view $id in $app or False if no link for $app registered or $id==''
*/
function viewLink($app,$id,$html='')
{
$view = $this->view($app,$id);
if (!count($view))
{
return False;
}
$html = CreateObject('infolog.html');
return $content == '' ? $html->link('/index.php',$view) : $html->a_href($content,'/index.php',$view);
}
/*!
@function linkBox
@syntax linkBox( $app,$id,$only_app='',$show_unlink=True )
@author ralfbecker
@abstract HTML UI to show, delete & add links to $app,$id
@param $only_app if set return only links from $only_app (eg. only addressbook-entries) or NOT from if $only_app[0]=='!'
@param $show_unlink boolean show unlink button for each link (default true)
@result html: table-row(s) with 4 cols
*/
function linkBox($app,$id,$only_app='',$show_unlink=True)
{
} }
} }

View File

@ -18,6 +18,13 @@
/* echo "<p>hook_addressbook_view(ab_id=$ab_id)</p>"; */ /* echo "<p>hook_addressbook_view(ab_id=$ab_id)</p>"; */
$link = CreateObject('infolog.uilink');
$out = '<table>'.$link->getEntry('entry','addressbook',$GLOBALS['ab_id'])."\n".
$link->showLinks('links','addressbook',$GLOBALS['ab_id'],'!infolog')."</table>\n";
$html = CreateObject('infolog.html');
$out = $html->form($out,'','/index.php',array('menuaction'=>'addressbook.uiaddressbook.view','ab_id'=>$GLOBALS['ab_id']));
$GLOBALS['phpgw']->template->set_var('phpgw_body',$out,True);
$infolog = CreateObject('infolog.uiinfolog'); $infolog = CreateObject('infolog.uiinfolog');
$infolog->get_list(True,'addr',$GLOBALS['ab_id']); $infolog->get_list(True,'addr',$GLOBALS['ab_id']);

View File

@ -1,7 +1,13 @@
<?php <?php
// eTemplates for Application 'infolog', generated by etemplate.dump() 2002-09-02 23:51 // eTemplates for Application 'infolog', generated by etemplate.dump() 2002-09-04 01:02
$templ_data[] = array('name' => 'infolog.linkto_widget.create','template' => '','lang' => '','group' => '0','version' => '0.9.15.001','data' => 'a:3:{i:0;a:0:{}i:1;a:3:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:4:\"name\";s:3:\"app\";}s:1:\"B\";a:3:{s:4:\"type\";s:6:\"select\";s:4:\"name\";s:2:\"id\";s:4:\"help\";s:28:\"Select an entry to link with\";}s:1:\"C\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:4:\"Link\";s:4:\"name\";s:6:\"create\";s:4:\"help\";s:29:\"click here to create the Link\";}}i:2;a:3:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:6:\"Remark\";}s:1:\"B\";a:5:{s:4:\"type\";s:4:\"text\";s:4:\"size\";s:5:\"50,50\";s:4:\"span\";s:3:\"all\";s:4:\"name\";s:6:\"remark\";s:4:\"help\";s:25:\"optional note to the Link\";}s:1:\"C\";a:1:{s:4:\"type\";s:5:\"label\";}}}','size' => '','style' => '',); $templ_data[] = array('name' => 'infolog.linklist_widget','template' => '','lang' => '','group' => '0','version' => '0.9.15.001','data' => 'a:3:{i:0;a:2:{s:2:\"c1\";s:3:\"nmh\";s:2:\"c2\";s:3:\"nmr\";}i:1;a:4:{s:1:\"A\";a:3:{s:4:\"type\";s:5:\"label\";s:4:\"size\";s:1:\"b\";s:4:\"name\";s:3:\"app\";}s:1:\"B\";a:4:{s:4:\"type\";s:5:\"label\";s:4:\"size\";s:1:\"b\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:5:\"title\";}s:1:\"C\";a:2:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:6:\"Remark\";}s:1:\"D\";a:4:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:2:\"Id\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:2:\"id\";}}i:2;a:4:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:4:\"name\";s:11:\"${row}[app]\";}s:1:\"B\";a:3:{s:4:\"type\";s:5:\"label\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:13:\"${row}[title]\";}s:1:\"C\";a:3:{s:4:\"type\";s:5:\"label\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:14:\"${row}[remark]\";}s:1:\"D\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:6:\"Unlink\";s:4:\"name\";s:26:\"unlink[$row_cont[link_id]]\";s:4:\"help\";s:39:\"Remove this link (not the entry itself)\";}}}','size' => '','style' => '',);
$templ_data[] = array('name' => 'infolog.linklist_widget','template' => '','lang' => '','group' => '0','version' => '0.9.15.002','data' => 'a:2:{i:0;a:1:{s:2:\"c1\";s:3:\"nmr\";}i:1;a:4:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:4:\"name\";s:11:\"${row}[app]\";}s:1:\"B\";a:3:{s:4:\"type\";s:5:\"label\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:13:\"${row}[title]\";}s:1:\"C\";a:3:{s:4:\"type\";s:5:\"label\";s:7:\"no_lang\";s:1:\"1\";s:4:\"name\";s:14:\"${row}[remark]\";}s:1:\"D\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:6:\"Unlink\";s:4:\"name\";s:26:\"unlink[$row_cont[link_id]]\";s:4:\"help\";s:39:\"Remove this link (not the entry itself)\";}}}','size' => '','style' => '',);
$templ_data[] = array('name' => 'infolog.linklist_widget.test','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:2:{i:0;a:0:{}i:1;a:1:{s:1:\"A\";a:2:{s:4:\"type\";s:8:\"linklist\";s:4:\"name\";s:5:\"links\";}}}','size' => '','style' => '',);
$templ_data[] = array('name' => 'infolog.linkto_widget.create','template' => '','lang' => '','group' => '0','version' => '0.9.15.001','data' => 'a:3:{i:0;a:0:{}i:1;a:4:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:4:\"name\";s:3:\"app\";}s:1:\"B\";a:3:{s:4:\"type\";s:6:\"select\";s:4:\"name\";s:2:\"id\";s:4:\"help\";s:28:\"Select an entry to link with\";}s:1:\"C\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:4:\"Link\";s:4:\"name\";s:6:\"create\";s:4:\"help\";s:29:\"click here to create the Link\";}s:1:\"D\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:10:\"New search\";s:4:\"name\";s:3:\"new\";s:4:\"help\";s:36:\"start a new search, cancel this link\";}}i:2;a:4:{s:1:\"A\";a:2:{s:4:\"type\";s:5:\"label\";s:5:\"label\";s:6:\"Remark\";}s:1:\"B\";a:5:{s:4:\"type\";s:4:\"text\";s:4:\"size\";s:5:\"50,50\";s:4:\"span\";s:3:\"all\";s:4:\"name\";s:6:\"remark\";s:4:\"help\";s:25:\"optional note to the Link\";}s:1:\"C\";a:1:{s:4:\"type\";s:5:\"label\";}s:1:\"D\";a:1:{s:4:\"type\";s:5:\"label\";}}}','size' => '','style' => '',);
$templ_data[] = array('name' => 'infolog.linkto_widget.search','template' => '','lang' => '','group' => '0','version' => '0.9.15.001','data' => 'a:2:{i:0;a:0:{}i:1;a:4:{s:1:\"A\";a:4:{s:4:\"type\";s:6:\"select\";s:5:\"label\";s:6:\"Search\";s:4:\"name\";s:3:\"app\";s:4:\"help\";s:26:\"Select an App to search in\";}s:1:\"B\";a:3:{s:4:\"type\";s:4:\"text\";s:4:\"name\";s:5:\"query\";s:4:\"help\";s:23:\"Enter the query pattern\";}s:1:\"C\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:6:\"Search\";s:4:\"name\";s:6:\"search\";s:4:\"help\";s:30:\"click here to start the search\";}s:1:\"D\";a:3:{s:4:\"type\";s:5:\"label\";s:4:\"size\";s:1:\"i\";s:4:\"name\";s:3:\"msg\";}}}','size' => '','style' => '',); $templ_data[] = array('name' => 'infolog.linkto_widget.search','template' => '','lang' => '','group' => '0','version' => '0.9.15.001','data' => 'a:2:{i:0;a:0:{}i:1;a:4:{s:1:\"A\";a:4:{s:4:\"type\";s:6:\"select\";s:5:\"label\";s:6:\"Search\";s:4:\"name\";s:3:\"app\";s:4:\"help\";s:26:\"Select an App to search in\";}s:1:\"B\";a:3:{s:4:\"type\";s:4:\"text\";s:4:\"name\";s:5:\"query\";s:4:\"help\";s:23:\"Enter the query pattern\";}s:1:\"C\";a:4:{s:4:\"type\";s:6:\"button\";s:5:\"label\";s:6:\"Search\";s:4:\"name\";s:6:\"search\";s:4:\"help\";s:30:\"click here to start the search\";}s:1:\"D\";a:3:{s:4:\"type\";s:5:\"label\";s:4:\"size\";s:1:\"i\";s:4:\"name\";s:3:\"msg\";}}}','size' => '','style' => '',);

View File

@ -1,19 +1,21 @@
%1 records imported infolog en %1 records imported %1 records imported infolog en %1 records imported
%1 records read (not yet imported, you may go back and uncheck test import) infolog en %1 records read (not yet imported, you may go %2back%3 and uncheck Test Import) %1 records read (not yet imported, you may go back and uncheck test import) infolog en %1 records read (not yet imported, you may go %2back%3 and uncheck Test Import)
<b>file-attachments via symlinks</b> instead of uploads and retrieval via file:/path for direct lan-clients infolog en en
accept infolog en accept accept infolog en accept
action infolog en Action action infolog en Action
Add a file infolog en Add a file
add infolog en Add add infolog en Add
add a file infolog en Add a file
add sub infolog en add Sub add sub infolog en add Sub
all infolog en All all infolog en All
are you sure you want to delete this entry infolog en Are you sure you want to delete this entry are you sure you want to delete this entry infolog en Are you sure you want to delete this entry
attach file infolog en Attach file attach file infolog en Attach file
back to Projectlist infolog en Back to Projectlist back to projectlist infolog en Back to Projectlist
<b>file-attachments via symlinks</b> instead of uploads and retrieval via file:/path for direct lan-clients infolog en <b>file-attachments via symlinks</b> instead of uploads and retrieval via file:/path for direct lan-clients
billed infolog en billed billed infolog en billed
both infolog en both both infolog en both
call infolog en call call infolog en call
category infolog en Category category infolog en Category
click here to create the link infolog en click here to create the Link
click here to start the search infolog en click here to start the search
close infolog en Close close infolog en Close
comment infolog en Comment comment infolog en Comment
configuration infolog en Konfiguration configuration infolog en Konfiguration
@ -23,83 +25,95 @@ csv-filename infolog en CSV-Filename
csv-import common en CSV-Import csv-import common en CSV-Import
datecreated infolog en date created datecreated infolog en date created
days infolog en days days infolog en days
default Filter for InfoLog infolog en Default Filter for InfoLog default filter for infolog infolog en Default Filter for InfoLog
description can not exceed 8000 characters in length infolog en Description can not exceed 8000 characters in length
description infolog en Description description infolog en Description
description can not exceed 8000 characters in length infolog en Description can not exceed 8000 characters in length
done infolog en done done infolog en done
download infolog en Download download infolog en Download
duration infolog en Duration duration infolog en Duration
enddate can not be before startdate infolog en Enddate can not be before startdate
enddate infolog en Enddate enddate infolog en Enddate
enddate can not be before startdate infolog en Enddate can not be before startdate
enter the query pattern infolog en Enter the query pattern
entry and all files infolog en Entry and all files entry and all files infolog en Entry and all files
fax infolog en Fax fax infolog en Fax
fieldseparator infolog en Fieldseparator fieldseparator infolog en Fieldseparator
finish infolog en finish finish infolog en finish
from infolog en From from infolog en From
id infolog en Id
import infolog en Import import infolog en Import
info log common en InfoLog info log common en InfoLog
infolog common en InfoLog infolog common en InfoLog
infolog - delete infolog en Info Log - Delete infolog - delete infolog en Info Log - Delete
infolog - edit infolog en InfoLog - Edit infolog - edit infolog en InfoLog - Edit
infolog-fieldname infolog en Info Log-Fieldname infolog - import csv-file infolog en InfoLog - Import CSV-File
infolog - import CSV-File infolog en InfoLog - Import CSV-File
infolog - new infolog en InfoLog - New infolog - new infolog en InfoLog - New
infolog - new subproject infolog en InfoLog - New Subproject infolog - new subproject infolog en InfoLog - New Subproject
infolog preferences common en InfoLog preferences
infolog - subprojects from infolog en InfoLog - Subprojects from infolog - subprojects from infolog en InfoLog - Subprojects from
Invalid filename infolog en Invalid filename infolog preferences common en InfoLog preferences
infolog-fieldname infolog en Info Log-Fieldname
invalid filename infolog en Invalid filename
last changed infolog en last changed last changed infolog en last changed
list no Subs/Childs infolog en List no Subs/Childs link infolog en Link
list no subs/childs infolog en List no Subs/Childs
new search infolog en New search
no - cancel infolog en No - Cancel no - cancel infolog en No - Cancel
no entries found, try again ... infolog en no entries found, try again ... no entries found, try again ... infolog en no entries found, try again ...
no filter infolog en no Filter no filter infolog en no Filter
none infolog en None none infolog en None
not infolog en not
not assigned infolog en not assigned not assigned infolog en not assigned
note infolog en Note note infolog en Note
not infolog en not
number of records to read (<=200) infolog en Number of records to read (<=200) number of records to read (<=200) infolog en Number of records to read (<=200)
offer infolog en offer offer infolog en offer
ongoing infolog en ongoing ongoing infolog en ongoing
open infolog en open open infolog en open
optional note to the link infolog en optional note to the Link
overdue infolog en overdue overdue infolog en overdue
owner infolog en Owner
own infolog en own own infolog en own
own open infolog en own open own open infolog en own open
own overdue infolog en own overdue own overdue infolog en own overdue
own upcoming infolog en own upcoming own upcoming infolog en own upcoming
path on (web-)serverside<br>eg. /var/samba/Share infolog en path on (web-)serverside<br>eg. /var/samba/Share owner infolog en Owner
pattern for search in addressbook infolog en pattern for search in Addressbook path on (web-)serverside<br>eg. /var/samba/share infolog en path on (web-)serverside<br>eg. /var/samba/Share
pattern for search in addressbook infolog en
pattern for search in projects infolog en pattern for search in Projects pattern for search in projects infolog en pattern for search in Projects
phonecall infolog en Phonecall
phone/email infolog en Phone/Email
phone infolog en Phonecall phone infolog en Phonecall
phone/email infolog en Phone/Email
phonecall infolog en Phonecall
priority infolog en Priority priority infolog en Priority
private infolog en Private private infolog en Private
project infolog en Project project infolog en Project
reg. expr. for local IP's<br>eg. ^192\.168\.1\. infolog en reg. expr. for local IP's<br>eg. ^192\.168\.1\.
re: infolog en Re: re: infolog en Re:
reg. expr. for local ip's<br>eg. ^192\.168\.1\. infolog en reg. expr. for local IP's<br>eg. ^192\.168\.1\.
remark infolog en Remark
remove this link (not the entry itself) infolog en Remove this link (not the entry itself)
responsible infolog en Responsible responsible infolog en Responsible
search infolog en Search
search for: infolog en Search for: search for: infolog en Search for:
select infolog en Select select infolog en Select
select an app to search in infolog en Select an App to search in
select an entry to link with infolog en Select an entry to link with
show full usernames infolog en Show full usernames show full usernames infolog en Show full usernames
show open events: tasks/calls/notes on main screen infolog en Show open Events: Tasks/Calls/Notes on main screen
showing x infolog en showing %1 showing x infolog en showing %1
showing x - x of x infolog en showing %1 - %2 of %3 showing x - x of x infolog en showing %1 - %2 of %3
show open Events: Tasks/Calls/Notes on main screen infolog en Show open Events: Tasks/Calls/Notes on main screen start a new search, cancel this link infolog en start a new search, cancel this link
startdate infolog en Startdate startdate infolog en Startdate
startrecord infolog en Startrecord startrecord infolog en Startrecord
sub infolog en Sub sub infolog en Sub
subject infolog en Subject subject infolog en Subject
task infolog en ToDo task infolog en ToDo
test Import (show importable records <u>only</u> in browser) infolog en Test Import (show importable records <u>only</u> in browser) test import (show importable records <u>only</u> in browser) infolog en Test Import (show importable records <u>only</u> in browser)
today infolog en Today today infolog en Today
translation infolog en Translation translation infolog en Translation
type infolog en Type type infolog en Type
unlink infolog en Unlink
upcoming infolog en upcoming upcoming infolog en upcoming
urgency infolog en urgency urgency infolog en urgency
urgent infolog en urgent urgent infolog en urgent
use Button to search for Address infolog en use Button to search for Address use button to search for address infolog en use Button to search for Address
use Button to search for Project infolog en use Button to search for Project use button to search for project infolog en use Button to search for Project
valid path on clientside<br>eg. \\Server\Share or e:\ infolog en valid path on clientside<br>eg. \\Server\Share or e:\ valid path on clientside<br>eg. \\server\share or e:\ infolog en valid path on clientside<br>eg. \\Server\Share or e:\
view other subs infolog en view other Subs view other subs infolog en view other Subs
view subs infolog en view Subs view subs infolog en view Subs
will-call infolog en will call will-call infolog en will call