711 lines
22 KiB
JavaScript
711 lines
22 KiB
JavaScript
/*
|
||
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 EmployeeAdapter(endPoint) {
|
||
this.initAdapter(endPoint);
|
||
this.fieldNameMap = {};
|
||
this.hiddenFields = {};
|
||
this.tableFields = {};
|
||
this.formOnlyFields = {};
|
||
this.customFields = [];
|
||
}
|
||
|
||
EmployeeAdapter.inherits(AdapterBase);
|
||
|
||
this.currentUserId = null;
|
||
|
||
EmployeeAdapter.method('setFieldNameMap', function(fields) {
|
||
var field;
|
||
for(var i=0;i<fields.length;i++){
|
||
field = fields[i];
|
||
this.fieldNameMap[field.name] = field;
|
||
if(field.display == "Hidden"){
|
||
this.hiddenFields[field.name] = field;
|
||
}else{
|
||
if(field.display == "Table and Form"){
|
||
this.tableFields[field.name] = field;
|
||
}else{
|
||
this.formOnlyFields[field.name] = field;
|
||
}
|
||
|
||
}
|
||
}
|
||
});
|
||
|
||
EmployeeAdapter.method('setCustomFields', function(fields) {
|
||
var field, parsed;
|
||
for(var i=0;i<fields.length;i++){
|
||
field = fields[i];
|
||
if(field.display != "Hidden" && field.data != "" && field.data != undefined){
|
||
try{
|
||
parsed = JSON.parse(field.data);
|
||
if(parsed == undefined || parsed == null){
|
||
continue;
|
||
}else if(parsed.length != 2){
|
||
continue;
|
||
}else if(parsed[1].type == undefined || parsed[1].type == null){
|
||
continue;
|
||
}
|
||
this.customFields.push(parsed);
|
||
}catch(e){
|
||
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
EmployeeAdapter.method('getDataMapping', function() {
|
||
return [
|
||
"id",
|
||
"employee_id",
|
||
"first_name",
|
||
"last_name",
|
||
"mobile_phone",
|
||
"department",
|
||
"gender",
|
||
"supervisor"
|
||
];
|
||
});
|
||
|
||
EmployeeAdapter.method('getHeaders', function() {
|
||
return [
|
||
{ "sTitle": "ID" },
|
||
{ "sTitle": "Employee Number" },
|
||
{ "sTitle": "First Name" },
|
||
{ "sTitle": "Last Name"},
|
||
{ "sTitle": "Mobile"},
|
||
{ "sTitle": "Department"},
|
||
{ "sTitle": "Gender"},
|
||
{ "sTitle": "Supervisor"}
|
||
];
|
||
});
|
||
|
||
EmployeeAdapter.method('getFormFields', function() {
|
||
var fields, newFields = [];
|
||
var employee_id, ssn_num, employment_status, job_title, pay_grade, joined_date, department, work_email, country;
|
||
|
||
if(this.checkPermission("Edit Employee Number") == "Yes"){
|
||
employee_id = [ "employee_id", {"label":"Employee Number","type":"text","validation":""}];
|
||
}else{
|
||
employee_id = [ "employee_id", {"label":"Employee Number","type":"placeholder","validation":""}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit EPF/CPF Number") == "Yes"){
|
||
ssn_num = [ "ssn_num", {"label":"EPF/CPF/SS No","type":"text","validation":"none"}];
|
||
}else{
|
||
ssn_num = [ "ssn_num", {"label":"EPF/CPF/SS No","type":"placeholder","validation":"none"}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Employment Status") == "Yes"){
|
||
employment_status = [ "employment_status", {"label":"Employment Status","type":"select2","remote-source":["EmploymentStatus","id","name"]}];
|
||
}else{
|
||
employment_status = [ "employment_status", {"label":"Employment Status","type":"placeholder","remote-source":["EmploymentStatus","id","name"]}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Job Title") == "Yes"){
|
||
job_title = [ "job_title", {"label":"Job Title","type":"select2","remote-source":["JobTitle","id","name"]}];
|
||
}else{
|
||
job_title = [ "job_title", {"label":"Job Title","type":"placeholder","remote-source":["JobTitle","id","name"]}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Pay Grade") == "Yes"){
|
||
pay_grade = [ "pay_grade", {"label":"Pay Grade","type":"select2","allow-null":true,"remote-source":["PayGrade","id","name"]}];
|
||
}else{
|
||
pay_grade = [ "pay_grade", {"label":"Pay Grade","type":"placeholder","allow-null":true,"remote-source":["PayGrade","id","name"]}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Joined Date") == "Yes"){
|
||
joined_date = [ "joined_date", {"label":"Joined Date","type":"date","validation":""}];
|
||
}else{
|
||
joined_date = [ "joined_date", {"label":"Joined Date","type":"placeholder","validation":""}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Department") == "Yes"){
|
||
department = [ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"]}];
|
||
}else{
|
||
department = [ "department", {"label":"Department","type":"placeholder","remote-source":["CompanyStructure","id","title"]}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Work Email") == "Yes"){
|
||
work_email = [ "work_email", {"label":"Work Email","type":"text","validation":"email"}];
|
||
}else{
|
||
work_email = [ "work_email", {"label":"Work Email","type":"placeholder","validation":"emailOrEmpty"}];
|
||
}
|
||
|
||
if(this.checkPermission("Edit Country") == "Yes"){
|
||
country = [ "country", {"label":"Country","type":"select2","remote-source":["Country","code","name"]}];
|
||
}else{
|
||
country = [ "country", {"label":"Country","type":"placeholder","remote-source":["Country","code","name"]}];
|
||
}
|
||
|
||
fields = [
|
||
[ "id", {"label":"ID","type":"hidden","validation":""}],
|
||
employee_id,
|
||
[ "first_name", {"label":"First Name","type":"text","validation":""}],
|
||
[ "middle_name", {"label":"Middle Name","type":"text","validation":"none"}],
|
||
[ "last_name", {"label":"Last Name","type":"text","validation":""}],
|
||
[ "nationality", {"label":"Nationality","type":"select2","remote-source":["Nationality","id","name"]}],
|
||
[ "birthday", {"label":"Date of Birth","type":"date","validation":""}],
|
||
[ "gender", {"label":"Gender","type":"select","source":[["Male","Male"],["Female","Female"]]}],
|
||
[ "marital_status", {"label":"Marital Status","type":"select","source":[["Married","Married"],["Single","Single"],["Divorced","Divorced"],["Widowed","Widowed"],["Other","Other"]]}],
|
||
ssn_num,
|
||
[ "nic_num", {"label":"NIC","type":"text","validation":"none"}],
|
||
[ "other_id", {"label":"Other ID","type":"text","validation":"none"}],
|
||
[ "driving_license", {"label":"Driving License No","type":"text","validation":"none"}],
|
||
employment_status,
|
||
job_title,
|
||
pay_grade,
|
||
[ "work_station_id", {"label":"Work Station Id","type":"text","validation":"none"}],
|
||
[ "address1", {"label":"Address Line 1","type":"text","validation":"none"}],
|
||
[ "address2", {"label":"Address Line 2","type":"text","validation":"none"}],
|
||
[ "city", {"label":"City","type":"text","validation":"none"}],
|
||
country,
|
||
[ "province", {"label":"Province","type":"select2","allow-null":true,"remote-source":["Province","id","name"]}],
|
||
[ "postal_code", {"label":"Postal/Zip Code","type":"text","validation":"none"}],
|
||
[ "home_phone", {"label":"Home Phone","type":"text","validation":"none"}],
|
||
[ "mobile_phone", {"label":"Mobile Phone","type":"text","validation":"none"}],
|
||
[ "work_phone", {"label":"Work Phone","type":"text","validation":"none"}],
|
||
work_email,
|
||
[ "private_email", {"label":"Private Email","type":"text","validation":"emailOrEmpty"}],
|
||
joined_date,
|
||
department
|
||
];
|
||
|
||
for(var i=0;i<this.customFields.length;i++){
|
||
fields.push(this.customFields[i]);
|
||
}
|
||
|
||
|
||
for(var i=0;i<fields.length;i++){
|
||
tempField = fields[i];
|
||
if(this.hiddenFields[tempField[0]] == undefined || this.hiddenFields[tempField[0]] == null ){
|
||
if(this.fieldNameMap[tempField[0]] != undefined && this.fieldNameMap[tempField[0]] != null){
|
||
title = this.fieldNameMap[tempField[0]].textMapped;
|
||
tempField[1]['label'] = title;
|
||
}
|
||
newFields.push(tempField);
|
||
}
|
||
}
|
||
|
||
return newFields;
|
||
});
|
||
|
||
EmployeeAdapter.method('getSourceMapping' , function() {
|
||
var k = this.sourceMapping ;
|
||
k['supervisor'] = ["Employee","id","first_name+last_name"];
|
||
return k;
|
||
});
|
||
|
||
|
||
EmployeeAdapter.method('get', function() {
|
||
var that = this;
|
||
var sourceMappingJson = JSON.stringify(this.getSourceMapping());
|
||
|
||
var req = {"map":sourceMappingJson};
|
||
var reqJson = JSON.stringify(req);
|
||
|
||
var callBackData = [];
|
||
callBackData['callBackData'] = [];
|
||
callBackData['callBackSuccess'] = 'modEmployeeGetSuccessCallBack';
|
||
callBackData['callBackFail'] = 'modEmployeeGetFailCallBack';
|
||
|
||
this.customAction('get','modules=employees',reqJson,callBackData);
|
||
});
|
||
|
||
EmployeeAdapter.method('deleteProfileImage', function(empId) {
|
||
var that = this;
|
||
|
||
var req = {"id":empId};
|
||
var reqJson = JSON.stringify(req);
|
||
|
||
var callBackData = [];
|
||
callBackData['callBackData'] = [];
|
||
callBackData['callBackSuccess'] = 'modEmployeeDeleteProfileImageCallBack';
|
||
callBackData['callBackFail'] = 'modEmployeeDeleteProfileImageCallBack';
|
||
|
||
this.customAction('deleteProfileImage','modules=employees',reqJson,callBackData);
|
||
});
|
||
|
||
EmployeeAdapter.method('modEmployeeDeleteProfileImageCallBack', function(data) {
|
||
top.location.href = top.location.href;
|
||
});
|
||
|
||
EmployeeAdapter.method('modEmployeeGetSuccessCallBack' , function(data) {
|
||
var fields = this.getFormFields();
|
||
var currentEmpId = data[1];
|
||
var userEmpId = data[2];
|
||
data = data[0];
|
||
var html = this.getCustomTemplate('myDetails.html');
|
||
|
||
for(var i=0;i<fields.length;i++) {
|
||
if(this.fieldNameMap[fields[i][0]] != undefined && this.fieldNameMap[fields[i][0]] != null){
|
||
title = this.fieldNameMap[fields[i][0]].textMapped;
|
||
html = html.replace("#_label_"+fields[i][0]+"_#",title);
|
||
}
|
||
}
|
||
|
||
html = html.replace(/#_.+_#/i,"");
|
||
|
||
html = html.replace(/_id_/g,data.id);
|
||
|
||
$("#"+this.getTableName()).html(html);
|
||
|
||
for(var i=0;i<fields.length;i++) {
|
||
$("#"+this.getTableName()+" #" + fields[i][0]).html(data[fields[i][0]]);
|
||
$("#"+this.getTableName()+" #" + fields[i][0]+"_Name").html(data[fields[i][0]+"_Name"]);
|
||
}
|
||
|
||
var subordinates = "";
|
||
for(var i=0;i<data.subordinates.length;i++){
|
||
if(data.subordinates[i].first_name != undefined && data.subordinates[i].first_name != null){
|
||
subordinates += data.subordinates[i].first_name+" ";
|
||
}
|
||
+data.subordinates[i].middle_name
|
||
if(data.subordinates[i].middle_name != undefined && data.subordinates[i].middle_name != null && data.subordinates[i].middle_name != ""){
|
||
subordinates += data.subordinates[i].middle_name+" ";
|
||
}
|
||
|
||
if(data.subordinates[i].last_name != undefined && data.subordinates[i].last_name != null && data.subordinates[i].last_name != ""){
|
||
subordinates += data.subordinates[i].last_name;
|
||
}
|
||
subordinates += "<br/>";
|
||
}
|
||
|
||
//Add custom fields
|
||
if(data.customFields != undefined && data.customFields != null && Object.keys(data.customFields).length > 0) {
|
||
|
||
|
||
var ct = '<div class="col-xs-6 col-md-3" style="font-size:16px;"><label class="control-label col-xs-12" style="font-size:13px;">#_label_#</label><label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;">#_value_#</label></div>';
|
||
var customFieldHtml;
|
||
for (index in data.customFields) {
|
||
|
||
if(!data.customFields[index][1]){
|
||
data.customFields[index][1] = 'Other Details';
|
||
}
|
||
|
||
sectionId = data.customFields[index][1].toLocaleLowerCase();
|
||
sectionId = sectionId.replace(' ','_');
|
||
|
||
if($("#cont_"+sectionId).length <= 0){
|
||
//Add section
|
||
sectionHtml = sectionTemplate;
|
||
sectionHtml = sectionHtml.replace('#_section_#', sectionId);
|
||
sectionHtml = sectionHtml.replace('#_section.name_#', data.customFields[index][1]);
|
||
$("#customFieldsCont").append($(sectionHtml));
|
||
}
|
||
|
||
customFieldHtml = ct;
|
||
customFieldHtml = customFieldHtml.replace('#_label_#', index);
|
||
customFieldHtml = customFieldHtml.replace('#_value_#', data.customFields[index][0]);
|
||
$("#cont_"+sectionId).append($(customFieldHtml));
|
||
}
|
||
}else{
|
||
$("#customFieldsCont").remove();
|
||
}
|
||
|
||
$("#"+this.getTableName()+" #subordinates").html(subordinates);
|
||
|
||
|
||
$("#"+this.getTableName()+" #name").html(data.first_name + " " + data.last_name);
|
||
this.currentUserId = data.id;
|
||
|
||
$("#"+this.getTableName()+" #profile_image_"+data.id).attr('src',data.image);
|
||
|
||
if(this.checkPermission("Upload/Delete Profile Image") == "No"){
|
||
$("#employeeUploadProfileImage").remove();
|
||
$("#employeeDeleteProfileImage").remove();
|
||
}
|
||
|
||
if(this.checkPermission("Edit Employee Details") == "No"){
|
||
$("#employeeProfileEditInfo").remove();
|
||
}
|
||
|
||
if(currentEmpId != userEmpId){
|
||
$("#employeeUpdatePassword").remove();
|
||
}
|
||
|
||
this.cancel();
|
||
});
|
||
|
||
EmployeeAdapter.method('modEmployeeGetFailCallBack' , function(data) {
|
||
|
||
});
|
||
|
||
EmployeeAdapter.method('editEmployee' , function() {
|
||
this.edit(this.currentUserId);
|
||
});
|
||
|
||
EmployeeAdapter.method('changePassword', function() {
|
||
$('#adminUsersModel').modal('show');
|
||
$('#adminUsersChangePwd #newpwd').val('');
|
||
$('#adminUsersChangePwd #conpwd').val('');
|
||
});
|
||
|
||
EmployeeAdapter.method('changePasswordConfirm', function() {
|
||
$('#adminUsersChangePwd_error').hide();
|
||
|
||
var passwordValidation = function (str) {
|
||
var val = /^[a-zA-Z0-9]\w{6,}$/;
|
||
return str != null && val.test(str);
|
||
};
|
||
|
||
var password = $('#adminUsersChangePwd #newpwd').val();
|
||
|
||
if(!passwordValidation(password)){
|
||
$('#adminUsersChangePwd_error').html("Password may contain only letters, numbers and should be longer than 6 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 = {"pwd":conPassword};
|
||
var reqJson = JSON.stringify(req);
|
||
|
||
var callBackData = [];
|
||
callBackData['callBackData'] = [];
|
||
callBackData['callBackSuccess'] = 'changePasswordSuccessCallBack';
|
||
callBackData['callBackFail'] = 'changePasswordFailCallBack';
|
||
|
||
this.customAction('changePassword','modules=employees',reqJson,callBackData);
|
||
|
||
});
|
||
|
||
EmployeeAdapter.method('closeChangePassword', function() {
|
||
$('#adminUsersModel').modal('hide');
|
||
});
|
||
|
||
EmployeeAdapter.method('changePasswordSuccessCallBack', function(callBackData,serverData) {
|
||
this.closeChangePassword();
|
||
this.showMessage("Password Change","Password changed successfully");
|
||
});
|
||
|
||
EmployeeAdapter.method('changePasswordFailCallBack', function(callBackData,serverData) {
|
||
this.closeChangePassword();
|
||
this.showMessage("Error",callBackData);
|
||
});
|
||
|
||
|
||
|
||
|
||
/*
|
||
* Company Graph
|
||
*/
|
||
|
||
function CompanyStructureAdapter(endPoint) {
|
||
this.initAdapter(endPoint);
|
||
}
|
||
|
||
CompanyStructureAdapter.inherits(AdapterBase);
|
||
|
||
|
||
|
||
CompanyStructureAdapter.method('getDataMapping', function() {
|
||
return [
|
||
"id",
|
||
"title",
|
||
"address",
|
||
"type",
|
||
"country",
|
||
"parent"
|
||
];
|
||
});
|
||
|
||
CompanyStructureAdapter.method('getHeaders', function() {
|
||
return [
|
||
{ "sTitle": "ID","bVisible":false },
|
||
{ "sTitle": "Name" },
|
||
{ "sTitle": "Address"},
|
||
{ "sTitle": "Type"},
|
||
{ "sTitle": "Country", "sClass": "center" },
|
||
{ "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":"select","remote-source":["Country","code","name"]}],
|
||
[ "parent", {"label":"Parent Structure","type":"select","allow-null":true,"remote-source":["CompanyStructure","id","title"]}]
|
||
];
|
||
});
|
||
|
||
|
||
|
||
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;
|
||
|
||
});
|
||
|