klnodekb/routes/gantt_holidays.js

165 lines
5.3 KiB
JavaScript

const express = require('express');
const router = express.Router();
const moment = require('moment');
const { mongo, Mongoose } = require('mongoose');
let Work=require('../models/works');
let Employee = require('../models/employee');
var utils = require('../js/utils');
const { default: mongoose } = require('mongoose');
// Add Devices ToRoute
router.get('/', utils.ensureAuthenticated,async function (req,res) {
const employees=await Employee.find({'konyvelesre':'on','isSubcontractor':{$ne:'on'}},null,{sort: {name: 1}} );
await employees.forEach(element => {
const color = generateColorHsl(element.name, saturationRange, lightnessRange);
const c=HSLToRGB(color.h,color.s,color.l);
element.color=c;
})
res.render('gantt_holiday', {
title: 'Szabadságok',
employees:employees
});
});
router.get('/getcolors', utils.ensureAuthenticated,async function (req,res) {
const employees=await Employee.find({'konyvelesre':'on'},null,{sort: {name: 1}} );
var colors=[];
await employees.forEach(element => {
const color = generateColorHsl(element.name, saturationRange, lightnessRange);
const c=HSLToRGB(color.h,color.s,color.l);
colors.push(c);
})
res.send(colors);
});
const getHashOfString = (str) => {
let hash = 0;
for (let i = 0; i < str.length; i++) {
// tslint:disable-next-line: no-bitwise
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
hash = Math.abs(hash);
return hash;
};
const normalizeHash = (hash, min, max) => {
return Math.floor((hash % (max - min)) + min);
};
const generateHSL = (name, saturationRange, lightnessRange) => {
const hash = getHashOfString(name);
const h = normalizeHash(hash, 0, 360);
const s = normalizeHash(hash, saturationRange[0], saturationRange[1]);
const l = normalizeHash(hash, lightnessRange[0], lightnessRange[1]);
return [h, s, l];
};
const HSLtoString = (hsl) => {
// return `hsl(${hsl[0]}, ${hsl[1]}%, ${hsl[2]}%)`;
return {'h':hsl[0],'s':hsl[1],'l':hsl[2]}
};
const generateColorHsl = (id, saturationRange, lightnessRange) => {
return HSLtoString(generateHSL(id, saturationRange, lightnessRange));
};
const getInitials = (user) => {
return `${user.name.first[0]}${user.name.last[0]}`
}
const setValue = (functionFor) => {
return (e) => {
const value = parseInt(e.target.value);
functionFor(value);
}
};
const getRange = (value, range) => {
return [Math.max(0, value-range), Math.min(value+range, 100)];
}
const saturation = 50;
const lightness = 50;
const range = 10;
const saturationRange = getRange(saturation, range);
const lightnessRange = getRange(lightness, range);
function HSLToRGB(h,s,l) {
// Must be fractions of 1
s /= 100;
l /= 100;
let c = (1 - Math.abs(2 * l - 1)) * s,
x = c * (1 - Math.abs((h / 60) % 2 - 1)),
m = l - c/2,
r = 0,
g = 0,
b = 0;
if (0 <= h && h < 60) {
r = c; g = x; b = 0;
} else if (60 <= h && h < 120) {
r = x; g = c; b = 0;
} else if (120 <= h && h < 180) {
r = 0; g = c; b = x;
} else if (180 <= h && h < 240) {
r = 0; g = x; b = c;
} else if (240 <= h && h < 300) {
r = x; g = 0; b = c;
} else if (300 <= h && h < 360) {
r = c; g = 0; b = x;
}
r = Math.round((r + m) * 255);
g = Math.round((g + m) * 255);
b = Math.round((b + m) * 255);
//return {'r':r,'g':g,'b':b};
return "rgb(" + r + "," + g + "," + b + ")";
}
router.get("/data/:display/:year", async function(req, res){
console.log('GANTT2');
var data=[];
moment.locale('HU');
const display=req.params.display
const year=req.params.year
const employees=await Employee.find({'konyvelesre':'on','isSubcontractor':{$ne:'on'}},null,{sort: {name: 1}} );
await employees.forEach(element => {
const color = generateColorHsl(element.name, saturationRange, lightnessRange);
const c=HSLToRGB(color.h,color.s,color.l);
if (element.konyvelesre=='on')
{
element.holidayData.forEach(hd=>{
if (moment(hd.start_date,'DD.MM.YYYY').format('YYYY')==year || moment(hd.end_date,'DD.MM.YYYY').format('YYYY')==year)
{
var task={
id:hd._id,
start:moment(hd.start_date,'DD.MM.YYYY').startOf('day').format('YYYY-MM-DD HH:mm:SS'),
end:moment(hd.end_date,'DD.MM.YYYY').add(1, 'days').toDate(),//.endOf('day').toDate(),
title:element.name,
allDay:true,
eventBackgroundColor: '#378006',//rgb(c.r,c.g,c.b),
color: c,//'#378006',
display:display,
extendedProps: {
employeeId:element._id,
},
}
data.push(task);
}
})
}
});
res.send(data);
});
module.exports = router;