forked from DGNum/gestioCOF
127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
|
var OpenWS = new KfetWebsocket({
|
||
|
relative_url: "open/"
|
||
|
});
|
||
|
|
||
|
var OpenKfet = function(force_close_url, admin) {
|
||
|
this.force_close_url = force_close_url;
|
||
|
this.admin = admin;
|
||
|
|
||
|
this.status = this.UNKNOWN;
|
||
|
this.dom = {
|
||
|
status_text: $('.kfetopen .status-text'),
|
||
|
force_close_btn: $('.kfetopen .force-close-btn'),
|
||
|
warning: $('.kfetopen .warning')
|
||
|
},
|
||
|
|
||
|
this.dom.force_close_btn.click( () => this.toggle_force_close() );
|
||
|
setInterval( () => this.refresh(), this.refresh_interval * 1000);
|
||
|
OpenWS.add_handler( data => this.refresh(data) );
|
||
|
|
||
|
};
|
||
|
|
||
|
OpenKfet.prototype = {
|
||
|
// Status is unknown after . minutes without update.
|
||
|
time_unknown: 2,
|
||
|
// Maximum interval (seconds) between two UI refresh.
|
||
|
refresh_interval: 10,
|
||
|
|
||
|
// Prefix for classes describing place status.
|
||
|
class_prefix: 'kfetopen-st-',
|
||
|
// Set status-classes on this dom element.
|
||
|
target: 'body',
|
||
|
|
||
|
// Status
|
||
|
OPENED: "opened",
|
||
|
CLOSED: "closed",
|
||
|
UNKNOWN: "unknown",
|
||
|
|
||
|
// Admin status
|
||
|
FAKE_CLOSED: "fake_closed",
|
||
|
|
||
|
// Display values
|
||
|
status_text: {
|
||
|
opened: "ouverte",
|
||
|
closed: "fermée",
|
||
|
unknown: "_____"
|
||
|
},
|
||
|
force_text: {
|
||
|
activate: "Fermer manuellement",
|
||
|
deactivate: "Réouvrir la K-Fêt"
|
||
|
},
|
||
|
|
||
|
get is_recent() {
|
||
|
return this.last_update && moment().diff(this.last_update, 'minute') <= this.time_unknown;
|
||
|
},
|
||
|
|
||
|
refresh: function(data) {
|
||
|
if (data)
|
||
|
$.extend(this, data);
|
||
|
this.refresh_status();
|
||
|
this.refresh_dom();
|
||
|
},
|
||
|
|
||
|
refresh_status: function() {
|
||
|
// find new status
|
||
|
let status = this.UNKNOWN;
|
||
|
if (this.is_recent)
|
||
|
status = this.is_open ? this.OPENED : this.CLOSED;
|
||
|
this.status = status;
|
||
|
|
||
|
// admin specific
|
||
|
if (this.admin) {
|
||
|
let admin_status = status;
|
||
|
if (status == this.CLOSED && this.raw_open)
|
||
|
admin_status = this.FAKE_CLOSED;
|
||
|
this.admin_status = admin_status;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
refresh_dom: function() {
|
||
|
let status = this.status;
|
||
|
this.clear_class();
|
||
|
|
||
|
this.add_class(status);
|
||
|
this.dom.status_text.html(this.status_text[status]);
|
||
|
|
||
|
// admin specific
|
||
|
if (this.admin) {
|
||
|
this.add_class(this.admin_status);
|
||
|
if (this.force_close) {
|
||
|
this.dom.warning.addClass('in');
|
||
|
this.dom.force_close_btn.html(this.force_text['deactivate']);
|
||
|
} else {
|
||
|
this.dom.warning.removeClass('in');
|
||
|
this.dom.force_close_btn.html(this.force_text['activate']);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
toggle_force_close: function(new_value, password) {
|
||
|
$.post({
|
||
|
url: this.force_close_url,
|
||
|
data: {force_close: !this.force_close},
|
||
|
beforeSend: function ($xhr) {
|
||
|
$xhr.setRequestHeader("X-CSRFToken", csrftoken);
|
||
|
if (password !== undefined)
|
||
|
$xhr.setRequestHeader("KFetPassword", password);
|
||
|
}
|
||
|
})
|
||
|
.fail(function($xhr) {
|
||
|
switch ($xhr.status) {
|
||
|
case 403:
|
||
|
requestAuth({'errors': {}}, this.toggle_force_close);
|
||
|
break;
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
|
||
|
clear_class: function() {
|
||
|
let re = new RegExp('(^|\\s)' + this.class_prefix + '\\S+', 'g');
|
||
|
$(this.target).attr('class', (i, c) => c ? c.replace(re, '') : '');
|
||
|
},
|
||
|
|
||
|
add_class: function(status) {
|
||
|
$(this.target).addClass(this.class_prefix + status);
|
||
|
}
|
||
|
};
|