Mercurial > altnet-hispano
comparison Agendas/trunk/src/Agendas.Web/Scripts/subpanels-0.9.js @ 224:de6d206bd5c3
Actualizando subpanels
author | nelopauselli |
---|---|
date | Sun, 25 Sep 2011 01:40:18 -0300 |
parents | 42a1068e73c8 |
children | c8f378272407 |
comparison
equal
deleted
inserted
replaced
223:6f2213e949e4 | 224:de6d206bd5c3 |
---|---|
1 jQuery.fn.subpanel = function () { | 1 jQuery.fn.subpanel = function () { |
2 var panel = $(this[0]); | 2 var panel = $(this[0]); |
3 | |
3 var settings = arguments[0] || {}; | 4 var settings = arguments[0] || {}; |
4 | 5 |
5 var closeLink = null; | 6 var closeLink = null; |
6 var openLink = null; | 7 var openLink = null; |
7 var main = null; | 8 var main = null; |
8 var loading = null; | 9 var loading = null; |
9 | 10 |
10 this.create = function () { | 11 this.create = function () { |
11 // botón para abrir el panel | 12 // botón para abrir el panel |
12 openLink = $('<a></a>').addClass('ajax-button ui-widget ui-state-default ui-corner-all').click(this.open).appendTo(panel); | 13 openLink = $('<a></a>').addClass('ajax-button ui-state-default ui-corner-all').click(this.open).appendTo(panel); |
13 var openSpan = $('<span></span>').addClass('ui-icon ui-icon-plusthick').appendTo(openLink); | |
14 | 14 |
15 closeLink = $('<a></a>').addClass('ajax-button ui-widget ui-state-default ui-corner-all').css('display', 'none').click(this.close).appendTo(panel); | 15 var openSpan = $('<span></span>').addClass('ui-icon ui-icon-plusthick').html('open').appendTo(openLink); |
16 var closeSpan = $('<span></span>').addClass('ui-icon ui-icon-minusthick').appendTo(closeLink); | 16 |
17 //boton para cerrar el panel | |
18 closeLink = $('<a></a>') | |
19 .addClass('ajax-button ui-state-default ui-corner-tr ui-corner-tl') | |
20 .css('display', 'none') | |
21 .click(this.close).appendTo(panel); | |
22 var closeSpan = $('<span></span>').addClass('ui-icon ui-icon-minusthick').html('close').appendTo(closeLink); | |
17 | 23 |
18 var body = $('body'); | 24 var body = $('body'); |
19 | 25 |
20 // panel principal | 26 // panel principal |
21 main = $('<div></div>') | 27 main = $('<div></div>') |
22 .addClass('ui-widget') | 28 // .addClass('ui-accordion') |
23 .addClass('ui-widget-content') | 29 .addClass('sp-main ui-widget-content ui-corner-bottom') |
24 .addClass('ui-corner-all') | |
25 .addClass('sp-main') | |
26 .width(settings.width || '400px') | 30 .width(settings.width || '400px') |
27 .css('display', 'none') | 31 .css('display', 'none') |
32 .css('padding', '5px 5px 5px 5px') | |
28 .appendTo(body); | 33 .appendTo(body); |
29 | 34 |
30 var o = openLink.offset(); | 35 panel.show(); |
31 var top = o.top + openLink.height() * 1.2; | |
32 var left = o.left; | |
33 | 36 |
34 main.offset({ top: top, left: left }); | 37 if (settings.created != undefined) |
38 settings.created(); | |
35 }; | 39 }; |
36 | 40 |
37 this.close = function () { | 41 this.close = function () { |
38 if (loading !== undefined && loading !== null) { | 42 if (loading !== undefined && loading !== null) { |
39 loading.abort(); | 43 loading.abort(); |
42 | 46 |
43 $(this).hide(); | 47 $(this).hide(); |
44 openLink.show(); | 48 openLink.show(); |
45 main.hide(); | 49 main.hide(); |
46 main.html(''); | 50 main.html(''); |
51 | |
52 if (settings.closed != undefined) | |
53 settings.closed(); | |
54 | |
47 }; | 55 }; |
48 | 56 |
49 this.open = function () { | 57 this.open = function () { |
58 var o = openLink.offset(); | |
59 var top = o.top + openLink.outerHeight(); | |
60 var left = o.left; | |
61 | |
62 //main.offset({ top: top, left: left }); | |
63 main.css('top', top); | |
64 main.css('left', left); | |
65 | |
50 $(this).hide(); | 66 $(this).hide(); |
51 closeLink.show(); | 67 closeLink.show(); |
52 main.show(); | 68 main.show(); |
53 | |
54 // si hay título, creamos el header | |
55 if (settings.title !== undefined) { | |
56 var header = $('<div></div>') | |
57 .addClass('sp-header').addClass('ui-widget-header') | |
58 .appendTo(main); | |
59 | |
60 var title = $('<span><span>') | |
61 .html(settings.title) | |
62 .appendTo(header); | |
63 } | |
64 | 69 |
65 // div que contendrá el html del panel | 70 // div que contendrá el html del panel |
66 var content = $('<div></div>') | 71 var content = $('<div></div>') |
67 .appendTo(main); | 72 .appendTo(main); |
68 | 73 |
69 var imgdiv = $('<div></div>').css('text-align', 'center').css('padding-top', '10px').appendTo(content); | 74 var imgdiv = $('<div></div>').css('text-align', 'center').css('padding-top', '10px').appendTo(content); |
70 var img = $('<img />').attr('src', '/Content/loader.gif').attr('alt', 'loading...').appendTo(imgdiv); | 75 if (settings.imageLoding !== undefined) { |
76 var img = $('<img />').attr('src', settings.imageLoding).attr('alt', 'loading...').appendTo(imgdiv); | |
77 } | |
71 | 78 |
72 // se invoca la acción con un GET para obtener el contenido del panel | 79 // se invoca la acción con un GET para obtener el contenido del panel |
73 loading = $.ajax({ | 80 loading = $.ajax({ |
74 url: settings.action, | 81 url: settings.url, |
75 cache: false, | 82 cache: false, |
76 success: function (data) { | 83 success: function (data) { |
77 loading = null; | 84 loading = null; |
78 | 85 |
79 // cuando se recibe el contenido del panel, lo agregamos al div contenedor | 86 // cuando se recibe el contenido del panel, lo agregamos al div contenedor |
80 content.html(data); | 87 content.html(data); |
81 | 88 |
82 // form dentro del cual se ejecutará el panel, y del que luego se hará el POST | 89 // buscamos el form que contiene el panel |
83 var form = $('form', content); | 90 var form = $('form', content); |
84 | 91 |
85 form.submit(function (event) { | 92 /* |
86 // prevenimos que se ejecute el submit ya que lo haremos manualmente. | 93 if ($('h3', content).length == 0) |
87 event.preventDefault(); | 94 form.before('<h3><h3>'); |
88 | 95 $('h3', content).each(function() { |
89 var self = $(this); | 96 $(this).addClass('ui-accordion-header ui-helper-reset ui-state-active'); |
90 | |
91 /* preguntamos si el formulario es validable y válido, con esto tenemos un problema | |
92 ya que no se están generando los validadores por un problema entre jquery.validate | |
93 y ajax */ | |
94 var valid = self.valid(); | |
95 if (valid === undefined || valid) { | |
96 | |
97 // tomamos la acción y serializamos el form | |
98 var action = self.attr("action"); | |
99 var data = self.serialize(); | |
100 | |
101 // ejecutamos el POST | |
102 $.post(action, data, function (data) { | |
103 // cuando termina de ejecutarse el POST, ejecutamos la acción configurada | |
104 var r = settings.successful(data); | |
105 | |
106 // si esta acción no devuelve false, cerramos el panel | |
107 if (r === undefined || r) | |
108 closeLink.click(); | |
109 }); | |
110 } | |
111 }); | 97 }); |
112 | 98 |
113 $.validator.unobtrusive.parse(form); | 99 // Agregamos un div que va a contener el form |
100 var body = $('<div></div>'); | |
101 body.addClass('ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content-active'); | |
102 form.wrap(body); | |
103 */ | |
114 | 104 |
115 $('input:submit', form).each(function () { $(this).button(); }); | 105 // modificamos el evento submit |
106 form.submit(dopost); | |
107 | |
108 if ($.validator != undefined) | |
109 $.validator.unobtrusive.parse(form); | |
110 | |
111 $(':submit', form).each(function () { $(this).button(); }); | |
116 | 112 |
117 // y seteamos el foco en el primer input | 113 // y seteamos el foco en el primer input |
118 var nextInput = $("input:visible:first", form); | 114 var nextInput = $("input:visible:first", form); |
119 nextInput.focus(); | 115 nextInput.focus(); |
116 | |
117 if (settings.loaded != undefined) | |
118 settings.loaded(); | |
120 }, | 119 }, |
121 error: function (xhr, text) { | 120 error: function (xhr, text) { |
122 loading = null; | 121 loading = null; |
123 | 122 |
124 if (xhr.status !== 0) { | 123 if (xhr.status !== 0) { |
128 else { | 127 else { |
129 closeLink.click(); | 128 closeLink.click(); |
130 } | 129 } |
131 } | 130 } |
132 }); | 131 }); |
132 }; | |
133 | |
134 function dopost(event) { | |
135 // prevenimos que se ejecute el submit ya que lo haremos manualmente. | |
136 event.preventDefault(); | |
133 | 137 |
134 /* | 138 var self = $(this); |
135 var buttons = $('<div></div>') | |
136 .addClass('sp-buttons') | |
137 .appendTo(form); | |
138 | 139 |
139 var confirm = $('<input/>') | 140 // preguntamos si el formulario es validable y válido |
140 .attr('type', 'submit') | 141 var valid = true; |
141 .attr('value', settings.confirmButton || 'Save') | 142 if (self.valid !== undefined) |
142 .button() | 143 valid = self.valid(); |
143 .appendTo(buttons); | |
144 | 144 |
145 var x = $('<a></a>') | 145 if (valid === undefined || valid) { |
146 .html(settings.cancelButton || 'Cancel') | 146 // tomamos la acción y serializamos el form |
147 .button() | 147 var action = self.attr("action"); |
148 .click(function (e) { | 148 var data = self.serialize(); |
149 e.preventDefault(); | |
150 closeLink.click(); | |
151 settings.cancel(); | |
152 }) | |
153 .appendTo(buttons); | |
154 */ | |
155 }; | |
156 | 149 |
150 console.log(data); | |
151 | |
152 // ejecutamos el POST | |
153 $.post(action, data, function (data) { | |
154 // cuando termina de ejecutarse el POST, ejecutamos la acción configurada | |
155 var r = true; | |
156 if (settings.success != undefined) | |
157 settings.success(data); | |
158 | |
159 // si esta acción no devuelve false, cerramos el panel | |
160 if (r === undefined || r) | |
161 closeLink.click(); | |
162 }); | |
163 } | |
164 } | |
157 this.create(); | 165 this.create(); |
158 } | 166 } |