forked from extern/egroupware
Placeholder dialog: Support for other apps, starting with Infolog
This commit is contained in:
parent
eb57294146
commit
7f930a6221
@ -87,6 +87,12 @@ export class et2_placeholder_select extends et2_inputWidget
|
|||||||
[],
|
[],
|
||||||
function(_content)
|
function(_content)
|
||||||
{
|
{
|
||||||
|
if(typeof _content === 'object' && _content.message)
|
||||||
|
{
|
||||||
|
// Something went wrong
|
||||||
|
this.egw().message(_content.message, 'error');
|
||||||
|
return;
|
||||||
|
}
|
||||||
this.egw().loading_prompt('placeholder_select', false);
|
this.egw().loading_prompt('placeholder_select', false);
|
||||||
et2_placeholder_select.placeholders = _content;
|
et2_placeholder_select.placeholders = _content;
|
||||||
callback.apply(self, arguments);
|
callback.apply(self, arguments);
|
||||||
@ -146,7 +152,7 @@ export class et2_placeholder_select extends et2_inputWidget
|
|||||||
data.sel_options.group = this._get_group_options(Object.keys(_data)[0]);
|
data.sel_options.group = this._get_group_options(Object.keys(_data)[0]);
|
||||||
data.content.app = data.sel_options.app[0].value;
|
data.content.app = data.sel_options.app[0].value;
|
||||||
data.content.group = data.sel_options.group[0].value;
|
data.content.group = data.sel_options.group[0].value;
|
||||||
data.content.entry = data.modifications.outer_box.entry.only_app = data.content.app;
|
data.content.entry = {app: data.content.app};
|
||||||
data.modifications.outer_box.entry.application_list = Object.keys(_data);
|
data.modifications.outer_box.entry.application_list = Object.keys(_data);
|
||||||
|
|
||||||
// callback for dialog
|
// callback for dialog
|
||||||
@ -207,14 +213,30 @@ export class et2_placeholder_select extends et2_inputWidget
|
|||||||
// Bind some handlers
|
// Bind some handlers
|
||||||
app.onchange = (node, widget) =>
|
app.onchange = (node, widget) =>
|
||||||
{
|
{
|
||||||
group.set_select_options(this._get_group_options(widget.get_value()));
|
let groups = this._get_group_options(widget.get_value());
|
||||||
entry.set_value({app: widget.get_value()});
|
group.set_select_options(groups);
|
||||||
|
group.set_value(groups[0].value);
|
||||||
|
if(['user'].indexOf(widget.get_value()) >= 0)
|
||||||
|
{
|
||||||
|
entry.app_select.val('api-accounts');
|
||||||
|
entry.set_value({app: 'api-accounts', id: '', query: ''});
|
||||||
|
}
|
||||||
|
else if(widget.get_value() == 'general')
|
||||||
|
{
|
||||||
|
// Don't change entry app, leave it
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
entry.app_select.val(widget.get_value());
|
||||||
|
entry.set_value({app: widget.get_value(), id: '', query: ''});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
group.onchange = (select_node, select_widget) =>
|
group.onchange = (select_node, select_widget) =>
|
||||||
{
|
{
|
||||||
console.log(this, arguments);
|
let options = this._get_placeholders(app.get_value(), group.get_value())
|
||||||
placeholder_list.set_select_options(this._get_placeholders(app.get_value(), group.get_value()));
|
placeholder_list.set_select_options(options);
|
||||||
preview.set_value("");
|
preview.set_value("");
|
||||||
|
placeholder_list.set_value(options[0].value);
|
||||||
}
|
}
|
||||||
placeholder_list.onchange = this._on_placeholder_select.bind(this);
|
placeholder_list.onchange = this._on_placeholder_select.bind(this);
|
||||||
entry.onchange = this._on_placeholder_select.bind(this);
|
entry.onchange = this._on_placeholder_select.bind(this);
|
||||||
@ -227,7 +249,7 @@ export class et2_placeholder_select extends et2_inputWidget
|
|||||||
this.options.insert_callback(this.dialog.template.widgetContainer.getDOMWidgetById("preview_content").getDOMNode().textContent);
|
this.options.insert_callback(this.dialog.template.widgetContainer.getDOMWidgetById("preview_content").getDOMNode().textContent);
|
||||||
};
|
};
|
||||||
|
|
||||||
this._on_placeholder_select();
|
app.set_value(app.get_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -252,9 +274,13 @@ export class et2_placeholder_select extends et2_inputWidget
|
|||||||
// Show the selected placeholder replaced with value from the selected entry
|
// Show the selected placeholder replaced with value from the selected entry
|
||||||
this.egw().json(
|
this.egw().json(
|
||||||
'EGroupware\\Api\\Etemplate\\Widget\\Placeholder::ajax_fill_placeholders',
|
'EGroupware\\Api\\Etemplate\\Widget\\Placeholder::ajax_fill_placeholders',
|
||||||
[app.get_value(), placeholder_list.get_value(), entry.get_value()],
|
[placeholder_list.get_value(), entry.get_value()],
|
||||||
function(_content)
|
function(_content)
|
||||||
{
|
{
|
||||||
|
if(!_content)
|
||||||
|
{
|
||||||
|
_content = '';
|
||||||
|
}
|
||||||
preview_content.set_value(_content);
|
preview_content.set_value(_content);
|
||||||
preview_content.getDOMNode().parentNode.style.visibility = _content.trim() ? null : 'hidden';
|
preview_content.getDOMNode().parentNode.style.visibility = _content.trim() ? null : 'hidden';
|
||||||
}.bind(this)
|
}.bind(this)
|
||||||
@ -385,6 +411,7 @@ export class et2_placeholder_snippet_select extends et2_placeholder_select
|
|||||||
placeholder_list.onchange = this._on_placeholder_select.bind(this);
|
placeholder_list.onchange = this._on_placeholder_select.bind(this);
|
||||||
entry.onchange = this._on_placeholder_select.bind(this);
|
entry.onchange = this._on_placeholder_select.bind(this);
|
||||||
|
|
||||||
|
app.set_value(app.get_value());
|
||||||
this._on_placeholder_select();
|
this._on_placeholder_select();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,9 +432,13 @@ export class et2_placeholder_snippet_select extends et2_placeholder_select
|
|||||||
// Show the selected placeholder replaced with value from the selected entry
|
// Show the selected placeholder replaced with value from the selected entry
|
||||||
this.egw().json(
|
this.egw().json(
|
||||||
'EGroupware\\Api\\Etemplate\\Widget\\Placeholder::ajax_fill_placeholders',
|
'EGroupware\\Api\\Etemplate\\Widget\\Placeholder::ajax_fill_placeholders',
|
||||||
[app.get_value(), placeholder_list.get_value(), entry.get_value()],
|
[placeholder_list.get_value(), entry.get_value()],
|
||||||
function(_content)
|
function(_content)
|
||||||
{
|
{
|
||||||
|
if(!_content)
|
||||||
|
{
|
||||||
|
_content = '';
|
||||||
|
}
|
||||||
this.set_value(_content);
|
this.set_value(_content);
|
||||||
preview_content.set_value(_content);
|
preview_content.set_value(_content);
|
||||||
preview_content.getDOMNode().parentNode.style.visibility = _content.trim() ? null : 'hidden';
|
preview_content.getDOMNode().parentNode.style.visibility = _content.trim() ? null : 'hidden';
|
||||||
|
@ -334,7 +334,7 @@ class Merge extends Api\Storage\Merge
|
|||||||
$group = 'customfields';
|
$group = 'customfields';
|
||||||
foreach($this->contacts->customfields as $name => $field)
|
foreach($this->contacts->customfields as $name => $field)
|
||||||
{
|
{
|
||||||
$placeholders[$group][$this->prefix($prefix, $name, '{')] = $field['label'];
|
$placeholders[$group][$this->prefix($prefix, '#' . $name, '{')] = $field['label'];
|
||||||
}
|
}
|
||||||
return $placeholders;
|
return $placeholders;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +64,9 @@ class Placeholder extends Etemplate\Widget
|
|||||||
|
|
||||||
if(is_null($apps))
|
if(is_null($apps))
|
||||||
{
|
{
|
||||||
$apps = ['addressbook', 'user', 'general'];
|
$apps = ['addressbook', 'user', 'general'] +
|
||||||
|
// We use linking for preview, so limit to apps that support links
|
||||||
|
array_keys(Api\Link::app_list('query'));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($apps as $appname)
|
foreach($apps as $appname)
|
||||||
@ -79,30 +81,38 @@ class Placeholder extends Etemplate\Widget
|
|||||||
$list = $merge->get_common_placeholder_list();
|
$list = $merge->get_common_placeholder_list();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$list = $merge->get_placeholder_list();
|
if(get_class($merge) === 'EGroupware\Api\Contacts\Merge' && $appname !== 'addressbook' || $placeholders[$appname])
|
||||||
|
{
|
||||||
|
// Looks like app doesn't support merging
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
$list = method_exists($merge, 'get_placeholder_list') ? $merge->get_placeholder_list() : [];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(!is_null($group))
|
if(!is_null($group) && is_array($list))
|
||||||
{
|
{
|
||||||
$list = array_intersect_key($list, $group);
|
$list = array_intersect_key($list, $group);
|
||||||
}
|
}
|
||||||
$placeholders[$appname] = $list;
|
if($list)
|
||||||
|
{
|
||||||
|
$placeholders[$appname] = $list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$response = Api\Json\Response::get();
|
$response = Api\Json\Response::get();
|
||||||
$response->data($placeholders);
|
$response->data($placeholders);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ajax_fill_placeholders($app, $content, $entry)
|
public function ajax_fill_placeholders($content, $entry)
|
||||||
{
|
{
|
||||||
$merge = Api\Storage\Merge::get_app_class($app);
|
$merge = Api\Storage\Merge::get_app_class($entry['app']);
|
||||||
$err = "";
|
$err = "";
|
||||||
|
|
||||||
switch($app)
|
switch($entry['app'])
|
||||||
{
|
{
|
||||||
case 'addressbook':
|
case 'addressbook':
|
||||||
default:
|
default:
|
||||||
$merged = $merge->merge_string($content, [$entry], $err, 'text/plain');
|
$merged = $merge->merge_string($content, [$entry['id']], $err, 'text/plain');
|
||||||
}
|
}
|
||||||
$response = Api\Json\Response::get();
|
$response = Api\Json\Response::get();
|
||||||
$response->data($merged);
|
$response->data($merged);
|
||||||
|
@ -1600,9 +1600,9 @@ abstract class Merge
|
|||||||
*/
|
*/
|
||||||
public static function get_app_class($appname)
|
public static function get_app_class($appname)
|
||||||
{
|
{
|
||||||
if(class_exists($appname) && is_subclass_of($appname, 'EGroupware\\Api\\Storage\\Merge'))
|
$classname = "{$appname}_merge";
|
||||||
|
if(class_exists($classname) && is_subclass_of($classname, 'EGroupware\\Api\\Storage\\Merge'))
|
||||||
{
|
{
|
||||||
$classname = "{$appname}_merge";
|
|
||||||
$document_merge = new $classname();
|
$document_merge = new $classname();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2709,4 +2709,23 @@ abstract class Merge
|
|||||||
|
|
||||||
return $replacements;
|
return $replacements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of placeholders provided.
|
||||||
|
*
|
||||||
|
* Placeholders are grouped logically. Group key should have a user-friendly translation.
|
||||||
|
* Override this method and specify the placeholders, as well as groups or a specific order
|
||||||
|
*/
|
||||||
|
public function get_placeholder_list($prefix = '')
|
||||||
|
{
|
||||||
|
$placeholders = [
|
||||||
|
'placeholders' => []
|
||||||
|
];
|
||||||
|
foreach(Customfields::get($this->get_app()) as $name => $field)
|
||||||
|
{
|
||||||
|
$placeholders['customfields'][$this->prefix($prefix, '#' . $name, '{')] = $field['label'] . ($field['type'] == 'select-account' ? '*' : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $placeholders;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,14 +250,44 @@ class infolog_merge extends Api\Storage\Merge
|
|||||||
echo '<tr><td>{{info_contact/#'.$name.'}}</td><td colspan="3">'.$field['label']."</td></tr>\n";
|
echo '<tr><td>{{info_contact/#'.$name.'}}</td><td colspan="3">'.$field['label']."</td></tr>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
echo '<tr><td colspan="4"><h3>'.lang('General fields:')."</h3></td></tr>";
|
echo '<tr><td colspan="4"><h3>' . lang('General fields:') . "</h3></td></tr>";
|
||||||
foreach($this->get_common_replacements() as $name => $label)
|
foreach($this->get_common_replacements() as $name => $label)
|
||||||
{
|
{
|
||||||
echo '<tr><td>{{'.$name.'}}</td><td colspan="3">'.$label."</td></tr>\n";
|
echo '<tr><td>{{' . $name . '}}</td><td colspan="3">' . $label . "</td></tr>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "</table>\n";
|
echo "</table>\n";
|
||||||
|
|
||||||
echo $GLOBALS['egw']->framework->footer();
|
echo $GLOBALS['egw']->framework->footer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function get_placeholder_list($prefix = '')
|
||||||
|
{
|
||||||
|
$placeholders = parent::get_placeholder_list($prefix);
|
||||||
|
|
||||||
|
$tracking = new infolog_tracking($this->bo);
|
||||||
|
$fields = array('info_id' => lang('Infolog ID'), 'pm_id' => lang('Project ID'),
|
||||||
|
'project' => lang('Project name')) + $tracking->field2label + array('info_sum_timesheets' => lang('Used time'));
|
||||||
|
Api\Translation::add_app('projectmanager');
|
||||||
|
|
||||||
|
$group = 'placeholders';
|
||||||
|
foreach($fields as $name => $label)
|
||||||
|
{
|
||||||
|
if(in_array($name, array('custom')))
|
||||||
|
{
|
||||||
|
// dont show them
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$marker = $this->prefix($prefix, $name, '{');
|
||||||
|
if(!array_filter($placeholders, function ($a) use ($marker)
|
||||||
|
{
|
||||||
|
return array_key_exists($marker, $a);
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
$placeholders[$group][$marker] = $label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $placeholders;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user