Upgrade to v15.0.OS
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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');}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'];
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
BIN
src/images/icehrm-loader.gif
Normal file
BIN
src/images/icehrm-loader.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
@@ -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
352
src/js/signature_pad.js
Normal 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);
|
||||
@@ -218,6 +218,9 @@ $logoFileUrl = UIManager::getInstance()->getCompanyLogoUrl();
|
||||
}
|
||||
|
||||
function submitLogin(){
|
||||
try{
|
||||
localStorage.clear();
|
||||
}catch(e){}
|
||||
$("#loginForm").submit();
|
||||
}
|
||||
|
||||
|
||||
@@ -69,4 +69,8 @@ class ICEHRM_Record extends ADOdb_Active_Record{
|
||||
return array(
|
||||
);
|
||||
}
|
||||
|
||||
public function allowIndirectMapping(){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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"){
|
||||
|
||||
@@ -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>
|
||||
|
||||
9
src/templates/fields/signature.html
Normal file
9
src/templates/fields/signature.html
Normal 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>
|
||||
@@ -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;
|
||||
}
|
||||
@@ -19,5 +19,13 @@ if(!class_exists('CalendarTools')) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static function addLeadingZero($val)
|
||||
{
|
||||
if ($val < 10) {
|
||||
$val = "0" . $val;
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user