Upgrade to v15.0.OS

This commit is contained in:
Thilina Hasantha
2016-02-08 04:25:58 +05:30
parent b99b6f6f77
commit 078396d5d7
91 changed files with 3332 additions and 1720 deletions

View File

@@ -95,13 +95,14 @@ AdapterBase.method('add', function(object,getFunctionCallBackData,callGetFunctio
}
$(object).attr('a','add');
$(object).attr('t',this.table);
that.showLoader();
$.post(this.moduleRelativeURL, object, function(data) {
if(data.status == "SUCCESS"){
that.addSuccessCallBack(getFunctionCallBackData,data.object, callGetFunction, successCallback, that);
}else{
that.addFailCallBack(getFunctionCallBackData,data.object);
}
},"json");
},"json").always(function() {that.hideLoader()});
this.trackEvent("add",this.tab,this.table);
});
@@ -126,13 +127,14 @@ AdapterBase.method('addFailCallBack', function(callBackData,serverData) {
AdapterBase.method('deleteObj', function(id,callBackData) {
var that = this;
that.showLoader();
$.post(this.moduleRelativeURL, {'t':this.table,'a':'delete','id':id}, function(data) {
if(data.status == "SUCCESS"){
that.deleteSuccessCallBack(callBackData,data.object);
}else{
that.deleteFailCallBack(callBackData,data.object);
}
},"json");
},"json").always(function() {that.hideLoader()});
this.trackEvent("delete",this.tab,this.table);
});
@@ -170,14 +172,15 @@ AdapterBase.method('get', function(callBackData) {
sourceMappingJson = this.fixJSON(sourceMappingJson);
filterJson = this.fixJSON(filterJson);
that.showLoader();
$.post(this.moduleRelativeURL, {'t':this.table,'a':'get','sm':sourceMappingJson,'ft':filterJson,'ob':orderBy}, function(data) {
if(data.status == "SUCCESS"){
that.getSuccessCallBack(callBackData,data.object);
}else{
that.getFailCallBack(callBackData,data.object);
}
},"json");
},"json").always(function() {that.hideLoader()});
that.initFieldMasterData();
@@ -274,13 +277,14 @@ AdapterBase.method('getElement', function(id,callBackData) {
var that = this;
var sourceMappingJson = JSON.stringify(this.getSourceMapping());
sourceMappingJson = this.fixJSON(sourceMappingJson);
$.post(this.moduleRelativeURL, {'t':this.table,'a':'getElement','id':id,'sm':sourceMappingJson}, function(data) {
that.showLoader();
$.post(this.moduleRelativeURL, {'t':this.table,'a':'getElement','id':id,'sm':sourceMappingJson}, function(data) {
if(data.status == "SUCCESS"){
that.getElementSuccessCallBack.apply(that,[callBackData,data.object]);
}else{
that.getElementFailCallBack.apply(that,[callBackData,data.object]);
}
},"json");
},"json").always(function() {that.hideLoader()});
this.trackEvent("getElement",this.tab,this.table);
});
@@ -361,6 +365,9 @@ AdapterBase.method('getFieldValues', function(fieldMaster,callBackData) {
AdapterBase.method('setAdminProfile', function(empId) {
var that = this;
try{
localStorage.clear();
}catch(e){}
$.post(this.moduleRelativeURL, {'a':'setAdminEmp','empid':empId}, function(data) {
top.location.href = clientUrl;
},"json");

View File

@@ -1094,6 +1094,12 @@ IceHRMBase.method('showFilters', function(object) {
});
});
/*
$tempDomObj.find('.signatureField').each(function() {
$(this).data('signaturePad',new SignaturePad($(this)));
});
*/
//var tHtml = $tempDomObj.wrap('<div>').parent().html();
this.showDomElement("Edit",$tempDomObj,null,null,true);
$(".filterBtn").off();
@@ -1134,6 +1140,7 @@ IceHRMBase.method('preRenderForm', function(object) {
IceHRMBase.method('renderForm', function(object) {
var that = this;
var signatureIds = [];
if(object == null || object == undefined){
this.currentId = null;
}
@@ -1200,6 +1207,12 @@ IceHRMBase.method('renderForm', function(object) {
});
});
$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"){
@@ -1239,6 +1252,14 @@ IceHRMBase.method('renderForm', function(object) {
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);
}
@@ -1253,6 +1274,14 @@ IceHRMBase.method('renderForm', function(object) {
$("#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);
@@ -1406,7 +1435,11 @@ IceHRMBase.method('showDataGroup', function(field, object) {
});
});
/*
$tempDomObj.find('.signatureField').each(function() {
$(this).data('signaturePad',new SignaturePad($(this)));
});
*/
this.currentDataGroupField = field;
this.showDomElement("Add "+field[1]['label'],$tempDomObj,null,null,true);
@@ -1696,6 +1729,14 @@ IceHRMBase.method('fillForm', function(object, formId, fields) {
$(formId + ' #'+fields[i][0]).val(object[fields[i][0]]);
$(formId + ' #'+fields[i][0]+"_div").html(html);
}catch(e){}
}else if(fields[i][1].type == 'signature'){
if(object[fields[i][0]] != '' || object[fields[i][0]] != undefined
|| object[fields[i][0]] != null){
$(formId + ' #'+fields[i][0]).data('signaturePad').fromDataURL(object[fields[i][0]]);
}
}else{
$(formId + ' #'+fields[i][0]).val(object[fields[i][0]]);
}
@@ -1774,7 +1815,11 @@ IceHRMBase.method('renderFormField', function(field) {
}else if(field[1].type == 'datagroup'){
t = t.replace(/_id_/g,field[0]);
t = t.replace(/_label_/g,field[1].label);
}
}else if(field[1].type == 'signature'){
t = t.replace(/_id_/g,field[0]);
t = t.replace(/_label_/g,field[1].label);
}
if(field[1].validation != undefined && field[1].validation != null && field[1].validation != ""){
t = t.replace(/_validation_/g,'validation="'+field[1].validation+'"');
@@ -2097,3 +2142,21 @@ IceHRMBase.method('getHelpLink', function () {
return null;
});
IceHRMBase.method('showLoader', function () {
$('#iceloader').show();
});
IceHRMBase.method('hideLoader', function () {
$('#iceloader').hide();
});
IceHRMBase.method('generateOptions', function (data) {
var template = '<option value="__val__">__text__</option>';
var options = "";
for(index in data){
options += template.replace("__val__",index).replace("__text__",data[index]);
}
return options;
});

View File

@@ -34,7 +34,7 @@ function FormValidation(formId,validateAll,options) {
this.settings = jQuery.extend(this.settings,options);
this.inputTypes = new Array( "text", "radio", "checkbox", "file", "password", "select-one","select-multi", "textarea","fileupload");
this.inputTypes = new Array( "text", "radio", "checkbox", "file", "password", "select-one","select-multi", "textarea","fileupload" ,"signature");
this.validator = {
@@ -202,8 +202,15 @@ FormValidation.method('checkValues' , function(options) {
inputValue = JSON.stringify(inputValue);
}else{
inputValue = "";
}
}else{
}
}else if(inputObject.hasClass('signatureField')){
if($('#'+id).data('signaturePad').isEmpty()){
inputValue = '';
}else{
inputValue = $('#'+id).data('signaturePad').toDataURL();
}
}else{
inputValue = inputObject.val();
}
}

View File

@@ -10,6 +10,11 @@ abstract class AbstractModuleManager{
private $userClasses = array();
private $errorMappings = array();
private $modelClasses = array();
private $modulePath = null;
private $moduleObject = null;
private $moduleType = null;
/**
* Override this method in module manager class to define user classes.
@@ -60,9 +65,82 @@ abstract class AbstractModuleManager{
*/
public abstract function setupModuleClassDefinitions();
public function initQuickAccessMenu(){
}
public function setModuleObject($obj){
$this->moduleObject = $obj;
}
public function getModuleObject(){
return $this->moduleObject;
}
public function setModuleType($type){
$this->moduleType = $type;
}
public function getModuleType(){
return $this->moduleType;
}
public function getModulePath(){
$subClass = get_called_class();
$reflector = new ReflectionClass($subClass);
$fn = $reflector->getFileName();
$this->modulePath = realpath(dirname($fn)."/..");
LogManager::getInstance()->info("Module Path: [$subClass | $fn]".$this->modulePath);
}
public function getDashboardItemData(){
return array();
}
public function getDashboardItem(){
return null;
$this->getModulePath();
if(!file_exists($this->modulePath."/dashboard.html")){
//LogManager::getInstance()->error("Dashboard file not found :".$this->modulePath."/dashboard.html");
return null;
}
$dashboardItem = file_get_contents($this->modulePath."/dashboard.html");
if(empty($dashboardItem)){
//LogManager::getInstance()->error("Dashboard file is empty :".$this->modulePath."/dashboard.html");
return null;
}
$data = $this->getDashboardItemData();
$data['moduleLink'] = $this->getModuleLink();
LogManager::getInstance()->info("Module Link:".$data['moduleLink']);
foreach($data as $k => $v){
$dashboardItem = str_replace("#_".$k."_#", $v, $dashboardItem);
}
return $dashboardItem;
}
public function getDashboardItemIndex(){
$metaData = json_decode(file_get_contents($this->modulePath."/meta.json"),true);
if(!isset($metaData['dashboardPosition'])){
return 100;
}else{
return $metaData['dashboardPosition'];
}
}
private function getModuleLink(){
$metaData = json_decode(file_get_contents($this->modulePath."/meta.json"),true);
$mod = basename($this->modulePath);
$group = basename(realpath($this->modulePath."/.."));
//?g=admin&n=candidates&m=admin_Recruitment
return CLIENT_BASE_URL."?g=".$group."&n=".$mod."&m=".$group."_".str_replace(" ","_",$metaData['label']);
}

File diff suppressed because it is too large Load Diff

View File

@@ -23,17 +23,25 @@ class CronUtils{
$count = 0;
foreach($ams as $am){
if(is_dir($this->clientBasePath.$am) && $am != '.' && $am != '..'){
//$command = "php ".$this->cronFile." -c".$this->clientBasePath.$am;
$command = "php ".$this->clientBasePath.$am."/".$this->cronFile;
echo "Run:".$command."\r\n";
passthru($command, $res);
echo "Result :".$res."\r\n";
$command = "php ".$this->clientBasePath.$am."/".$this->cronFile;
if(file_exists($this->clientBasePath.$am."/".$this->cronFile)){
$count++;
if($count > 25){
sleep(1);
$count = 0;
echo "Run:".$command."\r\n";
error_log("Run:".$command);
passthru($command, $res);
echo "Result :".$res."\r\n";
error_log("Result :".$res);
$count++;
if($count > 25){
sleep(1);
$count = 0;
}
}else{
echo "Error (File Not Found):".$command."\r\n";
error_log("Error (File Not Found):".$command);
}
}
}
}

View File

@@ -79,7 +79,7 @@ abstract class EmailSender{
$emailBody = str_replace("#_emailBody_#", $body, $emailBody);
$emailBody = str_replace("#_logourl_#",
BASE_URL."images/logo.png"
UIManager::getInstance()->getCompanyLogoUrl()
, $emailBody);
$user = new User();
@@ -113,7 +113,7 @@ abstract class EmailSender{
//Convert to an html email
$emailBody = $body;
$emailBody = str_replace("#_logourl_#",
BASE_URL."images/logo.png"
UIManager::getInstance()->getCompanyLogoUrl()
, $emailBody);
$user = new User();
@@ -271,6 +271,14 @@ class SMTPEmailSender extends EmailSender{
'Reply-To' => $replyToEmail,
'Subject' => $subject);
if(!empty($ccList)){
$headers['Cc'] = implode(",",$ccList);
}
if(!empty($bccList)){
$headers['Bcc'] = implode(",",$bccList);
}
$mail = $smtp->send($toEmail, $headers, $body);
@@ -297,6 +305,12 @@ class PHPMailer extends EmailSender{
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: '.$fromEmail. "\r\n";
if(!empty($ccList)){
$headers .= 'CC: '.implode(",",$ccList). "\r\n";
}
if(!empty($bccList)){
$headers .= 'BCC: '.implode(",",$bccList). "\r\n";
}
$headers .= 'ReplyTo: '.$replyToEmail. "\r\n";
$headers .= 'Ice-Mailer: PHP/' . phpversion();

View File

@@ -9,4 +9,4 @@ if(!defined('SIGN_IN_ELEMENT_MAPPING_FIELD_NAME')){define('SIGN_IN_ELEMENT_MAPPI
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','ice-framework@gamonoid.com');}
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','iCEf');}
if(!defined('APP_SEC')){define('APP_SEC','4dcxudersqw');}
if(!defined('APP_SEC')){define('APP_SEC','4dcxswfrds');}

View File

@@ -2,3 +2,12 @@
UIManager::getInstance()->setCurrentUser($user);
UIManager::getInstance()->setProfiles($profileCurrent, $profileSwitched);
UIManager::getInstance()->setHomeLink($homeLink);
$moduleManagers = BaseService::getInstance()->getModuleManagers();
foreach($moduleManagers as $moduleManagerObj){
$allowed = BaseService::getInstance()->isModuleAllowedForUser($moduleManagerObj);
if($allowed){
$moduleManagerObj->initQuickAccessMenu();
}
}

View File

@@ -2,7 +2,7 @@
if(php_sapi_name() != 'cli'){
exit();
}
include "../config.base.php";
include dirname(__FILE__)."/../config.base.php";
ini_set('error_log',CRON_LOG);
$opts = getopt('f:p:');
$file = $opts['f'];

View File

@@ -37,7 +37,10 @@ if(empty($user->default_module)){
}else{
$defaultModule = new Module();
$defaultModule->Load("id = ?",array($user->default_module));
$homeLink = CLIENT_BASE_URL."?g=".$defaultModule->mod_group."&&n=".$defaultModule->name.
if($defaultModule->mod_group == "user"){
$defaultModule->mod_group = "modules";
}
$homeLink = CLIENT_BASE_URL."?g=".$defaultModule->mod_group."&n=".$defaultModule->name.
"&m=".$defaultModule->mod_group."_".str_replace(" ","_",$defaultModule->menu);
}
@@ -62,15 +65,14 @@ if(!in_array($user->user_level, $modulePermissions['user'])){
}
$logoFileName = CLIENT_BASE_PATH."data/logo.png";
$logoFileUrl = CLIENT_BASE_URL."data/logo.png";
if(!file_exists($logoFileName)){
$logoFileUrl = BASE_URL."images/logo.png";
}
$logoFileUrl = UIManager::getInstance()->getCompanyLogoUrl();
$companyName = SettingsManager::getInstance()->getSetting('Company: Name');
if(empty($companyName) || $companyName == "Sample Company Pvt Ltd"){
$companyName = APP_NAME;
}
//Load meta info
$meta = json_decode(file_get_contents(MODULE_PATH."/meta.json"),true);
@@ -80,7 +82,7 @@ include('configureUIManager.php');
<html>
<head>
<meta charset="utf-8">
<title><?=APP_NAME?></title>
<title><?=$companyName?></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
@@ -129,6 +131,7 @@ include('configureUIManager.php');
<link href="<?=BASE_URL?>css/style.css?v=<?=$cssVersion?>" rel="stylesheet">
<script type="text/javascript" src="<?=BASE_URL?>js/signature_pad.js"></script>
<script type="text/javascript" src="<?=BASE_URL?>js/date.js"></script>
<script type="text/javascript" src="<?=BASE_URL?>js/json2.js"></script>
<script type="text/javascript" src="<?=BASE_URL?>js/CrockfordInheritance.v0.1.js"></script>
@@ -175,8 +178,8 @@ include('configureUIManager.php');
</script>
<header id="delegationDiv" class="header">
<a href="<?=$homeLink?>" class="logo" style="font-family: 'Source Sans Pro', sans-serif;">
<?=APP_NAME?>
<a href="<?=$homeLink?>" class="logo" style="overflow: hidden;font-family: 'Source Sans Pro', sans-serif;">
Home
</a>
<!-- Header Navbar: style can be found in header.less -->
<nav class="navbar navbar-static-top" role="navigation">
@@ -187,6 +190,9 @@ include('configureUIManager.php');
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<div class="logo" style="background: #3c8dbc;text-align: left;">
<?=$companyName?>
</div>
<div class="navbar-right">
<ul class="nav navbar-nav">
<?=UIManager::getInstance()->getMenuItemsHTML();?>
@@ -195,6 +201,17 @@ include('configureUIManager.php');
</nav>
</header>
<div class="wrapper row-offcanvas row-offcanvas-left">
<div id="iceloader" style="
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 9999;
background: rgba(0, 0, 0, 0);
background-image: url('<?=BASE_URL?>images/icehrm-loader.gif');
background-repeat: no-repeat;
background-position: center;display:none;"></div>
<!-- Left side column. contains the logo and sidebar -->
<aside class="left-side sidebar-offcanvas">
<!-- sidebar: style can be found in sidebar.less -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -53,6 +53,7 @@ $fieldTemplates['label'] = file_get_contents(CLIENT_PATH.'/templates/fields/labe
$fieldTemplates['placeholder'] = file_get_contents(CLIENT_PATH.'/templates/fields/placeholder.html');
$fieldTemplates['datagroup'] = file_get_contents(CLIENT_PATH.'/templates/fields/datagroup.html');
$fieldTemplates['colorpick'] = file_get_contents(CLIENT_PATH.'/templates/fields/colorpick.html');
$fieldTemplates['signature'] = file_get_contents(CLIENT_PATH.'/templates/fields/signature.html');
$templates = array();
$templates['formTemplate'] = file_get_contents(CLIENT_PATH.'/templates/form_template.html');
@@ -101,6 +102,11 @@ if(file_exists(MODULE_PATH.'/templates/fields/colorpick.html')){
$fieldTemplates['colorpick'] = file_get_contents(MODULE_PATH.'/templates/fields/colorpick.html');
}
if(file_exists(MODULE_PATH.'/templates/fields/signature.html')){
$fieldTemplates['signature'] = file_get_contents(MODULE_PATH.'/templates/fields/signature.html');
}
if(file_exists(MODULE_PATH.'/templates/form_template.html')){
$templates['orig_formTemplate'] = $templates['formTemplate'];
$templates['formTemplate'] = file_get_contents(MODULE_PATH.'/templates/form_template.html');

352
src/js/signature_pad.js Normal file
View File

@@ -0,0 +1,352 @@
var SignaturePad = (function (document) {
"use strict";
var SignaturePad = function (canvas, options) {
var self = this,
opts = options || {};
this.velocityFilterWeight = opts.velocityFilterWeight || 0.7;
this.minWidth = opts.minWidth || 0.5;
this.maxWidth = opts.maxWidth || 2.5;
this.dotSize = opts.dotSize || function () {
return (this.minWidth + this.maxWidth) / 2;
};
this.penColor = opts.penColor || "black";
this.backgroundColor = opts.backgroundColor || "rgba(0,0,0,0)";
this.onEnd = opts.onEnd;
this.onBegin = opts.onBegin;
this._canvas = canvas;
this._ctx = canvas.getContext("2d");
this.clear();
// we need add these inline so they are available to unbind while still having
// access to 'self' we could use _.bind but it's not worth adding a dependency
this._handleMouseDown = function (event) {
if (event.which === 1) {
self._mouseButtonDown = true;
self._strokeBegin(event);
}
};
this._handleMouseMove = function (event) {
if (self._mouseButtonDown) {
self._strokeUpdate(event);
}
};
this._handleMouseUp = function (event) {
if (event.which === 1 && self._mouseButtonDown) {
self._mouseButtonDown = false;
self._strokeEnd(event);
}
};
this._handleTouchStart = function (event) {
if (event.targetTouches.length == 1) {
var touch = event.changedTouches[0];
self._strokeBegin(touch);
}
};
this._handleTouchMove = function (event) {
// Prevent scrolling.
event.preventDefault();
var touch = event.targetTouches[0];
self._strokeUpdate(touch);
};
this._handleTouchEnd = function (event) {
var wasCanvasTouched = event.target === self._canvas;
if (wasCanvasTouched) {
event.preventDefault();
self._strokeEnd(event);
}
};
this._handleMouseEvents();
this._handleTouchEvents();
};
SignaturePad.prototype.clear = function () {
var ctx = this._ctx,
canvas = this._canvas;
ctx.fillStyle = this.backgroundColor;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillRect(0, 0, canvas.width, canvas.height);
this._reset();
};
SignaturePad.prototype.toDataURL = function (imageType, quality) {
var canvas = this._canvas;
return canvas.toDataURL.apply(canvas, arguments);
};
SignaturePad.prototype.fromDataURL = function (dataUrl) {
var self = this,
image = new Image(),
ratio = window.devicePixelRatio || 1,
width = this._canvas.width / ratio,
height = this._canvas.height / ratio;
this._reset();
image.src = dataUrl;
image.onload = function () {
self._ctx.drawImage(image, 0, 0, width, height);
};
this._isEmpty = false;
};
SignaturePad.prototype._strokeUpdate = function (event) {
var point = this._createPoint(event);
this._addPoint(point);
};
SignaturePad.prototype._strokeBegin = function (event) {
this._reset();
this._strokeUpdate(event);
if (typeof this.onBegin === 'function') {
this.onBegin(event);
}
};
SignaturePad.prototype._strokeDraw = function (point) {
var ctx = this._ctx,
dotSize = typeof(this.dotSize) === 'function' ? this.dotSize() : this.dotSize;
ctx.beginPath();
this._drawPoint(point.x, point.y, dotSize);
ctx.closePath();
ctx.fill();
};
SignaturePad.prototype._strokeEnd = function (event) {
var canDrawCurve = this.points.length > 2,
point = this.points[0];
if (!canDrawCurve && point) {
this._strokeDraw(point);
}
if (typeof this.onEnd === 'function') {
this.onEnd(event);
}
};
SignaturePad.prototype._handleMouseEvents = function () {
this._mouseButtonDown = false;
this._canvas.addEventListener("mousedown", this._handleMouseDown);
this._canvas.addEventListener("mousemove", this._handleMouseMove);
document.addEventListener("mouseup", this._handleMouseUp);
};
SignaturePad.prototype._handleTouchEvents = function () {
// Pass touch events to canvas element on mobile IE11 and Edge.
this._canvas.style.msTouchAction = 'none';
this._canvas.style.touchAction = 'none';
this._canvas.addEventListener("touchstart", this._handleTouchStart);
this._canvas.addEventListener("touchmove", this._handleTouchMove);
document.addEventListener("touchend", this._handleTouchEnd);
};
SignaturePad.prototype.on = function () {
this._handleMouseEvents();
this._handleTouchEvents();
};
SignaturePad.prototype.off = function () {
this._canvas.removeEventListener("mousedown", this._handleMouseDown);
this._canvas.removeEventListener("mousemove", this._handleMouseMove);
document.removeEventListener("mouseup", this._handleMouseUp);
this._canvas.removeEventListener("touchstart", this._handleTouchStart);
this._canvas.removeEventListener("touchmove", this._handleTouchMove);
document.removeEventListener("touchend", this._handleTouchEnd);
};
SignaturePad.prototype.isEmpty = function () {
return this._isEmpty;
};
SignaturePad.prototype._reset = function () {
this.points = [];
this._lastVelocity = 0;
this._lastWidth = (this.minWidth + this.maxWidth) / 2;
this._isEmpty = true;
this._ctx.fillStyle = this.penColor;
};
SignaturePad.prototype._createPoint = function (event) {
var rect = this._canvas.getBoundingClientRect();
return new Point(
event.clientX - rect.left,
event.clientY - rect.top
);
};
SignaturePad.prototype._addPoint = function (point) {
var points = this.points,
c2, c3,
curve, tmp;
points.push(point);
if (points.length > 2) {
// To reduce the initial lag make it work with 3 points
// by copying the first point to the beginning.
if (points.length === 3) points.unshift(points[0]);
tmp = this._calculateCurveControlPoints(points[0], points[1], points[2]);
c2 = tmp.c2;
tmp = this._calculateCurveControlPoints(points[1], points[2], points[3]);
c3 = tmp.c1;
curve = new Bezier(points[1], c2, c3, points[2]);
this._addCurve(curve);
// Remove the first element from the list,
// so that we always have no more than 4 points in points array.
points.shift();
}
};
SignaturePad.prototype._calculateCurveControlPoints = function (s1, s2, s3) {
var dx1 = s1.x - s2.x, dy1 = s1.y - s2.y,
dx2 = s2.x - s3.x, dy2 = s2.y - s3.y,
m1 = {x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0},
m2 = {x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0},
l1 = Math.sqrt(dx1*dx1 + dy1*dy1),
l2 = Math.sqrt(dx2*dx2 + dy2*dy2),
dxm = (m1.x - m2.x),
dym = (m1.y - m2.y),
k = l2 / (l1 + l2),
cm = {x: m2.x + dxm*k, y: m2.y + dym*k},
tx = s2.x - cm.x,
ty = s2.y - cm.y;
return {
c1: new Point(m1.x + tx, m1.y + ty),
c2: new Point(m2.x + tx, m2.y + ty)
};
};
SignaturePad.prototype._addCurve = function (curve) {
var startPoint = curve.startPoint,
endPoint = curve.endPoint,
velocity, newWidth;
velocity = endPoint.velocityFrom(startPoint);
velocity = this.velocityFilterWeight * velocity
+ (1 - this.velocityFilterWeight) * this._lastVelocity;
newWidth = this._strokeWidth(velocity);
this._drawCurve(curve, this._lastWidth, newWidth);
this._lastVelocity = velocity;
this._lastWidth = newWidth;
};
SignaturePad.prototype._drawPoint = function (x, y, size) {
var ctx = this._ctx;
ctx.moveTo(x, y);
ctx.arc(x, y, size, 0, 2 * Math.PI, false);
this._isEmpty = false;
};
SignaturePad.prototype._drawCurve = function (curve, startWidth, endWidth) {
var ctx = this._ctx,
widthDelta = endWidth - startWidth,
drawSteps, width, i, t, tt, ttt, u, uu, uuu, x, y;
drawSteps = Math.floor(curve.length());
ctx.beginPath();
for (i = 0; i < drawSteps; i++) {
// Calculate the Bezier (x, y) coordinate for this step.
t = i / drawSteps;
tt = t * t;
ttt = tt * t;
u = 1 - t;
uu = u * u;
uuu = uu * u;
x = uuu * curve.startPoint.x;
x += 3 * uu * t * curve.control1.x;
x += 3 * u * tt * curve.control2.x;
x += ttt * curve.endPoint.x;
y = uuu * curve.startPoint.y;
y += 3 * uu * t * curve.control1.y;
y += 3 * u * tt * curve.control2.y;
y += ttt * curve.endPoint.y;
width = startWidth + ttt * widthDelta;
this._drawPoint(x, y, width);
}
ctx.closePath();
ctx.fill();
};
SignaturePad.prototype._strokeWidth = function (velocity) {
return Math.max(this.maxWidth / (velocity + 1), this.minWidth);
};
var Point = function (x, y, time) {
this.x = x;
this.y = y;
this.time = time || new Date().getTime();
};
Point.prototype.velocityFrom = function (start) {
return (this.time !== start.time) ? this.distanceTo(start) / (this.time - start.time) : 1;
};
Point.prototype.distanceTo = function (start) {
return Math.sqrt(Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2));
};
var Bezier = function (startPoint, control1, control2, endPoint) {
this.startPoint = startPoint;
this.control1 = control1;
this.control2 = control2;
this.endPoint = endPoint;
};
// Returns approximated length.
Bezier.prototype.length = function () {
var steps = 10,
length = 0,
i, t, cx, cy, px, py, xdiff, ydiff;
for (i = 0; i <= steps; i++) {
t = i / steps;
cx = this._point(t, this.startPoint.x, this.control1.x, this.control2.x, this.endPoint.x);
cy = this._point(t, this.startPoint.y, this.control1.y, this.control2.y, this.endPoint.y);
if (i > 0) {
xdiff = cx - px;
ydiff = cy - py;
length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);
}
px = cx;
py = cy;
}
return length;
};
Bezier.prototype._point = function (t, start, c1, c2, end) {
return start * (1.0 - t) * (1.0 - t) * (1.0 - t)
+ 3.0 * c1 * (1.0 - t) * (1.0 - t) * t
+ 3.0 * c2 * (1.0 - t) * t * t
+ end * t * t * t;
};
return SignaturePad;
})(document);

View File

@@ -218,6 +218,9 @@ $logoFileUrl = UIManager::getInstance()->getCompanyLogoUrl();
}
function submitLogin(){
try{
localStorage.clear();
}catch(e){}
$("#loginForm").submit();
}

View File

@@ -69,4 +69,8 @@ class ICEHRM_Record extends ADOdb_Active_Record{
return array(
);
}
public function allowIndirectMapping(){
return false;
}
}

View File

@@ -23,14 +23,17 @@ if(SettingsManager::getInstance()->getSetting("System: Add New Permissions") ==
SettingsManager::getInstance()->setSetting("System: Add New Permissions","0");
}
function includeModuleManager($type,$name){
function includeModuleManager($type,$name,$data){
$moduleCapsName = ucfirst($name);
$moduleTypeCapsName = ucfirst($type); // Admin or Modules
$incFile = CLIENT_PATH.'/'.$type.'/'.$name.'/api/'.$moduleCapsName.$moduleTypeCapsName."Manager.php";
include ($incFile);
$moduleManagerClass = $moduleCapsName.$moduleTypeCapsName."Manager";
BaseService::getInstance()->addModuleManager(new $moduleManagerClass());
$moduleManagerObj = new $moduleManagerClass();
$moduleManagerObj->setModuleObject($data);
$moduleManagerObj->setModuleType($type);
BaseService::getInstance()->addModuleManager($moduleManagerObj);
}
@@ -82,13 +85,14 @@ $currentLocation = 0;
foreach($ams as $am){
if(is_dir(CLIENT_PATH.'/admin/'.$am) && $am != '.' && $am != '..'){
$meta = json_decode(file_get_contents(CLIENT_PATH.'/admin/'.$am.'/meta.json'));
includeModuleManager('admin',$am);
$arr = array();
$arr['name'] = $am;
$arr['label'] = $meta->label;
$arr['icon'] = $meta->icon;
$arr['menu'] = $meta->menu;
$arr['order'] = $meta->order;
$arr['status'] = 'Enabled';
$arr['user_levels'] = $meta->user_levels;
$arr['user_roles'] = isset($meta->user_roles)?$meta->user_roles:"";
@@ -110,6 +114,7 @@ foreach($ams as $am){
$arr['icon'] = $dbModule->icon;
$arr['menu'] = $dbModule->menu;
$arr['order'] = $dbModule->mod_order;
$arr['status'] = $dbModule->status;
$arr['user_levels'] = json_decode($dbModule->user_levels);
$arr['user_roles'] = json_decode($dbModule->user_roles);
@@ -133,6 +138,8 @@ foreach($ams as $am){
}
}
includeModuleManager('admin',$am, $arr);
if(!isset($adminModulesTemp[$arr['menu']])){
$adminModulesTemp[$arr['menu']] = array();
@@ -166,13 +173,14 @@ $ams = scandir(CLIENT_PATH.'/modules/');
foreach($ams as $am){
if(is_dir(CLIENT_PATH.'/modules/'.$am) && $am != '.' && $am != '..'){
$meta = json_decode(file_get_contents(CLIENT_PATH.'/modules/'.$am.'/meta.json'));
includeModuleManager('modules',$am);
$arr = array();
$arr['name'] = $am;
$arr['label'] = $meta->label;
$arr['icon'] = $meta->icon;
$arr['menu'] = $meta->menu;
$arr['order'] = $meta->order;
$arr['status'] = 'Enabled';
$arr['user_levels'] = $meta->user_levels;
$arr['user_roles'] = isset($meta->user_roles)?$meta->user_roles:"";
@@ -193,6 +201,7 @@ foreach($ams as $am){
$arr['icon'] = $dbModule->icon;
$arr['menu'] = $dbModule->menu;
$arr['order'] = $dbModule->mod_order;
$arr['status'] = $dbModule->status;
$arr['user_levels'] = json_decode($dbModule->user_levels);
$arr['user_roles'] = json_decode($dbModule->user_roles);
@@ -215,6 +224,8 @@ foreach($ams as $am){
createPermissions($meta, $dbModule->id);
}
}
includeModuleManager('modules',$am, $arr);
if(!isset($userModulesTemp[$arr['menu']])){
$userModulesTemp[$arr['menu']] = array();

View File

@@ -1,7 +1,6 @@
<?php
if(!defined("AWS_REGION")){define('AWS_REGION','us-east-1');}
include(APP_BASE_PATH.'lib/Mail.php');
include(APP_BASE_PATH.'lib/aws.phar');
include(APP_BASE_PATH.'adodb512/adodb.inc.php');
include(APP_BASE_PATH.'adodb512/adodb-active-record.inc.php');
$ADODB_ASSOC_CASE = 2;
@@ -145,6 +144,12 @@ if(file_exists(APP_BASE_PATH.'admin/audit/api/AuditActionManager.php')){
$emailEnabled = SettingsManager::getInstance()->getSetting("Email: Enable");
$emailMode = SettingsManager::getInstance()->getSetting("Email: Mode");
$uploadS3 = SettingsManager::getInstance()->getSetting("Files: Upload Files to S3");
if($emailMode == "SES" || $uploadS3 == '1'){
include(APP_BASE_PATH.'lib/aws.phar');
}
$emailSender = null;
if($emailEnabled == "1"){
if($emailMode == "SMTP"){

View File

@@ -3,7 +3,7 @@
<td>
<table cellpadding="15">
<tr>
<td><img style="max-width: 200px;max-height: 100px;" src="#_logourl_#" /></td>
<td><img style="max-height: 100px;" src="#_logourl_#" /></td>
</tr>
</table>
</td>

View File

@@ -0,0 +1,9 @@
<div class="row" id="field__id_">
<label class="control-label col-sm-3" for="_id_">_label_</label>
<div class="controls col-sm-6">
<canvas class="form-control signatureField" type="signature" id="_id_" name="_id_" _validation_ style="height:120px;"></canvas>
</div>
<div class="controls col-sm-3">
<span class="help-inline control-label" id="help__id_"></span>
</div>
</div>

View File

@@ -3433,3 +3433,311 @@ fieldset[disabled] .btn-vk.active {
color: #587ea3;
background-color: #ffffff;
}
/* Styles from v2.2 */
/* Widget: TODO LIST */
.todo-list {
margin: 0;
padding: 0px 0px;
list-style: none;
overflow: auto;
}
.todo-list > li {
border-radius: 2px;
padding: 10px;
background: #f4f4f4;
margin-bottom: 2px;
border-left: 2px solid #e6e7e8;
color: #444;
}
.todo-list > li:last-of-type {
margin-bottom: 0;
}
.todo-list > li.danger {
border-left-color: #dd4b39;
}
.todo-list > li.warning {
border-left-color: #f39c12;
}
.todo-list > li.info {
border-left-color: #00c0ef;
}
.todo-list > li.success {
border-left-color: #00a65a;
}
.todo-list > li.primary {
border-left-color: #3c8dbc;
}
.todo-list > li > input[type='checkbox'] {
margin: 0 10px 0 5px;
}
.todo-list > li .text {
display: inline-block;
margin-left: 5px;
font-weight: 600;
}
.todo-list > li .label {
margin-left: 10px;
font-size: 9px;
}
.todo-list > li .tools {
display: none;
float: right;
color: #dd4b39;
}
.todo-list > li .tools > .fa,
.todo-list > li .tools > .glyphicon,
.todo-list > li .tools > .ion {
margin-right: 5px;
cursor: pointer;
}
.todo-list > li:hover .tools {
display: inline-block;
}
.todo-list > li.done {
color: #999;
}
.todo-list > li.done .text {
text-decoration: line-through;
font-weight: 500;
}
.todo-list > li.done .label {
background: #d2d6de !important;
}
.todo-list .handle {
display: inline-block;
cursor: move;
margin: 0 5px;
}
/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/
.chat {
padding: 5px 20px 5px 10px;
}
.chat .item {
margin-bottom: 10px;
}
.chat .item:before,
.chat .item:after {
content: " ";
display: table;
}
.chat .item:after {
clear: both;
}
.chat .item > img {
width: 40px;
height: 40px;
border: 2px solid transparent;
border-radius: 50% !important;
}
.chat .item > img.online {
border: 2px solid #00a65a;
}
.chat .item > img.offline {
border: 2px solid #dd4b39;
}
.chat .item > .message {
margin-left: 55px;
margin-top: -40px;
}
.chat .item > .message > .name {
display: block;
font-weight: 600;
}
.chat .item > .attachment {
border-radius: 3px;
background: #f4f4f4;
margin-left: 65px;
margin-right: 15px;
padding: 10px;
}
.chat .item > .attachment > h4 {
margin: 0 0 5px 0;
font-weight: 600;
font-size: 14px;
}
.chat .item > .attachment > p,
.chat .item > .attachment > .filename {
font-weight: 600;
font-size: 13px;
font-style: italic;
margin: 0;
}
.chat .item > .attachment:before,
.chat .item > .attachment:after {
content: " ";
display: table;
}
.chat .item > .attachment:after {
clear: both;
}
.box-input {
max-width: 200px;
}
.modal .panel-body {
color: #444;
}
/*
* Component: Info Box
* -------------------
*/
.info-box {
display: block;
min-height: 90px;
background: #fff;
width: 100%;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
border-radius: 2px;
margin-bottom: 15px;
}
.info-box small {
font-size: 14px;
}
.info-box .progress {
background: rgba(0, 0, 0, 0.2);
margin: 5px -10px 5px -10px;
height: 2px;
}
.info-box .progress,
.info-box .progress .progress-bar {
border-radius: 0;
}
.info-box .progress .progress-bar {
background: #fff;
}
.info-box-icon {
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
display: block;
float: left;
height: 90px;
width: 90px;
text-align: center;
font-size: 45px;
line-height: 90px;
background: rgba(0, 0, 0, 0.2);
}
.info-box-icon > img {
max-width: 100%;
}
.info-box-content {
padding: 5px 10px;
margin-left: 90px;
}
.info-box-number {
display: block;
font-weight: bold;
font-size: 18px;
}
.progress-description,
.info-box-text {
display: block;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.info-box-text {
text-transform: uppercase;
}
.info-box-more {
display: block;
}
.progress-description {
margin: 0;
}
/*
* Component: Timeline
* -------------------
*/
.timeline {
position: relative;
margin: 0 0 30px 0;
padding: 0;
list-style: none;
}
.timeline:before {
content: '';
position: absolute;
top: 0px;
bottom: 0;
width: 4px;
background: #ddd;
left: 31px;
margin: 0;
border-radius: 2px;
}
.timeline > li {
position: relative;
margin-right: 10px;
margin-bottom: 15px;
}
.timeline > li:before,
.timeline > li:after {
content: " ";
display: table;
}
.timeline > li:after {
clear: both;
}
.timeline > li > .timeline-item {
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
border-radius: 3px;
margin-top: 0px;
background: #fff;
color: #444;
margin-left: 60px;
margin-right: 15px;
padding: 0;
position: relative;
}
.timeline > li > .timeline-item > .time {
color: #999;
float: right;
padding: 10px;
font-size: 12px;
}
.timeline > li > .timeline-item > .timeline-header {
margin: 0;
color: #555;
border-bottom: 1px solid #f4f4f4;
padding: 10px;
font-size: 16px;
line-height: 1.1;
}
.timeline > li > .timeline-item > .timeline-header > a {
font-weight: 600;
}
.timeline > li > .timeline-item > .timeline-body,
.timeline > li > .timeline-item > .timeline-footer {
padding: 10px;
}
.timeline > li.time-label > span {
font-weight: 600;
padding: 5px;
display: inline-block;
background-color: #fff;
border-radius: 4px;
}
.timeline > li > .fa,
.timeline > li > .glyphicon,
.timeline > li > .ion {
width: 30px;
height: 30px;
font-size: 15px;
line-height: 30px;
position: absolute;
color: #666;
background: #d2d6de;
border-radius: 50%;
text-align: center;
left: 18px;
top: 0;
}

View File

@@ -19,5 +19,13 @@ if(!class_exists('CalendarTools')) {
}
}
public static function addLeadingZero($val)
{
if ($val < 10) {
$val = "0" . $val;
}
return $val;
}
}
}