ninebadge-gnome-extension/ninebadge-gnome-extension@c.../extension.js

200 lines
6.5 KiB
JavaScript

// Example#8
imports.gi.versions.Gtk = "4.0";
const { Gtk } = imports.gi;
const Main = imports.ui.main;
const St = imports.gi.St;
const ByteArray = imports.byteArray;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Soup = imports.gi.Soup;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const version = Gtk.get_major_version();
let myPopup;
let started = false;
let key = get_config('key');
const MyPopup = GObject.registerClass(
class MyPopup extends PanelMenu.Button {
_init () {
super._init(0);
let icon = new St.Icon({
//icon_name : 'security-low-symbolic',
gicon : Gio.icon_new_for_string( Me.dir.get_path() + '/logo.png' ),
style_class : 'system-status-icon',
});
this.add_child(icon);
let workedItem = new PopupMenu.PopupMenuItem('');
let workedLabel = new St.Label({text:'TEMPS DE TRAVAIL : 0:00'});
workedItem.add(workedLabel);
this.menu.addMenuItem(workedItem);
let timeItem = new PopupMenu.PopupMenuItem('');
let timeLabel = new St.Label({text:'CAPITAL TOTAL : +0:00'});
timeItem.add(timeLabel);
this.menu.addMenuItem(timeItem);
let ifValidateItem = new PopupMenu.PopupMenuItem('');
let ifValidateLabel = new St.Label({text:'CAPITAL SI VALIDÉ : +0:00'});
ifValidateItem.add(ifValidateLabel);
this.menu.addMenuItem(ifValidateItem);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
let startItem = new PopupMenu.PopupMenuItem('');
let label = new St.Label({
text:'DÉBUT POINTAGE',
style_class:'timer-btn'
});
startItem.add(label);
this.menu.addMenuItem(startItem);
this.menu.connect('open-state-changed', (menu, open) => {
if (open) {
try {
let result = send_request('https://badge.cadoles.com/ninebadge/rest/showtimers', 'POST', key)
timeLabel.set_text('CAPITAL TOTAL : ' + result.capitaltime)
let status = send_request('https://badge.cadoles.com/ninebadge/rest/status', 'POST', key)
if(status.status == "started") {
label.set_text('FIN POINTAGE');
started = true
} else {
started = false
label.set_text('DÉBUT POINTAGE');
}
let today = new Date();
let timers = result.timers;
let lastTimer = new Date(timers[timers.length - 1].start);
let currentHours = parseInt(Math.abs(today - lastTimer) / (1000 * 60 * 60) % 24);
let currentMinutes = parseInt(Math.abs(today.getTime() - lastTimer.getTime()) / (1000 * 60) % 60);
let timeday = status.timeday;
let timedayToMinutes = timeday.split(':');
timedayToMinutes = parseInt(timedayToMinutes[0]) * 60 + parseInt(timedayToMinutes[1]);
let workedToday = timedayToMinutes + currentHours * 60 + currentMinutes;
let workedHours = Math.floor(workedToday / 60);
let workedMinutes = workedToday % 60;
let positiveCapital = result.capitaltime.includes('+');
let capitalToMinutes = result.capitaltime.replace('-', '').replace('+', '').split(':');
capitalToMinutes = parseInt(capitalToMinutes[0]) * 60 + parseInt(capitalToMinutes[1]);
if(positiveCapital) {
var workedTodayPlusCapital = workedToday + capitalToMinutes
} else {
var workedTodayPlusCapital = workedToday - capitalToMinutes
}
let diff = 7*60 - workedTodayPlusCapital
let diffHours = Math.floor(diff / 60);
let diffMinutes = diff % 60;
workedLabel.set_text('TEMPS DE TRAVAIL : '+ workedHours + ':' + String(workedMinutes).padStart(2, 0));
if(diff > 0) {
ifValidateLabel.set_text('CAPITAL SI VALIDÉ : -' + diffHours + ':' + String(diffMinutes).padStart(2, 0));
} else {
ifValidateLabel.set_text('CAPITAL SI VALIDÉ : +' + diffHours + ':' + String(diffMinutes).padStart(2, 0));
}
} catch(error) {
log(error);
}
}
});
startItem.connect('activate', () => {
try {
if(started){
send_request('https://badge.cadoles.com/ninebadge/rest/clockout', 'POST', key)
started = false
label.set_text('DÉBUT POINTAGE');
} else {
send_request('https://badge.cadoles.com/ninebadge/rest/clockin', 'POST', key)
label.set_text('FIN POINTAGE');
started = true
}
} catch(error) {
log(error);
}
});
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
let validateItem = new PopupMenu.PopupMenuItem('');
let validateLabel = new St.Label({
text:'VALIDER MA JOURNÉE',
style_class:'validate-btn'
});
validateItem.add(validateLabel);
this.menu.addMenuItem(validateItem);
validateItem.connect('activate', () => {
try {
send_request('https://badge.cadoles.com/ninebadge/rest/clockout', 'POST', key)
started = false
label.set_text('DÉBUT POINTAGE');
send_request('https://badge.cadoles.com/ninebadge/rest/validate', 'POST', key)
} catch(error) {
log(error);
}
});
// you can close, open and toggle the menu with
// this.menu.close();
// this.menu.open();
// this.menu.toggle();
}
});
function send_request(url, type='POST', key) {
let [ok, out, err, exit] = GLib.spawn_command_line_sync(`/usr/bin/curl --insecure --max-time 2 -X ${type} -d '{"key": "${key}"}' -H "Content-Type: application/json" ${url} -o /tmp/test.json`);
let text = GLib.file_get_contents('/tmp/test.json')[1];
let json_result = JSON.parse(text);
return json_result
}
function get_config(property) {
let text = GLib.file_get_contents(Me.dir.get_path() + '/config.json')[1];
let json_result = JSON.parse(text);
return json_result[property];
}
function addMinutes(date, minutes) {
return new Date(date.getTime() + minutes*60000);
}
function init() {
}
function enable() {
myPopup = new MyPopup();
Main.panel.addToStatusArea('myPopup', myPopup, 1);
}
function disable() {
myPopup.destroy();
}