~ubuntu-branches/ubuntu/precise/horizon/precise-updates

« back to all changes in this revision

Viewing changes to horizon/static/horizon/js/modals.js

  • Committer: Package Import Robot
  • Author(s): Chuck Short, Chuck Short, Adam Gandelman, Adrien Cunin
  • Date: 2012-04-04 07:21:15 UTC
  • mfrom: (1.1.12)
  • Revision ID: package-import@ubuntu.com-20120404072115-lb9v3gq3yv93ern2
Tags: 2012.1~rc2-0ubuntu1
[ Chuck Short ]
* New usptream release.
* debian/control: Use python-cherrypy3
* debian/rules: Update pythonpath in order to run tests.
* debian/patches/fix-coverage-binary-name.patch: Make the testsuite
  run.
* debian/rules: Fail build if tests fail.

[ Adam Gandelman ]
* debian/control: Add python-memcache 
* debain/dashboard.conf: Update to match current upstream documentation
  (LP: #966069)

[ Adrien Cunin ]
* Renamed Apache config file from dashboard.conf to openstack-dashboard.conf
  (LP: #965410)
  - Updated post{inst,rm} and added preinst to handle correctly the rename

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Storage for our current jqXHR object.
 
2
horizon.modals._request = null;
 
3
 
 
4
horizon.modals.success = function (data, textStatus, jqXHR) {
 
5
  $('body').append(data);
 
6
  $('.modal span.help-block').hide();
 
7
  $('.modal:last').modal();
 
8
 
 
9
  horizon.datatables.validate_button();
 
10
 
 
11
  // TODO(tres): Find some better way to deal with grouped form fields.
 
12
  var volumeField = $("#id_volume");
 
13
  if(volumeField) {
 
14
    var volumeContainer = volumeField.parent().parent();
 
15
    var deviceContainer = $("#id_device_name").parent().parent();
 
16
    var deleteOnTermContainer = $("#id_delete_on_terminate").parent().parent();
 
17
 
 
18
    function toggle_fields(show) {
 
19
      if(show) {
 
20
        volumeContainer.removeClass("hide");
 
21
        deviceContainer.removeClass("hide");
 
22
        deleteOnTermContainer.removeClass("hide");
 
23
      } else {
 
24
        volumeContainer.addClass("hide");
 
25
        deviceContainer.addClass("hide");
 
26
        deleteOnTermContainer.addClass("hide");
 
27
      }
 
28
    }
 
29
 
 
30
    if(volumeField.find("option").length == 1) {
 
31
      toggle_fields(false);
 
32
    } else {
 
33
      var disclosureElement = $("<div />").addClass("volume_boot_disclosure").text("Boot From Volume");
 
34
 
 
35
      volumeContainer.before(disclosureElement);
 
36
 
 
37
      disclosureElement.click(function() {
 
38
        if(volumeContainer.hasClass("hide")) {
 
39
          disclosureElement.addClass("on");
 
40
          toggle_fields(true);
 
41
        } else {
 
42
          disclosureElement.removeClass("on");
 
43
          toggle_fields(false);
 
44
        }
 
45
      });
 
46
 
 
47
      toggle_fields(false);
 
48
    }
 
49
  }
 
50
};
 
51
 
1
52
horizon.addInitFunction(function() {
2
 
  $(document).on('click', '.modal:not(.static_page) .cancel', function (evt) {
 
53
  $(document).on('click', '.modal .cancel', function (evt) {
3
54
    $(this).closest('.modal').modal('hide');
4
 
    return false;
 
55
    evt.preventDefault();
 
56
  });
 
57
 
 
58
  $(document).on('submit', '.modal form', function (evt) {
 
59
    var $form = $(this),
 
60
        $button = $form.find(".modal-footer .btn-primary");
 
61
    if ($form.attr("enctype") === "multipart/form-data") {
 
62
      // AJAX-upload for files is not currently supported.
 
63
      return;
 
64
    }
 
65
    evt.preventDefault();
 
66
 
 
67
    // Prevent duplicate form POSTs
 
68
    $button.prop("disabled", true);
 
69
 
 
70
    $.ajax({
 
71
      type: "POST",
 
72
      url: $form.attr('action'),
 
73
      data: $form.serialize(),
 
74
      complete: function () {
 
75
        $button.prop("disabled", false);
 
76
      },
 
77
      success: function (data, textStatus, jqXHR) {
 
78
        // TODO(gabriel): This isn't a long-term solution for AJAX redirects.
 
79
        // https://blueprints.launchpad.net/horizon/+spec/global-ajax-communication
 
80
        var header = jqXHR.getResponseHeader("X-Horizon-Location");
 
81
        if (header) {
 
82
          location.href = header;
 
83
        }
 
84
        $form.closest(".modal").modal("hide");
 
85
        horizon.modals.success(data, textStatus, jqXHR);
 
86
      },
 
87
      error: function(jqXHR, status, errorThrown) {
 
88
        $form.closest(".modal").modal("hide");
 
89
        horizon.alert("error", "There was an error submitting the form. Please try again.");
 
90
      }
 
91
    });
5
92
  });
6
93
 
7
94
  // Handle all modal hidden event to remove them as default
9
96
    $(this).remove();
10
97
  });
11
98
 
12
 
  $('.ajax-modal').click(function (evt) {
 
99
  $(document).on('show', '.modal', function(evt) {
 
100
    var scrollShift = $('body').scrollTop();
 
101
    var topVal = $(this).css('top');
 
102
    $(this).css('top', scrollShift + parseInt(topVal, 10));
 
103
  });
 
104
 
 
105
  $('.ajax-modal').live('click', function (evt) {
13
106
    var $this = $(this);
14
 
    $.ajax($this.attr('href'), {
15
 
      error: function(jqXHR, status, errorThrown){
 
107
 
 
108
    // If there's an existing modal request open, cancel it out.
 
109
    if (horizon.modals._request && typeof(horizon.modals._request.abort) !== undefined) {
 
110
      horizon.modals._request.abort();
 
111
    }
 
112
 
 
113
    horizon.modals._request = $.ajax($this.attr('href'), {
 
114
      complete: function () {
 
115
        // Clear the global storage;
 
116
        horizon.modals._request = null;
 
117
      },
 
118
      error: function(jqXHR, status, errorThrown) {
16
119
        if (jqXHR.status === 401){
17
 
          var redir_url = jqXHR.getResponseHeader("REDIRECT_URL");
 
120
          var redir_url = jqXHR.getResponseHeader("X-Horizon-Location");
18
121
          if (redir_url){
19
122
            location.href = redir_url;
20
123
          } else {
21
124
            location.reload(true);
22
125
          }
23
126
        }
 
127
        else {
 
128
          // Generic error handler. Really generic.
 
129
          horizon.alert("error", "An error occurred. Please try again.");
 
130
        }
24
131
      },
25
 
      success: function (data, status, jqXHR) {
26
 
        $('body').append(data);
27
 
        $('.modal span.help-block').hide();
28
 
        $('.modal:last').modal();
29
 
 
30
 
        horizon.datatables.validate_button();
31
 
 
32
 
        // TODO(tres): Find some better way to deal with grouped form fields.
33
 
        var volumeField = $("#id_volume");
34
 
        if(volumeField) {
35
 
          var volumeContainer = volumeField.parent().parent();
36
 
          var deviceContainer = $("#id_device_name").parent().parent();
37
 
          var deleteOnTermContainer = $("#id_delete_on_terminate").parent().parent();
38
 
 
39
 
          function toggle_fields(show) {
40
 
            if(show) {
41
 
              volumeContainer.removeClass("hide");
42
 
              deviceContainer.removeClass("hide");
43
 
              deleteOnTermContainer.removeClass("hide");
44
 
            } else {
45
 
              volumeContainer.addClass("hide");
46
 
              deviceContainer.addClass("hide");
47
 
              deleteOnTermContainer.addClass("hide");
48
 
            }
49
 
          }
50
 
 
51
 
          if(volumeField.find("option").length == 1) {
52
 
            toggle_fields(false);
53
 
          } else {
54
 
            var disclosureElement = $("<div />").addClass("volume_boot_disclosure").text("Boot From Volume");
55
 
 
56
 
            volumeContainer.before(disclosureElement);
57
 
 
58
 
            disclosureElement.click(function() {
59
 
              if(volumeContainer.hasClass("hide")) {
60
 
                disclosureElement.addClass("on");
61
 
                toggle_fields(true);
62
 
              } else {
63
 
                disclosureElement.removeClass("on");
64
 
                toggle_fields(false);
65
 
              }
66
 
            });
67
 
 
68
 
            toggle_fields(false);
69
 
          }
70
 
        }
71
 
      }
 
132
      success: horizon.modals.success
72
133
    });
73
134
    evt.preventDefault();
74
135
  });