summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/ui/lib/FormView.js
blob: dc1801b386e0e252daf8a418db4f330d2c30206e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
var FormView = View.extend({

	method: "post",

	events: {
		"submit form": "save"
	},

	initialize: function(){
		this.$form = this.$("form")
		this.$errors = this.$(".errors")
		this.$errorList = this.$(".errorList")
	},

	reset: function(){
		this.$("input,textarea").not("[type='submit']").not("[type='hidden']").val("")
	},
	
	showErrors: function(errors){
		if (errors && errors.length) {
			this.$errorList.empty();
			for (var i in errors) {
				this.$errorList.append('<div>' + errors[i] + '</div>');
			}
			this.$errors.css("opacity", 1.0);
			setTimeout($.proxy(function(){
				this.$errors.show().css("opacity", 1.0);
			}, this), 200)
		}
	},
	
	serialize: function(){
		var fd = new FormData()
		
		this.$("input[name], select[name], textarea[name]").each( function(){
			if (this.type == "file") {
				if (this.files.length > 0) {
					fd.append(this.name, this.files[0]);
				}
			}
			else if (this.type == "password") {
				if (this.value.length > 0) {
					fd.append(this.name, SHA1.hex('lol$' + this.value + '$vvalls'))
				}
			}
			else {
				fd.append(this.name, this.value);
			}
		});
		
		return fd
	},
	
	save: function(e){
		e.preventDefault()

		this.$errors.hide().css("opacity", 0.0);
		
		if (this.validate) {
			var errors = this.validate()
			if (errors && errors.length) {
				this.showErrors(errors)
				return
			}
		}

		var request = $.ajax({
			url: this.action,
			type: this.method,
			data: this.serialize(),
			dataType: "json",
			processData: false,
			contentType: false,
		});
		request.done($.proxy(function (response) {
			if (response.error) {
				var errors = []
				for (var key in response.error.errors) {
					errors.push(response.error.errors[key].message);
				}
				this.showErrors(errors)
				return
			}
			else {
				this.success && this.success(response)
			}
		}, this));
	}

})


var ModalFormView = ModalView.extend(FormView.prototype).extend({

	load: function(){
		this.reset()
		this.show()
	}

})