edifice 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/edifice/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: edifice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 59
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 9
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.9.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tom Coleman
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2011-10-
|
20
|
+
date: 2011-10-14 00:00:00 Z
|
21
21
|
dependencies: []
|
22
22
|
|
23
23
|
description: The idea here is to communicate which view is rendering to the javascript so that we can call the correct javascript files in an automagical way.
|
@@ -40,8 +40,6 @@ files:
|
|
40
40
|
- README
|
41
41
|
- Rakefile
|
42
42
|
- app/assets/javascripts/edifice.js
|
43
|
-
- app/assets/javascripts/edifice/edifice_form.js
|
44
|
-
- app/assets/javascripts/edifice/form.js
|
45
43
|
- app/assets/javascripts/edifice/framework.js
|
46
44
|
- edifice.gemspec
|
47
45
|
- init.rb
|
@@ -1,112 +0,0 @@
|
|
1
|
-
// add methods to a form element so it can be easily manipulated
|
2
|
-
//
|
3
|
-
// add client side validation
|
4
|
-
// understands:
|
5
|
-
// - rails form structures
|
6
|
-
// - rails form errors in JSON
|
7
|
-
// - etc
|
8
|
-
(function($) {
|
9
|
-
$.fn.edifice_form = function() {
|
10
|
-
$.extend(this, methods);
|
11
|
-
return this;
|
12
|
-
};
|
13
|
-
|
14
|
-
// VALIDATORS:
|
15
|
-
// validators expect a form element and return true or an error message
|
16
|
-
$.fn.edifice_form.validators = {
|
17
|
-
not_empty: function($input) {
|
18
|
-
return $input.val() ? true : 'must not be empty';
|
19
|
-
}
|
20
|
-
};
|
21
|
-
|
22
|
-
|
23
|
-
// in these 'this' is the $form
|
24
|
-
var methods = {
|
25
|
-
fields: function() {
|
26
|
-
return this.find('input, textarea, select');
|
27
|
-
},
|
28
|
-
|
29
|
-
error_fields: function() {
|
30
|
-
var $form = this;
|
31
|
-
return this.fields().filter(function() {
|
32
|
-
return $form.has_error($(this));
|
33
|
-
});
|
34
|
-
},
|
35
|
-
|
36
|
-
submits: function() {
|
37
|
-
return this.find('input[type=submit], button[type=submit]');
|
38
|
-
},
|
39
|
-
|
40
|
-
valid: function() {
|
41
|
-
var $form = this, valid = true;
|
42
|
-
|
43
|
-
this.fields().each(function() {
|
44
|
-
if (!$form.validate($(this))) { valid = false; }
|
45
|
-
});
|
46
|
-
|
47
|
-
return valid;
|
48
|
-
},
|
49
|
-
|
50
|
-
// 'prepare' a validator --> validator returns true or an error string
|
51
|
-
set_validator: function($field, validator) {
|
52
|
-
if (typeof validator === 'string') {
|
53
|
-
validator = $.fn.edifice_form.validators[validator] || validator;
|
54
|
-
if (typeof validator !== 'function') { throw "Validator not defined: '" + validator + "'"; }
|
55
|
-
};
|
56
|
-
$field.data('validator', validator);
|
57
|
-
},
|
58
|
-
|
59
|
-
// validate a single field
|
60
|
-
validate: function($field, validator) {
|
61
|
-
if (typeof validator === 'undefined') { validator = $field.data('validator'); }
|
62
|
-
if (validator) {
|
63
|
-
var error = validator($field), valid = error === true;
|
64
|
-
this.clear_error($field);
|
65
|
-
if (!valid) {
|
66
|
-
this.add_error($field, error);
|
67
|
-
}
|
68
|
-
|
69
|
-
return valid;
|
70
|
-
} else {
|
71
|
-
return true;
|
72
|
-
}
|
73
|
-
},
|
74
|
-
|
75
|
-
label_for: function($field) {
|
76
|
-
return this.find('label[for=' + $field.attr('id') + ']');
|
77
|
-
},
|
78
|
-
|
79
|
-
error_on: function($field) {
|
80
|
-
return this.label_for($field).parents('.field_with_errors').next('.formError');
|
81
|
-
},
|
82
|
-
|
83
|
-
has_error: function($field) {
|
84
|
-
return $field.parent('.field_with_errors').length > 0;
|
85
|
-
},
|
86
|
-
|
87
|
-
clear_error: function($field) {
|
88
|
-
var id = $field.attr('id');
|
89
|
-
if (this.has_error($field)) { $field.unwrap() }
|
90
|
-
|
91
|
-
this.find('.field_with_errors label[for=' + id + ']')
|
92
|
-
.unwrap()
|
93
|
-
.next('.formError').remove();
|
94
|
-
},
|
95
|
-
|
96
|
-
add_error: function($field, error) {
|
97
|
-
var id = $field.attr('id');
|
98
|
-
$field.wrap('<div class="field_with_errors">');
|
99
|
-
this.find('label[for=' + id + ']')
|
100
|
-
.after('<div class="formError">' + error + '</div>')
|
101
|
-
.wrap('<div class="field_with_errors">');
|
102
|
-
|
103
|
-
},
|
104
|
-
|
105
|
-
set_errors: function(errors) {
|
106
|
-
for (var name in errors) {
|
107
|
-
this.add_error(this.fields().filter('[name*=' + name + ']'), errors[name][0]);
|
108
|
-
}
|
109
|
-
}
|
110
|
-
};
|
111
|
-
|
112
|
-
}(jQuery));
|
@@ -1,137 +0,0 @@
|
|
1
|
-
(function($) {
|
2
|
-
var defaults = {
|
3
|
-
status_element: this, // element to set to .submitting/.success/.error as we submit
|
4
|
-
// a hash of input selector -> validation functions/names
|
5
|
-
validators: {},
|
6
|
-
// stop the form from submitting and use ajax
|
7
|
-
ajax: true,
|
8
|
-
// type of data to pass around (and thus what's seen by e.g. success)
|
9
|
-
dataType: 'html'
|
10
|
-
};
|
11
|
-
|
12
|
-
// EVENTS that fire during the course of the life of the submission:
|
13
|
-
// submit, invalid, success | error (+ user_error | server_error), complete
|
14
|
-
//
|
15
|
-
// -> success,errors + complete are all passed the data you would expect from
|
16
|
-
// jQuery.ajax
|
17
|
-
//
|
18
|
-
// obviously on submit + invalid fire for non-ajax forms
|
19
|
-
|
20
|
-
$.edifice_widgets.form = function() { return this.each(form); }
|
21
|
-
|
22
|
-
function form() {
|
23
|
-
var $form = $(this).edifice_form();
|
24
|
-
$form.settings = $form.read_options(defaults);
|
25
|
-
$.extend($form, methods);
|
26
|
-
|
27
|
-
$form.initialize();
|
28
|
-
}
|
29
|
-
var methods = {
|
30
|
-
initialize: function() {
|
31
|
-
// I don't know why, but FF seems to helpful remember that these are disabled
|
32
|
-
this.submits().removeAttr('disabled');
|
33
|
-
this.prepare_validators();
|
34
|
-
this.prepare_submit();
|
35
|
-
},
|
36
|
-
|
37
|
-
prepare_validators: function() {
|
38
|
-
var $form = this;
|
39
|
-
|
40
|
-
// setup validators from settings
|
41
|
-
for (var selector in $form.settings.validators) {
|
42
|
-
$form.set_validator($(selector), $form.settings.validators[selector]);
|
43
|
-
}
|
44
|
-
|
45
|
-
// setup validators from html
|
46
|
-
$form.fields().filter('[data-widget-validator]').each(function() {
|
47
|
-
$form.set_validator($(this), $(this).attr('data-widget-validator'));
|
48
|
-
});
|
49
|
-
|
50
|
-
// listen to validator
|
51
|
-
this.fields().live('change.ajax_form focusout.ajax_form', function() {
|
52
|
-
if ($form.validate($(this)) === false) { $form.trigger('invalid', [$form, $(this)]); }
|
53
|
-
});
|
54
|
-
},
|
55
|
-
|
56
|
-
prepare_submit: function() {
|
57
|
-
var $form = this;
|
58
|
-
this.submit(function(event) {
|
59
|
-
// do pre-submit validations
|
60
|
-
if (!$form.valid()) {
|
61
|
-
$form.invalid();
|
62
|
-
return false; // we are done.
|
63
|
-
}
|
64
|
-
|
65
|
-
$form.submits().attr('disabled', true); // disable submit buttons
|
66
|
-
|
67
|
-
// TODO - set status class
|
68
|
-
if ($form.settings.ajax && $form.settings.ajax !== 'false') {
|
69
|
-
// send up the form and process the results
|
70
|
-
$.ajax({
|
71
|
-
url: $form.attr('action'), type: $form.attr('method'),
|
72
|
-
dataType: $form.settings.dataType,
|
73
|
-
data: $.param($form.serializeArray()),
|
74
|
-
cache: false,
|
75
|
-
error: function (x, t, e) { $form.error(x, t, e); },
|
76
|
-
success: function (data, status) {
|
77
|
-
$form.trigger('success', [data, status, $form]);
|
78
|
-
},
|
79
|
-
complete: function (request, text_status) {
|
80
|
-
$form.trigger('complete', [request, text_status, $form]);
|
81
|
-
|
82
|
-
$form.submits().removeAttr('disabled');
|
83
|
-
}
|
84
|
-
});
|
85
|
-
event.preventDefault();
|
86
|
-
}
|
87
|
-
|
88
|
-
});
|
89
|
-
},
|
90
|
-
|
91
|
-
invalid: function() {
|
92
|
-
// focus the first error
|
93
|
-
this.error_fields().eq(0).focus();
|
94
|
-
this.trigger('invalid', [this]);
|
95
|
-
},
|
96
|
-
|
97
|
-
error: function(request, text_status, error) {
|
98
|
-
this.trigger('error', [request, status, error, this]);
|
99
|
-
|
100
|
-
// handle the different possible errors that we can see
|
101
|
-
if (request.status >= 400 && request.status < 500) {
|
102
|
-
// CLIENT ERROR -- server-side validation failed.
|
103
|
-
this.trigger('client_error', [request, status, error, this]);
|
104
|
-
|
105
|
-
// if data is html, we replace this content of the form with the content
|
106
|
-
// of the form that we've just received back
|
107
|
-
if (this.settings.dataType === 'html') {
|
108
|
-
// wrap in a div incase there are a bunch of floating elements, pull the form out
|
109
|
-
var $new_form = $('<div>').append(request.responseText).find('#' + this.attr('id'));
|
110
|
-
|
111
|
-
this.html($new_form.html());
|
112
|
-
this.prepare_validators();
|
113
|
-
|
114
|
-
} else if (this.settings.dataType === 'json') {
|
115
|
-
// we will be receiving an error object back, we can pass it straight into form.js
|
116
|
-
this.set_errors($.parseJSON(request.responseText));
|
117
|
-
} else {
|
118
|
-
throw "Don't know how to handle dataType " + this.settings.dataType;
|
119
|
-
}
|
120
|
-
|
121
|
-
this.invalid();
|
122
|
-
} else if (request.status >= 500 && request.status < 600) {
|
123
|
-
// a SERVER ERROR -- something unrecoverable happened on the server
|
124
|
-
this.trigger('server_error', [request, status, error, this]);
|
125
|
-
|
126
|
-
// we aren't going to do anything here.
|
127
|
-
// FIXME: we should probably have a way to set this behaviour at the application level.
|
128
|
-
// for instance, you probably just want to redirect to somewhere, or show a dialog,
|
129
|
-
// or popup something or.....?
|
130
|
-
} else {
|
131
|
-
// some other kind of error- something in the browser (e.g. navigating away)
|
132
|
-
this.trigger('browser_error', [request, status, error, this]);
|
133
|
-
}
|
134
|
-
},
|
135
|
-
}
|
136
|
-
|
137
|
-
}(jQuery));
|