Get submit actions (like Insert in document) working

This commit is contained in:
Nathan Gray 2012-04-17 22:56:04 +00:00
parent b05290d494
commit ea838035b6
4 changed files with 93 additions and 8 deletions

View File

@ -172,6 +172,7 @@ class etemplate_widget_nextmatch extends etemplate_widget
$value['start'] = (int)$queriedRange['start'];
$value['num_rows'] = (int)$queriedRange['num_rows'];
if($value['num_rows'] == 0) $value['num_rows'] = 20;
// if app supports parent_id / hierarchy ($value['parent_id'] not empty), set parent_id as filter
if (($parent_id = $value['parent_id']))
{
@ -687,6 +688,13 @@ class etemplate_widget_nextmatch extends etemplate_widget
// On client, rows does not get its own namespace, but all apps are expecting it
$value['rows'] = $value;
// Legacy support - action popups were not properly namespaced
$preserve = self::get_array(self::$request->preserv, $form_name);
if($value[$preserve['action_var']] && $content[$value[$preserve['action_var']].'_popup'])
{
$validated += $content[$value[$preserve['action_var']].'_popup'];
}
// Save current column settings as default (admins only)
if($value['as_default'])
{

View File

@ -114,7 +114,7 @@ function nm_action(_action, _senders, _target, _ids)
// open div styled as popup contained in current form and named action.id+'_popup'
if (nm_popup_action == null)
{
nm_open_popup(_action, _ids);
nm_open_popup(_action, _ids.ids);
break;
}
// fall through, if popup is open --> submit form
@ -145,12 +145,24 @@ function nm_action(_action, _senders, _target, _ids)
"checkboxes": checkboxes_elem ? checkboxes_elem.value : null
};
value[nextmatch.options.settings.action_var]= _action.id;
if(_target && _target.id) value[_target.id] = true;
return value;
}
if(_action.data.nm_action == 'popup')
{
nextmatch.getInstanceManager().submit();
// Clear action in case there's another one
delete nextmatch.getValue;
// TODO: force nextmatch to re-load affected rows
}
else
{
// Full POST
nextmatch.getInstanceManager().postSubmit();
}
}
else
{
@ -245,6 +257,27 @@ function nm_open_popup(_action, _ids)
nm_popup_action = _action;
nm_popup_ids = _ids;
popup.style.display = 'block';
/*
Not working yet - DOM manipulation causes et2 problems
var dialog = jQuery('.action_popup-content',popup);
var d_buttons = [];
jQuery('button',popup).each(function(index) {
var but = jQuery(this);
d_buttons.push({
text: but.text(),
click: this.onclick ? this.onclick : function(e) {
dialog.dialog("close");
// Need to destroy the dialog, etemplate widget needs divs back where they were
dialog.dialog("destroy");
nm_popup_action.data.nextmatch.getRoot().getWidgetById(but.attr("id")).onclick.apply(nm_popup_action.data.nextmatch.getRoot().getWidgetById(but.attr("id")), e.currentTarget);}
});
});
dialog.dialog({
title: jQuery('.promptheader',popup).text(),
modal: true,
buttons: d_buttons
});
*/
}
}
@ -257,16 +290,20 @@ function nm_submit_popup(button)
{
button.form.submit_button.value = button.name; // set name of button (sub-action)
}
else if (nm_popup_action.data.nextmatch)
{
nm_popup_action.data.nextmatch.getRoot().getWidgetById(button.id).clicked = true;
}
// Mangle senders to get IDs where nm_action() wants them
// No idea why this is needed
var ids = {ids:[]};
for(var i in nm_popup_ids)
{
ids.ids.push(nm_popup_ids[i].id);
ids.ids.push(nm_popup_ids[i]);
}
// call regular nm_action to transmit action and senders correct
nm_action(nm_popup_action,nm_popup_ids, null, ids);
nm_action(nm_popup_action,nm_popup_ids, button, ids);
}
/**

View File

@ -122,12 +122,15 @@ var et2_button = et2_baseWidget.extend([et2_IInput, et2_IDetachedDOM], {
},
onclick: function(_node) {
this.clicked = true;
// Execute the JS code connected to the event handler
if (this.options.onclick)
{
// Exectute the legacy JS code
if (!(et2_compileLegacyJS(this.options.onclick, this, _node))())
{
this.clicked = false;
return false;
}
}
@ -135,10 +138,9 @@ var et2_button = et2_baseWidget.extend([et2_IInput, et2_IDetachedDOM], {
// Submit the form
if (this._type != "buttononly")
{
this.clicked = true;
this.getInstanceManager().submit(this); //TODO: this only needs to be passed if it's in a datagrid
this.clicked = false;
}
this.clicked = false;
},
set_label: function(_value) {

View File

@ -293,6 +293,44 @@ etemplate2.prototype.submit = function(button)
}
}
/**
* Does a full form post submit.
* Only use this one if you need it, use the ajax submit() instead
*/
etemplate2.prototype.postSubmit = function()
{
// Get the form values
var values = this.getValues(this.widgetContainer);
// Trigger the submit event
var canSubmit = true;
this.widgetContainer.iterateOver(function(_widget) {
if (_widget.submit(values) === false)
{
canSubmit = false;
}
}, this, et2_ISubmitListener);
if (canSubmit)
{
var form = document.createElement("form");
form.method = "POST";
form.action = egw().webserverUrl +"/json.php?menuaction=etemplate::ajax_process_post";
var etemplate_id = document.createElement("input");
etemplate_id.name = 'etemplate_exec_id';
etemplate_id.value = this.etemplate_exec_id;
form.appendChild(etemplate_id);
var input = document.createElement("input");
input.name = 'value';
input.value = egw().jsonEncode(values);
form.appendChild(input);
form.submit();
}
}
/**
* Fetches all input element values and returns them in an associative
* array. Widgets which introduce namespacing can use the internal _target