/
modals.js
132 lines (115 loc) · 4.03 KB
/
modals.js
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Storage for our current jqXHR object.
horizon.modals._request = null;
horizon.modals.success = function (data, textStatus, jqXHR) {
$('body').append(data);
$('.modal span.help-block').hide();
$('.modal:last').modal();
horizon.datatables.validate_button();
// TODO(tres): Find some better way to deal with grouped form fields.
var volumeField = $("#id_volume");
if(volumeField) {
var volumeContainer = volumeField.parent().parent();
var deviceContainer = $("#id_device_name").parent().parent();
var deleteOnTermContainer = $("#id_delete_on_terminate").parent().parent();
function toggle_fields(show) {
if(show) {
volumeContainer.removeClass("hide");
deviceContainer.removeClass("hide");
deleteOnTermContainer.removeClass("hide");
} else {
volumeContainer.addClass("hide");
deviceContainer.addClass("hide");
deleteOnTermContainer.addClass("hide");
}
}
if(volumeField.find("option").length == 1) {
toggle_fields(false);
} else {
var disclosureElement = $("<div />").addClass("volume_boot_disclosure").text("Boot From Volume");
volumeContainer.before(disclosureElement);
disclosureElement.click(function() {
if(volumeContainer.hasClass("hide")) {
disclosureElement.addClass("on");
toggle_fields(true);
} else {
disclosureElement.removeClass("on");
toggle_fields(false);
}
});
toggle_fields(false);
}
}
};
horizon.addInitFunction(function() {
$(document).on('click', '.modal .cancel', function (evt) {
$(this).closest('.modal').modal('hide');
evt.preventDefault();
});
$(document).on('submit', '.modal form', function (evt) {
var $form = $(this),
$button = $form.find(".modal-footer .btn-primary");
if ($form.attr("enctype") === "multipart/form-data") {
// AJAX-upload for files is not currently supported.
return;
}
evt.preventDefault();
// Prevent duplicate form POSTs
$button.prop("disabled", true);
$.ajax({
type: "POST",
url: $form.attr('action'),
data: $form.serialize(),
complete: function () {
$button.prop("disabled", false);
},
success: function (data, textStatus, jqXHR) {
// TODO(gabriel): This isn't a long-term solution for AJAX redirects.
// https://blueprints.launchpad.net/horizon/+spec/global-ajax-communication
var header = jqXHR.getResponseHeader("X-Horizon-Location");
if (header) {
location.href = header;
}
$form.closest(".modal").modal("hide");
horizon.modals.success(data, textStatus, jqXHR);
},
error: function(jqXHR, status, errorThrown) {
$form.closest(".modal").modal("hide");
horizon.alert("error", "There was an error submitting the form. Please try again.");
}
});
});
// Handle all modal hidden event to remove them as default
$(document).on('hidden', '.modal', function () {
$(this).remove();
});
$(document).on('show', '.modal', function(evt) {
var scrollShift = $('body').scrollTop();
var topVal = $(this).css('top');
$(this).css('top', scrollShift + parseInt(topVal, 10));
});
$('.ajax-modal').live('click', function (evt) {
var $this = $(this);
// If there's an existing modal request open, cancel it out.
if (horizon.modals._request && typeof(horizon.modals._request.abort) !== undefined) {
horizon.modals._request.abort();
}
horizon.modals._request = $.ajax($this.attr('href'), {
complete: function () {
// Clear the global storage;
horizon.modals._request = null;
},
error: function(jqXHR, status, errorThrown) {
if (jqXHR.status === 401){
var redir_url = jqXHR.getResponseHeader("X-Horizon-Location");
if (redir_url){
location.href = redir_url;
} else {
location.reload(true);
}
}
},
success: horizon.modals.success
});
evt.preventDefault();
});
});