Projet

Général

Profil

Télécharger (12,6 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / static / js / calebasse.dialog.js @ 3a796ed8

1

    
2
function disable_button(button) {
3
  var $button = $(button);
4
  old_background_image = $button.css('background-image');
5
  old_background_repeat = $button.css('background-repeat');
6
  $button.data('old_background_image', old_background_image);
7
  $button.data('old_background_repeat', old_background_repeat);
8
  $button.attr('disabled', 'disabled');
9
  $button.css('background-image', 'url(/static/images/throbber.gif), ' + old_background_image);
10
  $button.css('background-repeat', 'no-repeat, ' + old_background_repeat);
11
}
12

    
13
function enable_button(button) {
14
  var $button = $(button);
15
  $button.css('background-image', $button.data('old_background_image'));
16
  $button.css('background-repeat', $button.data('old_background_repeat'));
17
  $button.removeAttr('disabled');
18
}
19

    
20
function init_dialog(id) {
21
    init_datepickers(id);
22
    $('#id_description', id).attr('rows', '3');
23
    $('#id_description', id).attr('cols', '30');
24
    var deck = $('#id_participants_on_deck', id);
25
    $(deck).bind('added', function() {
26
      var added = $(deck).find('div:last');
27
      var t = added.attr('id').indexOf('_group:');
28
      if ( t == -1) return;
29

    
30
      /* remove group element and fake id */
31
      added.remove();
32
      var val = $('#id_participants').val();
33
      $('#id_participants').val(val.substr(0, val.substr(0, val.length-1).lastIndexOf('|')+1));
34

    
35
      /* add all workers */
36
      var query = added.attr('id').substr(t+1);
37
      var receive_result = $('#id_participants_text', id).autocomplete('option', 'select');
38
      $.getJSON($('#id_participants_text', id).autocomplete('option', 'source') + '?term=' + query,
39
        function(data) {
40
          $.each(data, function(key, val) {
41
            if (key==0) return; /* ignore first element as it's the group itself */
42
            var ui = Object();
43
            ui.item = val;
44
            receive_result(null, ui);
45
          });
46
        });
47
    });
48
}
49

    
50
function generic_ajaxform_dialog(url, title, id, width, btn_submit_name, redirectToUrl, on_load_callback, height, extra_button, replace_content) {
51
  if (! height)
52
    height = 'auto';
53
  $(id).load(url,
54
      function () {
55
        init_dialog(id);
56
        function onsuccess(response, status, xhr, form) {
57
          enable_button($('#submit-btn'));
58
          var parse = $(response);
59
          if ($('.errorlist', parse).length != 0) {
60
            $(id).html(response);
61
            on_load_callback($(id));
62
            $(id + ' form').ajaxForm({
63
              success: onsuccess,
64
            });
65
          } else if(replace_content) {
66
              $('body').html(parse);
67
          } else {
68
            if (redirectToUrl) {
69
              if (redirectToUrl.indexOf('#') == 0) {
70
                window.location.hash = redirectToUrl.substr(1);
71
                window.location.reload(true);
72
              } else {
73
                window.location = redirectToUrl;
74
              }
75
            } else if (redirectToUrl == false) {
76
              /* if redirectToUrl is set to false then look for the redirection
77
               * url in the actual page content.
78
               */
79
              var url = $(parse).find('#ajax-redirect').data('url');
80
              if (url) { window.location = url; }
81
            } else {
82
              window.location.reload(true);
83
            }
84
          }
85
        }
86
        $('form', this).ajaxForm({
87
          success: onsuccess,
88
        });
89
        var buttons = [{text: "Annuler",
90
                        id: "close-btn",
91
                        click: function() { $(this).dialog("close"); } },
92
                       {text:btn_submit_name,
93
                        id: "submit-btn",
94
                        click: function() {
95
                            disable_button($('#submit-btn'));
96
                            $(id + " form").submit();
97
                        }}];
98

    
99
        if (extra_button)
100
            buttons.push(extra_button);
101
        $(this).dialog({title: title,
102
          modal: true,
103
          width: width,
104
          height: height,
105
          buttons: buttons});
106
        if (on_load_callback) {
107
          on_load_callback($(this));
108
        }
109

    
110
        $('.js-click-to-expand').on('click', function (event) {
111
             $(event.target).parents('.js-expandable').toggleClass('js-expanded');
112
             $(event.target).next().toggle();
113
        });
114
      });
115
}
116

    
117
/**
118
 * Transform form(s) to ajax forms
119
 * id: jQuery id where you want to replace form by ajaxForm
120
*/
121
function calebasse_ajax_form(id) {
122
  var selector = id + ' form';
123
  function onsuccess(response, status, xhr, form) {
124
    if ($('.errorlist', response).length != 0) {
125
      $(id).parent().html(response);
126
      $(selector).ajaxForm({
127
        success: onsuccess,
128
      });
129
    }
130
    else {
131
      window.location.reload(true);
132
    }
133
  }
134
  $(selector).ajaxForm({
135
    success: onsuccess,
136
  });
137
}
138

    
139
function add_dialog(on, url, title, width, btn_text) {
140
  // function used to add patient schedules, events and acts
141

    
142
  $(on).load(url,
143
      function () {
144
        init_dialog(on);
145
        var old_background_image, old_background_repeat, $button;
146
        var in_submit = false;
147
        $(on).unbind('submit');
148
        $(on).submit(function(event) {
149
          /* stop form from submitting normally */
150
          event.preventDefault();
151

    
152
          var $form = $('form', this);
153
          $.post($form.attr('action'), $form.serialize(),
154
            function (data) {
155
              var parse = $(data);
156
              $button.css('background-image', old_background_image);
157
              $button.css('background-repeat', old_background_repeat);
158
              $button.removeAttr('disabled');
159
              if ($('.errorlist', parse).length != 0) {
160
                $(on).html(data);
161
                init_dialog(on);
162
              } else {
163
                $('body').html(data);
164
              }
165
              in_submit = false;
166
            },
167
            "html");
168
        });
169
        var submit = function (ev) {
170
          if (in_submit) {
171
            return;
172
          }
173
          in_submit = true;
174
          $button = $(ev.target).parent();
175
          old_background_image = $button.css('background-image');
176
          old_background_repeat = $button.css('background-repeat');
177
          $button.attr('disabled', 'disabled');
178
          $button.css('background-image', 'url(/static/images/throbber.gif), ' + old_background_image);
179
          $button.css('background-repeat', 'no-repeat, ' + old_background_repeat);
180
          $(on + " form").submit();
181
        };
182
        $(this).dialog({title: title,
183
          modal: true,
184
          width: width,
185
          buttons: [
186
        { text: btn_text,
187
          click: submit }
188
        ],
189
          close: function() {},
190
        });
191
      });
192
}
193

    
194
function select_add_dialog(opts, $form, form_action)
195
{
196
  var add_form = $form;
197

    
198
  function on_success(response, status, xhr, form) {
199
    var parsed_response= $(response);
200
    if ($('.errorlist', parsed_response).length != 0) {
201
      $(add_form).html($(parsed_response).find('#form-content'));
202
    } else {
203
      new_id = $('.new-object .col-id', parsed_response).text();
204
      new_label = $('.new-object .col-label', parsed_response).text();
205
      $(opts.add_select).append('<option value="' + new_id + '">' + new_label + '</option>');
206
      $(opts.add_select).val(new_id);
207
      $(opts.add_select).trigger('change');
208
      $(add_form).parent().dialog('close');
209
    }
210
  }
211

    
212
  $form.attr('action', form_action);
213
  $form.ajaxForm({success: on_success});
214
}
215

    
216
function init_magic_dialog() {
217

    
218
  $.fn.dialogButton = function (opts) {
219
    var id = $(this).attr('id');
220
    this.on('click', function () {
221
      var $dialog = $('<div id="dialog-' + (opts.name || id) +
222
        '" title="' + opts.title + '"><form class="inline-form" method="post"></form></div>');
223
    var default_button = opts.default_button == undefined ? 'Envoyer' : opts.default_button;
224
    var form_action = opts.url.split(' ')[0];
225
    var $form = $('form', $dialog);
226
    $dialog.appendTo('#dialogs');
227
    if (opts.next_url) {
228
      $form.attr('action', form_action + '?next_url=' + opts.next_url);
229
    } else {
230
      $form.attr('action', form_action);
231
    }
232

    
233
    if (opts.add_select) {
234
      select_add_dialog(opts, $form, form_action);
235
    }
236

    
237
    var buttons = [
238
    {
239
      text: 'Annuler',
240
      click: function () {
241
        $(this).dialog('close');
242
      }
243
    },
244
    {
245
      text: default_button,
246
      click: function () {
247
        $form.submit();
248
      }
249
    },
250
    ];
251
    $dialog.css('max-height', $(window).height() - 200);
252
    $form.load(opts.url, function () {
253
      $dialog.dialog({
254
        modal: opts.modal == undefined ? true : opts.modal,
255
        width: 900,
256
        maxHeight: $(window).height() - 100,
257
        buttons: buttons,
258
        close: function () {
259
          $(this).remove();
260
        }
261
      });
262
    });
263
    })
264
  };
265
  $(function () {
266
    window.calebasse_dialogs = function(base) {
267

    
268
      var base = base || $('body').get(0);
269
      $('.dialog-button', base).each(function (i, button) {
270
        var $button = $(button);
271
        $button.dialogButton({
272
          url: $button.data('url') || $button.closest('a').attr('href'),
273
          default_button: $button.data('default-button') || $button.text(),
274
          title: $button.attr('title') || $button.text(),
275
          next_url: $button.data('next-url') || false,
276
          add_select: $button.data('add-select') || false
277
        });
278
      });
279

    
280
      /* Form buttons with the '.enable-on-change' class are only enabled if an
281
       * input or a select of the form is modified. */
282
      $('form button.enable-on-change, form input[type="submit"]:not(".login")', base).prop('disabled', 'true');
283
      $('form input, form select, form textarea', base).on('change', function () {
284
        var form = $(this).closest('form');
285
        $('button.enable-on-change, form input[type="submit"]', form).enable();
286
      })
287
      $('form input, form textarea', base).on('keyup', function () {
288
        var form = $(this).closest('form');
289
        $('button.enable-on-change, form input[type="submit"]', form).enable();
290
      })
291
      $('form.form-with-confirmation', base).on('submit', function () {
292
        var mesg = $(this).data('confirmation-msg') || "Êtes-vous sûr ?";
293
        return window.confirm(mesg);
294
      });
295
      $('form .datepicker', base).each(function (i, span) {
296
        var $span = $(span);
297
        var $input = $('input', span);
298
        var months = $span.data('number-of-months');
299
        var before_selector = $span.data('before-selector');
300
        var after_selector = $span.data('after-selector');
301
        $input.datepicker({dateFormat: 'd/m/yy', showOn: 'button' });
302
        if (months) {
303
          $input.datepicker("option", "numberOfMonths", months);
304
        }
305
        if (before_selector) {
306
          var $before_target = $('input', $(before_selector));
307
          $input.datepicker("option", "maxDate", $before_target.val());
308
          $input.datepicker("option", "onClose", function (selectedDate) {
309
            $before_target.datepicker( "option", "minDate", selectedDate );
310
          });
311
        }
312
        if (after_selector) {
313
          var $after_target = $('input', $(after_selector));
314
          $input.datepicker("option", "minDate", $after_target.val());
315
          $input.datepicker("option", "onClose", function (selectedDate) {
316
            $after_target.datepicker( "option", "maxDate", selectedDate );
317
          });
318
        }
319
      });
320
      $('form .reset', base).on('click', function () {
321
        var $this = $(this);
322
        var $form = $($this.closest('form'));
323
        $('input', $form).val('');
324
      });
325
      $('body').on('focus', 'form .datepicker input', function (e) {
326
        var $input = $(e.target);
327
        var $span = $($input.closest('.datepicker'));
328
        var months = $span.data('number-of-months');
329
        var before_selector = $span.data('before-selector');
330
        var after_selector = $span.data('after-selector');
331
        if ($input.is('.hasDatepicker')) {
332
          return true;
333
        }
334
        $input.datepicker({dateFormat: 'd/m/yy', showOn: 'button' });
335
        if (months) {
336
          $input.datepicker("option", "numberOfMonths", months);
337
        }
338
        if (before_selector) {
339
          var $before_target = $('input', $(before_selector));
340
          $input.datepicker("option", "maxDate", $before_target.val());
341
          $input.datepicker("option", "onClose", function (selectedDate) {
342
            $before_target.datepicker( "option", "minDate", selectedDate );
343
          });
344
        }
345
        if (after_selector) {
346
          var $after_target = $('input', $(after_selector));
347
          $input.datepicker("option", "minDate", $after_target.val());
348
          $input.datepicker("option", "onClose", function (selectedDate) {
349
            $after_target.datepicker( "option", "maxDate", selectedDate );
350
          });
351
        }
352
      });
353
    };
354
    window.calebasse_dialogs();
355
  });
356
}
357

    
358
(function ($) {
359
    init_magic_dialog();
360
})(window.jQuery)
(6-6/23)