Placeholder dialog: Support for other apps, starting with Infolog

This commit is contained in:
nathan 2021-09-27 14:46:41 -06:00
parent eb57294146
commit 7f930a6221
5 changed files with 111 additions and 21 deletions

View File

@ -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';

View File

@ -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;
} }

View File

@ -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);

View File

@ -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;
}
} }

View File

@ -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;
}
} }