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['start'] = (int)$queriedRange['start'];
$value['num_rows'] = (int)$queriedRange['num_rows']; $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 app supports parent_id / hierarchy ($value['parent_id'] not empty), set parent_id as filter
if (($parent_id = $value['parent_id'])) 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 // On client, rows does not get its own namespace, but all apps are expecting it
$value['rows'] = $value; $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) // Save current column settings as default (admins only)
if($value['as_default']) 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' // open div styled as popup contained in current form and named action.id+'_popup'
if (nm_popup_action == null) if (nm_popup_action == null)
{ {
nm_open_popup(_action, _ids); nm_open_popup(_action, _ids.ids);
break; break;
} }
// fall through, if popup is open --> submit form // 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 "checkboxes": checkboxes_elem ? checkboxes_elem.value : null
}; };
value[nextmatch.options.settings.action_var]= _action.id; value[nextmatch.options.settings.action_var]= _action.id;
if(_target && _target.id) value[_target.id] = true;
return value; return value;
} }
nextmatch.getInstanceManager().submit();
// Clear action in case there's another one if(_action.data.nm_action == 'popup')
delete nextmatch.getValue; {
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 else
{ {
@ -245,6 +257,27 @@ function nm_open_popup(_action, _ids)
nm_popup_action = _action; nm_popup_action = _action;
nm_popup_ids = _ids; nm_popup_ids = _ids;
popup.style.display = 'block'; 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) 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 // Mangle senders to get IDs where nm_action() wants them
// No idea why this is needed // No idea why this is needed
var ids = {ids:[]}; var ids = {ids:[]};
for(var i in nm_popup_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 // 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) { onclick: function(_node) {
this.clicked = true;
// Execute the JS code connected to the event handler // Execute the JS code connected to the event handler
if (this.options.onclick) if (this.options.onclick)
{ {
// Exectute the legacy JS code // Exectute the legacy JS code
if (!(et2_compileLegacyJS(this.options.onclick, this, _node))()) if (!(et2_compileLegacyJS(this.options.onclick, this, _node))())
{ {
this.clicked = false;
return false; return false;
} }
} }
@ -135,10 +138,9 @@ var et2_button = et2_baseWidget.extend([et2_IInput, et2_IDetachedDOM], {
// Submit the form // Submit the form
if (this._type != "buttononly") 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.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) { 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 * Fetches all input element values and returns them in an associative
* array. Widgets which introduce namespacing can use the internal _target * array. Widgets which introduce namespacing can use the internal _target