mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-28 10:53:39 +01:00
WIP allow to place custom-fields in specified tabs and automatic tab generation
- no more need to add custom-field tabs to the template, if a et2-tabs is used - new custom-field options for et2-tabs: + cfTypeFilter propagated to type_filter of customfields widget + cfPrivateTab use an extra tab for private cfs + cfPrepend where to add cf tabs, default before history tab or at the end, if no history tab
This commit is contained in:
parent
23aa3057e5
commit
2e37f9bd34
@ -2283,8 +2283,6 @@ class addressbook_ui extends addressbook_bo
|
|||||||
$content['private'] = (int) ($content['owner'] && substr($content['owner'],-1) == 'p');
|
$content['private'] = (int) ($content['owner'] && substr($content['owner'],-1) == 'p');
|
||||||
$content['owner'] = (string) (int) $content['owner'];
|
$content['owner'] = (string) (int) $content['owner'];
|
||||||
$content['cat_id'] = $this->config['cat_tab'] === 'Tree' ? $content['cat_id_tree'] : $content['cat_id'];
|
$content['cat_id'] = $this->config['cat_tab'] === 'Tree' ? $content['cat_id_tree'] : $content['cat_id'];
|
||||||
if ($this->config['private_cf_tab']) $content = (array)$content['private_cfs'] + $content;
|
|
||||||
unset($content['private_cfs']);
|
|
||||||
|
|
||||||
switch($button)
|
switch($button)
|
||||||
{
|
{
|
||||||
@ -2655,16 +2653,6 @@ class addressbook_ui extends addressbook_bo
|
|||||||
// Avoid ID conflict with tree & selectboxes
|
// Avoid ID conflict with tree & selectboxes
|
||||||
$content['cat_id_tree'] = $content['cat_id'];
|
$content['cat_id_tree'] = $content['cat_id'];
|
||||||
|
|
||||||
// Avoid setting conflicts with private custom fields
|
|
||||||
$content['private_cfs'] = array();
|
|
||||||
foreach(Api\Storage\Customfields::get('addressbook', true) as $name => $cf)
|
|
||||||
{
|
|
||||||
if ($this->config['private_cf_tab'] && $cf['private'] && isset($content['#'.$name]))
|
|
||||||
{
|
|
||||||
$content['private_cfs']['#'.$name] = $content['#'.$name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// how to display addresses
|
// how to display addresses
|
||||||
$content['addr_format'] = $this->addr_format_by_country($content['adr_one_countryname']);
|
$content['addr_format'] = $this->addr_format_by_country($content['adr_one_countryname']);
|
||||||
$content['addr_format2'] = $this->addr_format_by_country($content['adr_two_countryname']);
|
$content['addr_format2'] = $this->addr_format_by_country($content['adr_two_countryname']);
|
||||||
@ -3234,8 +3222,6 @@ class addressbook_ui extends addressbook_bo
|
|||||||
|
|
||||||
// disable not needed tabs
|
// disable not needed tabs
|
||||||
$readonlys['tabs']['cats'] = !($content['cat_tab'] = $this->config['cat_tab']);
|
$readonlys['tabs']['cats'] = !($content['cat_tab'] = $this->config['cat_tab']);
|
||||||
$readonlys['tabs']['custom'] = !$this->customfields;
|
|
||||||
$readonlys['tabs']['custom_private'] = !$this->customfields || !$this->config['private_cf_tab'];
|
|
||||||
$readonlys['tabs']['distribution_list'] = !$content['distrib_lists'];#false;
|
$readonlys['tabs']['distribution_list'] = !$content['distrib_lists'];#false;
|
||||||
$readonlys['tabs']['history'] = $this->contact_repository != 'sql' || !$content['id'] ||
|
$readonlys['tabs']['history'] = $this->contact_repository != 'sql' || !$content['id'] ||
|
||||||
$this->account_repository != 'sql' && $content['account_id'];
|
$this->account_repository != 'sql' && $content['account_id'];
|
||||||
@ -3385,10 +3371,6 @@ class addressbook_ui extends addressbook_bo
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if($this->config['private_cf_tab'])
|
|
||||||
{
|
|
||||||
$_content = array_merge($_content, $_content['private_cfs']);
|
|
||||||
}
|
|
||||||
$query['advanced_search'] = array_intersect_key(
|
$query['advanced_search'] = array_intersect_key(
|
||||||
$_content,
|
$_content,
|
||||||
array_flip(array_merge($this->get_contact_columns(), array('operator', 'meth_select')))
|
array_flip(array_merge($this->get_contact_columns(), array('operator', 'meth_select')))
|
||||||
@ -3466,15 +3448,6 @@ class addressbook_ui extends addressbook_bo
|
|||||||
}
|
}
|
||||||
// Make them not required, otherwise you can't search
|
// Make them not required, otherwise you can't search
|
||||||
$this->tmpl->setElementAttribute('#' . $name, 'required', FALSE);
|
$this->tmpl->setElementAttribute('#' . $name, 'required', FALSE);
|
||||||
if($this->config['private_cf_tab'] == 'True' && $data['private'])
|
|
||||||
{
|
|
||||||
if(isset($content['#' . $name]))
|
|
||||||
{
|
|
||||||
$content['private_cfs']['#' . $name] = $content['#' . $name];
|
|
||||||
}
|
|
||||||
// Private CF tab results in a different ID, turn required off there too
|
|
||||||
$this->tmpl->setElementAttribute('private_cfs[#' . $name . ']', 'required', FALSE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// configure edit template as search dialog
|
// configure edit template as search dialog
|
||||||
@ -3485,8 +3458,6 @@ class addressbook_ui extends addressbook_bo
|
|||||||
$readonlys['button'] = false;
|
$readonlys['button'] = false;
|
||||||
// disable not needed tabs
|
// disable not needed tabs
|
||||||
$readonlys['tabs']['cats'] = !($content['cat_tab'] = $this->config['cat_tab']);
|
$readonlys['tabs']['cats'] = !($content['cat_tab'] = $this->config['cat_tab']);
|
||||||
$readonlys['tabs']['custom'] = !$this->customfields;
|
|
||||||
$readonlys['tabs']['custom_private'] = !$this->customfields || !$this->config['private_cf_tab'];
|
|
||||||
$readonlys['tabs']['links'] = true;
|
$readonlys['tabs']['links'] = true;
|
||||||
$readonlys['tabs']['distribution_list'] = true;
|
$readonlys['tabs']['distribution_list'] = true;
|
||||||
$readonlys['tabs']['history'] = true;
|
$readonlys['tabs']['history'] = true;
|
||||||
|
@ -380,16 +380,13 @@
|
|||||||
<et2-description></et2-description>
|
<et2-description></et2-description>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<et2-tabbox id="tabs" span="all" width="100%" tabHeight="340">
|
<et2-tabbox id="tabs" span="all" width="100%" tabHeight="340" cfPrivateTab="!$cont[no_private_cfs]" cfTypeFilter="$cont[tid]">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="general" label="Organisation"/>
|
<tab id="general" label="Organisation"/>
|
||||||
<tab id="home" label="Private" statustext="Home address, Birthday, ..."/>
|
<tab id="home" label="Private" statustext="Home address, Birthday, ..."/>
|
||||||
<tab id="details" label="Details" statustext="Categories, Notes, ..."/>
|
<tab id="details" label="Details" statustext="Categories, Notes, ..."/>
|
||||||
<tab id="links" label="Links" statustext="Links"/>
|
<tab id="links" label="Links" statustext="Links"/>
|
||||||
<tab id="distribution_list" label="Distribution lists"
|
<tab id="distribution_list" label="Distribution lists" statustext="Distribution lists, ..."/>
|
||||||
statustext="Distribution lists, ..."/>
|
|
||||||
<tab id="custom" label="Extra" statustext="Custom fields"/>
|
|
||||||
<tab id="custom_private" label="Extra private" statustext="Private custom fields"/>
|
|
||||||
<tab id="history" label="History"/>
|
<tab id="history" label="History"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
<tabpanels>
|
<tabpanels>
|
||||||
@ -398,8 +395,6 @@
|
|||||||
<template id="addressbook.edit.details"/>
|
<template id="addressbook.edit.details"/>
|
||||||
<template id="addressbook.edit.links"/>
|
<template id="addressbook.edit.links"/>
|
||||||
<template id="addressbook.edit.distribution_list"/>
|
<template id="addressbook.edit.distribution_list"/>
|
||||||
<template id="addressbook.edit.custom"/>
|
|
||||||
<template id="addressbook.edit.custom_private"/>
|
|
||||||
<template id="addressbook.edit.history"/>
|
<template id="addressbook.edit.history"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
</et2-tabbox>
|
</et2-tabbox>
|
||||||
|
@ -261,36 +261,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="addressbook.edit.custom" template="" lang="" group="0" version="1.9.001">
|
|
||||||
<grid width="100%">
|
|
||||||
<columns>
|
|
||||||
<column width = "120"/>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row>
|
|
||||||
<et2-box width="100%" overflow="auto">
|
|
||||||
<customfields private="$cont[no_private_cfs]" type_filter="$cont[tid]"/>
|
|
||||||
</et2-box>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
<template id="addressbook.edit.custom_private" template="" lang="" group="0" version="1.9.001">
|
|
||||||
<grid width="100%">
|
|
||||||
<columns>
|
|
||||||
<column width = "120"/>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row>
|
|
||||||
<et2-box width="100%" overflow="auto">
|
|
||||||
<customfields id="private_cfs" private="1" type_filter="$cont[tid]"/>
|
|
||||||
</et2-box>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
<template id="addressbook.edit.ownership" template="" lang="" group="0" version="16.1.00">
|
<template id="addressbook.edit.ownership" template="" lang="" group="0" version="16.1.00">
|
||||||
<grid width="100%">
|
<grid width="100%">
|
||||||
<columns>
|
<columns>
|
||||||
@ -393,14 +363,13 @@
|
|||||||
<et2-url id="url" autocomplete="url" ></et2-url>
|
<et2-url id="url" autocomplete="url" ></et2-url>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<et2-tabbox id="tabs" span="all">
|
<et2-tabbox id="tabs" span="all" cfPrivateTab="!$cont[no_private_cfs]" cfTypeFilter="$cont[tid]">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="general" label="Organisation"/>
|
<tab id="general" label="Organisation"/>
|
||||||
<tab id="home" label="Private" statustext="Home address, Birthday, ..."/>
|
<tab id="home" label="Private" statustext="Home address, Birthday, ..."/>
|
||||||
<tab id="details" label="Details" statustext="Categories, Notes, ..."/>
|
<tab id="details" label="Details" statustext="Categories, Notes, ..."/>
|
||||||
<tab id="links" label="Links" statustext="Links"/>
|
<tab id="links" label="Links" statustext="Links"/>
|
||||||
<tab id="distribution_list" label="Distribution lists"
|
<tab id="distribution_list" label="Distribution lists" statustext="Distribution lists, ..."/>
|
||||||
statustext="Distribution lists, ..."/>
|
|
||||||
<tab id="custom" label="Extra" statustext="Custom fields"/>
|
<tab id="custom" label="Extra" statustext="Custom fields"/>
|
||||||
<tab id="custom_private" label="Extra private" statustext="Private custom fields"/>
|
<tab id="custom_private" label="Extra private" statustext="Private custom fields"/>
|
||||||
<tab id="ownership" label="Ownership"/>
|
<tab id="ownership" label="Ownership"/>
|
||||||
|
@ -186,8 +186,20 @@ export class Et2Tabs extends Et2InputWidget(SlTabGroup) implements et2_IResizeab
|
|||||||
{
|
{
|
||||||
let tab = this.extraTabs[i];
|
let tab = this.extraTabs[i];
|
||||||
let tab_id = tab.id || tab.template;
|
let tab_id = tab.id || tab.template;
|
||||||
let tab_options = {id: tab_id, template: tab.template, url: tab.url, content: tab.content};
|
let tab_options = {id: tab_id, template: tab.template, url: tab.url, content: tab.content, title: tab.statustext};
|
||||||
tabData[tab.prepend ? 'unshift' : 'push'].call(tabData, {
|
let pos = tabData.length;
|
||||||
|
if (typeof tab.prepend === "string")
|
||||||
|
{
|
||||||
|
if ((pos = tabData.findIndex(t => t.id === tab.prepend)) === -1)
|
||||||
|
{
|
||||||
|
pos = tabData.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tab.prepend)
|
||||||
|
{
|
||||||
|
pos = 0;
|
||||||
|
}
|
||||||
|
tabData.splice(pos, 0, {
|
||||||
"id": tab_id,
|
"id": tab_id,
|
||||||
"label": this.egw().lang(tab.label),
|
"label": this.egw().lang(tab.label),
|
||||||
"widget": null,
|
"widget": null,
|
||||||
@ -543,10 +555,10 @@ export class Et2Tabs extends Et2InputWidget(SlTabGroup) implements et2_IResizeab
|
|||||||
* get tab panel-name or label the given widget is in
|
* get tab panel-name or label the given widget is in
|
||||||
*
|
*
|
||||||
* @param widget
|
* @param widget
|
||||||
* @param label true: return label, otherwise return panel-name
|
* @param label true: return label, otherwise return panel-name / id
|
||||||
* @return string panel-name or undefined
|
* @return string panel-name or undefined
|
||||||
*/
|
*/
|
||||||
static getTabPanel(widget, label)
|
static getTabPanel(widget, label? : boolean) : string|undefined
|
||||||
{
|
{
|
||||||
let tab = widget;
|
let tab = widget;
|
||||||
while(tab._parent && tab._parent.nodeName !== 'ET2-TABBOX')
|
while(tab._parent && tab._parent.nodeName !== 'ET2-TABBOX')
|
||||||
|
@ -171,10 +171,18 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
|
|||||||
}
|
}
|
||||||
|
|
||||||
// tab === "panel" --> use label of tab panel
|
// tab === "panel" --> use label of tab panel
|
||||||
|
const default_tab = Et2Tabs.getTabPanel(this)?.match(/^cf-default(-(non-)?private)?$/);
|
||||||
if (this.options.tab === 'panel')
|
if (this.options.tab === 'panel')
|
||||||
|
{
|
||||||
|
if (default_tab)
|
||||||
|
{
|
||||||
|
this.options.tab = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
this.options.tab = Et2Tabs.getTabPanel(this, true);
|
this.options.tab = Et2Tabs.getTabPanel(this, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// filter fields additionally by tab attribute
|
// filter fields additionally by tab attribute
|
||||||
if (typeof this.options.fields === "undefined" || !Object.keys(this.options.fields).length)
|
if (typeof this.options.fields === "undefined" || !Object.keys(this.options.fields).length)
|
||||||
{
|
{
|
||||||
@ -185,17 +193,39 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
|
|||||||
{
|
{
|
||||||
this.options.fields[field_name] = true;
|
this.options.fields[field_name] = true;
|
||||||
}
|
}
|
||||||
|
else if (default_tab)
|
||||||
|
{
|
||||||
|
if (this.options.customfields[field_name].private.length) // private cf
|
||||||
|
{
|
||||||
|
this.options.fields[field_name] = default_tab[1] !== '-non-private';
|
||||||
|
}
|
||||||
|
else // non-private cf
|
||||||
|
{
|
||||||
|
this.options.fields[field_name] = default_tab[1] !== '-private';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for(let field_name in this.options.customfields)
|
for(let field_name in this.options.customfields)
|
||||||
{
|
{
|
||||||
if (this.options.customfields[field_name].tab !== this.options.tab)
|
if (default_tab ? this.options.customfields[field_name].tab : this.options.customfields[field_name].tab !== this.options.tab)
|
||||||
{
|
{
|
||||||
this.options.fields[field_name] = false;
|
this.options.fields[field_name] = false;
|
||||||
}
|
}
|
||||||
else if (this.options.tab)
|
else if (default_tab)
|
||||||
|
{
|
||||||
|
if (this.options.customfields[field_name].private.length) // private cf
|
||||||
|
{
|
||||||
|
this.options.fields[field_name] = default_tab[1] !== '-non-private';
|
||||||
|
}
|
||||||
|
else // non-private cf
|
||||||
|
{
|
||||||
|
this.options.fields[field_name] = default_tab[1] !== '-private';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this.options.customfields[field_name].tab === this.options.tab)
|
||||||
{
|
{
|
||||||
this.options.fields[field_name] = true;
|
this.options.fields[field_name] = true;
|
||||||
}
|
}
|
||||||
@ -326,6 +356,7 @@ export class et2_customfields_list extends et2_valueWidget implements et2_IDetac
|
|||||||
// Label in first column, widget in 2nd
|
// Label in first column, widget in 2nd
|
||||||
const label = this.options.label || field.label || '';
|
const label = this.options.label || field.label || '';
|
||||||
jQuery(document.createElement("td"))
|
jQuery(document.createElement("td"))
|
||||||
|
.attr('colspan', (attrs.type || field.type) === 'label' ? 2 : 1)
|
||||||
.prependTo(row);
|
.prependTo(row);
|
||||||
et2_createWidget("label", {id: id + "_label", value: label.trim(), for: id}, this);
|
et2_createWidget("label", {id: id + "_label", value: label.trim(), for: id}, this);
|
||||||
}
|
}
|
||||||
|
@ -20,15 +20,19 @@ use EGroupware\Api;
|
|||||||
* eTemplate Tabs widget stacks multiple sub-templates and lets you switch between them
|
* eTemplate Tabs widget stacks multiple sub-templates and lets you switch between them
|
||||||
*
|
*
|
||||||
* Available attributes:
|
* Available attributes:
|
||||||
* - add_tabs: true: tabs contain addtional tabs, false: tabs replace tabs in template
|
* - addTabs: true: extraTabs contain additional tabs, false (default): tabs replace tabs in template
|
||||||
* - tabs: array with (additional) tabs with values for following keys
|
* - extraTabs: array with (additional) tabs with values for following keys
|
||||||
* + label: label of tab
|
* + label: label of tab
|
||||||
* + template: template name with optional '?'.filemtime as cache-buster
|
* + template: template name with optional '?'.filemtime as cache-buster
|
||||||
* optional:
|
* optional:
|
||||||
* + prepend: true prepend tab to existing ones, false (default) append tabs
|
* + prepend: true prepend tab to existing ones, false (default) append tabs or name of tab to prepend the tab
|
||||||
* + hidden:
|
* + hidden: true: hide tab, false (default): show tab
|
||||||
* + id: optinal namespace (content attribute of template)
|
* + id: id of tab
|
||||||
* + add_tabs: true(default) add to given tabs to template, false replace tabs in template
|
* + content: optional namespace (content attribute of template)
|
||||||
|
* + statustext: tooltip of label
|
||||||
|
* - cfTypeFilter: optional type-filter for automatic created custom-fields tabs
|
||||||
|
* - cfPrivateTab: true: create an extra tab for private custom-fields, false (default): show private ones together with non-private ones
|
||||||
|
* - cfPrepend: value for prepend tab-attribute for dynamic generated custom-field tabs, default "history"
|
||||||
*/
|
*/
|
||||||
class Tabbox extends Etemplate\Widget
|
class Tabbox extends Etemplate\Widget
|
||||||
{
|
{
|
||||||
@ -54,7 +58,7 @@ class Tabbox extends Etemplate\Widget
|
|||||||
}
|
}
|
||||||
if($tabs && !$this->tabs_attr_evaluated)
|
if($tabs && !$this->tabs_attr_evaluated)
|
||||||
{
|
{
|
||||||
$this->tabs_attr_evaluated = true; // we must not evaluate tabs attribte more then once!
|
$this->tabs_attr_evaluated = true; // we must not evaluate tabs attribute more than once!
|
||||||
|
|
||||||
// add_tabs toggles replacing or adding to existing tabs
|
// add_tabs toggles replacing or adding to existing tabs
|
||||||
if(!($this->attrs['addTabs'] ?? $this->attrs['add_tabs']))
|
if(!($this->attrs['addTabs'] ?? $this->attrs['add_tabs']))
|
||||||
@ -66,7 +70,6 @@ class Tabbox extends Etemplate\Widget
|
|||||||
foreach($tabs as &$tab)
|
foreach($tabs as &$tab)
|
||||||
{
|
{
|
||||||
$template= clone Template::instance($tab['template']);
|
$template= clone Template::instance($tab['template']);
|
||||||
if($tab['id']) $template->attrs['content'] = $tab['id'];
|
|
||||||
$this->children[1]->children[] = $template;
|
$this->children[1]->children[] = $template;
|
||||||
$tab['url'] = Template::rel2url($template->rel_path);
|
$tab['url'] = Template::rel2url($template->rel_path);
|
||||||
//$this->tabs[] = $tab;
|
//$this->tabs[] = $tab;
|
||||||
@ -140,12 +143,25 @@ class Tabbox extends Etemplate\Widget
|
|||||||
public function beforeSendToClient($cname, array $expand=null)
|
public function beforeSendToClient($cname, array $expand=null)
|
||||||
{
|
{
|
||||||
[$app] = explode('.', self::$request->template['name']);
|
[$app] = explode('.', self::$request->template['name']);
|
||||||
if (empty($app) || !($cfs = Api\Storage\Customfields::get($app, false, null, null, true)))
|
// no need to run again for responses, or if we have no custom fields
|
||||||
|
if (!empty(self::$response) || empty($app) || !($cfs = Api\Storage\Customfields::get($app, false, null, null, true)))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$tabs = [];
|
$form_name = self::form_name($cname, $this->id, $expand);
|
||||||
$content = self::$request->content;
|
$extra_private_tab = self::expand_name(self::getElementAttribute($form_name, 'cfPrivateTab') ?? $this->attrs['cfPrivateTab'] ?? false,
|
||||||
|
0, 0, 0, 0, self::$request->content);
|
||||||
|
if (is_string($extra_private_tab) && $extra_private_tab[0] === '!')
|
||||||
|
{
|
||||||
|
$extra_private_tab = !substr($extra_private_tab, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$prepend = $this->attrs['cfPrepend'] ?? 'history';
|
||||||
|
|
||||||
|
// check if template still contains a legacy customfield tab
|
||||||
|
$have_legacy_cf_tab = $this->haveLegacyCfTab();
|
||||||
|
|
||||||
|
$tabs = $private_tab = $default_tab = [];
|
||||||
foreach($cfs as $cf)
|
foreach($cfs as $cf)
|
||||||
{
|
{
|
||||||
if (!empty($cf['tab']))
|
if (!empty($cf['tab']))
|
||||||
@ -153,24 +169,81 @@ class Tabbox extends Etemplate\Widget
|
|||||||
$tab = $tabs[$cf['tab']]['id'] ?? 'cf-tab'.(1+count($tabs));
|
$tab = $tabs[$cf['tab']]['id'] ?? 'cf-tab'.(1+count($tabs));
|
||||||
if (!isset($tabs[$cf['tab']]))
|
if (!isset($tabs[$cf['tab']]))
|
||||||
{
|
{
|
||||||
$tabs[$cf['tab']] = array(
|
$tabs[$cf['tab']] = [
|
||||||
'id' => $tab,
|
'id' => $tab,
|
||||||
'template' => 'api.cf-tab',
|
'template' => 'api.cf-tab',
|
||||||
'label' => $cf['tab'],
|
'label' => $cf['tab'],
|
||||||
);
|
'prepend' => $prepend,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
elseif ($have_legacy_cf_tab)
|
||||||
if ($tabs)
|
|
||||||
{
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// does app want an extra private cf tab
|
||||||
|
elseif (!empty($cf['private']) && $extra_private_tab)
|
||||||
|
{
|
||||||
|
if (!$private_tab)
|
||||||
|
{
|
||||||
|
$private_tab[] = [
|
||||||
|
'id' => 'cf-default-private',
|
||||||
|
'template' => 'api.cf-tab',
|
||||||
|
'label' => 'Extra private',
|
||||||
|
'statustext' => 'Private custom fields',
|
||||||
|
'prepend' => $prepend,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// default cf tab
|
||||||
|
elseif ((empty($cf['private']) || !$extra_private_tab && !empty($cf['private'])) && !$default_tab)
|
||||||
|
{
|
||||||
|
$default_tab[] = [
|
||||||
|
'id' => $extra_private_tab ? 'cf-default-non-private' : 'cf-default',
|
||||||
|
'template' => 'api.cf-tab',
|
||||||
|
'label' => 'Custom fields',
|
||||||
|
'prepend' => $prepend,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($tabs || $default_tab || $private_tab)
|
||||||
|
{
|
||||||
|
// pass given cfTypeFilter attribute via content to all customfields widgets (set in api.cf-tab template)
|
||||||
|
if (($type_filter = self::getElementAttribute($form_name, 'cfTypeFilter') ?? $this->attrs['cfTypeFilter'] ?? null))
|
||||||
|
{
|
||||||
|
$content = self::$request->content;
|
||||||
|
$content['cfTypeFilter'] = self::expand_name($type_filter, 0, 0, 0, 0, $content);
|
||||||
self::$request->content = $content;
|
self::$request->content = $content;
|
||||||
self::setElementAttribute($this->id, 'addTabs', true);
|
}
|
||||||
// if app already specifed extraTabs (like e.g. Addressbook), we need to add to them not overwrite them
|
|
||||||
if (($extra_tabs = self::setElementAttribute($this->id, 'extraTabs', null)))
|
// addTabs is default false (= replace tabs), we need a default of true
|
||||||
|
$add_tabs =& self::setElementAttribute($this->id, 'addTabs', null);
|
||||||
|
if (!isset($add_tabs)) $add_tabs = true;
|
||||||
|
|
||||||
|
// if app already specified extraTabs (like e.g. Addressbook), we need to add to them not overwrite them
|
||||||
|
$extra_tabs =& self::setElementAttribute($this->id, 'extraTabs', null);
|
||||||
|
$extra_tabs = array_merge($extra_tabs ?? [], $default_tab, $private_tab, array_values($tabs));
|
||||||
|
|
||||||
|
// if we have no explicit default cf widget/tab, we need to call customfields::beforeSendToClient() to pass cfs to client-side
|
||||||
|
$cfs = new Customfields('<customfields/>');
|
||||||
|
$cfs->beforeSendToClient($cname, $expand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if widget has a legacy custom-fields tab
|
||||||
|
*
|
||||||
|
* @return bool true: there is a tab named extra, custom or customfields
|
||||||
|
*/
|
||||||
|
public function haveLegacyCfTab()
|
||||||
{
|
{
|
||||||
$tabs = array_merge($extra_tabs, array_values($tabs));
|
foreach($this->children[$this->children[0]->type === 'tabs' ? 0 : 1]->children as $tab)
|
||||||
}
|
{
|
||||||
self::setElementAttribute($this->id, 'extraTabs', array_values($tabs));
|
if (preg_match('/(^|\.)(extra|custom|customfields)$/', $tab->id))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
@ -2,6 +2,6 @@
|
|||||||
<!DOCTYPE overlay PUBLIC "-//EGroupware GmbH//eTemplate 2.0//EN" "https://www.egroupware.org/etemplate2.0.dtd">
|
<!DOCTYPE overlay PUBLIC "-//EGroupware GmbH//eTemplate 2.0//EN" "https://www.egroupware.org/etemplate2.0.dtd">
|
||||||
<overlay>
|
<overlay>
|
||||||
<template id="api.cf-tab" template="" lang="" group="0" version="23.1">
|
<template id="api.cf-tab" template="" lang="" group="0" version="23.1">
|
||||||
<customfields tab="panel" type_filter="previous"/>
|
<customfields tab="panel" type_filter="@cfTypeFilter"/>
|
||||||
</template>
|
</template>
|
||||||
</overlay>
|
</overlay>
|
@ -144,18 +144,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="calendar.edit.custom" template="" lang="" group="0" version="1.4.001">
|
|
||||||
<grid width="100%" overflow="auto">
|
|
||||||
<columns>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row valign="top">
|
|
||||||
<customfields/>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
<template id="calendar.edit.links" template="" lang="" group="0" version="1.0.1.001">
|
<template id="calendar.edit.links" template="" lang="" group="0" version="1.0.1.001">
|
||||||
<grid width="100%">
|
<grid width="100%">
|
||||||
<columns>
|
<columns>
|
||||||
@ -229,7 +217,6 @@
|
|||||||
<tab id="description" label="Description" statustext="Full description"/>
|
<tab id="description" label="Description" statustext="Full description"/>
|
||||||
<tab id="participants" label="Participants" statustext="Participants, Resources, ..."/>
|
<tab id="participants" label="Participants" statustext="Participants, Resources, ..."/>
|
||||||
<tab id="recurrence" label="Recurrence" statustext="Repeating Event Information"/>
|
<tab id="recurrence" label="Recurrence" statustext="Repeating Event Information"/>
|
||||||
<tab id="custom" label="Custom" statustext="Custom fields"/>
|
|
||||||
<tab id="links" label="Links" statustext="Links, Attachments"/>
|
<tab id="links" label="Links" statustext="Links, Attachments"/>
|
||||||
<tab id="history" label="History" statustext="Change history"/>
|
<tab id="history" label="History" statustext="Change history"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
@ -237,7 +224,6 @@
|
|||||||
<template id="calendar.edit.description"/>
|
<template id="calendar.edit.description"/>
|
||||||
<template id="calendar.edit.participants"/>
|
<template id="calendar.edit.participants"/>
|
||||||
<template id="calendar.edit.recurrence"/>
|
<template id="calendar.edit.recurrence"/>
|
||||||
<template id="calendar.edit.custom"/>
|
|
||||||
<template id="calendar.edit.links"/>
|
<template id="calendar.edit.links"/>
|
||||||
<template id="calendar.edit.history"/>
|
<template id="calendar.edit.history"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
|
@ -139,9 +139,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="calendar.edit.custom" template="" lang="" group="0" version="1.4.001">
|
|
||||||
<customfields/>
|
|
||||||
</template>
|
|
||||||
<template id="calendar.edit.links" template="" lang="" group="0" version="1.0.1.001">
|
<template id="calendar.edit.links" template="" lang="" group="0" version="1.0.1.001">
|
||||||
<grid width="100%">
|
<grid width="100%">
|
||||||
<columns>
|
<columns>
|
||||||
@ -249,7 +246,6 @@
|
|||||||
<tab id="participants" label="Participants" statustext="Participants, Resources, ..."/>
|
<tab id="participants" label="Participants" statustext="Participants, Resources, ..."/>
|
||||||
<tab id="details" label="Details"/>
|
<tab id="details" label="Details"/>
|
||||||
<tab id="recurrence" label="Recurrence" statustext="Repeating Event Information"/>
|
<tab id="recurrence" label="Recurrence" statustext="Repeating Event Information"/>
|
||||||
<tab id="custom" label="Custom" statustext="Custom fields"/>
|
|
||||||
<tab id="links" label="Links" statustext="Links, Attachments"/>
|
<tab id="links" label="Links" statustext="Links, Attachments"/>
|
||||||
<tab id="ownership" label="Ownership"/>
|
<tab id="ownership" label="Ownership"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
@ -258,7 +254,6 @@
|
|||||||
<template id="calendar.edit.participants"/>
|
<template id="calendar.edit.participants"/>
|
||||||
<template id="calendar.edit.details"/>
|
<template id="calendar.edit.details"/>
|
||||||
<template id="calendar.edit.recurrence"/>
|
<template id="calendar.edit.recurrence"/>
|
||||||
<template id="calendar.edit.custom"/>
|
|
||||||
<template id="calendar.edit.links"/>
|
<template id="calendar.edit.links"/>
|
||||||
<template id="calendar.edit.ownership"/>
|
<template id="calendar.edit.ownership"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
|
@ -64,9 +64,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="infolog.edit.customfields" template="" lang="" group="0" version="1.0.1.001">
|
|
||||||
<customfields type_filter="@info_type"/>
|
|
||||||
</template>
|
|
||||||
<template id="infolog.edit.history" template="" lang="" group="0" version="1.3.002">
|
<template id="infolog.edit.history" template="" lang="" group="0" version="1.3.002">
|
||||||
<historylog id="history" width="100%"/>
|
<historylog id="history" width="100%"/>
|
||||||
</template>
|
</template>
|
||||||
@ -171,13 +168,12 @@
|
|||||||
</et2-hbox>
|
</et2-hbox>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<et2-tabbox id="tabs" span="all" width="100%" tabHeight="350px">
|
<et2-tabbox id="tabs" span="all" width="100%" tabHeight="350px" cfTypeFilter="@info_type">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="description" label="Description" statustext="longer textual description"/>
|
<tab id="description" label="Description" statustext="longer textual description"/>
|
||||||
<tab id="details" label="Details" statustext="Location, priority , ..."/>
|
<tab id="details" label="Details" statustext="Location, priority , ..."/>
|
||||||
<tab id="links" label="Links" statustext="Links of this entry"/>
|
<tab id="links" label="Links" statustext="Links of this entry"/>
|
||||||
<tab id="project" label="Projectmanager" statustext="Project settings: price, times"/>
|
<tab id="project" label="Projectmanager" statustext="Project settings: price, times"/>
|
||||||
<tab id="customfields" label="Customfields" statustext="Custom fields"/>
|
|
||||||
<tab id="history" label="History" statustext="Change history"/>
|
<tab id="history" label="History" statustext="Change history"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
<tabpanels>
|
<tabpanels>
|
||||||
@ -185,7 +181,6 @@
|
|||||||
<template id="infolog.edit.details"/>
|
<template id="infolog.edit.details"/>
|
||||||
<template id="infolog.edit.links"/>
|
<template id="infolog.edit.links"/>
|
||||||
<template id="infolog.edit.project"/>
|
<template id="infolog.edit.project"/>
|
||||||
<template id="infolog.edit.customfields"/>
|
|
||||||
<template id="infolog.edit.history"/>
|
<template id="infolog.edit.history"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
</et2-tabbox>
|
</et2-tabbox>
|
||||||
|
@ -56,9 +56,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="infolog.edit.customfields" template="" lang="" group="0" version="1.0.1.001">
|
|
||||||
<customfields type_filter="@info_type"/>
|
|
||||||
</template>
|
|
||||||
<template id="infolog.edit.details" template="" lang="" group="0" version="1.9.001">
|
<template id="infolog.edit.details" template="" lang="" group="0" version="1.9.001">
|
||||||
<grid width="100%">
|
<grid width="100%">
|
||||||
<columns>
|
<columns>
|
||||||
@ -185,13 +182,12 @@
|
|||||||
<et2-select-percent span="4" statustext="Percent completed" id="info_percent" onchange="app.infolog.statusChanged"></et2-select-percent>
|
<et2-select-percent span="4" statustext="Percent completed" id="info_percent" onchange="app.infolog.statusChanged"></et2-select-percent>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<et2-tabbox id="tabs" span="all">
|
<et2-tabbox id="tabs" span="all" cfTypeFilter="@info_type">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="description" label="Description" statustext="longer textual description"/>
|
<tab id="description" label="Description" statustext="longer textual description"/>
|
||||||
<tab id="details" label="Details" statustext="Location, priority , ..."/>
|
<tab id="details" label="Details" statustext="Location, priority , ..."/>
|
||||||
<tab id="links" label="Links" statustext="Links of this entry"/>
|
<tab id="links" label="Links" statustext="Links of this entry"/>
|
||||||
<tab id="project" label="Projectmanager" statustext="Project settings: price, times"/>
|
<tab id="project" label="Projectmanager" statustext="Project settings: price, times"/>
|
||||||
<tab id="customfields" label="Customfields" statustext="Custom fields"/>
|
|
||||||
<tab id="ownership" label="Ownership"/>
|
<tab id="ownership" label="Ownership"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
<tabpanels>
|
<tabpanels>
|
||||||
@ -199,7 +195,6 @@
|
|||||||
<template id="infolog.edit.details"/>
|
<template id="infolog.edit.details"/>
|
||||||
<template id="infolog.edit.links"/>
|
<template id="infolog.edit.links"/>
|
||||||
<template id="infolog.edit.project"/>
|
<template id="infolog.edit.project"/>
|
||||||
<template id="infolog.edit.customfields"/>
|
|
||||||
<template id="infolog.edit.ownership"/>
|
<template id="infolog.edit.ownership"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
</et2-tabbox>
|
</et2-tabbox>
|
||||||
|
@ -101,21 +101,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="resources.edit_tabs.custom" template="" lang="" group="0" version="">
|
|
||||||
<grid width="100%" height="245" class="row_on" spacing="0" padding="0" overflow="auto">
|
|
||||||
<columns>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row class="th" height="20">
|
|
||||||
<et2-description value="Custom fields"></et2-description>
|
|
||||||
</row>
|
|
||||||
<row valign="top">
|
|
||||||
<customfields type_filter="@cat_id"/>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
<template id="resources.edit_tabs.history" template="" lang="" group="0" version="">
|
<template id="resources.edit_tabs.history" template="" lang="" group="0" version="">
|
||||||
<historylog id="history" width="100%"/>
|
<historylog id="history" width="100%"/>
|
||||||
</template>
|
</template>
|
||||||
@ -156,19 +141,17 @@
|
|||||||
<et2-description></et2-description>
|
<et2-description></et2-description>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<et2-tabbox id="tabs" span="all" width="100%" tabHeight="250">
|
<et2-tabbox id="tabs" span="all" width="100%" tabHeight="250" cfTypeFilter="@cat_id">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="page" label="Description" statustext="Informations about the location of resource"/>
|
<tab id="page" label="Description" statustext="Informations about the location of resource"/>
|
||||||
<tab id="general" label="Details" statustext="General informations about resource"/>
|
<tab id="general" label="Details" statustext="General informations about resource"/>
|
||||||
<tab id="links" label="Links" statustext="Web-Page of resource"/>
|
<tab id="links" label="Links" statustext="Web-Page of resource"/>
|
||||||
<tab id="custom" label="Custom" statustext="Pictures or resource"/>
|
|
||||||
<tab id="history" label="History"/>
|
<tab id="history" label="History"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
<tabpanels>
|
<tabpanels>
|
||||||
<template id="resources.edit_tabs.page"/>
|
<template id="resources.edit_tabs.page"/>
|
||||||
<template id="resources.edit_tabs.general"/>
|
<template id="resources.edit_tabs.general"/>
|
||||||
<template id="resources.edit_tabs.links"/>
|
<template id="resources.edit_tabs.links"/>
|
||||||
<template id="resources.edit_tabs.custom"/>
|
|
||||||
<template id="resources.edit_tabs.history"/>
|
<template id="resources.edit_tabs.history"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
</et2-tabbox>
|
</et2-tabbox>
|
||||||
|
@ -88,21 +88,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="resources.edit_tabs.custom" template="" lang="" group="0" version="">
|
|
||||||
<grid width="100%" height="245" class="row_on" spacing="0" padding="0" overflow="auto">
|
|
||||||
<columns>
|
|
||||||
<column/>
|
|
||||||
</columns>
|
|
||||||
<rows>
|
|
||||||
<row class="th" height="20">
|
|
||||||
<et2-description value="Custom fields"></et2-description>
|
|
||||||
</row>
|
|
||||||
<row valign="top">
|
|
||||||
<customfields/>
|
|
||||||
</row>
|
|
||||||
</rows>
|
|
||||||
</grid>
|
|
||||||
</template>
|
|
||||||
<template id="resources.edit_tabs.ownership" template="" lang="" group="0" version="">
|
<template id="resources.edit_tabs.ownership" template="" lang="" group="0" version="">
|
||||||
<grid width="100%">
|
<grid width="100%">
|
||||||
<columns>
|
<columns>
|
||||||
@ -170,20 +155,18 @@
|
|||||||
<et2-checkbox statustext="Is resource bookable?" id="bookable" span="3"></et2-checkbox>
|
<et2-checkbox statustext="Is resource bookable?" id="bookable" span="3"></et2-checkbox>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<et2-tabbox id="tabs" span="all">
|
<et2-tabbox id="tabs" span="all" cfTypeFilter="@cat_id">
|
||||||
<tabs>
|
<tabs>
|
||||||
<tab id="page" label="Description"
|
<tab id="page" label="Description"
|
||||||
statustext="Informations about the location of resource"/>
|
statustext="Informations about the location of resource"/>
|
||||||
<tab id="general" label="Details" statustext="General informations about resource"/>
|
<tab id="general" label="Details" statustext="General informations about resource"/>
|
||||||
<tab id="links" label="Links" statustext="Web-Page of resource"/>
|
<tab id="links" label="Links" statustext="Web-Page of resource"/>
|
||||||
<tab id="custom" label="Custom" statustext="Pictures or resource"/>
|
|
||||||
<tab id="ownership" label="Ownership"/>
|
<tab id="ownership" label="Ownership"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
<tabpanels>
|
<tabpanels>
|
||||||
<template id="resources.edit_tabs.page"/>
|
<template id="resources.edit_tabs.page"/>
|
||||||
<template id="resources.edit_tabs.general"/>
|
<template id="resources.edit_tabs.general"/>
|
||||||
<template id="resources.edit_tabs.links"/>
|
<template id="resources.edit_tabs.links"/>
|
||||||
<template id="resources.edit_tabs.custom"/>
|
|
||||||
<template id="resources.edit_tabs.ownership"/>
|
<template id="resources.edit_tabs.ownership"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
</et2-tabbox>
|
</et2-tabbox>
|
||||||
|
@ -75,11 +75,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="timesheet.edit.customfields" template="" lang="" group="0" version="1.5.001">
|
|
||||||
<et2-box width="100%" overflow="auto">
|
|
||||||
<customfields class="et2_fullWidth"/>
|
|
||||||
</et2-box>
|
|
||||||
</template>
|
|
||||||
<template id="timesheet.edit.history" template="" lang="" group="0" version="1.7.001">
|
<template id="timesheet.edit.history" template="" lang="" group="0" version="1.7.001">
|
||||||
<historylog id="history"/>
|
<historylog id="history"/>
|
||||||
</template>
|
</template>
|
||||||
@ -152,7 +147,6 @@
|
|||||||
<tab id="notes" label="Description"/>
|
<tab id="notes" label="Description"/>
|
||||||
<tab id="general" label="Details"/>
|
<tab id="general" label="Details"/>
|
||||||
<tab id="links" label="Links"/>
|
<tab id="links" label="Links"/>
|
||||||
<tab id="customfields" label="Custom Fields"/>
|
|
||||||
<tab id="history" label="History"/>
|
<tab id="history" label="History"/>
|
||||||
<tab id="events" label="Events"/>
|
<tab id="events" label="Events"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
@ -160,7 +154,6 @@
|
|||||||
<template id="timesheet.edit.notes"/>
|
<template id="timesheet.edit.notes"/>
|
||||||
<template id="timesheet.edit.general"/>
|
<template id="timesheet.edit.general"/>
|
||||||
<template id="timesheet.edit.links"/>
|
<template id="timesheet.edit.links"/>
|
||||||
<template id="timesheet.edit.customfields"/>
|
|
||||||
<template id="timesheet.edit.history"/>
|
<template id="timesheet.edit.history"/>
|
||||||
<template id="timesheet.edit.events"/>
|
<template id="timesheet.edit.events"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
|
@ -61,9 +61,6 @@
|
|||||||
</rows>
|
</rows>
|
||||||
</grid>
|
</grid>
|
||||||
</template>
|
</template>
|
||||||
<template id="timesheet.edit.customfields" template="" lang="" group="0" version="1.5.001">
|
|
||||||
<customfields/>
|
|
||||||
</template>
|
|
||||||
<template id="timesheet.edit.ownership" template="" lang="" group="0" version="16.1.00">
|
<template id="timesheet.edit.ownership" template="" lang="" group="0" version="16.1.00">
|
||||||
<grid width="100%">
|
<grid width="100%">
|
||||||
<columns>
|
<columns>
|
||||||
@ -141,14 +138,12 @@
|
|||||||
<tab id="notes" label="Description"/>
|
<tab id="notes" label="Description"/>
|
||||||
<tab id="general" label="Details"/>
|
<tab id="general" label="Details"/>
|
||||||
<tab id="links" label="Links"/>
|
<tab id="links" label="Links"/>
|
||||||
<tab id="customfields" label="Custom Fields"/>
|
|
||||||
<tab id="ownership" label="Ownership"/>
|
<tab id="ownership" label="Ownership"/>
|
||||||
</tabs>
|
</tabs>
|
||||||
<tabpanels class="dialog-main-timeframe">
|
<tabpanels class="dialog-main-timeframe">
|
||||||
<template id="timesheet.edit.notes"/>
|
<template id="timesheet.edit.notes"/>
|
||||||
<template id="timesheet.edit.general"/>
|
<template id="timesheet.edit.general"/>
|
||||||
<template id="timesheet.edit.links"/>
|
<template id="timesheet.edit.links"/>
|
||||||
<template id="timesheet.edit.customfields"/>
|
|
||||||
<template id="timesheet.edit.ownership"/>
|
<template id="timesheet.edit.ownership"/>
|
||||||
</tabpanels>
|
</tabpanels>
|
||||||
</et2-tabbox>
|
</et2-tabbox>
|
||||||
|
Loading…
Reference in New Issue
Block a user