Upgrade to v26 (#172)
* A bunch of new updates from icehrm pro * Push changes to frontend
This commit is contained in:
4
web/admin/src/attendance/index.js
Normal file
4
web/admin/src/attendance/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { AttendanceAdapter, AttendanceStatusAdapter } from './lib';
|
||||
|
||||
window.AttendanceAdapter = AttendanceAdapter;
|
||||
window.AttendanceStatusAdapter = AttendanceStatusAdapter;
|
||||
289
web/admin/src/attendance/lib.js
Normal file
289
web/admin/src/attendance/lib.js
Normal file
@@ -0,0 +1,289 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
import FormValidation from '../../../api/FormValidation';
|
||||
|
||||
class AttendanceAdapter extends AdapterBase {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this.photoAttendance = false;
|
||||
}
|
||||
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'in_time',
|
||||
'out_time',
|
||||
'note',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Time-In' },
|
||||
{ sTitle: 'Time-Out' },
|
||||
{ sTitle: 'Note' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['employee', {
|
||||
label: 'Employee', type: 'select2', 'allow-null': false, 'remote-source': ['Employee', 'id', 'first_name+last_name'],
|
||||
}],
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['in_time', { label: 'Time-In', type: 'datetime' }],
|
||||
['out_time', { label: 'Time-Out', type: 'datetime', validation: 'none' }],
|
||||
['note', { label: 'Note', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', {
|
||||
label: 'Employee', type: 'select2', 'allow-null': false, 'remote-source': ['Employee', 'id', 'first_name+last_name'],
|
||||
}],
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
setPhotoAttendance(val) {
|
||||
this.photoAttendance = parseInt(val, 10);
|
||||
}
|
||||
|
||||
|
||||
getCustomTableParams() {
|
||||
const that = this;
|
||||
const dataTableParams = {
|
||||
aoColumnDefs: [
|
||||
{
|
||||
fnRender(data, cell) {
|
||||
return that.preProcessRemoteTableData(data, cell, 2);
|
||||
},
|
||||
aTargets: [2],
|
||||
},
|
||||
{
|
||||
fnRender(data, cell) {
|
||||
return that.preProcessRemoteTableData(data, cell, 3);
|
||||
},
|
||||
aTargets: [3],
|
||||
},
|
||||
{
|
||||
fnRender(data, cell) {
|
||||
return that.preProcessRemoteTableData(data, cell, 4);
|
||||
},
|
||||
aTargets: [4],
|
||||
},
|
||||
{
|
||||
fnRender: that.getActionButtons,
|
||||
aTargets: [that.getDataMapping().length],
|
||||
},
|
||||
],
|
||||
};
|
||||
return dataTableParams;
|
||||
}
|
||||
|
||||
preProcessRemoteTableData(data, cell, id) {
|
||||
if (id === 2) {
|
||||
if (cell === '0000-00-00 00:00:00' || cell === '' || cell === undefined || cell == null) {
|
||||
return '';
|
||||
}
|
||||
return Date.parse(cell).toString('yyyy MMM d <b>HH:mm</b>');
|
||||
} if (id === 3) {
|
||||
if (cell === '0000-00-00 00:00:00' || cell === '' || cell === undefined || cell == null) {
|
||||
return '';
|
||||
}
|
||||
return Date.parse(cell).toString('MMM d <b>HH:mm</b>');
|
||||
} if (id === 4) {
|
||||
if (cell !== undefined && cell !== null) {
|
||||
if (cell.length > 10) {
|
||||
return `${cell.substring(0, 10)}..`;
|
||||
}
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
save() {
|
||||
const validator = new FormValidation(`${this.getTableName()}_submit`, true, { ShowPopup: false, LabelErrorClass: 'error' });
|
||||
if (validator.checkValues()) {
|
||||
const params = validator.getFormParameters();
|
||||
|
||||
const msg = this.doCustomValidation(params);
|
||||
if (msg == null) {
|
||||
const id = $(`#${this.getTableName()}_submit #id`).val();
|
||||
if (id != null && id !== undefined && id !== '') {
|
||||
params.id = id;
|
||||
}
|
||||
|
||||
const reqJson = JSON.stringify(params);
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'saveSuccessCallback';
|
||||
callBackData.callBackFail = 'saveFailCallback';
|
||||
|
||||
this.customAction('savePunch', 'admin=attendance', reqJson, callBackData);
|
||||
} else {
|
||||
const label = $(`#${this.getTableName()}Form .label`);
|
||||
label.html(msg);
|
||||
label.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
saveSuccessCallback(callBackData) {
|
||||
this.get(callBackData);
|
||||
}
|
||||
|
||||
|
||||
saveFailCallback(callBackData) {
|
||||
this.showMessage('Error saving attendance entry', callBackData);
|
||||
}
|
||||
|
||||
isSubProfileTable() {
|
||||
return this.user.user_level !== 'Admin';
|
||||
}
|
||||
|
||||
showPunchImages(id) {
|
||||
const reqJson = JSON.stringify({ id });
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'getImagesSuccessCallback';
|
||||
callBackData.callBackFail = 'getImagesFailCallback';
|
||||
this.customAction('getImages', 'admin=attendance', reqJson, callBackData);
|
||||
}
|
||||
|
||||
getImagesSuccessCallback(callBackData) {
|
||||
$('#attendancePhotoModel').modal('show');
|
||||
$('#attendnaceCanvasEmp').html(callBackData.employee_Name);
|
||||
if (callBackData.in_time) {
|
||||
$('#attendnaceCanvasPunchInTime').html(Date.parse(callBackData.in_time).toString('yyyy MMM d <b>HH:mm</b>'));
|
||||
}
|
||||
|
||||
if (callBackData.image_in) {
|
||||
const myCanvas = document.getElementById('attendnaceCanvasIn');
|
||||
const ctx = myCanvas.getContext('2d');
|
||||
const img = new Image();
|
||||
img.onload = function () {
|
||||
ctx.drawImage(img, 0, 0); // Or at whatever offset you like
|
||||
};
|
||||
img.src = callBackData.image_in;
|
||||
}
|
||||
|
||||
if (callBackData.out_time) {
|
||||
$('#attendnaceCanvasPunchOutTime').html(Date.parse(callBackData.out_time).toString('yyyy MMM d <b>HH:mm</b>'));
|
||||
}
|
||||
|
||||
if (callBackData.image_out) {
|
||||
const myCanvas = document.getElementById('attendnaceCanvasOut');
|
||||
const ctx = myCanvas.getContext('2d');
|
||||
const img = new Image();
|
||||
img.onload = function () {
|
||||
ctx.drawImage(img, 0, 0); // Or at whatever offset you like
|
||||
};
|
||||
img.src = callBackData.image_out;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
getImagesFailCallback(callBackData) {
|
||||
this.showMessage('Error', callBackData);
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
const editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
const deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
const photoButton = '<img class="tableActionButton" src="_BASE_images/cam.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Show Photo" onclick="modJs.showPunchImages(_id_);return false;"></img>';
|
||||
|
||||
let html;
|
||||
if (this.photoAttendance === 1) {
|
||||
html = '<div style="width:80px;">_edit__delete__photo_</div>';
|
||||
} else {
|
||||
html = '<div style="width:80px;">_edit__delete_</div>';
|
||||
}
|
||||
|
||||
html = html.replace('_photo_', photoButton);
|
||||
|
||||
if (this.showDelete) {
|
||||
html = html.replace('_delete_', deleteButton);
|
||||
} else {
|
||||
html = html.replace('_delete_', '');
|
||||
}
|
||||
|
||||
if (this.showEdit) {
|
||||
html = html.replace('_edit_', editButton);
|
||||
} else {
|
||||
html = html.replace('_edit_', '');
|
||||
}
|
||||
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Attendance Status
|
||||
*/
|
||||
|
||||
class AttendanceStatusAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'status',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Clocked In Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', {
|
||||
label: 'Employee', type: 'select2', 'allow-null': false, 'remote-source': ['Employee', 'id', 'first_name+last_name'],
|
||||
}],
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
let html = '<div class="online-button-_COLOR_"></div>';
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
if (data[2] == 'Not Clocked In') {
|
||||
html = html.replace(/_COLOR_/g, 'gray');
|
||||
} else if (data[2] == 'Clocked Out') {
|
||||
html = html.replace(/_COLOR_/g, 'yellow');
|
||||
} else if (data[2] == 'Clocked In') {
|
||||
html = html.replace(/_COLOR_/g, 'green');
|
||||
}
|
||||
return html;
|
||||
}
|
||||
|
||||
|
||||
isSubProfileTable() {
|
||||
return this.user.user_level !== 'Admin';
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { AttendanceAdapter, AttendanceStatusAdapter };
|
||||
4
web/admin/src/company_structure/index.js
Normal file
4
web/admin/src/company_structure/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { CompanyStructureAdapter, CompanyGraphAdapter } from './lib';
|
||||
|
||||
window.CompanyStructureAdapter = CompanyStructureAdapter;
|
||||
window.CompanyGraphAdapter = CompanyGraphAdapter;
|
||||
311
web/admin/src/company_structure/lib.js
Normal file
311
web/admin/src/company_structure/lib.js
Normal file
@@ -0,0 +1,311 @@
|
||||
/* eslint-disable prefer-destructuring */
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
/* global d3, nv */
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
class CompanyStructureAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'title',
|
||||
'address',
|
||||
'type',
|
||||
'country',
|
||||
'timezone',
|
||||
'parent',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Address', bSortable: false },
|
||||
{ sTitle: 'Type' },
|
||||
{ sTitle: 'Country', sClass: 'center' },
|
||||
{ sTitle: 'Time Zone' },
|
||||
{ sTitle: 'Parent Structure' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden', validation: '' }],
|
||||
['title', { label: 'Name', type: 'text', validation: '' }],
|
||||
['description', { label: 'Details', type: 'textarea', validation: '' }],
|
||||
['address', { label: 'Address', type: 'textarea', validation: 'none' }],
|
||||
['type', { label: 'Type', type: 'select', source: [['Company', 'Company'], ['Head Office', 'Head Office'], ['Regional Office', 'Regional Office'], ['Department', 'Department'], ['Unit', 'Unit'], ['Sub Unit', 'Sub Unit'], ['Other', 'Other']] }],
|
||||
['country', { label: 'Country', type: 'select2', 'remote-source': ['Country', 'code', 'name'] }],
|
||||
['timezone', {
|
||||
label: 'Time Zone', type: 'select2', 'allow-null': false, 'remote-source': ['Timezone', 'name', 'details'],
|
||||
}],
|
||||
['parent', {
|
||||
label: 'Parent Structure', type: 'select', 'allow-null': true, 'remote-source': ['CompanyStructure', 'id', 'title'],
|
||||
}],
|
||||
['heads', {
|
||||
label: 'Heads', type: 'select2multi', 'allow-null': true, 'remote-source': ['Employee', 'id', 'first_name+last_name'],
|
||||
}],
|
||||
];
|
||||
}
|
||||
|
||||
postRenderForm(object, $tempDomObj) {
|
||||
if (object === undefined
|
||||
|| object === null
|
||||
|| object.id === null
|
||||
|| object.id === undefined || object.id === ''
|
||||
) {
|
||||
$tempDomObj.find('#field_heads').hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Company Graph
|
||||
*/
|
||||
|
||||
|
||||
class CompanyGraphAdapter extends CompanyStructureAdapter {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this.nodeIdCounter = 0;
|
||||
}
|
||||
|
||||
convertToTree(data) {
|
||||
const ice = {};
|
||||
ice.id = -1;
|
||||
ice.title = '';
|
||||
ice.name = '';
|
||||
ice.children = [];
|
||||
|
||||
let parent = null;
|
||||
|
||||
const added = {};
|
||||
|
||||
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
data[i].name = data[i].title;
|
||||
|
||||
if (data[i].parent != null && data[i].parent !== undefined) {
|
||||
parent = this.findParent(data, data[i].parent);
|
||||
if (parent != null) {
|
||||
if (parent.children === undefined || parent.children == null) {
|
||||
parent.children = [];
|
||||
}
|
||||
parent.children.push(data[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].parent == null || data[i].parent === undefined) {
|
||||
ice.children.push(data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return ice;
|
||||
}
|
||||
|
||||
|
||||
findParent(data, parent) {
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].title === parent || data[i].title === parent) {
|
||||
return data[i];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
createTable(elementId) {
|
||||
$('#tabPageCompanyGraph').html('');
|
||||
const that = this;
|
||||
const sourceData = this.sourceData;
|
||||
|
||||
// this.fixCyclicParent(sourceData);
|
||||
const treeData = this.convertToTree(sourceData);
|
||||
const m = [20, 120, 20, 120];
|
||||
const w = 5000 - m[1] - m[3];
|
||||
const h = 1000 - m[0] - m[2];
|
||||
|
||||
const tree = d3.layout.tree()
|
||||
.size([h, w]);
|
||||
|
||||
this.diagonal = d3.svg.diagonal()
|
||||
.projection(d => [d.y, d.x]);
|
||||
|
||||
this.vis = d3.select('#tabPageCompanyGraph').append('svg:svg')
|
||||
.attr('width', w + m[1] + m[3])
|
||||
.attr('height', h + m[0] + m[2])
|
||||
.append('svg:g')
|
||||
.attr('transform', `translate(${m[3]},${m[0]})`);
|
||||
|
||||
const root = treeData;
|
||||
root.x0 = h / 2;
|
||||
root.y0 = 0;
|
||||
|
||||
function toggleAll(d) {
|
||||
if (d.children) {
|
||||
console.log(d.name);
|
||||
d.children.forEach(toggleAll);
|
||||
that.toggle(d);
|
||||
}
|
||||
}
|
||||
this.update(root, tree, root);
|
||||
}
|
||||
|
||||
update(source, tree, root) {
|
||||
const that = this;
|
||||
const duration = d3.event && d3.event.altKey ? 5000 : 500;
|
||||
|
||||
// Compute the new tree layout.
|
||||
const nodes = tree.nodes(root).reverse();
|
||||
|
||||
// Normalize for fixed-depth.
|
||||
nodes.forEach((d) => { d.y = d.depth * 180; });
|
||||
|
||||
// Update the nodes<65>
|
||||
const node = that.vis.selectAll('g.node')
|
||||
.data(nodes, d => d.id || (d.id = ++that.nodeIdCounter));
|
||||
|
||||
// Enter any new nodes at the parent's previous position.
|
||||
const nodeEnter = node.enter().append('svg:g')
|
||||
.attr('class', 'node')
|
||||
.attr('transform', d => `translate(${source.y0},${source.x0})`)
|
||||
.on('click', (d) => { that.toggle(d); that.update(d, tree, root); });
|
||||
|
||||
nodeEnter.append('svg:circle')
|
||||
.attr('r', 1e-6)
|
||||
.style('fill', d => (d._children ? 'lightsteelblue' : '#fff'));
|
||||
|
||||
nodeEnter.append('svg:text')
|
||||
.attr('x', d => (d.children || d._children ? -10 : 10))
|
||||
.attr('dy', '.35em')
|
||||
.attr('text-anchor', d => (d.children || d._children ? 'end' : 'start'))
|
||||
.text(d => d.name)
|
||||
.style('fill-opacity', 1e-6);
|
||||
|
||||
// Transition nodes to their new position.
|
||||
const nodeUpdate = node.transition()
|
||||
.duration(duration)
|
||||
.attr('transform', d => `translate(${d.y},${d.x})`);
|
||||
|
||||
nodeUpdate.select('circle')
|
||||
.attr('r', 4.5)
|
||||
.style('fill', d => (d._children ? 'lightsteelblue' : '#fff'));
|
||||
|
||||
nodeUpdate.select('text')
|
||||
.style('fill-opacity', 1);
|
||||
|
||||
// Transition exiting nodes to the parent's new position.
|
||||
const nodeExit = node.exit().transition()
|
||||
.duration(duration)
|
||||
.attr('transform', d => `translate(${source.y},${source.x})`)
|
||||
.remove();
|
||||
|
||||
nodeExit.select('circle')
|
||||
.attr('r', 1e-6);
|
||||
|
||||
nodeExit.select('text')
|
||||
.style('fill-opacity', 1e-6);
|
||||
|
||||
// Update the links<6B>
|
||||
const link = that.vis.selectAll('path.link')
|
||||
.data(tree.links(nodes), d => d.target.id);
|
||||
|
||||
// Enter any new links at the parent's previous position.
|
||||
link.enter().insert('svg:path', 'g')
|
||||
.attr('class', 'link')
|
||||
.attr('d', (d) => {
|
||||
const o = { x: source.x0, y: source.y0 };
|
||||
return that.diagonal({ source: o, target: o });
|
||||
})
|
||||
.transition()
|
||||
.duration(duration)
|
||||
.attr('d', that.diagonal);
|
||||
|
||||
// Transition links to their new position.
|
||||
link.transition()
|
||||
.duration(duration)
|
||||
.attr('d', that.diagonal);
|
||||
|
||||
// Transition exiting nodes to the parent's new position.
|
||||
link.exit().transition()
|
||||
.duration(duration)
|
||||
.attr('d', (d) => {
|
||||
const o = { x: source.x, y: source.y };
|
||||
return that.diagonal({ source: o, target: o });
|
||||
})
|
||||
.remove();
|
||||
|
||||
// Stash the old positions for transition.
|
||||
nodes.forEach((d) => {
|
||||
d.x0 = d.x;
|
||||
d.y0 = d.y;
|
||||
});
|
||||
}
|
||||
|
||||
// Toggle children.
|
||||
toggle(d) {
|
||||
if (d.children) {
|
||||
d._children = d.children;
|
||||
d.children = null;
|
||||
} else {
|
||||
d.children = d._children;
|
||||
d._children = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
getSourceDataById(id) {
|
||||
for (let i = 0; i < this.sourceData.length; i++) {
|
||||
if (this.sourceData[i].id == id) {
|
||||
return this.sourceData[i];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
fixCyclicParent(sourceData) {
|
||||
let errorMsg = '';
|
||||
for (let i = 0; i < sourceData.length; i++) {
|
||||
const obj = sourceData[i];
|
||||
|
||||
|
||||
let curObj = obj;
|
||||
const parentIdArr = {};
|
||||
parentIdArr[curObj.id] = 1;
|
||||
|
||||
while (curObj.parent != null && curObj.parent != undefined) {
|
||||
const parent = this.getSourceDataById(curObj.parent);
|
||||
if (parent == null) {
|
||||
break;
|
||||
} else if (parentIdArr[parent.id] == 1) {
|
||||
errorMsg = `${obj.title}'s parent structure set to ${parent.title}<br/>`;
|
||||
obj.parent = null;
|
||||
break;
|
||||
}
|
||||
parentIdArr[parent.id] = 1;
|
||||
curObj = parent;
|
||||
}
|
||||
}
|
||||
|
||||
if (errorMsg !== '') {
|
||||
this.showMessage('Company Structure is having a cyclic dependency', `We found a cyclic dependency due to following reasons:<br/>${errorMsg}`);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
getHelpLink() {
|
||||
return 'https://thilinah.gitbooks.io/icehrm-guide/content/employee-information-setup.html';
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { CompanyStructureAdapter, CompanyGraphAdapter };
|
||||
3
web/admin/src/dashboard/index.js
Normal file
3
web/admin/src/dashboard/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
import { DashboardAdapter } from './lib';
|
||||
|
||||
window.DashboardAdapter = DashboardAdapter;
|
||||
56
web/admin/src/dashboard/lib.js
Normal file
56
web/admin/src/dashboard/lib.js
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
class DashboardAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
get(callBackData) {
|
||||
}
|
||||
|
||||
|
||||
getInitData() {
|
||||
const that = this;
|
||||
const object = {};
|
||||
const reqJson = JSON.stringify(object);
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'getInitDataSuccessCallBack';
|
||||
callBackData.callBackFail = 'getInitDataFailCallBack';
|
||||
|
||||
this.customAction('getInitData', 'admin=dashboard', reqJson, callBackData);
|
||||
}
|
||||
|
||||
|
||||
getInitDataSuccessCallBack(data) {
|
||||
$('#numberOfEmployees').html(`${data.numberOfEmployees} Employees`);
|
||||
$('#numberOfCompanyStuctures').html(`${data.numberOfCompanyStuctures} Departments`);
|
||||
$('#numberOfUsers').html(`${data.numberOfUsers} Users`);
|
||||
$('#numberOfProjects').html(`${data.numberOfProjects} Active Projects`);
|
||||
$('#numberOfAttendanceLastWeek').html(`${data.numberOfAttendanceLastWeek} Entries Last Week`);
|
||||
$('#numberOfLeaves').html(`${data.numberOfLeaves} Upcoming`);
|
||||
$('#numberOfTimeEntries').html(data.numberOfTimeEntries);
|
||||
$('#numberOfCandidates').html(`${data.numberOfCandidates} Candidates`);
|
||||
$('#numberOfJobs').html(`${data.numberOfJobs} Active`);
|
||||
$('#numberOfCourses').html(`${data.numberOfCourses} Courses`);
|
||||
}
|
||||
|
||||
getInitDataFailCallBack(callBackData) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { DashboardAdapter };
|
||||
4
web/admin/src/data/index.js
Normal file
4
web/admin/src/data/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { DataImportAdapter, DataImportFileAdapter } from './lib';
|
||||
|
||||
window.DataImportAdapter = DataImportAdapter;
|
||||
window.DataImportFileAdapter = DataImportFileAdapter;
|
||||
185
web/admin/src/data/lib.js
Normal file
185
web/admin/src/data/lib.js
Normal file
@@ -0,0 +1,185 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
/* global dependOnField */
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* DataImportAdapter
|
||||
*/
|
||||
|
||||
class DataImportAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'dataType',
|
||||
'details',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Data Type' },
|
||||
{ sTitle: 'Details' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['dataType', { label: 'Data Type', type: 'text', validation: '' }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
['columns', {
|
||||
label: 'Columns',
|
||||
type: 'datagroup',
|
||||
form: [
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['title', { label: 'Filed Title', type: 'text', validation: 'none' }],
|
||||
['type', {
|
||||
label: 'Type', type: 'select', sort: 'none', source: [['Normal', 'Normal'], ['Reference', 'Reference'], ['Attached', 'Attached']],
|
||||
}],
|
||||
['dependOn', {
|
||||
label: 'Depends On',
|
||||
type: 'select',
|
||||
'allow-null': true,
|
||||
'null-label': 'N/A',
|
||||
source: [['EmergencyContact', 'Emergency Contacts'], ['Ethnicity', 'Ethnicity'], ['Nationality', 'Nationality'], ['JobTitle', 'JobTitle'], ['PayFrequency', 'PayFrequency'], ['PayGrade', 'PayGrade'], ['EmploymentStatus', 'EmploymentStatus'], ['CompanyStructure', 'CompanyStructure'], ['Employee', 'Employee']],
|
||||
}],
|
||||
['dependOnField', { label: 'Depends On Field', type: 'text', validation: 'none' }],
|
||||
['isKeyField', {
|
||||
label: 'Is Key Field', type: 'select', validation: '', source: [['No', 'No'], ['Yes', 'Yes']],
|
||||
}],
|
||||
['idField', {
|
||||
label: 'Is ID Field', type: 'select', validation: '', source: [['No', 'No'], ['Yes', 'Yes']],
|
||||
}],
|
||||
],
|
||||
html: '<div id="#_id_#" class="panel panel-default"><div class="panel-heading"><b>#_name_#</b> #_delete_##_edit_#</div><div class="panel-body"><b>Header Title: </b>#_title_#<br/><span style="color:#999;font-size:11px;font-weight:bold">Type: #_type_# </span><br/></div></div>',
|
||||
validation: 'none',
|
||||
'custom-validate-function': function (data) {
|
||||
const res = {};
|
||||
res.params = data;
|
||||
res.valid = true;
|
||||
if (data.type === 'Reference') {
|
||||
if (data.dependOn === 'NULL') {
|
||||
res.message = 'If the type is Reference this field should referring another table';
|
||||
res.valid = false;
|
||||
} else if (dependOnField === null || dependOnField === undefined) {
|
||||
res.message = "If the type is Reference then 'Depends On Field' can not be empty";
|
||||
res.valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
},
|
||||
|
||||
}],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* DataImportFileAdapter
|
||||
*/
|
||||
|
||||
class DataImportFileAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'data_import_definition',
|
||||
'status',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Data Import Definition' },
|
||||
{ sTitle: 'Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['data_import_definition', { label: 'Data Import Definitions', type: 'select', 'remote-source': ['DataImport', 'id', 'name'] }],
|
||||
['file', {
|
||||
label: 'File to Import', type: 'fileupload', validation: '', filetypes: 'csv,txt',
|
||||
}],
|
||||
['details', { label: 'Last Export Result', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
const editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
const processButton = '<img class="tableActionButton" src="_BASE_images/run.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Process" onclick="modJs.process(_id_,\'_status_\');return false;"></img>';
|
||||
const deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
const cloneButton = '<img class="tableActionButton" src="_BASE_images/clone.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Copy" onclick="modJs.copyRow(_id_);return false;"></img>';
|
||||
|
||||
let html = '<div style="width:120px;">_edit__process__clone__delete_</div>';
|
||||
|
||||
|
||||
if (this.showAddNew) {
|
||||
html = html.replace('_clone_', cloneButton);
|
||||
} else {
|
||||
html = html.replace('_clone_', '');
|
||||
}
|
||||
|
||||
if (this.showDelete) {
|
||||
html = html.replace('_delete_', deleteButton);
|
||||
} else {
|
||||
html = html.replace('_delete_', '');
|
||||
}
|
||||
|
||||
if (this.showEdit) {
|
||||
html = html.replace('_edit_', editButton);
|
||||
} else {
|
||||
html = html.replace('_edit_', '');
|
||||
}
|
||||
|
||||
if (data[3] === 'Not Processed') {
|
||||
html = html.replace('_process_', processButton);
|
||||
} else {
|
||||
html = html.replace('_process_', '');
|
||||
}
|
||||
|
||||
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_status_/g, data[6]);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
|
||||
|
||||
process(id) {
|
||||
const that = this;
|
||||
const object = { id };
|
||||
const reqJson = JSON.stringify(object);
|
||||
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'processSuccessCallBack';
|
||||
callBackData.callBackFail = 'processFailCallBack';
|
||||
|
||||
this.customAction('processDataFile', 'admin=data', reqJson, callBackData);
|
||||
}
|
||||
|
||||
processSuccessCallBack(callBackData) {
|
||||
this.showMessage('Success', 'File imported successfully.');
|
||||
}
|
||||
|
||||
|
||||
processFailCallBack(callBackData) {
|
||||
this.showMessage('Error', `File import unsuccessful. Result:${callBackData}`);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { DataImportAdapter, DataImportFileAdapter };
|
||||
39
web/admin/src/employees/index.js
Normal file
39
web/admin/src/employees/index.js
Normal file
@@ -0,0 +1,39 @@
|
||||
import {
|
||||
EmployeeAdapter,
|
||||
TerminatedEmployeeAdapter,
|
||||
ArchivedEmployeeAdapter,
|
||||
EmployeeSkillAdapter,
|
||||
EmployeeEducationAdapter,
|
||||
EmployeeCertificationAdapter,
|
||||
EmployeeLanguageAdapter,
|
||||
EmployeeDependentAdapter,
|
||||
EmergencyContactAdapter,
|
||||
EmployeeImmigrationAdapter,
|
||||
EmployeeSubSkillsAdapter,
|
||||
EmployeeSubEducationAdapter,
|
||||
EmployeeSubCertificationAdapter,
|
||||
EmployeeSubLanguageAdapter,
|
||||
EmployeeSubDependentAdapter,
|
||||
EmployeeSubEmergencyContactAdapter,
|
||||
EmployeeSubDocumentAdapter,
|
||||
EmployeeDocumentAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.EmployeeAdapter = EmployeeAdapter;
|
||||
window.TerminatedEmployeeAdapter = TerminatedEmployeeAdapter;
|
||||
window.ArchivedEmployeeAdapter = ArchivedEmployeeAdapter;
|
||||
window.EmployeeSkillAdapter = EmployeeSkillAdapter;
|
||||
window.EmployeeEducationAdapter = EmployeeEducationAdapter;
|
||||
window.EmployeeCertificationAdapter = EmployeeCertificationAdapter;
|
||||
window.EmployeeLanguageAdapter = EmployeeLanguageAdapter;
|
||||
window.EmployeeDependentAdapter = EmployeeDependentAdapter;
|
||||
window.EmergencyContactAdapter = EmergencyContactAdapter;
|
||||
window.EmployeeImmigrationAdapter = EmployeeImmigrationAdapter;
|
||||
window.EmployeeSubSkillsAdapter = EmployeeSubSkillsAdapter;
|
||||
window.EmployeeSubEducationAdapter = EmployeeSubEducationAdapter;
|
||||
window.EmployeeSubCertificationAdapter = EmployeeSubCertificationAdapter;
|
||||
window.EmployeeSubLanguageAdapter = EmployeeSubLanguageAdapter;
|
||||
window.EmployeeSubDependentAdapter = EmployeeSubDependentAdapter;
|
||||
window.EmployeeSubEmergencyContactAdapter = EmployeeSubEmergencyContactAdapter;
|
||||
window.EmployeeSubDocumentAdapter = EmployeeSubDocumentAdapter;
|
||||
window.EmployeeDocumentAdapter = EmployeeDocumentAdapter;
|
||||
1877
web/admin/src/employees/lib.js
Normal file
1877
web/admin/src/employees/lib.js
Normal file
File diff suppressed because it is too large
Load Diff
4
web/admin/src/fieldnames/index.js
Normal file
4
web/admin/src/fieldnames/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { FieldNameAdapter, CustomFieldAdapter } from './lib';
|
||||
|
||||
window.FieldNameAdapter = FieldNameAdapter;
|
||||
window.CustomFieldAdapter = CustomFieldAdapter;
|
||||
47
web/admin/src/fieldnames/lib.js
Normal file
47
web/admin/src/fieldnames/lib.js
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
import CustomFieldAdapter from '../../../api/CustomFieldAdapter';
|
||||
|
||||
/**
|
||||
* FieldNameAdapter
|
||||
*/
|
||||
|
||||
class FieldNameAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'textOrig',
|
||||
'textMapped',
|
||||
'display',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Original Text' },
|
||||
{ sTitle: 'Mapped Text' },
|
||||
{ sTitle: 'Display Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['type', { label: 'Type', type: 'placeholder', validation: '' }],
|
||||
['name', { label: 'Name', type: 'placeholder', validation: '' }],
|
||||
['textOrig', { label: 'Original Text', type: 'placeholder', validation: '' }],
|
||||
['textMapped', { label: 'Mapped Text', type: 'text', validation: '' }],
|
||||
['display', { label: 'Display Status', type: 'select', source: [['Form', 'Show'], ['Hidden', 'Hidden']] }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = { FieldNameAdapter, CustomFieldAdapter };
|
||||
5
web/admin/src/jobs/index.js
Normal file
5
web/admin/src/jobs/index.js
Normal file
@@ -0,0 +1,5 @@
|
||||
import { JobTitleAdapter, PayGradeAdapter, EmploymentStatusAdapter } from './lib';
|
||||
|
||||
window.JobTitleAdapter = JobTitleAdapter;
|
||||
window.PayGradeAdapter = PayGradeAdapter;
|
||||
window.EmploymentStatusAdapter = EmploymentStatusAdapter;
|
||||
124
web/admin/src/jobs/lib.js
Normal file
124
web/admin/src/jobs/lib.js
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* JobTitleAdapter
|
||||
*/
|
||||
|
||||
class JobTitleAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'code',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Code' },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['code', { label: 'Job Title Code', type: 'text' }],
|
||||
['name', { label: 'Job Title', type: 'text' }],
|
||||
['description', { label: 'Description', type: 'textarea' }],
|
||||
['specification', { label: 'Specification', type: 'textarea' }],
|
||||
];
|
||||
}
|
||||
|
||||
getHelpLink() {
|
||||
return 'http://blog.icehrm.com/docs/jobdetails/';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* PayGradeAdapter
|
||||
*/
|
||||
|
||||
class PayGradeAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'currency',
|
||||
'min_salary',
|
||||
'max_salary',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Currency' },
|
||||
{ sTitle: 'Min Salary' },
|
||||
{ sTitle: 'Max Salary' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Pay Grade Name', type: 'text' }],
|
||||
['currency', { label: 'Currency', type: 'select2', 'remote-source': ['CurrencyType', 'code', 'name'] }],
|
||||
['min_salary', { label: 'Min Salary', type: 'text', validation: 'float' }],
|
||||
['max_salary', { label: 'Max Salary', type: 'text', validation: 'float' }],
|
||||
];
|
||||
}
|
||||
|
||||
doCustomValidation(params) {
|
||||
try {
|
||||
if (parseFloat(params.min_salary) > parseFloat(params.max_salary)) {
|
||||
return 'Min Salary should be smaller than Max Salary';
|
||||
}
|
||||
} catch (e) {
|
||||
// D/N
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EmploymentStatusAdapter
|
||||
*/
|
||||
|
||||
class EmploymentStatusAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID' },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Description' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Employment Status', type: 'text' }],
|
||||
['description', { label: 'Description', type: 'textarea', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = { JobTitleAdapter, PayGradeAdapter, EmploymentStatusAdapter };
|
||||
7
web/admin/src/loans/index.js
Normal file
7
web/admin/src/loans/index.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import {
|
||||
CompanyLoanAdapter,
|
||||
EmployeeCompanyLoanAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.CompanyLoanAdapter = CompanyLoanAdapter;
|
||||
window.EmployeeCompanyLoanAdapter = EmployeeCompanyLoanAdapter;
|
||||
101
web/admin/src/loans/lib.js
Normal file
101
web/admin/src/loans/lib.js
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* CompanyLoanAdapter
|
||||
*/
|
||||
|
||||
class CompanyLoanAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'details',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Details' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* EmployeeCompanyLoanAdapter
|
||||
*/
|
||||
|
||||
class EmployeeCompanyLoanAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'loan',
|
||||
'start_date',
|
||||
'period_months',
|
||||
'currency',
|
||||
'amount',
|
||||
'status',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Loan Type' },
|
||||
{ sTitle: 'Loan Start Date' },
|
||||
{ sTitle: 'Loan Period (Months)' },
|
||||
{ sTitle: 'Currency' },
|
||||
{ sTitle: 'Amount' },
|
||||
{ sTitle: 'Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
['loan', { label: 'Loan Type', type: 'select', 'remote-source': ['CompanyLoan', 'id', 'name'] }],
|
||||
['start_date', { label: 'Loan Start Date', type: 'date', validation: '' }],
|
||||
['last_installment_date', { label: 'Last Installment Date', type: 'date', validation: 'none' }],
|
||||
['period_months', { label: 'Loan Period (Months)', type: 'text', validation: 'number' }],
|
||||
['currency', { label: 'Currency', type: 'select2', 'remote-source': ['CurrencyType', 'id', 'name'] }],
|
||||
['amount', { label: 'Loan Amount', type: 'text', validation: 'float' }],
|
||||
['monthly_installment', { label: 'Monthly Installment', type: 'text', validation: 'float' }],
|
||||
['status', { label: 'Status', type: 'select', source: [['Approved', 'Approved'], ['Paid', 'Paid'], ['Suspended', 'Suspended']] }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', {
|
||||
label: 'Employee', type: 'select2', 'allow-null': true, 'null-label': 'All Employees', 'remote-source': ['Employee', 'id', 'first_name+last_name'],
|
||||
}],
|
||||
['loan', {
|
||||
label: 'Loan Type', type: 'select', 'allow-null': true, 'null-label': 'All Loan Types', 'remote-source': ['CompanyLoan', 'id', 'name'],
|
||||
}],
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
CompanyLoanAdapter,
|
||||
EmployeeCompanyLoanAdapter,
|
||||
};
|
||||
15
web/admin/src/metadata/index.js
Normal file
15
web/admin/src/metadata/index.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import {
|
||||
CountryAdapter,
|
||||
ProvinceAdapter,
|
||||
CurrencyTypeAdapter,
|
||||
NationalityAdapter,
|
||||
ImmigrationStatusAdapter,
|
||||
EthnicityAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.CountryAdapter = CountryAdapter;
|
||||
window.ProvinceAdapter = ProvinceAdapter;
|
||||
window.CurrencyTypeAdapter = CurrencyTypeAdapter;
|
||||
window.NationalityAdapter = NationalityAdapter;
|
||||
window.ImmigrationStatusAdapter = ImmigrationStatusAdapter;
|
||||
window.EthnicityAdapter = EthnicityAdapter;
|
||||
142
web/admin/src/metadata/lib.js
Normal file
142
web/admin/src/metadata/lib.js
Normal file
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
import IdNameAdapter from '../../../api/IdNameAdapter';
|
||||
/**
|
||||
* CountryAdapter
|
||||
*/
|
||||
|
||||
class CountryAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'code',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Code' },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['code', { label: 'Code', type: 'text', validation: '' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ProvinceAdapter
|
||||
*/
|
||||
|
||||
class ProvinceAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'code',
|
||||
'name',
|
||||
'country',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Code' },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Country' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['code', { label: 'Code', type: 'text', validation: '' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['country', { label: 'Country', type: 'select2', 'remote-source': ['Country', 'code', 'name'] }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['country', { label: 'Country', type: 'select2', 'remote-source': ['Country', 'code', 'name'] }],
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* CurrencyTypeAdapter
|
||||
*/
|
||||
|
||||
class CurrencyTypeAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'code',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Code' },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['code', { label: 'Code', type: 'text', validation: '' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* NationalityAdapter
|
||||
*/
|
||||
|
||||
class NationalityAdapter extends IdNameAdapter {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* ImmigrationStatusAdapter
|
||||
*/
|
||||
|
||||
class ImmigrationStatusAdapter extends IdNameAdapter {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EthnicityAdapter
|
||||
*/
|
||||
|
||||
class EthnicityAdapter extends IdNameAdapter {
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
CountryAdapter,
|
||||
ProvinceAdapter,
|
||||
CurrencyTypeAdapter,
|
||||
NationalityAdapter,
|
||||
ImmigrationStatusAdapter,
|
||||
EthnicityAdapter,
|
||||
};
|
||||
4
web/admin/src/modules/index.js
Normal file
4
web/admin/src/modules/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { ModuleAdapter, UsageAdapter } from './lib';
|
||||
|
||||
window.ModuleAdapter = ModuleAdapter;
|
||||
window.UsageAdapter = UsageAdapter;
|
||||
133
web/admin/src/modules/lib.js
Normal file
133
web/admin/src/modules/lib.js
Normal file
@@ -0,0 +1,133 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
/**
|
||||
* ModuleAdapter
|
||||
*/
|
||||
|
||||
class ModuleAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'label',
|
||||
'menu',
|
||||
'mod_group',
|
||||
'mod_order',
|
||||
'status',
|
||||
'version',
|
||||
'update_path',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Menu', bVisible: false },
|
||||
{ sTitle: 'Group' },
|
||||
{ sTitle: 'Order' },
|
||||
{ sTitle: 'Status' },
|
||||
{ sTitle: 'Version', bVisible: false },
|
||||
{ sTitle: 'Path', bVisible: false },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['label', { label: 'Label', type: 'text', validation: '' }],
|
||||
['status', { label: 'Status', type: 'select', source: [['Enabled', 'Enabled'], ['Disabled', 'Disabled']] }],
|
||||
['user_levels', { label: 'User Levels', type: 'select2multi', source: [['Admin', 'Admin'], ['Manager', 'Manager'], ['Employee', 'Employee'], ['Other', 'Other']] }],
|
||||
['user_roles', { label: 'User Roles', type: 'select2multi', 'remote-source': ['UserRole', 'id', 'name'] }],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
const nonEditableFields = {};
|
||||
nonEditableFields['admin_Company Structure'] = 1;
|
||||
nonEditableFields.admin_Employees = 1;
|
||||
nonEditableFields['admin_Job Details Setup'] = 1;
|
||||
nonEditableFields.admin_Leaves = 1;
|
||||
nonEditableFields['admin_Manage Modules'] = 1;
|
||||
nonEditableFields.admin_Projects = 1;
|
||||
nonEditableFields.admin_Qualifications = 1;
|
||||
nonEditableFields.admin_Settings = 1;
|
||||
nonEditableFields.admin_Users = 1;
|
||||
nonEditableFields.admin_Upgrade = 1;
|
||||
nonEditableFields.admin_Dashboard = 1;
|
||||
|
||||
nonEditableFields['user_Basic Information'] = 1;
|
||||
nonEditableFields.user_Dashboard = 1;
|
||||
|
||||
if (nonEditableFields[`${data[3]}_${data[1]}`] === 1) {
|
||||
return '';
|
||||
}
|
||||
let html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"/></div>';
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* UsageAdapter
|
||||
*/
|
||||
|
||||
class UsageAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
get(callBackData) {
|
||||
|
||||
}
|
||||
|
||||
saveUsage() {
|
||||
const object = {};
|
||||
const arr = [];
|
||||
$('.module-check').each(function () {
|
||||
if ($(this).is(':checked')) {
|
||||
arr.push($(this).val());
|
||||
}
|
||||
});
|
||||
|
||||
if (arr.length === 0) {
|
||||
alert('Please select one or more module groups');
|
||||
return;
|
||||
}
|
||||
|
||||
object.groups = arr.join(',');
|
||||
|
||||
const reqJson = JSON.stringify(object);
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'getInitDataSuccessCallBack';
|
||||
callBackData.callBackFail = 'getInitDataFailCallBack';
|
||||
|
||||
this.customAction('saveUsage', 'admin=modules', reqJson, callBackData);
|
||||
}
|
||||
|
||||
|
||||
saveUsageSuccessCallBack(data) {
|
||||
|
||||
}
|
||||
|
||||
saveUsageFailCallBack(callBackData) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { ModuleAdapter, UsageAdapter };
|
||||
7
web/admin/src/overtime/index.js
Normal file
7
web/admin/src/overtime/index.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import {
|
||||
OvertimeCategoryAdapter,
|
||||
EmployeeOvertimeAdminAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.OvertimeCategoryAdapter = OvertimeCategoryAdapter;
|
||||
window.EmployeeOvertimeAdminAdapter = EmployeeOvertimeAdminAdapter;
|
||||
100
web/admin/src/overtime/lib.js
Normal file
100
web/admin/src/overtime/lib.js
Normal file
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
import ApproveAdminAdapter from '../../../api/ApproveAdminAdapter';
|
||||
|
||||
/**
|
||||
* OvertimeCategoryAdapter
|
||||
*/
|
||||
|
||||
class OvertimeCategoryAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeOvertimeAdminAdapter
|
||||
*/
|
||||
|
||||
|
||||
class EmployeeOvertimeAdminAdapter extends ApproveAdminAdapter {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this.itemName = 'OvertimeRequest';
|
||||
this.itemNameLower = 'overtimerequest';
|
||||
this.modulePathName = 'overtime';
|
||||
}
|
||||
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'category',
|
||||
'start_time',
|
||||
'end_time',
|
||||
'project',
|
||||
'status',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Category' },
|
||||
{ sTitle: 'Start Time' },
|
||||
{ sTitle: 'End Time' },
|
||||
{ sTitle: 'Project' },
|
||||
{ sTitle: 'Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', {
|
||||
label: 'Employee',
|
||||
type: 'select2',
|
||||
sort: 'none',
|
||||
'allow-null': false,
|
||||
'remote-source': ['Employee', 'id', 'first_name+last_name', 'getActiveSubordinateEmployees'],
|
||||
}],
|
||||
['category', {
|
||||
label: 'Category', type: 'select2', 'allow-null': false, 'remote-source': ['OvertimeCategory', 'id', 'name'],
|
||||
}],
|
||||
['start_time', { label: 'Start Time', type: 'datetime', validation: '' }],
|
||||
['end_time', { label: 'End Time', type: 'datetime', validation: '' }],
|
||||
['project', {
|
||||
label: 'Project', type: 'select2', 'allow-null': true, 'null=label': 'none', 'remote-source': ['Project', 'id', 'name'],
|
||||
}],
|
||||
['notes', { label: 'Notes', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
OvertimeCategoryAdapter,
|
||||
EmployeeOvertimeAdminAdapter,
|
||||
};
|
||||
21
web/admin/src/payroll/index.js
Normal file
21
web/admin/src/payroll/index.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import {
|
||||
PaydayAdapter,
|
||||
PayrollAdapter,
|
||||
PayrollDataAdapter,
|
||||
PayrollColumnAdapter,
|
||||
PayrollColumnTemplateAdapter,
|
||||
PayrollEmployeeAdapter,
|
||||
DeductionAdapter,
|
||||
DeductionGroupAdapter,
|
||||
PayslipTemplateAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.PaydayAdapter = PaydayAdapter;
|
||||
window.PayrollAdapter = PayrollAdapter;
|
||||
window.PayrollDataAdapter = PayrollDataAdapter;
|
||||
window.PayrollColumnAdapter = PayrollColumnAdapter;
|
||||
window.PayrollColumnTemplateAdapter = PayrollColumnTemplateAdapter;
|
||||
window.PayrollEmployeeAdapter = PayrollEmployeeAdapter;
|
||||
window.DeductionAdapter = DeductionAdapter;
|
||||
window.DeductionGroupAdapter = DeductionGroupAdapter;
|
||||
window.PayslipTemplateAdapter = PayslipTemplateAdapter;
|
||||
631
web/admin/src/payroll/lib.js
Normal file
631
web/admin/src/payroll/lib.js
Normal file
@@ -0,0 +1,631 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
/* global modJs, modJsList */
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
import TableEditAdapter from '../../../api/TableEditAdapter';
|
||||
|
||||
/**
|
||||
* PaydayAdapter
|
||||
*/
|
||||
|
||||
class PaydayAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Select Pay Frequency' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
];
|
||||
}
|
||||
|
||||
getAddNewLabel() {
|
||||
return 'Run Payroll';
|
||||
}
|
||||
|
||||
createTable(elementId) {
|
||||
$('#payday_all').off();
|
||||
super.createTable(elementId);
|
||||
$('#payday_all').off().on('click', function () {
|
||||
if ($(this).is(':checked')) {
|
||||
$('.paydayCheck').prop('checked', true);
|
||||
} else {
|
||||
$('.paydayCheck').prop('checked', false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
const editButton = '<input type="checkbox" class="paydayCheck" id="payday__id_" name="payday__id_" value="checkbox_payday__id_"/>';
|
||||
|
||||
let html = '<div style="width:120px;">_edit_</div>';
|
||||
html = html.replace('_edit_', editButton);
|
||||
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
|
||||
getActionButtonHeader() {
|
||||
return { sTitle: '<input type="checkbox" id="payday_all" name="payday_all" value="checkbox_payday_all"/>', sClass: 'center' };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* PayrollAdapter
|
||||
*/
|
||||
|
||||
class PayrollAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'pay_period',
|
||||
'department',
|
||||
'date_start',
|
||||
'date_end',
|
||||
'status',
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Pay Frequency' },
|
||||
{ sTitle: 'Department' },
|
||||
{ sTitle: 'Date Start' },
|
||||
{ sTitle: 'Date End' },
|
||||
{ sTitle: 'Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['pay_period', {
|
||||
label: 'Pay Frequency', type: 'select', 'remote-source': ['PayFrequency', 'id', 'name'], sort: 'none',
|
||||
}],
|
||||
['deduction_group', {
|
||||
label: 'Calculation Group', type: 'select', 'remote-source': ['DeductionGroup', 'id', 'name'], sort: 'none',
|
||||
}],
|
||||
['payslipTemplate', { label: 'Payslip Template', type: 'select', 'remote-source': ['PayslipTemplate', 'id', 'name'] }],
|
||||
['department', {
|
||||
label: 'Department', type: 'select2', 'remote-source': ['CompanyStructure', 'id', 'title'], sort: 'none',
|
||||
}],
|
||||
['date_start', { label: 'Start Date', type: 'date', validation: '' }],
|
||||
['date_end', { label: 'End Date', type: 'date', validation: '' }],
|
||||
// [ "column_template", {"label":"Report Column Template","type":"select","remote-source":["PayrollColumnTemplate","id","name"]}],
|
||||
['columns', { label: 'Payroll Columns', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }],
|
||||
['status', {
|
||||
label: 'Status', type: 'select', source: [['Draft', 'Draft'], ['Completed', 'Completed']], sort: 'none',
|
||||
}],
|
||||
];
|
||||
}
|
||||
|
||||
postRenderForm(object, $tempDomObj) {
|
||||
if (object != null && object !== undefined && object.id !== undefined && object.id != null) {
|
||||
$tempDomObj.find('#pay_period').attr('disabled', 'disabled');
|
||||
$tempDomObj.find('#department').attr('disabled', 'disabled');
|
||||
// $tempDomObj.find("#date_start").attr('disabled','disabled');
|
||||
// $tempDomObj.find("#date_end").attr('disabled','disabled');
|
||||
// $tempDomObj.find("#column_template").attr('disabled','disabled');
|
||||
}
|
||||
}
|
||||
|
||||
process(id, status) {
|
||||
// eslint-disable-next-line no-global-assign
|
||||
modJs = modJsList.tabPayrollData;
|
||||
modJs.setCurrentPayroll(id);
|
||||
$('#Payroll').hide();
|
||||
$('#PayrollData').show();
|
||||
$('#PayrollDataButtons').show();
|
||||
|
||||
if (status === 'Completed') {
|
||||
$('.completeBtnTable').hide();
|
||||
$('.saveBtnTable').hide();
|
||||
} else {
|
||||
$('.completeBtnTable').show();
|
||||
$('.saveBtnTable').show();
|
||||
}
|
||||
|
||||
modJs.get([]);
|
||||
}
|
||||
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
const editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
const processButton = '<img class="tableActionButton" src="_BASE_images/run.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Process" onclick="modJs.process(_id_,\'_status_\');return false;"></img>';
|
||||
const deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
|
||||
const cloneButton = '<img class="tableActionButton" src="_BASE_images/clone.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Copy" onclick="modJs.copyRow(_id_);return false;"></img>';
|
||||
|
||||
let html = '<div style="width:120px;">_edit__process__clone__delete_</div>';
|
||||
|
||||
|
||||
if (this.showAddNew) {
|
||||
html = html.replace('_clone_', cloneButton);
|
||||
} else {
|
||||
html = html.replace('_clone_', '');
|
||||
}
|
||||
|
||||
if (this.showDelete) {
|
||||
html = html.replace('_delete_', deleteButton);
|
||||
} else {
|
||||
html = html.replace('_delete_', '');
|
||||
}
|
||||
|
||||
if (this.showEdit) {
|
||||
html = html.replace('_edit_', editButton);
|
||||
} else {
|
||||
html = html.replace('_edit_', '');
|
||||
}
|
||||
|
||||
html = html.replace('_process_', processButton);
|
||||
|
||||
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_status_/g, data[6]);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
|
||||
get(callBackData) {
|
||||
$('#PayrollData').hide();
|
||||
$('#PayrollForm').hide();
|
||||
$('#PayrollDataButtons').hide();
|
||||
$('#Payroll').show();
|
||||
modJsList.tabPayrollData.setCurrentPayroll(null);
|
||||
super.get(callBackData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* PayrollDataAdapter
|
||||
*/
|
||||
|
||||
class PayrollDataAdapter extends TableEditAdapter {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this.cellDataUpdates = {};
|
||||
this.payrollId = null;
|
||||
}
|
||||
|
||||
validateCellValue(element, evt, newValue) {
|
||||
modJs.addCellDataUpdate(element.data('colId'), element.data('rowId'), newValue);
|
||||
return true;
|
||||
}
|
||||
|
||||
setCurrentPayroll(val) {
|
||||
this.payrollId = val;
|
||||
}
|
||||
|
||||
|
||||
addAdditionalRequestData(type, req) {
|
||||
if (type === 'updateData') {
|
||||
req.payrollId = this.payrollId;
|
||||
} else if (type === 'updateAllData') {
|
||||
req.payrollId = this.payrollId;
|
||||
} else if (type === 'getAllData') {
|
||||
req.payrollId = this.payrollId;
|
||||
}
|
||||
|
||||
return req;
|
||||
}
|
||||
|
||||
modifyCSVHeader(header) {
|
||||
header.unshift('');
|
||||
return header;
|
||||
}
|
||||
|
||||
getCSVData() {
|
||||
let csv = '';
|
||||
|
||||
for (let i = 0; i < this.csvData.length; i++) {
|
||||
csv += this.csvData[i].join(',');
|
||||
if (i < this.csvData.length - 1) {
|
||||
csv += '\r\n';
|
||||
}
|
||||
}
|
||||
|
||||
return csv;
|
||||
}
|
||||
|
||||
downloadPayroll() {
|
||||
const element = document.createElement('a');
|
||||
element.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(this.getCSVData())}`);
|
||||
element.setAttribute('download', `payroll_${this.payrollId}.csv`);
|
||||
|
||||
element.style.display = 'none';
|
||||
document.body.appendChild(element);
|
||||
|
||||
element.click();
|
||||
|
||||
document.body.removeChild(element);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* PayrollColumnAdapter
|
||||
*/
|
||||
|
||||
class PayrollColumnAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'colorder',
|
||||
'calculation_hook',
|
||||
'deduction_group',
|
||||
'editable',
|
||||
'enabled',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Column Order' },
|
||||
{ sTitle: 'Calculation Method' },
|
||||
{ sTitle: 'Calculation Group' },
|
||||
{ sTitle: 'Editable' },
|
||||
{ sTitle: 'Enabled' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
const fucntionColumnList = ['calculation_columns', {
|
||||
label: 'Calculation Columns',
|
||||
type: 'datagroup',
|
||||
form: [
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['column', { label: 'Column', type: 'select2', 'remote-source': ['PayrollColumn', 'id', 'name'] }],
|
||||
],
|
||||
html: '<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_renderFunction_#</div></div>',
|
||||
validation: 'none',
|
||||
render(item) {
|
||||
const output = `Variable:${item.name}`;
|
||||
return output;
|
||||
},
|
||||
|
||||
}];
|
||||
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['calculation_hook', {
|
||||
label: 'Predefined Calculations', type: 'select2', 'allow-null': true, 'null-label': 'None', 'remote-source': ['CalculationHook', 'code', 'name'],
|
||||
}],
|
||||
['deduction_group', {
|
||||
label: 'Calculation Group', type: 'select2', 'allow-null': true, 'null-label': 'Common', 'remote-source': ['DeductionGroup', 'id', 'name'],
|
||||
}],
|
||||
['salary_components', { label: 'Salary Components', type: 'select2multi', 'remote-source': ['SalaryComponent', 'id', 'name'] }],
|
||||
['deductions', { label: 'Calculation Method', type: 'select2multi', 'remote-source': ['Deduction', 'id', 'name'] }],
|
||||
['add_columns', { label: 'Columns to Add', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }],
|
||||
['sub_columns', { label: 'Columns to Subtract', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }],
|
||||
['colorder', { label: 'Column Order', type: 'text', validation: 'number' }],
|
||||
['editable', { label: 'Editable', type: 'select', source: [['Yes', 'Yes'], ['No', 'No']] }],
|
||||
['enabled', { label: 'Enabled', type: 'select', source: [['Yes', 'Yes'], ['No', 'No']] }],
|
||||
['default_value', { label: 'Default Value', type: 'text', validation: '' }],
|
||||
fucntionColumnList,
|
||||
['calculation_function', { label: 'Function', type: 'text', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['deduction_group', {
|
||||
label: 'Calculation Group', type: 'select2', 'allow-null': true, 'null-label': 'Any', 'remote-source': ['DeductionGroup', 'id', 'name'],
|
||||
}],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* PayrollColumnTemplateAdapter
|
||||
*/
|
||||
|
||||
class PayrollColumnTemplateAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: true },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['columns', { label: 'Payroll Columns', type: 'select2multi', 'remote-source': ['PayrollColumn', 'id', 'name'] }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* PayrollEmployeeAdapter
|
||||
*/
|
||||
|
||||
class PayrollEmployeeAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'pay_frequency',
|
||||
'deduction_group',
|
||||
'currency',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Pay Frequency' },
|
||||
{ sTitle: 'Calculation Group' },
|
||||
{ sTitle: 'Currency' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
['pay_frequency', { label: 'Pay Frequency', type: 'select2', 'remote-source': ['PayFrequency', 'id', 'name'] }],
|
||||
['currency', { label: 'Currency', type: 'select2', 'remote-source': ['CurrencyType', 'id', 'code'] }],
|
||||
['deduction_group', {
|
||||
label: 'Calculation Group', type: 'select2', 'allow-null': true, 'null-label': 'None', 'remote-source': ['DeductionGroup', 'id', 'name'],
|
||||
}],
|
||||
['deduction_exemptions', {
|
||||
label: 'Calculation Exemptions', type: 'select2multi', 'remote-source': ['Deduction', 'id', 'name'], validation: 'none',
|
||||
}],
|
||||
['deduction_allowed', {
|
||||
label: 'Calculations Assigned', type: 'select2multi', 'remote-source': ['Deduction', 'id', 'name'], validation: 'none',
|
||||
}],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* DeductionAdapter
|
||||
*/
|
||||
|
||||
class DeductionAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'deduction_group',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Calculation Group' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
const rangeAmounts = ['rangeAmounts', {
|
||||
label: 'Calculation Process',
|
||||
type: 'datagroup',
|
||||
form: [
|
||||
['lowerCondition', { label: 'Lower Limit Condition', type: 'select', source: [['No Lower Limit', 'No Lower Limit'], ['gt', 'Greater than'], ['gte', 'Greater than or Equal']] }],
|
||||
['lowerLimit', { label: 'Lower Limit', type: 'text', validation: 'float' }],
|
||||
['upperCondition', { label: 'Upper Limit Condition', type: 'select', source: [['No Upper Limit', 'No Upper Limit'], ['lt', 'Less than'], ['lte', 'Less than or Equal']] }],
|
||||
['upperLimit', { label: 'Upper Limit', type: 'text', validation: 'float' }],
|
||||
['amount', { label: 'Value', type: 'text', validation: '' }],
|
||||
],
|
||||
html: '<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_renderFunction_#</div></div>',
|
||||
validation: 'none',
|
||||
'custom-validate-function': function (data) {
|
||||
const res = {};
|
||||
res.valid = true;
|
||||
if (data.lowerCondition === 'No Lower Limit') {
|
||||
data.lowerLimit = 0;
|
||||
}
|
||||
if (data.upperCondition === 'No Upper Limit') {
|
||||
data.upperLimit = 0;
|
||||
}
|
||||
res.params = data;
|
||||
return res;
|
||||
},
|
||||
render(item) {
|
||||
let output = '';
|
||||
const getSymbol = function (text) {
|
||||
const map = {};
|
||||
map.gt = '>';
|
||||
map.gte = '>=';
|
||||
map.lt = '<';
|
||||
map.lte = '<=';
|
||||
|
||||
return map[text];
|
||||
};
|
||||
|
||||
if (item.lowerCondition !== 'No Lower Limit') {
|
||||
output += `${item.lowerLimit} ${getSymbol(item.lowerCondition)} `;
|
||||
}
|
||||
|
||||
if (item.upperCondition !== 'No Upper Limit') {
|
||||
output += ' and ';
|
||||
output += `${getSymbol(item.upperCondition)} ${item.upperLimit} `;
|
||||
}
|
||||
if (output === '') {
|
||||
return `Deduction is ${item.amount} for all ranges`;
|
||||
}
|
||||
return `If salary component ${output} deduction is ${item.amount}`;
|
||||
},
|
||||
|
||||
}];
|
||||
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['componentType', {
|
||||
label: 'Salary Component Type', type: 'select2multi', 'allow-null': true, 'remote-source': ['SalaryComponentType', 'id', 'name'],
|
||||
}],
|
||||
['component', {
|
||||
label: 'Salary Component', type: 'select2multi', 'allow-null': true, 'remote-source': ['SalaryComponent', 'id', 'name'],
|
||||
}],
|
||||
['payrollColumn', {
|
||||
label: 'Payroll Report Column', type: 'select2', 'allow-null': true, 'remote-source': ['PayrollColumn', 'id', 'name'],
|
||||
}],
|
||||
rangeAmounts,
|
||||
['deduction_group', {
|
||||
label: 'Calculation Group', type: 'select2', 'allow-null': true, 'null-label': 'None', 'remote-source': ['DeductionGroup', 'id', 'name'],
|
||||
}],
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* DeductionGroupAdapter
|
||||
*/
|
||||
|
||||
class DeductionGroupAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Details' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['description', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* PayslipTemplateAdapter
|
||||
*/
|
||||
|
||||
class PayslipTemplateAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
const payslipFields = ['data', {
|
||||
label: 'Payslip Fields',
|
||||
type: 'datagroup',
|
||||
form: [
|
||||
['type', {
|
||||
label: 'Type', type: 'select', sort: 'none', source: [['Payroll Column', 'Payroll Column'], ['Text', 'Text'], ['Company Name', 'Company Name'], ['Company Logo', 'Company Logo'], ['Separators', 'Separators']],
|
||||
}],
|
||||
['payrollColumn', {
|
||||
label: 'Payroll Column', type: 'select2', sort: 'none', 'allow-null': true, 'null-label': 'None', 'remote-source': ['PayrollColumn', 'id', 'name'],
|
||||
}],
|
||||
|
||||
['label', { label: 'Label', type: 'text', validation: 'none' }],
|
||||
['text', { label: 'Text', type: 'textarea', validation: 'none' }],
|
||||
['status', {
|
||||
label: 'Status', type: 'select', sort: 'none', source: [['Show', 'Show'], ['Hide', 'Hide']],
|
||||
}],
|
||||
],
|
||||
|
||||
// "html":'<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body"><table class="table table-striped"><tr><td>Type</td><td>#_type_#</td></tr><tr><td>Label</td><td>#_label_#</td></tr><tr><td>Text</td><td>#_text_#</td></tr><tr><td>Font Size</td><td>#_fontSize_#</td></tr><tr><td>Font Style</td><td>#_fontStyle_#</td></tr><tr><td>Font Color</td><td>#_fontColor_#</td></tr><tr><td>Status</td><td>#_status_#</td></tr></table> </div></div>',
|
||||
html: '<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_type_# #_label_# <br/> #_text_#</div></div>',
|
||||
validation: 'none',
|
||||
'custom-validate-function': function (data) {
|
||||
const res = {};
|
||||
res.valid = true;
|
||||
if (data.type === 'Payroll Column') {
|
||||
if (data.payrollColumn === 'NULL') {
|
||||
res.valid = false;
|
||||
res.message = 'Please select payroll column';
|
||||
} else {
|
||||
data.payrollColumn = 'NULL';
|
||||
}
|
||||
} else if (data.type === 'Text') {
|
||||
if (data.text === '') {
|
||||
res.valid = false;
|
||||
res.message = 'Text can not be empty';
|
||||
}
|
||||
}
|
||||
|
||||
res.params = data;
|
||||
return res;
|
||||
},
|
||||
}];
|
||||
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
payslipFields,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
PaydayAdapter,
|
||||
PayrollAdapter,
|
||||
PayrollDataAdapter,
|
||||
PayrollColumnAdapter,
|
||||
PayrollColumnTemplateAdapter,
|
||||
PayrollEmployeeAdapter,
|
||||
DeductionAdapter,
|
||||
DeductionGroupAdapter,
|
||||
PayslipTemplateAdapter,
|
||||
};
|
||||
3
web/admin/src/permissions/index.js
Normal file
3
web/admin/src/permissions/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
import { PermissionAdapter } from './lib';
|
||||
|
||||
window.PermissionAdapter = PermissionAdapter;
|
||||
73
web/admin/src/permissions/lib.js
Normal file
73
web/admin/src/permissions/lib.js
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* PermissionAdapter
|
||||
*/
|
||||
|
||||
class PermissionAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'user_level',
|
||||
'module_id',
|
||||
'permission',
|
||||
'value',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'User Level' },
|
||||
{ sTitle: 'Module' },
|
||||
{ sTitle: 'Permission' },
|
||||
{ sTitle: 'Value' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['user_level', { label: 'User Level', type: 'placeholder', validation: 'none' }],
|
||||
['module_id', { label: 'Module', type: 'placeholder', 'remote-source': ['Module', 'id', 'menu+name'] }],
|
||||
['permission', { label: 'Permission', type: 'placeholder', validation: 'none' }],
|
||||
['value', { label: 'Value', type: 'text', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['module_id', {
|
||||
label: 'Module', type: 'select2', 'allow-null': true, 'null-label': 'All Modules', 'remote-source': ['Module', 'id', 'menu+name'],
|
||||
}],
|
||||
];
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
let html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img></div>';
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
|
||||
|
||||
getMetaFieldForRendering(fieldName) {
|
||||
if (fieldName === 'value') {
|
||||
return 'meta';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
fillForm(object) {
|
||||
super.fillForm(object);
|
||||
$('#helptext').html(object.description);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { PermissionAdapter };
|
||||
9
web/admin/src/projects/index.js
Normal file
9
web/admin/src/projects/index.js
Normal file
@@ -0,0 +1,9 @@
|
||||
import {
|
||||
ClientAdapter,
|
||||
ProjectAdapter,
|
||||
EmployeeProjectAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.ClientAdapter = ClientAdapter;
|
||||
window.ProjectAdapter = ProjectAdapter;
|
||||
window.EmployeeProjectAdapter = EmployeeProjectAdapter;
|
||||
163
web/admin/src/projects/lib.js
Normal file
163
web/admin/src/projects/lib.js
Normal file
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* ClientAdapter
|
||||
*/
|
||||
|
||||
class ClientAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'details',
|
||||
'address',
|
||||
'contact_number',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Details' },
|
||||
{ sTitle: 'Address' },
|
||||
{ sTitle: 'Contact Number' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
if (this.showSave) {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
['address', { label: 'Address', type: 'textarea', validation: 'none' }],
|
||||
['contact_number', { label: 'Contact Number', type: 'text', validation: 'none' }],
|
||||
['contact_email', { label: 'Contact Email', type: 'text', validation: 'none' }],
|
||||
['company_url', { label: 'Company Url', type: 'text', validation: 'none' }],
|
||||
['status', { label: 'Status', type: 'select', source: [['Active', 'Active'], ['Inactive', 'Inactive']] }],
|
||||
['first_contact_date', { label: 'First Contact Date', type: 'date', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'placeholder' }],
|
||||
['details', { label: 'Details', type: 'placeholder', validation: 'none' }],
|
||||
['address', { label: 'Address', type: 'placeholder', validation: 'none' }],
|
||||
['contact_number', { label: 'Contact Number', type: 'placeholder', validation: 'none' }],
|
||||
['contact_email', { label: 'Contact Email', type: 'placeholder', validation: 'none' }],
|
||||
['company_url', { label: 'Company Url', type: 'placeholder', validation: 'none' }],
|
||||
['status', { label: 'Status', type: 'placeholder', source: [['Active', 'Active'], ['Inactive', 'Inactive']] }],
|
||||
['first_contact_date', { label: 'First Contact Date', type: 'placeholder', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getHelpLink() {
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ProjectAdapter
|
||||
*/
|
||||
|
||||
class ProjectAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'client',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Client' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
if (this.showSave) {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['client', {
|
||||
label: 'Client', type: 'select2', 'allow-null': true, 'remote-source': ['Client', 'id', 'name'],
|
||||
}],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
['status', { label: 'Status', type: 'select', source: [['Active', 'Active'], ['On Hold', 'On Hold'], ['Completed', 'Completed'], ['Dropped', 'Dropped']] }],
|
||||
];
|
||||
}
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'placeholder' }],
|
||||
['client', {
|
||||
label: 'Client', type: 'placeholder', 'allow-null': true, 'remote-source': ['Client', 'id', 'name'],
|
||||
}],
|
||||
['details', { label: 'Details', type: 'placeholder', validation: 'none' }],
|
||||
['status', { label: 'Status', type: 'select', source: [['Active', 'Active'], ['On Hold', 'On Hold'], ['Completed', 'Completed'], ['Dropped', 'Dropped']] }],
|
||||
];
|
||||
}
|
||||
|
||||
getHelpLink() {
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* EmployeeProjectAdapter
|
||||
*/
|
||||
|
||||
|
||||
class EmployeeProjectAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'project',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Project' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
['project', { label: 'Project', type: 'select2', 'remote-source': ['Project', 'id', 'name'] }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
getHelpLink() {
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ClientAdapter,
|
||||
ProjectAdapter,
|
||||
EmployeeProjectAdapter,
|
||||
};
|
||||
11
web/admin/src/qualifications/index.js
Normal file
11
web/admin/src/qualifications/index.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import {
|
||||
SkillAdapter,
|
||||
EducationAdapter,
|
||||
CertificationAdapter,
|
||||
LanguageAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.SkillAdapter = SkillAdapter;
|
||||
window.EducationAdapter = EducationAdapter;
|
||||
window.CertificationAdapter = CertificationAdapter;
|
||||
window.LanguageAdapter = LanguageAdapter;
|
||||
140
web/admin/src/qualifications/lib.js
Normal file
140
web/admin/src/qualifications/lib.js
Normal file
@@ -0,0 +1,140 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* SkillAdapter
|
||||
*/
|
||||
|
||||
class SkillAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Description' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['description', { label: 'Description', type: 'textarea', validation: '' }],
|
||||
];
|
||||
}
|
||||
|
||||
getHelpLink() {
|
||||
return 'http://blog.icehrm.com/docs/qualifications/';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EducationAdapter
|
||||
*/
|
||||
|
||||
class EducationAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Description' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['description', { label: 'Description', type: 'textarea', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* CertificationAdapter
|
||||
*/
|
||||
|
||||
class CertificationAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Description' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['description', { label: 'Description', type: 'textarea', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* LanguageAdapter
|
||||
*/
|
||||
|
||||
class LanguageAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Description' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text' }],
|
||||
['description', { label: 'Description', type: 'textarea', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
SkillAdapter,
|
||||
EducationAdapter,
|
||||
CertificationAdapter,
|
||||
LanguageAdapter,
|
||||
};
|
||||
4
web/admin/src/reports/index.js
Normal file
4
web/admin/src/reports/index.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { ReportAdapter, ReportGenAdapter } from './lib';
|
||||
|
||||
window.ReportAdapter = ReportAdapter;
|
||||
window.ReportGenAdapter = ReportGenAdapter;
|
||||
372
web/admin/src/reports/lib.js
Normal file
372
web/admin/src/reports/lib.js
Normal file
@@ -0,0 +1,372 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
/* global SignaturePad, modJs */
|
||||
/* eslint-disable no-underscore-dangle */
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
|
||||
/**
|
||||
* ReportAdapter
|
||||
*/
|
||||
|
||||
|
||||
class ReportAdapter extends AdapterBase {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this._construct();
|
||||
}
|
||||
|
||||
_construct() {
|
||||
this._formFileds = [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'label', validation: '' }],
|
||||
['parameters', { label: 'Parameters', type: 'fieldset', validation: 'none' }],
|
||||
];
|
||||
this.remoteFieldsExists = false;
|
||||
}
|
||||
|
||||
_initLocalFormFields() {
|
||||
this._formFileds = [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'label', validation: '' }],
|
||||
['parameters', { label: 'Parameters', type: 'fieldset', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
setRemoteFieldExists(val) {
|
||||
this.remoteFieldsExists = val;
|
||||
}
|
||||
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'icon',
|
||||
'name',
|
||||
'details',
|
||||
'parameters',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: '', bSortable: false, sWidth: '22px' },
|
||||
{ sTitle: 'Name', sWidth: '30%' },
|
||||
{ sTitle: 'Details' },
|
||||
{ sTitle: 'Parameters', bVisible: false },
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
getFormFields() {
|
||||
return this._formFileds;
|
||||
}
|
||||
|
||||
processFormFieldsWithObject(object) {
|
||||
const that = this;
|
||||
this._initLocalFormFields();
|
||||
const len = this._formFileds.length;
|
||||
const fieldIDsToDelete = [];
|
||||
const fieldsToDelete = [];
|
||||
this.remoteFieldsExists = false;
|
||||
for (let i = 0; i < len; i++) {
|
||||
if (this._formFileds[i][1].type === 'fieldset') {
|
||||
const newFields = JSON.parse(object[this._formFileds[i][0]]);
|
||||
fieldsToDelete.push(this._formFileds[i][0]);
|
||||
newFields.forEach((entry) => {
|
||||
that._formFileds.push(entry);
|
||||
if (entry[1]['remote-source'] !== undefined && entry[1]['remote-source'] != null) {
|
||||
that.remoteFieldsExists = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const tempArray = [];
|
||||
that._formFileds.forEach((entry) => {
|
||||
if (jQuery.inArray(entry[0], fieldsToDelete) < 0) {
|
||||
tempArray.push(entry);
|
||||
}
|
||||
});
|
||||
|
||||
that._formFileds = tempArray;
|
||||
}
|
||||
|
||||
|
||||
renderForm(object) {
|
||||
const that = this;
|
||||
this.processFormFieldsWithObject(object);
|
||||
if (this.remoteFieldsExists) {
|
||||
const cb = function () {
|
||||
that.renderFormNew(object);
|
||||
};
|
||||
this.initFieldMasterData(cb);
|
||||
} else {
|
||||
this.initFieldMasterData();
|
||||
that.renderFormNew(object);
|
||||
}
|
||||
|
||||
this.currentReport = object;
|
||||
}
|
||||
|
||||
renderFormNew(object) {
|
||||
const that = this;
|
||||
const signatureIds = [];
|
||||
if (object == null || object === undefined) {
|
||||
this.currentId = null;
|
||||
}
|
||||
|
||||
this.preRenderForm(object);
|
||||
|
||||
let formHtml = this.templates.formTemplate;
|
||||
let html = '';
|
||||
const fields = this.getFormFields();
|
||||
|
||||
for (let i = 0; i < fields.length; i++) {
|
||||
const metaField = this.getMetaFieldForRendering(fields[i][0]);
|
||||
if (metaField === '' || metaField === undefined) {
|
||||
html += this.renderFormField(fields[i]);
|
||||
} else {
|
||||
const metaVal = object[metaField];
|
||||
if (metaVal !== '' && metaVal != null && metaVal !== undefined && metaVal.trim() !== '') {
|
||||
html += this.renderFormField(JSON.parse(metaVal));
|
||||
} else {
|
||||
html += this.renderFormField(fields[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
formHtml = formHtml.replace(/_id_/g, `${this.getTableName()}_submit`);
|
||||
formHtml = formHtml.replace(/_fields_/g, html);
|
||||
|
||||
|
||||
let $tempDomObj;
|
||||
const randomFormId = this.generateRandom(14);
|
||||
if (!this.showFormOnPopup) {
|
||||
$tempDomObj = $(`#${this.getTableName()}Form`);
|
||||
} else {
|
||||
$tempDomObj = $('<div class="reviewBlock popupForm" data-content="Form"></div>');
|
||||
$tempDomObj.attr('id', randomFormId);
|
||||
}
|
||||
|
||||
$tempDomObj.html(formHtml);
|
||||
|
||||
|
||||
$tempDomObj.find('.datefield').datepicker({ viewMode: 2 });
|
||||
$tempDomObj.find('.timefield').datetimepicker({
|
||||
language: 'en',
|
||||
pickDate: false,
|
||||
});
|
||||
$tempDomObj.find('.datetimefield').datetimepicker({
|
||||
language: 'en',
|
||||
});
|
||||
|
||||
$tempDomObj.find('.colorpick').colorpicker();
|
||||
|
||||
// $tempDomObj.find('.select2Field').select2();
|
||||
$tempDomObj.find('.select2Field').each(function () {
|
||||
$(this).select2().select2('val', $(this).find('option:eq(0)').val());
|
||||
});
|
||||
|
||||
$tempDomObj.find('.select2Multi').each(function () {
|
||||
$(this).select2().on('change', function (e) {
|
||||
const parentRow = $(this).parents('.row');
|
||||
const height = parentRow.find('.select2-choices').height();
|
||||
parentRow.height(parseInt(height, 10));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$tempDomObj.find('.signatureField').each(function () {
|
||||
// $(this).data('signaturePad',new SignaturePad($(this)));
|
||||
signatureIds.push($(this).attr('id'));
|
||||
});
|
||||
|
||||
for (let i = 0; i < fields.length; i++) {
|
||||
if (fields[i][1].type === 'datagroup') {
|
||||
$tempDomObj.find(`#${fields[i][0]}`).data('field', fields[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (this.showSave === false) {
|
||||
$tempDomObj.find('.saveBtn').remove();
|
||||
} else {
|
||||
$tempDomObj.find('.saveBtn').off();
|
||||
$tempDomObj.find('.saveBtn').data('modJs', this);
|
||||
$tempDomObj.find('.saveBtn').on('click', function () {
|
||||
if ($(this).data('modJs').saveSuccessItemCallback != null && $(this).data('modJs').saveSuccessItemCallback !== undefined) {
|
||||
$(this).data('modJs').save($(this).data('modJs').retriveItemsAfterSave(), $(this).data('modJs').saveSuccessItemCallback);
|
||||
} else {
|
||||
$(this).data('modJs').save();
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
if (this.showCancel === false) {
|
||||
$tempDomObj.find('.cancelBtn').remove();
|
||||
} else {
|
||||
$tempDomObj.find('.cancelBtn').off();
|
||||
$tempDomObj.find('.cancelBtn').data('modJs', this);
|
||||
$tempDomObj.find('.cancelBtn').on('click', function () {
|
||||
$(this).data('modJs').cancel();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
if (!this.showFormOnPopup) {
|
||||
$(`#${this.getTableName()}Form`).show();
|
||||
$(`#${this.getTableName()}`).hide();
|
||||
|
||||
for (let i = 0; i < signatureIds.length; i++) {
|
||||
$(`#${signatureIds[i]}`)
|
||||
.data('signaturePad',
|
||||
new SignaturePad(document.getElementById(signatureIds[i])));
|
||||
}
|
||||
|
||||
if (object !== undefined && object != null) {
|
||||
this.fillForm(object);
|
||||
}
|
||||
} else {
|
||||
// var tHtml = $tempDomObj.wrap('<div>').parent().html();
|
||||
// this.showMessage("Edit",tHtml,null,null,true);
|
||||
this.showMessage('Edit', '', null, null, true);
|
||||
|
||||
$('#plainMessageModel .modal-body').html('');
|
||||
$('#plainMessageModel .modal-body').append($tempDomObj);
|
||||
|
||||
|
||||
for (let i = 0; i < signatureIds.length; i++) {
|
||||
$(`#${signatureIds[i]}`)
|
||||
.data('signaturePad',
|
||||
new SignaturePad(document.getElementById(signatureIds[i])));
|
||||
}
|
||||
|
||||
if (object !== undefined && object != null) {
|
||||
this.fillForm(object, `#${randomFormId}`);
|
||||
}
|
||||
}
|
||||
|
||||
this.postRenderForm(object, $tempDomObj);
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
let html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/download.png" style="cursor:pointer;" rel="tooltip" title="Download" onclick="modJs.edit(_id_);return false;"></img></div>';
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
|
||||
addSuccessCallBack(callBackData, serverData) {
|
||||
const fileName = serverData[0];
|
||||
let link;
|
||||
|
||||
if (fileName.indexOf('https:') === 0) {
|
||||
link = `<a href="${fileName}" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>`;
|
||||
} else {
|
||||
link = `<a href="${modJs.getCustomActionUrl('download', { file: fileName })}" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>`;
|
||||
}
|
||||
link = link.replace(/_BASE_/g, this.baseUrl);
|
||||
|
||||
if (this.currentReport.output === 'PDF' || this.currentReport.output === 'JSON') {
|
||||
this.showMessage('Download Report', link);
|
||||
} else {
|
||||
if (serverData[1].length === 0) {
|
||||
this.showMessage('Empty Report', 'There were no data for selected filters');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const tableHtml = `${link}<br/><br/><div class="box-body table-responsive" style="overflow-x:scroll;padding: 5px;border: solid 1px #DDD;"><table id="tempReportTable" cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped"></table></div>`;
|
||||
|
||||
// Delete existing temp report table
|
||||
$('#tempReportTable').remove();
|
||||
|
||||
// this.showMessage("Report",tableHtml);
|
||||
|
||||
$(`#${this.table}`).html(tableHtml);
|
||||
$(`#${this.table}`).show();
|
||||
$(`#${this.table}Form`).hide();
|
||||
|
||||
// Prepare headers
|
||||
const headers = [];
|
||||
for (const index in serverData[1]) {
|
||||
headers.push({ sTitle: serverData[1][index] });
|
||||
}
|
||||
|
||||
const data = serverData[2];
|
||||
|
||||
|
||||
const dataTableParams = {
|
||||
oLanguage: {
|
||||
sLengthMenu: '_MENU_ records per page',
|
||||
},
|
||||
aaData: data,
|
||||
aoColumns: headers,
|
||||
bSort: false,
|
||||
iDisplayLength: 15,
|
||||
iDisplayStart: 0,
|
||||
};
|
||||
|
||||
$('#tempReportTable').dataTable(dataTableParams);
|
||||
|
||||
$('.dataTables_paginate ul').addClass('pagination');
|
||||
$('.dataTables_length').hide();
|
||||
$('.dataTables_filter input').addClass('form-control');
|
||||
$('.dataTables_filter input').attr('placeholder', 'Search');
|
||||
$('.dataTables_filter label').contents().filter(function () {
|
||||
return (this.nodeType === 3);
|
||||
}).remove();
|
||||
$('.tableActionButton').tooltip();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fillForm(object) {
|
||||
const fields = this.getFormFields();
|
||||
for (let i = 0; i < fields.length; i++) {
|
||||
if (fields[i][1].type === 'label') {
|
||||
$(`#${this.getTableName()}Form #${fields[i][0]}`).html(object[fields[i][0]]);
|
||||
} else {
|
||||
$(`#${this.getTableName()}Form #${fields[i][0]}`).val(object[fields[i][0]]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ReportGenAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
|
||||
];
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
let html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/download.png" style="cursor:pointer;" rel="tooltip" title="Download" onclick="download(_name_);return false;"></img></div>';
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_name_/g, data[1]);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = { ReportAdapter, ReportGenAdapter };
|
||||
9
web/admin/src/salary/index.js
Normal file
9
web/admin/src/salary/index.js
Normal file
@@ -0,0 +1,9 @@
|
||||
import {
|
||||
SalaryComponentTypeAdapter,
|
||||
SalaryComponentAdapter,
|
||||
EmployeeSalaryAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.SalaryComponentTypeAdapter = SalaryComponentTypeAdapter;
|
||||
window.SalaryComponentAdapter = SalaryComponentAdapter;
|
||||
window.EmployeeSalaryAdapter = EmployeeSalaryAdapter;
|
||||
120
web/admin/src/salary/lib.js
Normal file
120
web/admin/src/salary/lib.js
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* SalaryComponentTypeAdapter
|
||||
*/
|
||||
|
||||
class SalaryComponentTypeAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'code',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Code' },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['code', { label: 'Code', type: 'text', validation: '' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* SalaryComponentAdapter
|
||||
*/
|
||||
|
||||
class SalaryComponentAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'componentType',
|
||||
'details',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Salary Component Type' },
|
||||
{ sTitle: 'Details' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['componentType', { label: 'Salary Component Type', type: 'select2', 'remote-source': ['SalaryComponentType', 'id', 'name'] }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* EmployeeSalaryAdapter
|
||||
*/
|
||||
|
||||
class EmployeeSalaryAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'component',
|
||||
'amount',
|
||||
'details',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Salary Component' },
|
||||
{ sTitle: 'Amount' },
|
||||
{ sTitle: 'Details' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
['component', { label: 'Salary Component', type: 'select2', 'remote-source': ['SalaryComponent', 'id', 'name'] }],
|
||||
['amount', { label: 'Amount', type: 'text', validation: 'float' }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
SalaryComponentTypeAdapter,
|
||||
SalaryComponentAdapter,
|
||||
EmployeeSalaryAdapter,
|
||||
};
|
||||
3
web/admin/src/settings/index.js
Normal file
3
web/admin/src/settings/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
import { SettingAdapter } from './lib';
|
||||
|
||||
window.SettingAdapter = SettingAdapter;
|
||||
109
web/admin/src/settings/lib.js
Normal file
109
web/admin/src/settings/lib.js
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
/**
|
||||
* SettingAdapter
|
||||
*/
|
||||
|
||||
class SettingAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'value',
|
||||
'description',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Value' },
|
||||
{ sTitle: 'Details' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['value', { label: 'Value', type: 'text', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
getActionButtonsHtml(id, data) {
|
||||
let html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img></div>';
|
||||
html = html.replace(/_id_/g, id);
|
||||
html = html.replace(/_BASE_/g, this.baseUrl);
|
||||
return html;
|
||||
}
|
||||
|
||||
|
||||
getMetaFieldForRendering(fieldName) {
|
||||
if (fieldName === 'value') {
|
||||
return 'meta';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
edit(id) {
|
||||
this.loadRemoteDataForSettings();
|
||||
super.edit(id);
|
||||
}
|
||||
|
||||
|
||||
fillForm(object) {
|
||||
const metaField = this.getMetaFieldForRendering('value');
|
||||
const metaVal = object[metaField];
|
||||
let formFields = null;
|
||||
|
||||
if (metaVal !== '' && metaVal !== undefined) {
|
||||
formFields = [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
JSON.parse(metaVal),
|
||||
];
|
||||
}
|
||||
|
||||
super.fillForm(object, null, formFields);
|
||||
$('#helptext').html(object.description);
|
||||
}
|
||||
|
||||
|
||||
loadRemoteDataForSettings() {
|
||||
const fields = [];
|
||||
let field = null;
|
||||
fields.push(['country', { label: 'Country', type: 'select2multi', 'remote-source': ['Country', 'id', 'name'] }]);
|
||||
fields.push(['countryCompany', { label: 'Country', type: 'select2', 'remote-source': ['Country', 'code', 'name'] }]);
|
||||
fields.push(['currency', { label: 'Currency', type: 'select2multi', 'remote-source': ['CurrencyType', 'id', 'code+name'] }]);
|
||||
fields.push(['nationality', { label: 'Nationality', type: 'select2multi', 'remote-source': ['Nationality', 'id', 'name'] }]);
|
||||
fields.push(['supportedLanguage', {
|
||||
label: 'Value', type: 'select2', 'allow-null': false, 'remote-source': ['SupportedLanguage', 'name', 'description'],
|
||||
}]);
|
||||
|
||||
for (const index in fields) {
|
||||
field = fields[index];
|
||||
if (field[1]['remote-source'] !== undefined && field[1]['remote-source'] !== null) {
|
||||
const key = `${field[1]['remote-source'][0]}_${field[1]['remote-source'][1]}_${field[1]['remote-source'][2]}`;
|
||||
this.fieldMasterDataKeys[key] = false;
|
||||
this.sourceMapping[field[0]] = field[1]['remote-source'];
|
||||
|
||||
const callBackData = {};
|
||||
callBackData.callBack = 'initFieldMasterDataResponse';
|
||||
callBackData.callBackData = [key];
|
||||
|
||||
this.getFieldValues(field[1]['remote-source'], callBackData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
getHelpLink() {
|
||||
return 'http://blog.icehrm.com/docs/settings/';
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { SettingAdapter };
|
||||
11
web/admin/src/travel/index.js
Normal file
11
web/admin/src/travel/index.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import {
|
||||
ImmigrationDocumentAdapter,
|
||||
EmployeeImmigrationAdapter,
|
||||
EmployeeTravelRecordAdminAdapter,
|
||||
CustomFieldAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.ImmigrationDocumentAdapter = ImmigrationDocumentAdapter;
|
||||
window.EmployeeImmigrationAdapter = EmployeeImmigrationAdapter;
|
||||
window.EmployeeTravelRecordAdminAdapter = EmployeeTravelRecordAdminAdapter;
|
||||
window.CustomFieldAdapter = CustomFieldAdapter;
|
||||
195
web/admin/src/travel/lib.js
Normal file
195
web/admin/src/travel/lib.js
Normal file
@@ -0,0 +1,195 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
import CustomFieldAdapter from '../../../api/CustomFieldAdapter';
|
||||
import ApproveAdminAdapter from '../../../api/ApproveAdminAdapter';
|
||||
|
||||
/**
|
||||
* ImmigrationDocumentAdapter
|
||||
*/
|
||||
|
||||
class ImmigrationDocumentAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
'details',
|
||||
'required',
|
||||
'alert_on_missing',
|
||||
'alert_before_expiry',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
{ sTitle: 'Details' },
|
||||
{ sTitle: 'Compulsory' },
|
||||
{ sTitle: 'Alert If Not Found' },
|
||||
{ sTitle: 'Alert Before Expiry' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
const fields = [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
['required', { label: 'Compulsory', type: 'select', source: [['No', 'No'], ['Yes', 'Yes']] }],
|
||||
['alert_on_missing', { label: 'Alert If Not Found', type: 'select', source: [['No', 'No'], ['Yes', 'Yes']] }],
|
||||
['alert_before_expiry', { label: 'Alert Before Expiry', type: 'select', source: [['No', 'No'], ['Yes', 'Yes']] }],
|
||||
['alert_before_day_number', { label: 'Days for Expiry Alert', type: 'text', validation: '' }],
|
||||
];
|
||||
|
||||
for (let i = 0; i < this.customFields.length; i++) {
|
||||
fields.push(this.customFields[i]);
|
||||
}
|
||||
|
||||
return fields;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeImmigrationAdapter
|
||||
*/
|
||||
|
||||
|
||||
class EmployeeImmigrationAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'document',
|
||||
'documentname',
|
||||
'valid_until',
|
||||
'status',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Document' },
|
||||
{ sTitle: 'Document Id' },
|
||||
{ sTitle: 'Valid Until' },
|
||||
{ sTitle: 'Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
['document', { label: 'Document', type: 'select2', 'remote-source': ['ImmigrationDocument', 'id', 'name'] }],
|
||||
['documentname', { label: 'Document Id', type: 'text', validation: '' }],
|
||||
['valid_until', { label: 'Valid Until', type: 'date', validation: 'none' }],
|
||||
['status', { label: 'Status', type: 'select', source: [['Active', 'Active'], ['Inactive', 'Inactive'], ['Draft', 'Draft']] }],
|
||||
['details', { label: 'Details', type: 'textarea', validation: 'none' }],
|
||||
['attachment1', { label: 'Attachment 1', type: 'fileupload', validation: 'none' }],
|
||||
['attachment2', { label: 'Attachment 2', type: 'fileupload', validation: 'none' }],
|
||||
['attachment3', { label: 'Attachment 3', type: 'fileupload', validation: 'none' }],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
getFilters() {
|
||||
return [
|
||||
['employee', { label: 'Employee', type: 'select2', 'remote-source': ['Employee', 'id', 'first_name+last_name'] }],
|
||||
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeTravelRecordAdminAdapter
|
||||
*/
|
||||
|
||||
|
||||
class EmployeeTravelRecordAdminAdapter extends ApproveAdminAdapter {
|
||||
constructor(endPoint, tab, filter, orderBy) {
|
||||
super(endPoint, tab, filter, orderBy);
|
||||
this.itemName = 'TravelRequest';
|
||||
this.itemNameLower = 'travelrequest';
|
||||
this.modulePathName = 'travel';
|
||||
}
|
||||
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'employee',
|
||||
'type',
|
||||
'purpose',
|
||||
'travel_from',
|
||||
'travel_to',
|
||||
'travel_date',
|
||||
'status',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'Travel Type' },
|
||||
{ sTitle: 'Purpose' },
|
||||
{ sTitle: 'From' },
|
||||
{ sTitle: 'To' },
|
||||
{ sTitle: 'Travel Date' },
|
||||
{ sTitle: 'Status' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return this.addCustomFields([
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['employee', {
|
||||
label: 'Employee',
|
||||
type: 'select2',
|
||||
sort: 'none',
|
||||
'allow-null': false,
|
||||
'remote-source': ['Employee', 'id', 'first_name+last_name', 'getActiveSubordinateEmployees'],
|
||||
}],
|
||||
['type', {
|
||||
label: 'Means of Transportation',
|
||||
type: 'select',
|
||||
source: [
|
||||
['Plane', 'Plane'],
|
||||
['Rail', 'Rail'],
|
||||
['Taxi', 'Taxi'],
|
||||
['Own Vehicle', 'Own Vehicle'],
|
||||
['Rented Vehicle', 'Rented Vehicle'],
|
||||
['Other', 'Other'],
|
||||
],
|
||||
}],
|
||||
['purpose', { label: 'Purpose of Travel', type: 'textarea', validation: '' }],
|
||||
['travel_from', { label: 'Travel From', type: 'text', validation: '' }],
|
||||
['travel_to', { label: 'Travel To', type: 'text', validation: '' }],
|
||||
['travel_date', { label: 'Travel Date', type: 'datetime', validation: '' }],
|
||||
['return_date', { label: 'Return Date', type: 'datetime', validation: '' }],
|
||||
['details', { label: 'Notes', type: 'textarea', validation: 'none' }],
|
||||
['currency', {
|
||||
label: 'Currency', type: 'select2', 'allow-null': false, 'remote-source': ['CurrencyType', 'id', 'code'],
|
||||
}],
|
||||
['funding', {
|
||||
label: 'Total Funding Proposed', type: 'text', validation: 'float', default: '0.00', mask: '9{0,10}.99',
|
||||
}],
|
||||
['attachment1', { label: 'Attachment', type: 'fileupload', validation: 'none' }],
|
||||
['attachment2', { label: 'Attachment', type: 'fileupload', validation: 'none' }],
|
||||
['attachment3', { label: 'Attachment', type: 'fileupload', validation: 'none' }],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ImmigrationDocumentAdapter,
|
||||
EmployeeImmigrationAdapter,
|
||||
EmployeeTravelRecordAdminAdapter,
|
||||
CustomFieldAdapter,
|
||||
};
|
||||
7
web/admin/src/users/index.js
Normal file
7
web/admin/src/users/index.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import {
|
||||
UserAdapter,
|
||||
UserRoleAdapter,
|
||||
} from './lib';
|
||||
|
||||
window.UserAdapter = UserAdapter;
|
||||
window.UserRoleAdapter = UserRoleAdapter;
|
||||
201
web/admin/src/users/lib.js
Normal file
201
web/admin/src/users/lib.js
Normal file
@@ -0,0 +1,201 @@
|
||||
/*
|
||||
Copyright (c) 2018 [Glacies UG, Berlin, Germany] (http://glacies.de)
|
||||
Developer: Thilina Hasantha (http://lk.linkedin.com/in/thilinah | https://github.com/thilinah)
|
||||
*/
|
||||
|
||||
import FormValidation from '../../../api/FormValidation';
|
||||
import AdapterBase from '../../../api/AdapterBase';
|
||||
|
||||
|
||||
class UserAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'username',
|
||||
'email',
|
||||
'employee',
|
||||
'user_level',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID' },
|
||||
{ sTitle: 'User Name' },
|
||||
{ sTitle: 'Authentication Email' },
|
||||
{ sTitle: 'Employee' },
|
||||
{ sTitle: 'User Level' },
|
||||
];
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden', validation: '' }],
|
||||
['username', { label: 'User Name', type: 'text', validation: 'username' }],
|
||||
['email', { label: 'Email', type: 'text', validation: 'email' }],
|
||||
['employee', {
|
||||
label: 'Employee', type: 'select2', 'allow-null': true, 'remote-source': ['Employee', 'id', 'first_name+last_name'],
|
||||
}],
|
||||
['user_level', { label: 'User Level', type: 'select', source: [['Admin', 'Admin'], ['Manager', 'Manager'], ['Employee', 'Employee'], ['Other', 'Other']] }],
|
||||
['user_roles', { label: 'User Roles', type: 'select2multi', 'remote-source': ['UserRole', 'id', 'name'] }],
|
||||
['lang', {
|
||||
label: 'Language', type: 'select2', 'allow-null': true, 'remote-source': ['SupportedLanguage', 'id', 'description'],
|
||||
}],
|
||||
['default_module', {
|
||||
label: 'Default Module', type: 'select2', 'null-label': 'No Default Module', 'allow-null': true, 'remote-source': ['Module', 'id', 'menu+label'],
|
||||
}],
|
||||
];
|
||||
}
|
||||
|
||||
postRenderForm(object, $tempDomObj) {
|
||||
if (object == null || object === undefined) {
|
||||
$tempDomObj.find('#changePasswordBtn').remove();
|
||||
}
|
||||
}
|
||||
|
||||
changePassword() {
|
||||
$('#adminUsersModel').modal('show');
|
||||
$('#adminUsersChangePwd #newpwd').val('');
|
||||
$('#adminUsersChangePwd #conpwd').val('');
|
||||
}
|
||||
|
||||
saveUserSuccessCallBack(callBackData, serverData) {
|
||||
const user = callBackData[0];
|
||||
if (callBackData[1]) {
|
||||
this.showMessage('Create User', `An email has been sent to ${user.email} with a temporary password to login to IceHrm.`);
|
||||
} else {
|
||||
this.showMessage('Create User', 'User created successfully. But there was a problem sending welcome email.');
|
||||
}
|
||||
this.get([]);
|
||||
}
|
||||
|
||||
saveUserFailCallBack(callBackData, serverData) {
|
||||
this.showMessage('Error', callBackData);
|
||||
}
|
||||
|
||||
doCustomValidation(params) {
|
||||
let msg = null;
|
||||
if ((params.user_level !== 'Admin' && params.user_level !== 'Other') && params.employee === 'NULL') {
|
||||
msg = 'For this user type, you have to assign an employee when adding or editing the user.<br/>';
|
||||
msg += " You may create a new employee through 'Admin'->'Employees' menu";
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
save() {
|
||||
const validator = new FormValidation(`${this.getTableName()}_submit`, true, { ShowPopup: false, LabelErrorClass: 'error' });
|
||||
if (validator.checkValues()) {
|
||||
const params = validator.getFormParameters();
|
||||
|
||||
const msg = this.doCustomValidation(params);
|
||||
if (msg == null) {
|
||||
const id = $(`#${this.getTableName()}_submit #id`).val();
|
||||
params.csrf = $(`#${this.getTableName()}Form`).data('csrf');
|
||||
if (id != null && id !== undefined && id !== '') {
|
||||
params.id = id;
|
||||
this.add(params, []);
|
||||
} else {
|
||||
const reqJson = JSON.stringify(params);
|
||||
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'saveUserSuccessCallBack';
|
||||
callBackData.callBackFail = 'saveUserFailCallBack';
|
||||
|
||||
this.customAction('saveUser', 'admin=users', reqJson, callBackData);
|
||||
}
|
||||
} else {
|
||||
// $("#"+this.getTableName()+'Form .label').html(msg);
|
||||
// $("#"+this.getTableName()+'Form .label').show();
|
||||
this.showMessage('Error Saving User', msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
changePasswordConfirm() {
|
||||
$('#adminUsersChangePwd_error').hide();
|
||||
|
||||
const passwordValidation = function (str) {
|
||||
return str.length > 7;
|
||||
};
|
||||
|
||||
const password = $('#adminUsersChangePwd #newpwd').val();
|
||||
|
||||
if (!passwordValidation(password)) {
|
||||
$('#adminUsersChangePwd_error').html('Password should be longer than 7 characters');
|
||||
$('#adminUsersChangePwd_error').show();
|
||||
return;
|
||||
}
|
||||
|
||||
const conPassword = $('#adminUsersChangePwd #conpwd').val();
|
||||
|
||||
if (conPassword !== password) {
|
||||
$('#adminUsersChangePwd_error').html("Passwords don't match");
|
||||
$('#adminUsersChangePwd_error').show();
|
||||
return;
|
||||
}
|
||||
|
||||
const req = { id: this.currentId, pwd: conPassword };
|
||||
const reqJson = JSON.stringify(req);
|
||||
|
||||
const callBackData = [];
|
||||
callBackData.callBackData = [];
|
||||
callBackData.callBackSuccess = 'changePasswordSuccessCallBack';
|
||||
callBackData.callBackFail = 'changePasswordFailCallBack';
|
||||
|
||||
this.customAction('changePassword', 'admin=users', reqJson, callBackData);
|
||||
}
|
||||
|
||||
closeChangePassword() {
|
||||
$('#adminUsersModel').modal('hide');
|
||||
}
|
||||
|
||||
changePasswordSuccessCallBack(callBackData, serverData) {
|
||||
this.closeChangePassword();
|
||||
this.showMessage('Password Change', 'Password changed successfully');
|
||||
}
|
||||
|
||||
changePasswordFailCallBack(callBackData, serverData) {
|
||||
this.closeChangePassword();
|
||||
this.showMessage('Error', callBackData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* UserRoleAdapter
|
||||
*/
|
||||
|
||||
class UserRoleAdapter extends AdapterBase {
|
||||
getDataMapping() {
|
||||
return [
|
||||
'id',
|
||||
'name',
|
||||
];
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
return [
|
||||
{ sTitle: 'ID', bVisible: false },
|
||||
{ sTitle: 'Name' },
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
postRenderForm(object, $tempDomObj) {
|
||||
$tempDomObj.find('#changePasswordBtn').remove();
|
||||
}
|
||||
|
||||
getFormFields() {
|
||||
return [
|
||||
['id', { label: 'ID', type: 'hidden' }],
|
||||
['name', { label: 'Name', type: 'text', validation: '' }],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
UserAdapter,
|
||||
UserRoleAdapter,
|
||||
};
|
||||
Reference in New Issue
Block a user