diff --git a/static/js/users.js b/static/js/users.js
new file mode 100644
index 0000000..23eabff
--- /dev/null
+++ b/static/js/users.js
@@ -0,0 +1,163 @@
+var punchcardWidget;
+var pieOrgWidget;
+var pieApiWidget;
+var overtimeWidget;
+
+var div_day;
+function highlight_punchDay() {
+ if (!(div_day === undefined)) {
+ div_day.removeClass('highlightDay');
+ }
+
+ var curDay = datePickerWidgetPunch.datepicker( "getDate" ).getDay();
+ if (curDay == 7)
+ curDay = 0;
+ div_day = $('[data-daynum="'+curDay+'"]');
+ div_day.addClass('highlightDay')
+}
+
+function updateDatePunch() {
+ var date = datePickerWidgetPunch.datepicker( "getDate" );
+ $.getJSON( url_getUserLogins+"?date="+date.getTime()/1000, function( data ) {
+ if (!(punchcardWidget === undefined)) {
+ punchcardWidget.settings.data = data;
+ punchcardWidget.refresh();
+ highlight_punchDay();
+ } else {
+ punchcardWidget = $('#punchcard').punchcard({
+ data: data,
+ singular: 'login',
+ plural: 'logins',
+ timezones: ['local'],
+ timezoneIndex:0
+ });
+ punchcardWidget = punchcardWidget.data("plugin_" + "punchcard");
+ highlight_punchDay();
+ }
+ });
+}
+function updateDatePieOrg() {
+ var date = datePickerWidgetOrg.datepicker( "getDate" );
+ $.getJSON( url_getTopOrglogin+"?date="+date.getTime()/1000, function( data ) {
+ toPlot = [];
+ for (item of data) { toPlot.push({ label: item[0], data: item[1] }); }
+ if (toPlot.length == 0) {
+ toPlot = [{ label: 'No data', data: 100 }];
+ }
+ if (!pieOrgWidget === undefined) {
+ pieOrgWidget.setData(toPlot);
+ pieOrgWidget.draw();
+ } else {
+ pieOrgWidget = $.plot('#pieOrg', toPlot, {
+ series: {
+ pie: {
+ innerRadius: 0.5,
+ show: true
+ }
+ }
+ });
+ }
+ });
+}
+function updateDatePieApi() {
+ var date = datePickerWidgetApi.datepicker( "getDate" );
+ $.getJSON( url_getLoginVSCOntribution+"?date="+date.getTime()/1000, function( data ) {
+ toPlot = [
+ {label: 'Login with contribution during the day', data: data[0], color: '#4da74d' },
+ {label: 'Login without contribution during the day', data:data[1], color: '#cb4b4b' }
+ ];
+ if (data[0] == 0 && data[1] == 0) {
+ toPlot = [{ label: 'No data', data: 100 }];
+ }
+
+ if (!pieApiWidget === undefined) {
+ pieApiWidget.setData(toPlot);
+ pieApiWidget.draw();
+ } else {
+ pieApiWidget = $.plot('#pieApi', toPlot, {
+ series: {
+ pie: {
+ innerRadius: 0.5,
+ show: true
+ }
+ }
+ });
+ }
+ });
+}
+function updateDateOvertime() {
+ var date = datePickerWidgetOvertime.datepicker( "getDate" );
+ var now = new Date();
+ if (date.toDateString() == now.toDateString()) {
+ date = now;
+ } else {
+ date.setTime(date.getTime() + (24*60*60*1000-1)); // include data of selected date
+ }
+ $.getJSON( url_getUserLoginsOvertime+"?date="+parseInt(date.getTime()/1000), function( data ) {
+ temp = [];
+ var i=0;
+ for (item of data) {
+ temp.push([new Date(item[0]*1000), item[1]]);
+ }
+ data = {label: 'Login overtime', data: temp}
+ if (!overtimeWidget === undefined) {
+ overtimeWidget.setData(toPlot);
+ overtimeWidget.draw();
+ } else {
+ overtimeWidget = $.plot('#lineChart', [data], {
+ lines: {
+ show: true,
+ steps: true,
+ fill: true
+ },
+ xaxis: {
+ mode: "time",
+ minTickSize: [1, "day"],
+ }
+ });
+ }
+ });
+
+}
+
+$(document).ready(function () {
+
+ var datePickerOptions = {
+ showOn: "button",
+ maxDate: 0,
+ buttonImage: urlIconCalendar,
+ buttonImageOnly: true,
+ buttonText: "Select date",
+ showAnim: "slideDown"
+ };
+ // punch
+ var datePickerOptionsPunch = jQuery.extend({}, datePickerOptions);
+ datePickerOptionsPunch['onSelect'] = updateDatePunch;
+ datePickerWidgetPunch = $( "#datepickerPunch" );
+ datePickerWidgetPunch.datepicker(datePickerOptionsPunch);
+ datePickerWidgetPunch.datepicker("setDate", new Date());
+ // org login
+ var datePickerOptionsOrg = jQuery.extend({}, datePickerOptions);
+ datePickerOptionsOrg['onSelect'] = updateDatePieOrg;
+ datePickerWidgetOrg = $( "#datepickerOrgLogin" );
+ datePickerWidgetOrg.datepicker(datePickerOptionsOrg);
+ datePickerWidgetOrg.datepicker("setDate", new Date());
+ // api
+ var datePickerOptionsApi = jQuery.extend({}, datePickerOptions);
+ datePickerOptionsApi['onSelect'] = updateDatePieApi;
+ datePickerWidgetApi = $( "#datepickerApi" );
+ datePickerWidgetApi.datepicker(datePickerOptionsApi);
+ datePickerWidgetApi.datepicker("setDate", new Date());
+ // overtime
+ var datePickerOptionsOvertime = jQuery.extend({}, datePickerOptions);
+ datePickerOptionsOvertime['onSelect'] = updateDateOvertime;
+ datePickerWidgetOvertime = $( "#datepickerOvertimeLogin" );
+ datePickerWidgetOvertime.datepicker(datePickerOptionsOvertime);
+ datePickerWidgetOvertime.datepicker("setDate", new Date());
+
+ updateDatePunch();
+ updateDatePieOrg();
+ updateDatePieApi();
+ updateDateOvertime();
+
+});
diff --git a/templates/users.html b/templates/users.html
index 152a044..10b651f 100644
--- a/templates/users.html
+++ b/templates/users.html
@@ -180,178 +180,16 @@ small {
-
-
-
+