Page MenuHomeIn-Portal Phabricator

modern-store
No OneTemporary

File Metadata

Created
Wed, Feb 12, 3:11 AM

modern-store

Index: branches/1.0.x/inc/js/form_manager.js
===================================================================
--- branches/1.0.x/inc/js/form_manager.js (revision 15355)
+++ branches/1.0.x/inc/js/form_manager.js (revision 15356)
@@ -1,537 +1,573 @@
function FormManager() { }
FormManager.init = function ($settings) {
$.ajaxSetup( {cache: false} );
this.url = '';
this.fieldMask = '#PREFIX#[#ID#][#FIELD_NAME#]';
this.noErrorsHTML = '';
this.checkTimeout = 1000;
this.pendingChecks = {};
this.fields = {};
+ this.errors = {};
this.fieldTypes = {};
this.forms = {};
this.fieldWatermarks = {};
this.xhrRequests = [];
$.extend(this, $settings);
}
FormManager.resetFields = function ($prefix) {
this.fields[$prefix] = [];
}
FormManager.registerField = function ($prefix, $field, $watermark, $field_type) {
// fields are registered before form -> store them in separate array
if (!this.fields[$prefix]) {
this.fields[$prefix] = [];
}
if ($watermark === undefined) {
$watermark = '';
}
this.fieldWatermarks[$prefix + '_' + $field] = $watermark;
this.fields[$prefix].push($field);
if ($field_type !== undefined) {
this.fieldTypes[$prefix + '_' + $field] = $field_type;
}
}
FormManager.unregisterField = function ($prefix, $field) {
var $field_index = array_search($field, this.fields[$prefix]);
this.fields[$prefix].splice($field_index, 1);
delete this.fieldWatermarks[$prefix + '_' + $field];
delete this.fieldTypes[$prefix + '_' + $field];
}
FormManager.getFieldMask = function ($prefix) {
return this.fieldMask.replace('#PREFIX#', $prefix).replace('#ID#', this.form_param($prefix, 'id'));
}
FormManager.getField = function ($prefix, $field, $prepend, $append) {
if ($prepend === undefined) {
$prepend = '';
}
if ($append === undefined) {
$append = '';
}
var $control_id = this.getFieldMask($prefix).replace('#FIELD_NAME#', $field);
return document.getElementById($prepend + $control_id + $append);
}
FormManager.getBlurFields = function ($prefix, $field) {
var $field_mask = this.getFieldMask($prefix);
switch ( this.fieldTypes[$prefix + '_' + $field] ) {
case 'swf_upload':
return this.getField($prefix, $field, undefined, '[tmp_names]');
break;
case 'date':
$field += '_date';
break;
case 'radio':
return $("input[name='" + jq($field_mask.replace('#FIELD_NAME#', $field)) + "']");
break;
case 'checkbox':
return get_control($field_mask, $field, undefined, '_cb');
break;
case 'checkboxes':
return $("input[id^='" + jq($field_mask.replace('#FIELD_NAME#', $field)) + "_']");
break;
case 'cc_expiration':
return $('select', this.getCell($prefix, $field, 'field'));
break;
}
return this.getField($prefix, $field);
}
FormManager.registerForm = function ($settings) {
var $defaults = {
url: false, // url for form submission
+ template: '', // template to use instead of empty string
prefix: '', // unit prefix, used in the form
enabled: true, // form submit enabled
enabledTimer: null, // timer that performs form-resubmit countdown
save_event: '', // event to use for form data processing
id: 0, // id of item being add/edited on a form
form_id: '', // form id to work with
before_close: '', // before window close callback
validation_failure: '', // on validate failure callback
immediate_validation: true // perfom validation on blur
}
this.forms[$settings.prefix] = {};
$.extend(this.forms[$settings.prefix], $defaults, $settings);
// when form is registred, then all it's fields should also be registred
if ( !this.form_param($settings.prefix, 'immediate_validation') ) {
return ;
}
var $me = this;
$( this.fields[$settings.prefix] ).each(
function () {
- $( $me.getBlurFields($settings.prefix, this) ).blur(
+ var $blur_fields = $( $me.getBlurFields($settings.prefix, this) ),
+ $event_name = $blur_fields.length == 1 ? 'blur' : 'click';
+
+ $( $me.getBlurFields($settings.prefix, this) )[$event_name](
function ($e) {
$me.checkField(this);
}
);
}
);
+ for (var $error_field in this.errors[$settings.prefix]) {
+ this.setFieldStatus($settings.prefix, $error_field, this.errors[$settings.prefix][$error_field]);
+ }
+
+ // custom: begin
$('input[title], select[title], textarea[title]', '#' + this.forms[$settings.prefix].form_id).qtip(
{
style: {
classes: 'ui-tooltip-light ui-tooltip-shadow'
},
position: {
my: 'left center',
at: 'right center'
},
show: {
event: 'focus'
}
}
);
$('img.help-icon', '#' + this.forms[$settings.prefix].form_id ).qtip(
{
style: {
classes: 'ui-tooltip-light ui-tooltip-shadow'
},
position: {
my: 'bottom left',
at: 'top center'
}
}
);
+ // custom: end
}
FormManager.getURL = function ($prefix, $template, $event, $params) {
var $url = this.form_param($prefix, 'url');
if (!$url) {
$url = this.url;
}
if ($template === undefined) {
- $template = '';
+ $template = this.form_param($prefix, 'template');
}
$url = $url.replace('#TEMPLATE#', $template);
if ($event !== undefined) {
$url += ($url.indexOf('?') == -1 ? '?' : '&') + 'events[' + $prefix + ']=' + $event;
}
if ( typeof($params) == 'object' ) {
for (key in $params) {
$url += ($url.indexOf('?') == -1 ? '?' : '&') + key + '=' + $params[key];
}
}
return $url;
}
FormManager.processResponse = function ($prefix, $data, $add_params) {
// enable form back
// alert('enabling for for [' + $prefix + '] in processResponse');
if ( $add_params !== undefined ) {
$add_params.response = $data;
}
else {
$add_params = {response: $data};
}
this.clearErrors($prefix);
if ($data.status == 'OK') {
var $next_template = this.getNextTemplate($prefix, $data);
- if ( $next_template || $data.do_refresh ) {
+ if ( $next_template || $data.do_refresh || $data.redirect_to ) {
var $before_close = this.getFormParamOverride($prefix, 'before_close', $add_params);
if ( $.isFunction($before_close) ) {
$before_close.call(this, $data, $add_params);
}
if ( $next_template ) {
// load another template instead of current form
$('#TB_ajaxContent').html('').load( this.getURL($prefix, $next_template, undefined, $data.params) );
}
else if ( $data.do_refresh ) {
// refresh whole page
window.location.href = window.location.href;
}
+ else if ( $data.redirect_to ) {
+ // redirect to given page
+ window.location.href = $data.redirect_to;
+ }
}
else {
// close form without refreshing the page
this.closeForm($prefix, $data, $add_params);
}
}
else {
// set new errors
for ($field in $data.field_errors) {
this.setFieldStatus($prefix, $field, $data.field_errors[$field]);
}
var $validation_failure = this.form_param($prefix, 'validation_failure');
if ( $.isFunction($validation_failure) ) {
$validation_failure.call(this, $data, $add_params);
}
}
this.enableForm($prefix, true);
// var $me = this;
// setTimeout(function () { $me.enableForm($prefix, true); }, 1000);
}
/**
* Clear errors from all from fields
*
* @param $prefix
*/
FormManager.clearErrors = function ($prefix) {
var $fields = this.fields[$prefix];
if (typeof($fields) == 'undefined') {
$fields = [];
}
+ this.errors[$prefix] = {};
+
for (var $i = 0; $i < $fields.length; $i++) {
this.setFieldStatus($prefix, $fields[$i]);
}
}
FormManager.getNextTemplate = function ($prefix, $responce) {
if ( $responce.next_template && $responce.next_template != '' ) {
return $responce.next_template;
}
else if ( this.form_param($prefix, 'next_template') ) {
return this.form_param($prefix, 'next_template');
}
return false;
}
FormManager.getCell = function ($prefix, $field_name, $cell_type) {
$field_name = $field_name.replace(/_(date|time)$/, '');
return this.getField($prefix, $field_name, undefined, '_' + $cell_type + '_cell');
}
FormManager.setFieldStatus = function ($prefix, $field_name, $error_msg) {
var field_cell = this.getCell($prefix, $field_name, 'field');
var status_cell = this.getCell($prefix, $field_name, 'status');
- if (!field_cell) {
- alert('Error field "' + $field_name + '" missing.');
+ if ( $error_msg === undefined || !$error_msg ) {
+ $error_msg = '';
+ }
+
+ if ( !field_cell ) {
+ if (!this.errors[$prefix]) {
+ this.errors[$prefix] = {};
+ }
+
+ this.errors[$prefix][$field_name] = $error_msg;
+
+ /*if(typeof console === 'object') {
+ console.log('FormManager: Error field "' + $field_name + '" missing.');
+ }*/
+
return ;
}
if ($error_msg === undefined || !$error_msg) {
// show OK
$(field_cell).parents('p:first').removeClass('error'); //.addClass('ok');
$(status_cell)/*.removeClass('field-error')*/.html(this.noErrorsHTML);
var $fields = this.fields[$prefix];
for (var $i = 0; $i < $fields.length; $i++) {
if ( this.fieldHasError($prefix, $fields[$i]) ) {
return ;
}
}
}
else {
// show error message
$(field_cell).parents('p:first')/*.removeClass('ok')*/.addClass('error');
$(status_cell)/*.addClass('field-error')*/.html($error_msg);
}
}
FormManager.fieldHasError = function ($prefix, $field) {
var status_cell = this.getField($prefix, $field, undefined, '_status_cell');
return $.trim( $(status_cell).html() ) != $.trim( this.noErrorsHTML );
}
FormManager.checkField = function ($input, $delayed) {
if ( !$input.id.match(/^(.*?)\[.*?\]\[(.*?)\].*?$/) ) {
return ;
}
var $prefix = RegExp.$1;
var $field = RegExp.$2.replace(/(_date|_time)$/, '');
if ( $field.match(/(.*)(Month|Year)$/) && this.fieldTypes[$prefix + '_' + RegExp.$1 + 'Date'] == 'cc_expiration' ) {
$field = RegExp.$1 + 'Date';
}
if ( this.pendingChecks[$field] ) {
clearTimeout( this.pendingChecks[$field] );
delete this.pendingChecks[$field];
}
var $me = this;
this.pendingChecks[$field] = setTimeout(
function () {
$me.validateField($prefix, $field, $input)
},
($delayed === true ? this.checkTimeout : 0)
);
}
FormManager.validateField = function ($prefix, $field, $input) {
var $me = this;
var form = document.getElementById( this.form_param($prefix, 'form_id') );
var $request = $.post(
this.getURL($prefix, undefined, 'OnValidateField') + '&field=' + encodeURIComponent($field) + '&' + $input.name + '=' + encodeURIComponent($input.value),
- $(form).serialize(),
+ this._getFormFields($prefix),
function ($data) {
$data = eval('(' + $data + ')');
$me.setFieldStatus($prefix, $field, $data.status == 'OK' ? undefined : $data.status);
- $("input[type='submit']", form).attr('disabled', !$.isArray($data.other_errors) );
+ $("input[type='submit']", form).attr('disabled', !$.isArray($data.other_errors) ); // custom
}
);
this.xhrRequests.push($request);
};
FormManager.form_param = function ($prefix, $param, $value) {
if ( this.forms[$prefix] === undefined ) {
return '';
}
if ($value === undefined) {
return this.forms[$prefix][$param];
}
this.forms[$prefix][$param] = $value;
}
FormManager.getFormParamOverride = function ($prefix, $param, $overrides) {
if ( $overrides[$param] !== undefined ) {
return $overrides[$param];
}
return this.form_param($prefix, $param);
}
/* === related to form opening/closing/submitting === */
FormManager.openForm = function ($prefix, $template, $width, $height, $source_form, $params) {
var $url = this.getURL($prefix, $template, undefined, $params);
$url += ($url.indexOf('?') == -1 ? '?' : '&') + 'width=' + $width + '&height=' + $height + '&modal=true';
var $tb_settings = {url: $url};
if ($source_form !== undefined) {
$tb_settings.postParams = $($source_form).serialize();
}
TB.show($tb_settings);
}
FormManager.validateAll = function ($prefix, $status) {
var $fields = this.fields[$prefix];
for (var $i = 0; $i < $fields.length; $i++) {
this.setFieldStatus($prefix, $fields[$i], $status);
}
}
FormManager.closeForm = function ($prefix, $data, $add_params) {
if ( $data === undefined ) {
$data = {};
}
if ( $add_params === undefined ) {
$add_params = {};
}
var $before_close = this.getFormParamOverride($prefix, 'before_close', $add_params);
this.cancelXHRRequests();
this.validateAll($prefix);
if ( $.isFunction($before_close) ) {
var $result = $before_close.call(this, $data, $add_params);
if ($result === false) {
return;
}
}
TB.remove();
}
FormManager._getFormFields = function ($prefix) {
- var $fields = this.fields[$prefix];
+ var $old_values = {},
+ $fields = this.fields[$prefix];
if (typeof($fields) == 'undefined') {
$fields = [];
}
- // remove watermakrs from input fields
+ // remove watermarks from input fields
for (var $i = 0; $i < $fields.length; $i++) {
- var $control = this.getField($prefix, $fields[$i]);
- var $watermark = this.fieldWatermarks[ $prefix + '_' + $fields[$i] ];
+ var $control = this.getField($prefix, $fields[$i]),
+ $watermark = this.fieldWatermarks[ $prefix + '_' + $fields[$i] ];
- if ($control && $watermark !== undefined && $control.value == $watermark) {
- $control.value = '';
+ if ( $control ) {
+ $old_values[$fields[$i]] = $control.value;
+
+ if ( $watermark !== undefined && $control.value == $watermark ) {
+ $control.value = '';
+ }
}
}
- var form = document.getElementById( this.form_param($prefix, 'form_id') );
- var $form_fields = $(form).serialize();
+ var form = document.getElementById( this.form_param($prefix, 'form_id')),
+ $form_fields = $(form).serialize();
- // restore watermarks in input fields
+ // restore original values into input fields
for (var $i = 0; $i < $fields.length; $i++) {
var $control = this.getField($prefix, $fields[$i]);
- var $watermark = this.fieldWatermarks[$prefix + '_' + $fields[$i]];
- if ($control && $watermark !== undefined && !$control.value) {
- $control.value = $watermark;
+ if ( $control ) {
+ $control.value = $old_values[$fields[$i]];
}
}
return $form_fields;
}
FormManager.enableForm = function ($prefix, $enabled) {
if ($enabled === undefined) {
$enabled = true;
}
if ($enabled) {
clearTimeout( this.form_param($prefix, 'enabledTimer') );
this.form_param($prefix, 'enabledTimer', null);
}
else {
var $me = this;
// set timer for 10 seconds to enable form back (just in case if ajax responce fails)
var $timer = setTimeout(
function () {
// alert('enabling for for [' + $prefix + '] in setTimeout');
$me.enableForm($prefix, true);
}
, 10000
);
this.form_param($prefix, 'enabledTimer', $timer);
}
this.form_param($prefix, 'enabled', $enabled);
}
FormManager.cancelXHRRequests = function () {
while ( this.xhrRequests.length > 0 ) {
this.xhrRequests.shift().abort();
}
}
FormManager.submitForm = function ($prefix, $add_params) {
if ( !this.form_param($prefix, 'enabled') ) {
return ;
}
// disable form
this.enableForm($prefix, false);
var $me = this;
this.cancelXHRRequests();
$.post(
- this.getURL( $prefix, '', this.form_param($prefix, 'save_event') ),
+ this.getURL( $prefix, undefined, this.form_param($prefix, 'save_event') ),
this._getFormFields($prefix),
function ($data) {
var $redirect = TB.parseRedirect($data);
if ( $redirect !== false ) {
window.location.href = $redirect;
return ;
}
$me.processResponse($prefix, eval('(' + $data + ')'), $add_params);
}
)
}
FormManager.beforeClose = function () {
this.cancelXHRRequests();
for (var $prefix in this.forms) {
var $before_close = this.form_param($prefix, 'before_close');
+ this.clearErrors($prefix);
+
if ( $.isFunction($before_close) ) {
$before_close.call(this, {}, {});
}
}
}
\ No newline at end of file

Event Timeline