Upgrade to v26 (#172)
* A bunch of new updates from icehrm pro * Push changes to frontend
This commit is contained in:
@@ -1,317 +0,0 @@
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
function AttendanceAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.photoAttendance = false;
|
||||
}
|
||||
|
||||
AttendanceAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
AttendanceAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"in_time",
|
||||
"out_time",
|
||||
"note"
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Time-In" },
|
||||
{ "sTitle": "Time-Out"},
|
||||
{ "sTitle": "Note"}
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","allow-null":false,"remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('setPhotoAttendance', function(val) {
|
||||
this.photoAttendance = val;
|
||||
});
|
||||
|
||||
|
||||
AttendanceAdapter.method('getCustomTableParams', function() {
|
||||
var that = this;
|
||||
var dataTableParams = {
|
||||
"aoColumnDefs": [
|
||||
{
|
||||
"fnRender": function(data, cell){
|
||||
return that.preProcessRemoteTableData(data, cell, 2)
|
||||
} ,
|
||||
"aTargets": [2]
|
||||
},
|
||||
{
|
||||
"fnRender": function(data, cell){
|
||||
return that.preProcessRemoteTableData(data, cell, 3)
|
||||
} ,
|
||||
"aTargets": [3]
|
||||
},
|
||||
{
|
||||
"fnRender": function(data, cell){
|
||||
return that.preProcessRemoteTableData(data, cell, 4)
|
||||
} ,
|
||||
"aTargets": [4]
|
||||
},
|
||||
{
|
||||
"fnRender": that.getActionButtons,
|
||||
"aTargets": [that.getDataMapping().length]
|
||||
}
|
||||
]
|
||||
};
|
||||
return dataTableParams;
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('preProcessRemoteTableData', function(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>');
|
||||
}else 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>');
|
||||
}else if(id == 4){
|
||||
if(cell != undefined && cell != null){
|
||||
if(cell.length > 10){
|
||||
return cell.substring(0,10)+"..";
|
||||
}
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
AttendanceAdapter.method('save', function() {
|
||||
var validator = new FormValidation(this.getTableName()+"_submit",true,{'ShowPopup':false,"LabelErrorClass":"error"});
|
||||
if(validator.checkValues()){
|
||||
var params = validator.getFormParameters();
|
||||
|
||||
var msg = this.doCustomValidation(params);
|
||||
if(msg == null){
|
||||
var id = $('#'+this.getTableName()+"_submit #id").val();
|
||||
if(id != null && id != undefined && id != ""){
|
||||
$(params).attr('id',id);
|
||||
}
|
||||
|
||||
var reqJson = JSON.stringify(params);
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'saveSuccessCallback';
|
||||
callBackData['callBackFail'] = 'saveFailCallback';
|
||||
|
||||
this.customAction('savePunch','admin=attendance',reqJson,callBackData);
|
||||
}else{
|
||||
$("#"+this.getTableName()+'Form .label').html(msg);
|
||||
$("#"+this.getTableName()+'Form .label').show();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
AttendanceAdapter.method('saveSuccessCallback', function(callBackData) {
|
||||
this.get(callBackData);
|
||||
});
|
||||
|
||||
|
||||
AttendanceAdapter.method('saveFailCallback', function(callBackData) {
|
||||
this.showMessage("Error saving attendance entry", callBackData);
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('isSubProfileTable', function() {
|
||||
if(this.user.user_level == "Admin"){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('showPunchImages', function(id) {
|
||||
var reqJson = JSON.stringify({id: id});
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'getImagesSuccessCallback';
|
||||
callBackData['callBackFail'] = 'getImagesFailCallback';
|
||||
this.customAction('getImages','admin=attendance',reqJson,callBackData);
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('getImagesSuccessCallback', function(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) {
|
||||
var myCanvas = document.getElementById('attendnaceCanvasIn');
|
||||
var ctx = myCanvas.getContext('2d');
|
||||
var 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) {
|
||||
var myCanvas = document.getElementById('attendnaceCanvasOut');
|
||||
var ctx = myCanvas.getContext('2d');
|
||||
var img = new Image;
|
||||
img.onload = function(){
|
||||
ctx.drawImage(img,0,0); // Or at whatever offset you like
|
||||
};
|
||||
img.src = callBackData.image_out;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
AttendanceAdapter.method('getImagesFailCallback', function(callBackData) {
|
||||
this.showMessage("Error", callBackData);
|
||||
});
|
||||
|
||||
AttendanceAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var 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>';
|
||||
var 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>';
|
||||
|
||||
var html;
|
||||
if (this.photoAttendance) {
|
||||
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
|
||||
*/
|
||||
|
||||
|
||||
function AttendanceStatusAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
AttendanceStatusAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
AttendanceStatusAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceStatusAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Clocked In Status" }
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceStatusAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceStatusAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","allow-null":false,"remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
AttendanceStatusAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
|
||||
|
||||
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;
|
||||
});
|
||||
|
||||
|
||||
AttendanceStatusAdapter.method('isSubProfileTable', function() {
|
||||
if(this.user.user_level == "Admin"){
|
||||
return false;
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
});
|
||||
@@ -1,320 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
function CompanyStructureAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
CompanyStructureAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
CompanyStructureAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"title",
|
||||
"address",
|
||||
"type",
|
||||
"country",
|
||||
"timezone",
|
||||
"parent"
|
||||
];
|
||||
});
|
||||
|
||||
CompanyStructureAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID","bVisible":false },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Address","bSortable":false},
|
||||
{ "sTitle": "Type"},
|
||||
{ "sTitle": "Country", "sClass": "center" },
|
||||
{ "sTitle": "Time Zone"},
|
||||
{ "sTitle": "Parent Structure"}
|
||||
];
|
||||
});
|
||||
|
||||
CompanyStructureAdapter.method('getFormFields', function() {
|
||||
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"]}]
|
||||
];
|
||||
});
|
||||
|
||||
CompanyStructureAdapter.method('postRenderForm', function(object, $tempDomObj) {
|
||||
if (object === undefined
|
||||
|| object === null
|
||||
|| object.id === null
|
||||
|| object.id === undefined || object.id === ''
|
||||
) {
|
||||
$tempDomObj.find('#field_heads').hide();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* Company Graph
|
||||
*/
|
||||
|
||||
|
||||
function CompanyGraphAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
this.nodeIdCounter = 0;
|
||||
}
|
||||
|
||||
CompanyGraphAdapter.inherits(CompanyStructureAdapter);
|
||||
|
||||
|
||||
CompanyGraphAdapter.method('convertToTree', function(data) {
|
||||
var ice = {};
|
||||
ice['id'] = -1;
|
||||
ice['title'] = '';
|
||||
ice['name'] = '';
|
||||
ice['children'] = [];
|
||||
|
||||
var parent = null;
|
||||
|
||||
var added = {};
|
||||
|
||||
|
||||
for(var 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(var i=0;i<data.length;i++){
|
||||
if(data[i].parent == null || data[i].parent == undefined){
|
||||
ice['children'].push(data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return ice;
|
||||
|
||||
});
|
||||
|
||||
|
||||
CompanyGraphAdapter.method('findParent', function(data, parent) {
|
||||
for(var i=0;i<data.length;i++){
|
||||
if(data[i].title == parent || data[i].title == parent){
|
||||
return data[i];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
|
||||
CompanyGraphAdapter.method('createTable', function(elementId) {
|
||||
$("#tabPageCompanyGraph").html("");
|
||||
var that = this;
|
||||
var sourceData = this.sourceData;
|
||||
|
||||
//this.fixCyclicParent(sourceData);
|
||||
var treeData = this.convertToTree(sourceData);
|
||||
|
||||
var m = [20, 120, 20, 120],
|
||||
w = 5000 - m[1] - m[3],
|
||||
h = 1000 - m[0] - m[2],
|
||||
root;
|
||||
|
||||
var tree = d3.layout.tree()
|
||||
.size([h, w]);
|
||||
|
||||
this.diagonal = d3.svg.diagonal()
|
||||
.projection(function(d) { return [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] + ")");
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
CompanyGraphAdapter.method('update', function(source, tree, root) {
|
||||
var that = this;
|
||||
var duration = d3.event && d3.event.altKey ? 5000 : 500;
|
||||
|
||||
// Compute the new tree layout.
|
||||
var nodes = tree.nodes(root).reverse();
|
||||
|
||||
// Normalize for fixed-depth.
|
||||
nodes.forEach(function(d) { d.y = d.depth * 180; });
|
||||
|
||||
// Update the nodes<65>
|
||||
var node = that.vis.selectAll("g.node")
|
||||
.data(nodes, function(d) { return d.id || (d.id = ++that.nodeIdCounter); });
|
||||
|
||||
// Enter any new nodes at the parent's previous position.
|
||||
var nodeEnter = node.enter().append("svg:g")
|
||||
.attr("class", "node")
|
||||
.attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
|
||||
.on("click", function(d) { that.toggle(d); that.update(d, tree, root); });
|
||||
|
||||
nodeEnter.append("svg:circle")
|
||||
.attr("r", 1e-6)
|
||||
.style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });
|
||||
|
||||
nodeEnter.append("svg:text")
|
||||
.attr("x", function(d) { return d.children || d._children ? -10 : 10; })
|
||||
.attr("dy", ".35em")
|
||||
.attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; })
|
||||
.text(function(d) { return d.name; })
|
||||
.style("fill-opacity", 1e-6);
|
||||
|
||||
// Transition nodes to their new position.
|
||||
var nodeUpdate = node.transition()
|
||||
.duration(duration)
|
||||
.attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; });
|
||||
|
||||
nodeUpdate.select("circle")
|
||||
.attr("r", 4.5)
|
||||
.style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });
|
||||
|
||||
nodeUpdate.select("text")
|
||||
.style("fill-opacity", 1);
|
||||
|
||||
// Transition exiting nodes to the parent's new position.
|
||||
var nodeExit = node.exit().transition()
|
||||
.duration(duration)
|
||||
.attr("transform", function(d) { return "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>
|
||||
var link = that.vis.selectAll("path.link")
|
||||
.data(tree.links(nodes), function(d) { return d.target.id; });
|
||||
|
||||
// Enter any new links at the parent's previous position.
|
||||
link.enter().insert("svg:path", "g")
|
||||
.attr("class", "link")
|
||||
.attr("d", function(d) {
|
||||
var 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", function(d) {
|
||||
var o = {x: source.x, y: source.y};
|
||||
return that.diagonal({source: o, target: o});
|
||||
})
|
||||
.remove();
|
||||
|
||||
// Stash the old positions for transition.
|
||||
nodes.forEach(function(d) {
|
||||
d.x0 = d.x;
|
||||
d.y0 = d.y;
|
||||
});
|
||||
});
|
||||
|
||||
// Toggle children.
|
||||
CompanyGraphAdapter.method('toggle', function(d) {
|
||||
if (d.children) {
|
||||
d._children = d.children;
|
||||
d.children = null;
|
||||
} else {
|
||||
d.children = d._children;
|
||||
d._children = null;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
CompanyGraphAdapter.method('getSourceDataById', function(id) {
|
||||
|
||||
for(var i=0; i< this.sourceData.length; i++){
|
||||
if(this.sourceData[i].id == id){
|
||||
return this.sourceData[i];
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
});
|
||||
|
||||
CompanyGraphAdapter.method('fixCyclicParent', function(sourceData) {
|
||||
var errorMsg = "";
|
||||
for(var i=0; i< sourceData.length; i++){
|
||||
var obj = sourceData[i];
|
||||
|
||||
|
||||
var curObj = obj;
|
||||
var parentIdArr = {};
|
||||
parentIdArr[curObj.id] = 1;
|
||||
|
||||
while(curObj.parent != null && curObj.parent != undefined){
|
||||
var 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;
|
||||
|
||||
});
|
||||
|
||||
CompanyGraphAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/companystructure/';
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
function DashboardAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
DashboardAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DashboardAdapter.method('getDataMapping', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
DashboardAdapter.method('getHeaders', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
DashboardAdapter.method('getFormFields', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
|
||||
DashboardAdapter.method('get', function(callBackData) {
|
||||
});
|
||||
|
||||
|
||||
DashboardAdapter.method('getInitData', function() {
|
||||
var that = this;
|
||||
var object = {};
|
||||
var reqJson = JSON.stringify(object);
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'getInitDataSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'getInitDataFailCallBack';
|
||||
|
||||
this.customAction('getInitData','admin=dashboard',reqJson,callBackData);
|
||||
});
|
||||
|
||||
|
||||
|
||||
DashboardAdapter.method('getInitDataSuccessCallBack', function(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");
|
||||
|
||||
});
|
||||
|
||||
DashboardAdapter.method('getInitDataFailCallBack', function(callBackData) {
|
||||
|
||||
});
|
||||
@@ -1,177 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
/**
|
||||
* DataImportAdapter
|
||||
*/
|
||||
|
||||
function DataImportAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
DataImportAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DataImportAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"dataType",
|
||||
"details"
|
||||
];
|
||||
});
|
||||
|
||||
DataImportAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Data Type" },
|
||||
{ "sTitle": "Details" }
|
||||
];
|
||||
});
|
||||
|
||||
DataImportAdapter.method('getFormFields', function() {
|
||||
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){
|
||||
var 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
|
||||
*/
|
||||
|
||||
function DataImportFileAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
DataImportFileAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DataImportFileAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"data_import_definition",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
DataImportFileAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Data Import Definition" },
|
||||
{ "sTitle": "Status" }
|
||||
];
|
||||
});
|
||||
|
||||
DataImportFileAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
DataImportFileAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var 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>';
|
||||
var 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>';
|
||||
var 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>';
|
||||
|
||||
var 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;
|
||||
});
|
||||
|
||||
|
||||
DataImportFileAdapter.method('process', function(id) {
|
||||
var that = this;
|
||||
var object = {"id":id};
|
||||
var reqJson = JSON.stringify(object);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'processSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'processFailCallBack';
|
||||
|
||||
this.customAction('processDataFile','admin=data',reqJson,callBackData);
|
||||
});
|
||||
|
||||
DataImportFileAdapter.method('processSuccessCallBack', function(callBackData) {
|
||||
this.showMessage("Success", "File imported successfully.");
|
||||
});
|
||||
|
||||
|
||||
DataImportFileAdapter.method('processFailCallBack', function(callBackData) {
|
||||
this.showMessage("Error", "File import unsuccessful. Result:"+callBackData);
|
||||
});
|
||||
2
web/admin/dist/attendance.js
vendored
Normal file
2
web/admin/dist/attendance.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/company_structure.js
vendored
Normal file
2
web/admin/dist/company_structure.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/dashboard.js
vendored
Normal file
2
web/admin/dist/dashboard.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/data.js
vendored
Normal file
2
web/admin/dist/data.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/employees.js
vendored
Normal file
2
web/admin/dist/employees.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/fieldnames.js
vendored
Normal file
2
web/admin/dist/fieldnames.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/jobs.js
vendored
Normal file
2
web/admin/dist/jobs.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/loans.js
vendored
Normal file
2
web/admin/dist/loans.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/metadata.js
vendored
Normal file
2
web/admin/dist/metadata.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/modules.js
vendored
Normal file
2
web/admin/dist/modules.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/overtime.js
vendored
Normal file
2
web/admin/dist/overtime.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/payroll.js
vendored
Normal file
2
web/admin/dist/payroll.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/permissions.js
vendored
Normal file
2
web/admin/dist/permissions.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/projects.js
vendored
Normal file
2
web/admin/dist/projects.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/qualifications.js
vendored
Normal file
2
web/admin/dist/qualifications.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/reports.js
vendored
Normal file
2
web/admin/dist/reports.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/salary.js
vendored
Normal file
2
web/admin/dist/salary.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/settings.js
vendored
Normal file
2
web/admin/dist/settings.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/travel.js
vendored
Normal file
2
web/admin/dist/travel.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
web/admin/dist/users.js
vendored
Normal file
2
web/admin/dist/users.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -1,49 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* FieldNameAdapter
|
||||
*/
|
||||
|
||||
function FieldNameAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
FieldNameAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
FieldNameAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"textOrig",
|
||||
"textMapped",
|
||||
"display"
|
||||
];
|
||||
});
|
||||
|
||||
FieldNameAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Original Text"},
|
||||
{ "sTitle": "Mapped Text"},
|
||||
{ "sTitle": "Display Status"}
|
||||
];
|
||||
});
|
||||
|
||||
FieldNameAdapter.method('getFormFields', function() {
|
||||
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"]]}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* JobTitleAdapter
|
||||
*/
|
||||
|
||||
function JobTitleAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
JobTitleAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
JobTitleAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"code",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
JobTitleAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Code" },
|
||||
{ "sTitle": "Name" }
|
||||
];
|
||||
});
|
||||
|
||||
JobTitleAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
JobTitleAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/jobdetails/';
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* PayGradeAdapter
|
||||
*/
|
||||
|
||||
function PayGradeAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
PayGradeAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
PayGradeAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"currency",
|
||||
"min_salary",
|
||||
"max_salary"
|
||||
];
|
||||
});
|
||||
|
||||
PayGradeAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Currency"},
|
||||
{ "sTitle": "Min Salary" },
|
||||
{ "sTitle": "Max Salary"}
|
||||
];
|
||||
});
|
||||
|
||||
PayGradeAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
PayGradeAdapter.method('doCustomValidation', function(params) {
|
||||
try{
|
||||
if(parseFloat(params.min_salary)>parseFloat(params.max_salary)){
|
||||
return "Min Salary should be smaller than Max Salary";
|
||||
}
|
||||
}catch(e){
|
||||
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* EmploymentStatusAdapter
|
||||
*/
|
||||
|
||||
function EmploymentStatusAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmploymentStatusAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmploymentStatusAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
EmploymentStatusAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Description"}
|
||||
];
|
||||
});
|
||||
|
||||
EmploymentStatusAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Employment Status","type":"text"}],
|
||||
[ "description", {"label":"Description","type":"textarea","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* CompanyLoanAdapter
|
||||
*/
|
||||
|
||||
function CompanyLoanAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
CompanyLoanAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
CompanyLoanAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"details"
|
||||
];
|
||||
});
|
||||
|
||||
CompanyLoanAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details"}
|
||||
];
|
||||
});
|
||||
|
||||
CompanyLoanAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "details", {"label":"Details","type":"textarea","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
/*
|
||||
* EmployeeCompanyLoanAdapter
|
||||
*/
|
||||
|
||||
function EmployeeCompanyLoanAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeCompanyLoanAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeCompanyLoanAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"loan",
|
||||
"start_date",
|
||||
"period_months",
|
||||
"currency",
|
||||
"amount",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeCompanyLoanAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Loan Type" },
|
||||
{ "sTitle": "Loan Start Date"},
|
||||
{ "sTitle": "Loan Period (Months)"},
|
||||
{ "sTitle": "Currency"},
|
||||
{ "sTitle": "Amount"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeCompanyLoanAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeCompanyLoanAdapter.method('getFilters', function() {
|
||||
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"]}],
|
||||
|
||||
];
|
||||
});
|
||||
@@ -1,158 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* CountryAdapter
|
||||
*/
|
||||
|
||||
function CountryAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
CountryAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
CountryAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"code",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
CountryAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Code" },
|
||||
{ "sTitle": "Name"}
|
||||
];
|
||||
});
|
||||
|
||||
CountryAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "code", {"label":"Code","type":"text","validation":""}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* ProvinceAdapter
|
||||
*/
|
||||
|
||||
function ProvinceAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
ProvinceAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ProvinceAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"code",
|
||||
"name",
|
||||
"country"
|
||||
];
|
||||
});
|
||||
|
||||
ProvinceAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Code" },
|
||||
{ "sTitle": "Name"},
|
||||
{ "sTitle": "Country"},
|
||||
];
|
||||
});
|
||||
|
||||
ProvinceAdapter.method('getFormFields', function() {
|
||||
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"]}]
|
||||
];
|
||||
});
|
||||
|
||||
ProvinceAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "country", {"label":"Country","type":"select2","remote-source":["Country","code","name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* CurrencyTypeAdapter
|
||||
*/
|
||||
|
||||
function CurrencyTypeAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
CurrencyTypeAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
CurrencyTypeAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"code",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
CurrencyTypeAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Code" },
|
||||
{ "sTitle": "Name"}
|
||||
];
|
||||
});
|
||||
|
||||
CurrencyTypeAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "code", {"label":"Code","type":"text","validation":""}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
/**
|
||||
* NationalityAdapter
|
||||
*/
|
||||
|
||||
function NationalityAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
NationalityAdapter.inherits(IdNameAdapter);
|
||||
|
||||
/**
|
||||
* ImmigrationStatusAdapter
|
||||
*/
|
||||
|
||||
function ImmigrationStatusAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
ImmigrationStatusAdapter.inherits(IdNameAdapter);
|
||||
|
||||
|
||||
/**
|
||||
* EthnicityAdapter
|
||||
*/
|
||||
|
||||
function EthnicityAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EthnicityAdapter.inherits(IdNameAdapter);
|
||||
|
||||
|
||||
|
||||
@@ -1,164 +0,0 @@
|
||||
/*
|
||||
This file is part of iCE Hrm.
|
||||
|
||||
iCE Hrm is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
iCE Hrm is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
------------------------------------------------------------------
|
||||
|
||||
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
|
||||
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* ModuleAdapter
|
||||
*/
|
||||
|
||||
function ModuleAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
ModuleAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ModuleAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"label",
|
||||
"menu",
|
||||
"mod_group",
|
||||
"mod_order",
|
||||
"status",
|
||||
"version",
|
||||
"update_path"
|
||||
];
|
||||
});
|
||||
|
||||
ModuleAdapter.method('getHeaders', function() {
|
||||
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}
|
||||
];
|
||||
});
|
||||
|
||||
ModuleAdapter.method('getFormFields', function() {
|
||||
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"]}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
ModuleAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
|
||||
|
||||
var 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 "";
|
||||
}
|
||||
var 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;
|
||||
});
|
||||
|
||||
|
||||
|
||||
function UsageAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
UsageAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
UsageAdapter.method('getDataMapping', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
UsageAdapter.method('getHeaders', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
UsageAdapter.method('getFormFields', function() {
|
||||
return [];
|
||||
});
|
||||
|
||||
|
||||
UsageAdapter.method('get', function(callBackData) {
|
||||
});
|
||||
|
||||
|
||||
UsageAdapter.method('saveUsage', function() {
|
||||
var that = this;
|
||||
var object = {};
|
||||
var 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(",");
|
||||
|
||||
var reqJson = JSON.stringify(object);
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'getInitDataSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'getInitDataFailCallBack';
|
||||
|
||||
this.customAction('saveUsage','admin=modules',reqJson,callBackData);
|
||||
});
|
||||
|
||||
|
||||
|
||||
UsageAdapter.method('saveUsageSuccessCallBack', function(data) {
|
||||
|
||||
|
||||
});
|
||||
|
||||
UsageAdapter.method('saveUsageFailCallBack', function(callBackData) {
|
||||
|
||||
});
|
||||
@@ -1,99 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* OvertimeCategoryAdapter
|
||||
*/
|
||||
|
||||
function OvertimeCategoryAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
OvertimeCategoryAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
OvertimeCategoryAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
OvertimeCategoryAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" }
|
||||
];
|
||||
});
|
||||
|
||||
OvertimeCategoryAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeOvertimeAdminAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeOvertimeAdminAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.itemName = 'OvertimeRequest';
|
||||
this.itemNameLower = 'overtimerequest';
|
||||
this.modulePathName = 'overtime';
|
||||
}
|
||||
|
||||
EmployeeOvertimeAdminAdapter.inherits(ApproveAdminAdapter);
|
||||
|
||||
|
||||
|
||||
EmployeeOvertimeAdminAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"category",
|
||||
"start_time",
|
||||
"end_time",
|
||||
"project",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeOvertimeAdminAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Category" },
|
||||
{ "sTitle": "Start Time" },
|
||||
{ "sTitle": "End Time"},
|
||||
{ "sTitle": "Project"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeOvertimeAdminAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
@@ -1,657 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* PaydayAdapter
|
||||
*/
|
||||
|
||||
function PaydayAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
PaydayAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
PaydayAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
PaydayAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Select Pay Frequency"}
|
||||
];
|
||||
});
|
||||
|
||||
PaydayAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "name", {"label":"Name","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
/*
|
||||
PaydayAdapter.method('showActionButtons' , function() {
|
||||
return false;
|
||||
});
|
||||
*/
|
||||
|
||||
PaydayAdapter.method('getAddNewLabel', function() {
|
||||
return "Run Payroll";
|
||||
});
|
||||
|
||||
PaydayAdapter.method('createTable', function(elementId) {
|
||||
$("#payday_all").off();
|
||||
this.uber('createTable',elementId);
|
||||
$("#payday_all").off().on('click',function(){
|
||||
if($(this).is(':checked')){
|
||||
$('.paydayCheck').prop('checked', true);
|
||||
}else{
|
||||
$('.paydayCheck').prop('checked', false);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
PaydayAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<input type="checkbox" class="paydayCheck" id="payday__id_" name="payday__id_" value="checkbox_payday__id_"/>';
|
||||
|
||||
var 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;
|
||||
});
|
||||
|
||||
PaydayAdapter.method('getActionButtonHeader', function() {
|
||||
return { "sTitle": '<input type="checkbox" id="payday_all" name="payday_all" value="checkbox_payday_all"/>', "sClass": "center" };
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* PayrollAdapter
|
||||
*/
|
||||
|
||||
function PayrollAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
PayrollAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
PayrollAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"pay_period",
|
||||
"department",
|
||||
"date_start",
|
||||
"date_end",
|
||||
"status"
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
PayrollAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID","bVisible":false },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Pay Frequency"},
|
||||
{ "sTitle": "Department"},
|
||||
{ "sTitle": "Date Start"},
|
||||
{ "sTitle": "Date End"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
PayrollAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
PayrollAdapter.method('postRenderForm', function(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');
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
PayrollAdapter.method('process', function(id, status) {
|
||||
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([]);
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
PayrollAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
|
||||
var 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>';
|
||||
var 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>';
|
||||
var 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>';
|
||||
|
||||
var 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[6] != "Completed"){
|
||||
html = html.replace('_process_',processButton);
|
||||
}else{
|
||||
html = html.replace('_process_','');
|
||||
}
|
||||
*/
|
||||
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;
|
||||
});
|
||||
|
||||
PayrollAdapter.method('get', function(callBackData) {
|
||||
$("#PayrollData").hide();
|
||||
$("#PayrollForm").hide();
|
||||
$("#PayrollDataButtons").hide();
|
||||
$("#Payroll").show();
|
||||
modJsList['tabPayrollData'].setCurrentPayroll(null);
|
||||
this.uber('get',callBackData);
|
||||
});
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* PayrollDataAdapter
|
||||
*/
|
||||
|
||||
function PayrollDataAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
this.cellDataUpdates = {};
|
||||
this.payrollId = null;
|
||||
}
|
||||
|
||||
PayrollDataAdapter.inherits(TableEditAdapter);
|
||||
|
||||
PayrollDataAdapter.method('validateCellValue', function(element, evt, newValue) {
|
||||
modJs.addCellDataUpdate(element.data('colId'),element.data('rowId'),newValue);
|
||||
return true;
|
||||
});
|
||||
|
||||
PayrollDataAdapter.method('setCurrentPayroll', function(val) {
|
||||
this.payrollId = val;
|
||||
});
|
||||
|
||||
|
||||
PayrollDataAdapter.method('addAdditionalRequestData' , function(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;
|
||||
});
|
||||
|
||||
PayrollDataAdapter.method('modifyCSVHeader', function(header) {
|
||||
header.unshift("");
|
||||
return header;
|
||||
});
|
||||
|
||||
PayrollDataAdapter.method('getCSVData' , function() {
|
||||
var csv = "";
|
||||
|
||||
for(var i=0;i<this.csvData.length;i++){
|
||||
csv += this.csvData[i].join(",");
|
||||
if(i < this.csvData.length -1){
|
||||
csv += "\r\n";
|
||||
}
|
||||
}
|
||||
|
||||
return csv;
|
||||
});
|
||||
|
||||
PayrollDataAdapter.method('downloadPayroll' , function() {
|
||||
var 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
|
||||
*/
|
||||
|
||||
function PayrollColumnAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
PayrollColumnAdapter.inherits(AdapterBase);
|
||||
|
||||
PayrollColumnAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"colorder",
|
||||
"calculation_hook",
|
||||
"deduction_group",
|
||||
"editable",
|
||||
"enabled"
|
||||
];
|
||||
});
|
||||
|
||||
PayrollColumnAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name"},
|
||||
{ "sTitle": "Column Order"},
|
||||
{ "sTitle": "Calculation Method"},
|
||||
{ "sTitle": "Calculation Group"},
|
||||
{ "sTitle": "Editable"},
|
||||
{ "sTitle": "Enabled"}
|
||||
];
|
||||
});
|
||||
|
||||
PayrollColumnAdapter.method('getFormFields', function() {
|
||||
|
||||
var 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":function(item){
|
||||
var 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"}]
|
||||
];
|
||||
});
|
||||
|
||||
PayrollColumnAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "deduction_group", {"label":"Calculation Group","type":"select2","allow-null":true,"null-label":"Any","remote-source":["DeductionGroup","id","name"]}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* PayrollColumnTemplateAdapter
|
||||
*/
|
||||
|
||||
function PayrollColumnTemplateAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
PayrollColumnTemplateAdapter.inherits(AdapterBase);
|
||||
|
||||
PayrollColumnTemplateAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
PayrollColumnTemplateAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":true},
|
||||
{ "sTitle": "Name"}
|
||||
];
|
||||
});
|
||||
|
||||
PayrollColumnTemplateAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "columns", {"label":"Payroll Columns","type":"select2multi","remote-source":["PayrollColumn","id","name"]}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* PayrollEmployeeAdapter
|
||||
*/
|
||||
|
||||
function PayrollEmployeeAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
PayrollEmployeeAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
PayrollEmployeeAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"pay_frequency",
|
||||
"deduction_group",
|
||||
"currency"
|
||||
];
|
||||
});
|
||||
|
||||
PayrollEmployeeAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Pay Frequency"},
|
||||
{ "sTitle": "Calculation Group"},
|
||||
{ "sTitle": "Currency"},
|
||||
];
|
||||
});
|
||||
|
||||
PayrollEmployeeAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
PayrollEmployeeAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* DeductionAdapter
|
||||
*/
|
||||
|
||||
function DeductionAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
DeductionAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DeductionAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"deduction_group"
|
||||
];
|
||||
});
|
||||
|
||||
DeductionAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Calculation Group"}
|
||||
];
|
||||
});
|
||||
|
||||
DeductionAdapter.method('getFormFields', function() {
|
||||
|
||||
var 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){
|
||||
var 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":function(item){
|
||||
var output = "";
|
||||
var getSymbol = function(text){
|
||||
var 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";
|
||||
}else{
|
||||
return "If salary component "+output+ " deduction is "+item.amount;
|
||||
}
|
||||
|
||||
|
||||
return output;
|
||||
|
||||
}
|
||||
|
||||
}];
|
||||
|
||||
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
|
||||
*/
|
||||
|
||||
function DeductionGroupAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
DeductionGroupAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
DeductionGroupAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
DeductionGroupAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details" }
|
||||
];
|
||||
});
|
||||
|
||||
DeductionGroupAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}],
|
||||
[ "description", {"label":"Details","type":"textarea","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* PayslipTemplateAdapter
|
||||
*/
|
||||
|
||||
function PayslipTemplateAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
PayslipTemplateAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
PayslipTemplateAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
PayslipTemplateAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" }
|
||||
];
|
||||
});
|
||||
|
||||
PayslipTemplateAdapter.method('getFormFields', function() {
|
||||
|
||||
var 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){
|
||||
var 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
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* PermissionAdapter
|
||||
*/
|
||||
|
||||
function PermissionAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
PermissionAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
PermissionAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"user_level",
|
||||
"module_id",
|
||||
"permission",
|
||||
"value"
|
||||
];
|
||||
});
|
||||
|
||||
PermissionAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "User Level" },
|
||||
{ "sTitle": "Module"},
|
||||
{ "sTitle": "Permission"},
|
||||
{ "sTitle": "Value"}
|
||||
];
|
||||
});
|
||||
|
||||
PermissionAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
PermissionAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "module_id", {"label":"Module","type":"select2","allow-null":true,"null-label":"All Modules","remote-source":["Module","id","menu+name"]}]
|
||||
];
|
||||
});
|
||||
|
||||
PermissionAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var 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;
|
||||
});
|
||||
|
||||
|
||||
PermissionAdapter.method('getMetaFieldForRendering', function(fieldName) {
|
||||
if(fieldName == "value"){
|
||||
return "meta";
|
||||
}
|
||||
return "";
|
||||
});
|
||||
|
||||
|
||||
PermissionAdapter.method('fillForm', function(object) {
|
||||
this.uber('fillForm',object);
|
||||
$("#helptext").html(object.description);
|
||||
});
|
||||
@@ -1,172 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
/**
|
||||
* ClientAdapter
|
||||
*/
|
||||
|
||||
function ClientAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
ClientAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ClientAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"details",
|
||||
"address",
|
||||
"contact_number"
|
||||
];
|
||||
});
|
||||
|
||||
ClientAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID","bVisible":false },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details"},
|
||||
{ "sTitle": "Address"},
|
||||
{ "sTitle": "Contact Number"}
|
||||
];
|
||||
});
|
||||
|
||||
ClientAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
}else{
|
||||
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"}]
|
||||
];
|
||||
}
|
||||
});
|
||||
|
||||
ClientAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
});
|
||||
|
||||
/**
|
||||
* ProjectAdapter
|
||||
*/
|
||||
|
||||
function ProjectAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
ProjectAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ProjectAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"client"
|
||||
];
|
||||
});
|
||||
|
||||
ProjectAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID","bVisible":false },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Client"},
|
||||
];
|
||||
});
|
||||
|
||||
ProjectAdapter.method('getFormFields', function() {
|
||||
|
||||
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"]]}]
|
||||
];
|
||||
}else{
|
||||
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"]]}]
|
||||
];
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
ProjectAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
* EmployeeProjectAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeProjectAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeProjectAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeProjectAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"project"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeProjectAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Project" }
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeProjectAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeProjectAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeProjectAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/projects/';
|
||||
});
|
||||
|
||||
@@ -1,161 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* SkillAdapter
|
||||
*/
|
||||
|
||||
function SkillAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
SkillAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
SkillAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
SkillAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID","bVisible":false },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Description"}
|
||||
];
|
||||
});
|
||||
|
||||
SkillAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text"}],
|
||||
[ "description", {"label":"Description","type":"textarea","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
SkillAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/qualifications/';
|
||||
});
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* EducationAdapter
|
||||
*/
|
||||
|
||||
function EducationAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EducationAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EducationAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
EducationAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID","bVisible":false },
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Description"}
|
||||
];
|
||||
});
|
||||
|
||||
EducationAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text"}],
|
||||
[ "description", {"label":"Description","type":"textarea","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* CertificationAdapter
|
||||
*/
|
||||
|
||||
function CertificationAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
CertificationAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
CertificationAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
CertificationAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Description"}
|
||||
];
|
||||
});
|
||||
|
||||
CertificationAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text"}],
|
||||
[ "description", {"label":"Description","type":"textarea","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* LanguageAdapter
|
||||
*/
|
||||
|
||||
function LanguageAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
LanguageAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
LanguageAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
LanguageAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Description"}
|
||||
];
|
||||
});
|
||||
|
||||
LanguageAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text"}],
|
||||
[ "description", {"label":"Description","type":"textarea","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
@@ -1,396 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* ReportAdapter
|
||||
*/
|
||||
|
||||
|
||||
function ReportAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this._construct();
|
||||
}
|
||||
|
||||
ReportAdapter.inherits(AdapterBase);
|
||||
|
||||
ReportAdapter.method('_construct', function() {
|
||||
this._formFileds = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"label","validation":""}],
|
||||
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
|
||||
];
|
||||
this.remoteFieldsExists = false;
|
||||
});
|
||||
|
||||
ReportAdapter.method('_initLocalFormFields', function() {
|
||||
this._formFileds = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"label","validation":""}],
|
||||
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
ReportAdapter.method('setRemoteFieldExists', function(val) {
|
||||
this.remoteFieldsExists = val;
|
||||
});
|
||||
|
||||
ReportAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"icon",
|
||||
"name",
|
||||
"details",
|
||||
"parameters"
|
||||
];
|
||||
});
|
||||
|
||||
ReportAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "","bSortable":false,"sWidth":"22px"},
|
||||
{ "sTitle": "Name","sWidth":"30%"},
|
||||
{ "sTitle": "Details"},
|
||||
{ "sTitle": "Parameters","bVisible":false},
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('getFormFields', function() {
|
||||
return this._formFileds;
|
||||
});
|
||||
|
||||
ReportAdapter.method('processFormFieldsWithObject', function(object) {
|
||||
var that = this;
|
||||
this._initLocalFormFields();
|
||||
var len = this._formFileds.length;
|
||||
var fieldIDsToDelete = [];
|
||||
var fieldsToDelete = [];
|
||||
this.remoteFieldsExists = false;
|
||||
for(var i=0;i<len;i++){
|
||||
if(this._formFileds[i][1]['type']=="fieldset"){
|
||||
var newFields = JSON.parse(object[this._formFileds[i][0]]);
|
||||
fieldsToDelete.push(this._formFileds[i][0]);
|
||||
newFields.forEach(function(entry) {
|
||||
that._formFileds.push(entry);
|
||||
if(entry[1]['remote-source'] != undefined && entry[1]['remote-source'] != null){
|
||||
that.remoteFieldsExists = true;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
var tempArray = [];
|
||||
that._formFileds.forEach(function(entry) {
|
||||
if(jQuery.inArray(entry[0], fieldsToDelete) < 0){
|
||||
tempArray.push(entry);
|
||||
}
|
||||
});
|
||||
|
||||
that._formFileds = tempArray;
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('renderForm', function(object) {
|
||||
var that = this;
|
||||
this.processFormFieldsWithObject(object);
|
||||
if(this.remoteFieldsExists){
|
||||
var cb = function(){
|
||||
that.renderFormNew(object);
|
||||
};
|
||||
this.initFieldMasterData(cb);
|
||||
}else{
|
||||
this.initFieldMasterData();
|
||||
that.renderFormNew(object);
|
||||
}
|
||||
|
||||
this.currentReport = object;
|
||||
|
||||
});
|
||||
|
||||
ReportAdapter.method('renderFormNew', function(object) {
|
||||
|
||||
var that = this;
|
||||
var signatureIds = [];
|
||||
if(object == null || object == undefined){
|
||||
this.currentId = null;
|
||||
}
|
||||
|
||||
this.preRenderForm(object);
|
||||
|
||||
var formHtml = this.templates['formTemplate'];
|
||||
var html = "";
|
||||
var fields = this.getFormFields();
|
||||
|
||||
for(var i=0;i<fields.length;i++){
|
||||
var metaField = this.getMetaFieldForRendering(fields[i][0]);
|
||||
if(metaField == "" || metaField == undefined){
|
||||
html += this.renderFormField(fields[i]);
|
||||
}else{
|
||||
var 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);
|
||||
|
||||
|
||||
var $tempDomObj;
|
||||
var 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){
|
||||
var parentRow = $(this).parents(".row");
|
||||
var height = parentRow.find(".select2-choices").height();
|
||||
parentRow.height(parseInt(height));
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
$tempDomObj.find('.signatureField').each(function() {
|
||||
//$(this).data('signaturePad',new SignaturePad($(this)));
|
||||
signatureIds.push($(this).attr('id'));
|
||||
});
|
||||
|
||||
for(var 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(var 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(var 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);
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
ReportAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var 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;
|
||||
});
|
||||
|
||||
ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
|
||||
var fileName = serverData[0];
|
||||
var 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;
|
||||
}
|
||||
|
||||
|
||||
var 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
|
||||
var headers = [];
|
||||
for(title in serverData[1]){
|
||||
headers.push({ "sTitle": serverData[1][title]});
|
||||
}
|
||||
|
||||
var data = serverData[2];
|
||||
|
||||
|
||||
var 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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
ReportAdapter.method('fillForm', function(object) {
|
||||
var fields = this.getFormFields();
|
||||
for(var 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]]);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
function ReportGenAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
ReportGenAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ReportGenAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
];
|
||||
});
|
||||
|
||||
ReportGenAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" }
|
||||
];
|
||||
});
|
||||
|
||||
ReportGenAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
ReportGenAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var 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;
|
||||
});
|
||||
@@ -1,134 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
/**
|
||||
* SalaryComponentTypeAdapter
|
||||
*/
|
||||
|
||||
function SalaryComponentTypeAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
SalaryComponentTypeAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
SalaryComponentTypeAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"code",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
SalaryComponentTypeAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Code" },
|
||||
{ "sTitle": "Name"}
|
||||
];
|
||||
});
|
||||
|
||||
SalaryComponentTypeAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "code", {"label":"Code","type":"text","validation":""}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* SalaryComponentAdapter
|
||||
*/
|
||||
|
||||
function SalaryComponentAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
SalaryComponentAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
SalaryComponentAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"componentType",
|
||||
"details"
|
||||
];
|
||||
});
|
||||
|
||||
SalaryComponentAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Salary Component Type" },
|
||||
{ "sTitle": "Details"}
|
||||
];
|
||||
});
|
||||
|
||||
SalaryComponentAdapter.method('getFormFields', function() {
|
||||
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
|
||||
*/
|
||||
|
||||
function EmployeeSalaryAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
EmployeeSalaryAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeSalaryAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"component",
|
||||
"amount",
|
||||
"details"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeSalaryAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Salary Component" },
|
||||
{ "sTitle": "Amount"},
|
||||
{ "sTitle": "Details"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeSalaryAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeSalaryAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* SettingAdapter
|
||||
*/
|
||||
|
||||
function SettingAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
SettingAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
SettingAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"value",
|
||||
"description"
|
||||
];
|
||||
});
|
||||
|
||||
SettingAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Value"},
|
||||
{ "sTitle": "Details"}
|
||||
];
|
||||
});
|
||||
|
||||
SettingAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "value", {"label":"Value","type":"text","validation":"none"}]
|
||||
];
|
||||
});
|
||||
|
||||
SettingAdapter.method('getActionButtonsHtml', function(id,data) {
|
||||
var 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;
|
||||
});
|
||||
|
||||
|
||||
SettingAdapter.method('getMetaFieldForRendering', function(fieldName) {
|
||||
if(fieldName == "value"){
|
||||
return "meta";
|
||||
}
|
||||
return "";
|
||||
});
|
||||
|
||||
SettingAdapter.method('edit', function(id) {
|
||||
this.loadRemoteDataForSettings();
|
||||
this.uber('edit',id);
|
||||
});
|
||||
|
||||
|
||||
SettingAdapter.method('fillForm', function(object) {
|
||||
|
||||
var metaField = this.getMetaFieldForRendering('value');
|
||||
var metaVal = object[metaField];
|
||||
var formFields = null;
|
||||
|
||||
if(metaVal != "" && metaVal != undefined){
|
||||
var formFields = [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
JSON.parse(metaVal)
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
this.uber('fillForm',object, null, formFields);
|
||||
$("#helptext").html(object.description);
|
||||
});
|
||||
|
||||
|
||||
SettingAdapter.method('loadRemoteDataForSettings', function () {
|
||||
var fields = [];
|
||||
var field = null;
|
||||
fields.push(["country", {"label": "Country", "type": "select2multi", "remote-source": ["Country", "id", "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(index in fields){
|
||||
field = fields[index];
|
||||
if (field[1]['remote-source'] != undefined && field[1]['remote-source'] != null) {
|
||||
var 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'];
|
||||
|
||||
var callBackData = {};
|
||||
callBackData['callBack'] = 'initFieldMasterDataResponse';
|
||||
callBackData['callBackData'] = [key];
|
||||
|
||||
this.getFieldValues(field[1]['remote-source'], callBackData);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
SettingAdapter.method('getHelpLink', function () {
|
||||
return 'http://blog.icehrm.com/docs/settings/';
|
||||
});
|
||||
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,
|
||||
};
|
||||
@@ -1,195 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* ImmigrationDocumentAdapter
|
||||
*/
|
||||
|
||||
function ImmigrationDocumentAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
ImmigrationDocumentAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
ImmigrationDocumentAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name",
|
||||
"details",
|
||||
"required",
|
||||
"alert_on_missing",
|
||||
"alert_before_expiry"
|
||||
];
|
||||
});
|
||||
|
||||
ImmigrationDocumentAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name" },
|
||||
{ "sTitle": "Details"},
|
||||
{ "sTitle": "Compulsory"},
|
||||
{ "sTitle": "Alert If Not Found"},
|
||||
{ "sTitle": "Alert Before Expiry"}
|
||||
];
|
||||
});
|
||||
|
||||
ImmigrationDocumentAdapter.method('getFormFields', function() {
|
||||
var 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(var i=0;i<this.customFields.length;i++){
|
||||
fields.push(this.customFields[i]);
|
||||
}
|
||||
|
||||
return fields;
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeImmigrationAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeImmigrationAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
EmployeeImmigrationAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
EmployeeImmigrationAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"document",
|
||||
"documentname",
|
||||
"valid_until",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeImmigrationAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Document" },
|
||||
{ "sTitle": "Document Id" },
|
||||
{ "sTitle": "Valid Until"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeImmigrationAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
EmployeeImmigrationAdapter.method('getFilters', function() {
|
||||
return [
|
||||
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
|
||||
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* EmployeeTravelRecordAdminAdapter
|
||||
*/
|
||||
|
||||
|
||||
function EmployeeTravelRecordAdminAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
this.itemName = 'TravelRequest';
|
||||
this.itemNameLower = 'travelrequest';
|
||||
this.modulePathName = 'travel';
|
||||
}
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.inherits(ApproveAdminAdapter);
|
||||
|
||||
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"employee",
|
||||
"type",
|
||||
"purpose",
|
||||
"travel_from",
|
||||
"travel_to",
|
||||
"travel_date",
|
||||
"status"
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Employee" },
|
||||
{ "sTitle": "Travel Type" },
|
||||
{ "sTitle": "Purpose" },
|
||||
{ "sTitle": "From"},
|
||||
{ "sTitle": "To"},
|
||||
{ "sTitle": "Travel Date"},
|
||||
{ "sTitle": "Status"}
|
||||
];
|
||||
});
|
||||
|
||||
EmployeeTravelRecordAdminAdapter.method('getFormFields', function() {
|
||||
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"}]
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -1,201 +0,0 @@
|
||||
/**
|
||||
* Author: Thilina Hasantha
|
||||
*/
|
||||
|
||||
function UserAdapter(endPoint) {
|
||||
this.initAdapter(endPoint);
|
||||
}
|
||||
|
||||
UserAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
UserAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"username",
|
||||
"email",
|
||||
"employee",
|
||||
"user_level"
|
||||
];
|
||||
});
|
||||
|
||||
UserAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" },
|
||||
{ "sTitle": "User Name" },
|
||||
{ "sTitle": "Authentication Email" },
|
||||
{ "sTitle": "Employee"},
|
||||
{ "sTitle": "User Level"}
|
||||
];
|
||||
});
|
||||
|
||||
UserAdapter.method('getFormFields', function() {
|
||||
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"]}]
|
||||
];
|
||||
});
|
||||
|
||||
UserAdapter.method('postRenderForm', function(object, $tempDomObj) {
|
||||
if(object == null || object == undefined){
|
||||
$tempDomObj.find("#changePasswordBtn").remove();
|
||||
}
|
||||
});
|
||||
|
||||
UserAdapter.method('changePassword', function() {
|
||||
$('#adminUsersModel').modal('show');
|
||||
$('#adminUsersChangePwd #newpwd').val('');
|
||||
$('#adminUsersChangePwd #conpwd').val('');
|
||||
});
|
||||
|
||||
UserAdapter.method('saveUserSuccessCallBack', function(callBackData,serverData) {
|
||||
var 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([]);
|
||||
});
|
||||
|
||||
UserAdapter.method('saveUserFailCallBack', function(callBackData,serverData) {
|
||||
this.showMessage("Error",callBackData);
|
||||
});
|
||||
|
||||
UserAdapter.method('doCustomValidation', function(params) {
|
||||
var 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;
|
||||
});
|
||||
|
||||
UserAdapter.method('save', function() {
|
||||
var validator = new FormValidation(this.getTableName()+"_submit",true,{'ShowPopup':false,"LabelErrorClass":"error"});
|
||||
if(validator.checkValues()){
|
||||
var params = validator.getFormParameters();
|
||||
|
||||
var msg = this.doCustomValidation(params);
|
||||
if(msg == null){
|
||||
var 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{
|
||||
var reqJson = JSON.stringify(params);
|
||||
|
||||
var 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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
UserAdapter.method('changePasswordConfirm', function() {
|
||||
$('#adminUsersChangePwd_error').hide();
|
||||
|
||||
var passwordValidation = function (str) {
|
||||
return str.length > 7;
|
||||
};
|
||||
|
||||
var password = $('#adminUsersChangePwd #newpwd').val();
|
||||
|
||||
if(!passwordValidation(password)){
|
||||
$('#adminUsersChangePwd_error').html("Password should be longer than 7 characters");
|
||||
$('#adminUsersChangePwd_error').show();
|
||||
return;
|
||||
}
|
||||
|
||||
var conPassword = $('#adminUsersChangePwd #conpwd').val();
|
||||
|
||||
if(conPassword != password){
|
||||
$('#adminUsersChangePwd_error').html("Passwords don't match");
|
||||
$('#adminUsersChangePwd_error').show();
|
||||
return;
|
||||
}
|
||||
|
||||
var req = {"id":this.currentId,"pwd":conPassword};
|
||||
var reqJson = JSON.stringify(req);
|
||||
|
||||
var callBackData = [];
|
||||
callBackData['callBackData'] = [];
|
||||
callBackData['callBackSuccess'] = 'changePasswordSuccessCallBack';
|
||||
callBackData['callBackFail'] = 'changePasswordFailCallBack';
|
||||
|
||||
this.customAction('changePassword','admin=users',reqJson,callBackData);
|
||||
|
||||
});
|
||||
|
||||
UserAdapter.method('closeChangePassword', function() {
|
||||
$('#adminUsersModel').modal('hide');
|
||||
});
|
||||
|
||||
UserAdapter.method('changePasswordSuccessCallBack', function(callBackData,serverData) {
|
||||
this.closeChangePassword();
|
||||
this.showMessage("Password Change","Password changed successfully");
|
||||
});
|
||||
|
||||
UserAdapter.method('changePasswordFailCallBack', function(callBackData,serverData) {
|
||||
this.closeChangePassword();
|
||||
this.showMessage("Error",callBackData);
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* UserRoleAdapter
|
||||
*/
|
||||
|
||||
function UserRoleAdapter(endPoint,tab,filter,orderBy) {
|
||||
this.initAdapter(endPoint,tab,filter,orderBy);
|
||||
}
|
||||
|
||||
UserRoleAdapter.inherits(AdapterBase);
|
||||
|
||||
|
||||
|
||||
UserRoleAdapter.method('getDataMapping', function() {
|
||||
return [
|
||||
"id",
|
||||
"name"
|
||||
];
|
||||
});
|
||||
|
||||
UserRoleAdapter.method('getHeaders', function() {
|
||||
return [
|
||||
{ "sTitle": "ID" ,"bVisible":false},
|
||||
{ "sTitle": "Name"}
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
UserRoleAdapter.method('postRenderForm', function(object, $tempDomObj) {
|
||||
$tempDomObj.find("#changePasswordBtn").remove();
|
||||
});
|
||||
|
||||
UserRoleAdapter.method('getFormFields', function() {
|
||||
return [
|
||||
[ "id", {"label":"ID","type":"hidden"}],
|
||||
[ "name", {"label":"Name","type":"text","validation":""}]
|
||||
];
|
||||
});
|
||||
Reference in New Issue
Block a user