Compare commits

..

3 Commits

Author SHA1 Message Date
Alan Cell
5df15d39c1 Example usage of IceHrm model classes 2020-11-13 04:47:50 +01:00
Alan Cell
143bcac1f9 Custom tasks extension, basic implementation 2020-11-12 08:06:36 +01:00
Alan Cell
84548c4f63 Ability to add custom modules 2020-11-12 05:51:31 +01:00
24 changed files with 842 additions and 408 deletions

View File

@@ -5,7 +5,7 @@ if(!file_exists('config.php')){
} }
include ('config.php'); include ('config.php');
if(!isset($_REQUEST['g']) || !isset($_REQUEST['n'])){ if(!isset($_REQUEST['g']) || !isset($_REQUEST['n'])){
header("Location:".CLIENT_BASE_URL."login.php"); header("Location:".CLIENT_BASE_URL."login.php");
exit(); exit();
} }
$group = $_REQUEST['g']; $group = $_REQUEST['g'];
@@ -14,9 +14,16 @@ $name= $_REQUEST['n'];
$groups = array('admin','modules'); $groups = array('admin','modules');
if($group == 'admin' || $group == 'modules'){ if($group == 'admin' || $group == 'modules'){
$name = str_replace("..","",$name); $name = str_replace("..","",$name);
$name = str_replace("/","",$name); $name = str_replace("/","",$name);
include APP_BASE_PATH.'/'.$group.'/'.$name.'/index.php'; include APP_BASE_PATH.'/'.$group.'/'.$name.'/index.php';
}else if ($group == 'extension'){
$name = str_replace("..","",$name);
$name = str_replace("/","",$name);
$moduleName = $name;
$moduleGroup = 'extensions';
$extensionIndex = APP_BASE_PATH.'/../extensions/'.$name.'/web/index.php';
include APP_BASE_PATH.'extensions/wrapper.php';
}else{ }else{
exit(); exit();
} }

View File

@@ -13,10 +13,10 @@ if(!defined('HOME_LINK_OTHERS')){
} }
//Version //Version
define('VERSION', '28.2.0.OS'); define('VERSION', '28.1.1.OS');
define('CACHE_VALUE', '28.2.0.OS.2020-11130243'); define('CACHE_VALUE', '28.1.1.OS.2020-11071143');
define('VERSION_NUMBER', '280200'); define('VERSION_NUMBER', '280101');
define('VERSION_DATE', '13/11/2020'); define('VERSION_DATE', '07/11/2020');
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');} if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');}
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');} if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');}
@@ -36,3 +36,7 @@ define('ALL_CLIENT_BASE_PATH', '/var/www/icehrm.app/icehrmapp/');
define('LDAP_ENABLED', true); define('LDAP_ENABLED', true);
define('RECRUITMENT_ENABLED', false); define('RECRUITMENT_ENABLED', false);
define('APP_WEB_URL', 'https://icehrm.com'); define('APP_WEB_URL', 'https://icehrm.com');
if (!defined('EXTENSIONS_URL')) {
define('EXTENSIONS_URL', str_replace('/web/', '/extensions/', BASE_URL));
}

View File

@@ -0,0 +1,31 @@
<?php
use Classes\ExtensionManager;
use Utils\LogManager;
if (!isset($extensionIndex)) {
exit();
}
define('MODULE_PATH',APP_BASE_PATH.'extensions/'.$moduleName);
include APP_BASE_PATH.'header.php';
$extensionManager = new ExtensionManager();
$meta = $extensionManager->getExtensionMetaData($moduleName);
if (!$meta) {
LogManager::getInstance()->error("Extension metadata.json not found for $moduleName");
exit();
}
if ($meta->headless) {
LogManager::getInstance()->error("Extension running in headless mode for $moduleName");
exit();
}
?>
<script type="text/javascript" src="<?=BASE_URL.'dist/vendorReact.js'?>?v=<?=$jsVersion?>"></script>
<script type="text/javascript" src="<?=BASE_URL.'dist/vendorAntd.js'?>?v=<?=$jsVersion?>"></script>
<script type="text/javascript" src="<?=BASE_URL.'dist/vendorAntdIcons.js'?>?v=<?=$jsVersion?>"></script>
<script type="text/javascript" src="<?=BASE_URL.'dist/vendorAntv.js'?>?v=<?=$jsVersion?>"></script>
<script type="text/javascript" src="<?=BASE_URL.'dist/vendorOther.js'?>?v=<?=$jsVersion?>"></script>
<script type="text/javascript" src="<?=EXTENSIONS_URL.$moduleName.'/dist/'.$moduleName.'.js'?>?v=<?=$jsVersion?>"></script>
<?php
include $extensionIndex;
include APP_BASE_PATH.'footer.php';
?>

View File

@@ -215,6 +215,26 @@ if (defined('SYM_CLIENT')) {
<?php }?> <?php }?>
<?php foreach($extensions as $menu){?>
<?php if(count($menu['menu']) == 0){continue;}?>
<li class="treeview" ref="<?="extension_".str_replace(" ", "_", $menu['name'])?>">
<a href="#">
<i class="fa <?=!isset($mainIcons[$menu['name']])?"fa-th":$mainIcons[$menu['name']];?>"></i></i> <span><?=\Classes\LanguageManager::tran($menu['name'])?></span>
<i class="fa fa-angle-left pull-right"></i>
</a>
<ul class="treeview-menu" id="<?="extension_".str_replace(" ", "_", $menu['name'])?>">
<?php foreach ($menu['menu'] as $item){?>
<li>
<a data-turbolinks="true" href="<?=CLIENT_BASE_URL?>?g=extension&n=<?=$item['name']?>&m=<?="extension_".str_replace(" ", "_", $menu['name'])?>">
<i class="fa <?=!isset($item['icon'])?"fa-angle-double-right":$item['icon']?>"></i> <?=\Classes\LanguageManager::tran($item['label'])?>
</a>
</li>
<?php }?>
</ul>
</li>
<?php }?>
<?php <?php
if(file_exists(CLIENT_PATH.'/third_party_meta.json')){ if(file_exists(CLIENT_PATH.'/third_party_meta.json')){
$tpModules = json_decode(file_get_contents(CLIENT_PATH.'/third_party_meta.json'),true); $tpModules = json_decode(file_get_contents(CLIENT_PATH.'/third_party_meta.json'),true);

View File

@@ -291,6 +291,12 @@ foreach ($ams as $am) {
} }
} }
$extensionManager = new \Classes\ExtensionManager();
$extensionData = $extensionManager->setupExtensions();
$extensionIcons = $extensionData[0];
$extensionTemp = $extensionData[1];
$extensionMenus = array_keys($extensionIcons);
foreach ($adminModulesTemp as $k => $v) { foreach ($adminModulesTemp as $k => $v) {
ksort($adminModulesTemp[$k]); ksort($adminModulesTemp[$k]);
} }
@@ -299,6 +305,10 @@ foreach ($userModulesTemp as $k => $v) {
ksort($userModulesTemp[$k]); ksort($userModulesTemp[$k]);
} }
foreach ($extensionTemp as $k => $v) {
ksort($extensionTemp[$k]);
}
$adminIcons = json_decode(file_get_contents(CLIENT_PATH.'/admin/meta.json'), true); $adminIcons = json_decode(file_get_contents(CLIENT_PATH.'/admin/meta.json'), true);
$adminMenus = array_keys($adminIcons); $adminMenus = array_keys($adminIcons);
@@ -332,8 +342,6 @@ foreach ($userMenus as $menu) {
} }
} }
$mainIcons = array_merge($adminIcons, $userIcons);
foreach ($userModulesTemp as $k => $v) { foreach ($userModulesTemp as $k => $v) {
if (!in_array($k, $added)) { if (!in_array($k, $added)) {
$arr = array("name"=>$k,"menu"=>$userModulesTemp[$k]); $arr = array("name"=>$k,"menu"=>$userModulesTemp[$k]);
@@ -341,6 +349,25 @@ foreach ($userModulesTemp as $k => $v) {
} }
} }
$extensions = array();
foreach ($extensionMenus as $menu) {
if (isset($extensionTemp[$menu])) {
$arr = array("name"=>$menu,"menu"=>$extensionTemp[$menu]);
$extensions[] = $arr;
$added[] = $menu;
}
}
foreach ($extensionTemp as $k => $v) {
if (!in_array($k, $added)) {
$arr = array("name"=>$k,"menu"=>$extensionTemp[$k]);
$extensions[] = $arr;
}
}
// Merge icons
$mainIcons = array_merge($adminIcons, $userIcons, $extensionIcons);
//Remove modules having no permissions //Remove modules having no permissions
if (!empty($user)) { if (!empty($user)) {
if (!empty($user->user_roles)) { if (!empty($user->user_roles)) {
@@ -393,4 +420,24 @@ if (!empty($user)) {
} }
} }
} }
foreach ($extensions as $fk => $menu) {
foreach ($menu['menu'] as $key => $item) {
// If the user's once of the user roles are blacklisted for the module
$commonRoles = array_intersect($item['user_roles_blacklist'], $userRoles);
if (!empty($commonRoles)) {
unset($extensions[$fk]['menu'][$key]);
}
if (!in_array($user->user_level, $item['user_levels'])) {
if (!empty($userRoles)) {
$commonRoles = array_intersect($item['user_roles'], $userRoles);
if (empty($commonRoles)) {
unset($extensions[$fk]['menu'][$key]);
}
} else {
unset($extensions[$fk]['menu'][$key]);
}
}
}
}
} }

View File

@@ -278,4 +278,12 @@ abstract class AbstractModuleManager
{ {
BaseService::getInstance()->addCalculationHook($code, $name, $class, $method); BaseService::getInstance()->addCalculationHook($code, $name, $class, $method);
} }
public function install() {
}
public function uninstall() {
}
} }

View File

@@ -0,0 +1,143 @@
<?php
namespace Classes;
use Utils\LogManager;
class ExtensionManager
{
const GROUP = 'extension';
protected function processExtensionInDB() {
$dbModule = new \Modules\Common\Model\Module();
$extensions = $dbModule->Find("mod_group = ?", array(self::GROUP));
$extensionsInDB = [];
foreach ($extensions as $dbm) {
$extensionsInDB[$dbm->name] = $dbm;
ModuleAccessService::getInstance()->setModule($dbm->name, self::GROUP, $dbm);
}
return $extensionsInDB;
}
public function getExtensionsPath() {
return APP_BASE_PATH.'../extensions/';
}
public function getExtensionMetaData($extensionName)
{
return json_decode(file_get_contents($this->getExtensionsPath().$extensionName.'/meta.json'));
}
public function setupExtensions() {
$menu = [];
$extensions = [];
$extensionDirs = scandir($this->getExtensionsPath());
$currentLocation = 0;
$extensionsInDB = $this->processExtensionInDB();
$needToInstall = false;
foreach ($extensionDirs as $extensionDir) {
if (is_dir($this->getExtensionsPath().$extensionDir) && $extensionDir != '.' && $extensionDir != '..') {
$meta = $this->getExtensionMetaData($extensionDir);
$arr = [];
$arr['name'] = $extensionDir;
$arr['label'] = $meta->label;
$arr['icon'] = $meta->icon;
$arr['menu'] = $meta->menu[0];
$arr['order'] = 0;
$arr['status'] = 'Enabled';
$arr['user_levels'] = $meta->user_levels;
$arr['user_roles'] = isset($meta->user_roles)?$meta->user_roles:"";
$arr['model_namespace'] = $meta->model_namespace;
$arr['manager'] = $meta->manager;
// Add menu
$menu[$meta->menu[0]] = $meta->menu[1];
//Check in admin dbmodules
if (isset($extensionsInDB[$arr['name']])) {
$dbModule = $extensionsInDB[$arr['name']];
$arr['name'] = $dbModule->name;
$arr['label'] = $dbModule->label;
$arr['icon'] = $dbModule->icon;
$arr['menu'] = $dbModule->menu;
$arr['status'] = $dbModule->status;
$arr['user_levels'] = json_decode($dbModule->user_levels);
$arr['user_roles'] = empty($dbModule->user_roles)
? [] : json_decode($dbModule->user_roles);
$arr['user_roles_blacklist'] = empty($dbModule->user_roles_blacklist)
? [] : json_decode($dbModule->user_roles_blacklist);
} else {
$dbModule = new \Modules\Common\Model\Module();
$dbModule->menu = $arr['menu'];
$dbModule->name = $arr['name'];
$dbModule->label = $arr['label'];
$dbModule->icon = $arr['icon'];
$dbModule->mod_group = self::GROUP;
$dbModule->mod_order = $arr['order'];
$dbModule->status = "Enabled";
$dbModule->version = isset($meta->version)?$meta->version:"";
$dbModule->update_path = self::GROUP.">".$extensionDir;
$dbModule->user_levels = isset($meta->user_levels)?json_encode($meta->user_levels):"";
$dbModule->user_roles = isset($meta->user_roles)?json_encode($meta->user_roles):"";
$ok = $dbModule->Save();
if (!$ok) {
LogManager::getInstance()->error('Error saving module: '.$dbModule->name);
}
$needToInstall = $ok;
}
/* @var \Classes\AbstractModuleManager */
$manager = $this->includeModuleManager($extensionDir, $arr);
if ($dbModule->status == 'Disabled') {
continue;
}
if ($needToInstall) {
$manager->install();
}
$menuName = $arr['menu'];
if (!isset($extensions[$menuName])) {
$extensions[$menuName] = array();
}
if (!$meta->headless) {
if ($arr['order'] == '0' || $arr['order'] == '') {
$extensions[$menuName]["Z".$currentLocation] = $arr;
$currentLocation++;
} else {
$extensions[$arr['menu']]["A".$arr['order']] = $arr;
}
}
$initializer = $manager->getInitializer();
if ($initializer !== null) {
$initializer->setBaseService(BaseService::getInstance());
$initializer->init();
}
}
}
return [$menu, $extensions];
}
public function includeModuleManager($name, $data)
{
include($this->getExtensionsPath().$name.'/'.$name.'.php');
$moduleManagerClass = $data['manager'];
/* @var \Classes\AbstractModuleManager $moduleManagerObj*/
$moduleManagerObj = new $moduleManagerClass();
$moduleManagerObj->setModuleObject($data);
$moduleManagerObj->setModuleType(self::GROUP);
$moduleManagerObj->setModulePath(CLIENT_PATH.'/'.self::GROUP.'/'.$name);
\Classes\BaseService::getInstance()->addModuleManager($moduleManagerObj);
return $moduleManagerObj;
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Classes;
abstract class IceExtension extends AbstractModuleManager
{
public function initializeUserClasses()
{
// TODO: Implement initializeUserClasses() method.
}
public function initializeFieldMappings()
{
// TODO: Implement initializeFieldMappings() method.
}
public function initializeDatabaseErrorMappings()
{
// TODO: Implement initializeDatabaseErrorMappings() method.
}
}

View File

@@ -8,6 +8,8 @@
namespace Classes\Migration; namespace Classes\Migration;
use Utils\LogManager;
abstract class AbstractMigration abstract class AbstractMigration
{ {
protected $file; protected $file;
@@ -16,7 +18,7 @@ abstract class AbstractMigration
protected $lastError; protected $lastError;
public function __construct($file) public function __construct($file = null)
{ {
$this->file = $file; $this->file = $file;
} }
@@ -50,6 +52,7 @@ abstract class AbstractMigration
$ret = $this->db()->Execute($sql); $ret = $this->db()->Execute($sql);
if (!$ret) { if (!$ret) {
$this->lastError = $this->db()->ErrorMsg(); $this->lastError = $this->db()->ErrorMsg();
LogManager::getInstance()->error('Error in migration: '.$this->lastError);
} }
return $ret; return $ret;
} }

View File

@@ -12,7 +12,7 @@ class ModuleAccess
* @param $name * @param $name
* @param $group * @param $group
*/ */
public function __construct($name, $group) public function __construct($name, $group = 'extension')
{ {
$this->name = $name; $this->name = $name;
$this->group = $group; $this->group = $group;

1
extensions/gitkeep Executable file
View File

@@ -0,0 +1 @@
git keep

View File

@@ -0,0 +1,13 @@
{
"label": "My Tasks",
"menu": ["Tasks", "fa-list"],
"icon": "fa-tasks",
"user_levels": [
"Admin",
"Manager",
"User"
],
"model_namespace": "\\Tasks\\Model",
"manager": "\\Tasks\\Extension",
"headless": false
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Tasks;
use Classes\IceExtension;
class Extension extends IceExtension
{
public function install() {
$migration = new Migration();
return $migration->up();
}
public function uninstall() {
$migration = new Migration();
return $migration->down();
}
public function setupModuleClassDefinitions()
{
}
public function setupRestEndPoints()
{
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace Tasks;
use Classes\Migration\AbstractMigration;
class Migration extends AbstractMigration
{
public function up()
{
$sql = <<<'SQL'
create table `Tasks` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`employee` bigint(20) NULL,
`name` varchar(250) NOT NULL,
`description` TEXT NULL,
`attachment` varchar(100) NULL,
`created` DATETIME default NULL,
`updated` DATETIME default NULL,
primary key (`id`),
CONSTRAINT `Fk_EmployeeTasks_Employees` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) engine=innodb default charset=utf8;
SQL;
return $this->executeQuery($sql);
}
public function down()
{
$sql = <<<'SQL'
DROP TABLE IF EXISTS `Tasks`;
SQL;
return $this->executeQuery($sql);
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Tasks\Model;
use Classes\ModuleAccess;
use Model\BaseModel;
class Task extends BaseModel
{
public $table = 'Tasks';
public function getAdminAccess()
{
return ["get","element","save","delete"];
}
public function getManagerAccess()
{
return ["get","element"];
}
public function getUserAccess()
{
return [];
}
public function getAnonymousAccess()
{
return [];
}
public function getModuleAccess()
{
return [
new ModuleAccess('tasks'),
];
}
}

View File

@@ -0,0 +1,4 @@
<?php
require_once __DIR__.'/src/Tasks/Extension.php';
require_once __DIR__.'/src/Tasks/Migration.php';
require_once __DIR__.'/src/Tasks/Model/Task.php';

View File

@@ -0,0 +1,33 @@
<?php
$user = \Classes\BaseService::getInstance()->getCurrentUser();
echo "Welcome ".$user->username."<br/>";
echo "Creating a task <br/>";
$task = new \Tasks\Model\Task();
$taskName = 'Task-'.rand(rand(0, 100), 50000);
$task->name = $taskName;
$task->employee = $user->employee;
$task->description = $taskName.' description';
$task->created = date('Y-m-d H:i:s');
$task->updated = date('Y-m-d H:i:s');
/**
* Saving the task, $ok will be false if there were any error during the creation
*/
$ok = $task->Save();
if (!$ok) {
echo "Error: ".$task->ErrorMsg()." <br/>";
}
echo "Find last task <br/>";
$taskFromDB = new \Tasks\Model\Task();
/**
* You can use load method to load the first matching task into an empty model
*/
$taskFromDB->Load('name = ?', [$taskName]);
var_dump($taskFromDB);

View File

@@ -359,6 +359,48 @@ gulp.task('modules-js', (done) => {
.pipe(gulp.dest('./web/dist')); .pipe(gulp.dest('./web/dist'));
}); });
gulp.task('extension-js', (done) => {
let extension = process.argv.filter((item) => item.substr(0, 3) === '--x');
if (extension.length === 1) {
extension = extension[0].substr(3);
}
// map them to our stream function
return browserify({
entries: [`extensions/${extension}/web/js/index.js`],
basedir: '.',
debug: true,
cache: {},
packageCache: {},
})
.external(vendorsFlat)
.transform('babelify', {
plugins: [
['@babel/plugin-proposal-class-properties', { loose: true }],
],
presets: ['@babel/preset-env', '@babel/preset-react'],
extensions: ['.js', '.jsx'],
})
.transform(require('browserify-css'))
.bundle()
.pipe(source(`${extension}.js`))
.pipe(buffer())
.pipe(ifElse(!isProduction, () => sourcemaps.init({ loadMaps: true })))
.pipe(ifElse(isProduction, () => uglifyes(
{
compress: true,
mangle: {
reserved: [],
},
},
)))
.pipe(ifElse(isProduction, () => javascriptObfuscator({
compact: true,
})))
.pipe(ifElse(!isProduction, () => sourcemaps.write('./')))
.pipe(gulp.dest(`./extensions/${extension}/dist`));
});
gulp.task('watch', () => { gulp.task('watch', () => {
gulp.watch('web/admin/src/*/*.js', gulp.series('admin-js')); gulp.watch('web/admin/src/*/*.js', gulp.series('admin-js'));

View File

@@ -1,19 +1,3 @@
# Release Notes IceHrm Open Source
## Release note v28.2.0.OS
### New features
* 🦠 💉 Custom extensions [https://icehrm.gitbook.io/icehrm/developer-guide/creating-first-extension](https://icehrm.gitbook.io/icehrm/developer-guide/creating-first-extension)
## Release note v28.1.1.OS
### 🐛 Bug fixes
* Fixing inability to filter employee documents
* Fixed the issue with selecting projects when adding timesheets details
* Fix issues occurred due to incorrectly configured API
## Release note v28.1.0.OS ## Release note v28.1.0.OS
### 🧲 New features ### 🧲 New features
@@ -32,477 +16,441 @@
* New REST endpoints for employee qualifications * New REST endpoints for employee qualifications
### 🐛 Bug fixes ### 🐛 Bug fixes
* Fixed, issue with managers being able to create performance reviews for employees who are not their direct reports * Fixed, issue with managers being able to create performance reviews for employees who are not their direct reports
* Fixed, issues related to using full profile image instead of using smaller version of profile image * Fixed, issues related to using full profile image instead of using smaller version of profile image
* Changing third gender to other * Changing third gender to other
* Improvements and fixes for internal frontend data caching * Improvements and fixes for internal frontend data caching
## Release note v27.0.2.OS
This fixes some major issues found in v27.0.1.OS
### 🐛 Bug fixes
* Filtering across whole application was broken and now it's fixed
* Fixed the issue related to photo not being shown to the admin when photo attendance is enabled
### 🧑🏻‍💻 For developers
* We have added support for vagrant development environment based on Debian 10 / PHP 7.3 \(with Xdebug\) / Nginx / MySQL
## Release note v27.0.0.OS ## Release note v27.0.0.OS
### New features ### New features
* Employee document management is now available for open-source version * Employee document management is now available for open-source version
* UI/UX improvements \(new fonts / better spacing\) * UI/UX improvements (new fonts / better spacing)
* Payroll module improvements * Payroll module improvements
* Security improvements to password policy * Security improvements to password policy
* Albanian language is now available * Albanian language is now available
* Ability to deploy using docker * Ability to deploy using docker
### For developers ### For developers
* Developer environment based on docker [https://www.youtube.com/watch?v=sz8OV_ON6S8](https://www.youtube.com/watch?v=sz8OV_ON6S8)
* Developer environment based on docker [https://www.youtube.com/watch?v=sz8OV\_ON6S8](https://www.youtube.com/watch?v=sz8OV_ON6S8)
* [Developer guide](https://icehrm.gitbook.io/icehrm/developer-guide/create-new-module) * [Developer guide](https://icehrm.gitbook.io/icehrm/developer-guide/create-new-module)
* Fully supports all php versions &gt;= 5.6 upto v7.3 \(php 5.6 support is deprecated and not recommended\) * Fully supports all php versions >= 5.6 upto v7.3 (php 5.6 support is deprecated and not recommended)
### Bug fixes ### Bug fixes
* Fixes to newly found vulnerabilities (https://github.com/gamonoid/icehrm/issues/213): credits to: [Talos](https://talosintelligence.com/)
* Fixes to newly found vulnerabilities \([https://github.com/gamonoid/icehrm/issues/213](https://github.com/gamonoid/icehrm/issues/213)\): credits to: [Talos](https://talosintelligence.com/)
* Fixed the travel request approval for managers * Fixed the travel request approval for managers
* Fixed the issue with attendance source IP display * Fixed the issue with attendance source IP display
* Fixing Api issues in PHP 7.3 * Fixing Api issues in PHP 7.3
## Release note v26.6.0.OS
Release note v26.6.0.OS
------------------------
### Features ### Features
* Some Improvements to UI such as updating Icons and upgrading font-awesome to its latest version
* Some Improvements to UI such as updating Icons and upgrading font-awesome to its latest version * Tracking IP and location of the employee when marking attendance, this is done when updating attendance via mobile
* Tracking IP and location of the employee when marking attendance, this is done when updating attendance via mobile * Ability to control location tracking via mobile using server side settings
* Ability to control location tracking via mobile using server side settings * Improvements to translations
* Improvements to translations * Compatible with location tracking with icehrm mobile app
### Mobile App ### Mobile App
* This release is coupled with mobile application release on AppStore (https://apple.co/2Yrtxoy) and Google Play (http://bit.ly/2OkMmKe)
* This release is coupled with mobile application release on AppStore \([https://apple.co/2Yrtxoy](https://apple.co/2Yrtxoy)\) and Google Play \([http://bit.ly/2OkMmKe](http://bit.ly/2OkMmKe)\)
### Fixes ### Fixes
* Order projects by name on Timesheet project listing (This is to make it easier to edit timesheets with many projects)
* Order projects by name on Timesheet project listing \(This is to make it easier to edit timesheets with many projects\) * Link home page user profile to employee profile update page
* Link home page user profile to employee profile update page * Fix issues related to configuring Api with mobile app
* Fix issues related to configuring Api with mobile app
### Security Improvements ### Security Improvements
* Upgrade npm missing dependencies
* Upgrade npm missing dependencies
Release note v26.2.0.OS
## Release note v26.2.0.OS ------------------------
### Features ### Features
* Add staff directory module
* Update client-side js to ES6
* Compatible with IceHrm Mobile App
* Use npm libraries when possible
* Add gulp build for frontend assets
* Allow generating QR code with rest api key (https://github.com/gamonoid/icehrm/issues/169)
* Updated readme for development setup with vagrant
* Add staff directory module
* Update client-side js to ES6
* Compatible with IceHrm Mobile App
* Use npm libraries when possible
* Add gulp build for frontend assets
* Allow generating QR code with rest api key \([https://github.com/gamonoid/icehrm/issues/169](https://github.com/gamonoid/icehrm/issues/169)\)
* Updated readme for development setup with vagrant
### Fixes ### Fixes
* Add missing employee details report
* Fix: Labels of 'Employee Custom Fields' not displayed (https://github.com/gamonoid/icehrm/issues/146)
* Fix: Work week for all counties can not be edited
* Fix: Custom fields are not shown under employee profile (https://github.com/gamonoid/icehrm/issues/159)
* Fix: Additional buttons shown below timesheet list (https://github.com/gamonoid/icehrm/issues/171)
* Updates to Italian translations (https://github.com/gamonoid/icehrm/pull/166) by https://github.com/nightwatch75
* Add missing employee details report
* Fix: Labels of 'Employee Custom Fields' not displayed \([https://github.com/gamonoid/icehrm/issues/146](https://github.com/gamonoid/icehrm/issues/146)\) Release note v24.0.0.OS
* Fix: Work week for all counties can not be edited ------------------------
* Fix: Custom fields are not shown under employee profile \([https://github.com/gamonoid/icehrm/issues/159](https://github.com/gamonoid/icehrm/issues/159)\)
* Fix: Additional buttons shown below timesheet list \([https://github.com/gamonoid/icehrm/issues/171](https://github.com/gamonoid/icehrm/issues/171)\)
* Updates to Italian translations \([https://github.com/gamonoid/icehrm/pull/166](https://github.com/gamonoid/icehrm/pull/166)\) by [https://github.com/nightwatch75](https://github.com/nightwatch75)
## Release note v24.0.0.OS
### Features ### Features
* Allow passing additional parameters to payroll predefined methods
* Allow passing additional parameters to payroll predefined methods * Pass leave type name in function field to get leave count for a given type
* Pass leave type name in function field to get leave count for a given type * Add employee name to payroll report
* Add employee name to payroll report * Show supervisor name on employee profile
* Show supervisor name on employee profile * Add custom fields to employee report
* Add custom fields to employee report * Add filter by status feature to subordinate time sheets
* Add filter by status feature to subordinate time sheets
### Security Fixes ### Security Fixes
* Fix missing login form CSRF token
* Fix missing login form CSRF token * Fix risky usage of hashed password in request
* Fix risky usage of hashed password in request * Fixing permission issues on module access for each user level
* Fixing permission issues on module access for each user level * Prevent manager from accessing sensitive user records
* Prevent manager from accessing sensitive user records
### Other Fixes ### Other Fixes
* Hide employee salary from managers
* Hide employee salary from managers * Prevent manager from accessing audit, cron and notifications
* Prevent manager from accessing audit, cron and notifications * Prevent managers from deleting employees
* Prevent managers from deleting employees * Validate overtime start and end times
* Validate overtime start and end times * Fix issue: employee can download draft payroll
* Fix issue: employee can download draft payroll
Release note v23.0.1.OS
## Release note v23.0.1.OS ------------------------
This release include some very critical security fixes. We recommend upgrading your installation to latest release. This release include some very critical security fixes. We recommend upgrading your installation to latest release.
### Fixes ### Fixes
* Fix missing login form CSRF token
* Fix missing login form CSRF token * Fix risky usage of hashed password in request
* Fix risky usage of hashed password in request
Release note v23.0.0.OS
## Release note v23.0.0.OS ------------------------
### Features ### Features
* Loading last used module when revisiting application
* Finnish language support (Beta)
* Improvements to German, Italian and Chinese language translations
* Allow quickly switching languages
* Improvements to security for preventing possible LFI attacks
* Allow manual date inputs
* Custom fields for travel requests
* Allow importing approved overtime hours into payroll
* Add date and time masks
### Fixes
* Fix logout cookie issue, by clearing remember me cookie when logging out
* Improve privacy for GDPR
* Improvements to file upload field
* Fix issue: attendance rest end point not working on php 5.6
* Loading last used module when revisiting application Release note v22.0.0.OS
* Finnish language support \(Beta\) ------------------------
* Improvements to German, Italian and Chinese language translations ### Features
* Allow quickly switching languages * Improvements to module naming
* Improvements to security for preventing possible LFI attacks
* Allow manual date inputs ### Fixes
* Custom fields for travel requests * Fix issue: filter dialog default values are not selected
* Allow importing approved overtime hours into payroll * Fix issue: department head can be an employee outside the department
* Add date and time masks * Fix issue: department head or supervisor (who has manager leave access) can't use switch employee feature
* Fix issue: employee name is not visible on report if middle name is empty
Release note v21.1.0.OS
------------------------
### Features
* UI improvements (help button and error messages)
* Allow adding placeholders to text fields
* Improvements to German Translations
### Fixes
* Fixing notification issues
Release note v21.0.0.OS
------------------------
### Features
* Fully compatible with php 7.1
* Add Net_SMTP via composer (no pear installation needed)
### Fixes
* Fixes for web servers not supporting JSON in GET request
Release note v21.0.0.OS
------------------------
### Features
* Fully compatible with php 7.1
* Add Net_SMTP via composer (no pear installation needed)
### Fixes
* Fixes for web servers not supporting JSON in GET request
Release note v20.3.0.PRO
------------------------
### Features
* Employee and Attendance REST Api Released
* Import/Export for Payroll Configurations
* Ability to import employee approved time sheet hours to payroll
* Swift Mailer based SMTP support (no need to install Net_SMTP anymore)
* Add direct Edit button on employee list
### Fixes
* Fix DB connection issues due to special characters in password
* Fixes for custom field saving issues in mysql v5.7.x
Release note v20.2
------------------
### Fixes
* Fix for resetting modules
Release note v20.1
------------------
### Features
* Compatible with MySQL 5.7 Strict Mode
* PSR-2 compatible code
* Employee History Module
* Staff Directory
### Fixes
* Fix: password reset not working
* Fix: limiting selectable countries via Settings
* Fix for resetting modules
Release note v20.0
------------------
### Features
* Payroll Module
* Compatible with MySQL 5.7 Strict Mode
* Namespaced Classes
* LDAP Module
### Fixes
* Fix: limiting selectable countries via Settings
Release note v19.0
------------------
### Features
* Development environment
* Overtime module
* Department heads who can manage all employees attached to a company structure
Release note v18.0
------------------
### Features
* Translations (beta) for German, French, Polish, Italian, Sinhala, Chinese, Japanese, Hindi and Spanish
* PDF Reports
* Ability to specify department heads
* Add advanced custom fields to employees via UI
* Allow indirect admins to approve travel requests
* Adding more languages to Language meta data table
* Improvements to report module
* Ability to select sections for placing custom fields on employee detail view screen
* Introducing clone button
* Unlimited custom fields for employees
* PDF report for monitoring time employee spent on projects
* Report files module - Allow downloading all previously generated reports
### Fixes ### Fixes
* Fix: subordinates are not showing beyond first page issue.
* Fix logout cookie issue, by clearing remember me cookie when logging out
* Improve privacy for GDPR
* Improvements to file upload field
* Fix issue: attendance rest end point not working on php 5.6
## Release note v22.0.0.OS Release note v16.1
------------------
### Fixes
* Fix LDAP user login issue
* Allow creating users with username having dot and dash
Release note v16.0
------------------
### Features
* Advanced Employee Management Module is now included in IceHrm Open Source Edition
* LDAP Module which was only available in IceHrm Enterprise is now included in open source also
* Initial implementation of icehrm REST Api for reading employee details
* Improvements to data filtering
* Multiple tabs for settings module
* Overtime reports - now its possible to calculate overtime for employees.compatible with US overtime rules
* Logout the user if tried accessing an unauthorized module
* Setting for updating module names
### Fixes
* Fix issue: classes should be loaded even the module is disabled
* Deleting the only Admin user is not allowed
* Fixes for handling non UTF-8
* Fix for non-mandatory select boxes are shown as mandatory
Release note v15.2
------------------
### Features ### Features
* Overtime Reports
* Improvements to module naming * Overtime calculation for california
### Fixes ### Fixes
* Fix issue: uncaught error when placeholder value is empty
* Log email sending success status
* Fix broken longer company name issue
* Make the application accessible when client on an intranet with no internet connection
* Fix issue: when a module is disabled other modules depend on it stops working
* Fix issue: filter dialog default values are not selected
* Fix issue: department head can be an employee outside the department
* Fix issue: department head or supervisor \(who has manager leave access\) can't use switch employee feature
* Fix issue: employee name is not visible on report if middle name is empty
## Release note v21.1.0.OS Release note v15.0
------------------
### Features ### Features
* Clear HTML5 local storage when logging in and switching users
* UI improvements \(help button and error messages\) * Showing a loading message while getting data from server
* Allow adding placeholders to text fields * Adding a new field to show total time of each time sheet
* Improvements to German Translations * New report added for listing Employee Time Sheets
* Company logo uploaded via settings will be used for all email headers
### Fixes ### Fixes
* Fix issue: default module URL is incorrect for Employees
* Fix date parsing issue in time sheets
* AWS phar is included only when required
* Fixing notification issues Release note v14.1
------------------
## Release note v21.0.0.OS
### Features ### Features
* Add Quick access menu
* Fully compatible with php 7.1
* Add Net\_SMTP via composer \(no pear installation needed\)
### Fixes ### Fixes
* Fix issue: salary module not loading
* Add travel report
* Fixes for web servers not supporting JSON in GET request Release note v14.0
------------------
## Release note v21.0.0.OS
### Features ### Features
* IceHrm is now fully compatible with PHP 7
* Fully compatible with php 7.1 * Improvements to travel management module to change the process of applying for travel requests
* Add Net\_SMTP via composer \(no pear installation needed\) * New report add for getting travel requests
* Improvements to user interface
* Bunch of UI improvements including changing menu order and font sizes
* Add a setting to use server time for time zone defined on department that a user is attached to create new attendance records
* Improvements to admin/manager and user dashboard
* Managers allowed to view/add/edit employee documents
* New reports added for employee expenses and travel
### Fixes ### Fixes
* Fix unavailable help links
* Fixes for web servers not supporting JSON in GET request
## Release note v20.3.0.PRO Release note v13.4
-----------------
### Features ### Features
* Employee and Attendance REST Api Released
* Import/Export for Payroll Configurations
* Ability to import employee approved time sheet hours to payroll
* Swift Mailer based SMTP support \(no need to install Net\_SMTP anymore\)
* Add direct Edit button on employee list
### Fixes ### Fixes
* Fix employee leave report leave type field
* Fix DB connection issues due to special characters in password Release note v13.0
* Fixes for custom field saving issues in mysql v5.7.x -----------------
## Release note v20.2
### Fixes
* Fix for resetting modules
## Release note v20.1
### Features ### Features
* Recruitment module
* Compatible with MySQL 5.7 Strict Mode * Allow managers to edit attendance of direct report employees
* PSR-2 compatible code
* Employee History Module
* Staff Directory
### Fixes ### Fixes
* Employee switching issue fixed
* Fix terminated employee labels
* Fix issue with punch-in
* Fix: password reset not working Release note v12.6
* Fix: limiting selectable countries via Settings -----------------
* Fix for resetting modules
## Release note v20.0
### Features ### Features
* Charts module
* Payroll Module * Code level security improvements
* Compatible with MySQL 5.7 Strict Mode
* Namespaced Classes
* LDAP Module
### Fixes ### Fixes
* Employee switching issue fixed
* Fix: limiting selectable countries via Settings
## Release note v19.0 Release note v11.1
-----------------
### Features ### Features
* Add/Edit or remove employee fields
* Development environment
* Overtime module
* Department heads who can manage all employees attached to a company structure
## Release note v18.0 Release note v11.0
-----------------
### Features ### Features
* Employee data archiving
* Translations \(beta\) for German, French, Polish, Italian, Sinhala, Chinese, Japanese, Hindi and Spanish * Leave cancellation requests
* PDF Reports * Adding view employee feature
* Ability to specify department heads
* Add advanced custom fields to employees via UI
* Allow indirect admins to approve travel requests
* Adding more languages to Language meta data table
* Improvements to report module
* Ability to select sections for placing custom fields on employee detail view screen
* Introducing clone button
* Unlimited custom fields for employees
* PDF report for monitoring time employee spent on projects
* Report files module - Allow downloading all previously generated reports
### Fixes ### Fixes
* Improvements to date time pickers
* Fix: subordinates are not showing beyond first page issue.
## Release note v16.1 Release note v10.1
-----------------
### Fixes
* Fix LDAP user login issue
* Allow creating users with username having dot and dash
## Release note v16.0
### Features ### Features
* Integration with ice-framework (http://githun.com/thilinah/ice-framework)
* Option for only allow users to add an entry to a timesheet only if they have marked atteandance for the selected period
* Restricting availability of leave types to employees using leave groups
* Admins and add notes to employees
* Advanced Employee Management Module is now included in IceHrm Open Source Edition Release note v9.1
* LDAP Module which was only available in IceHrm Enterprise is now included in open source also -----------------
* Initial implementation of icehrm REST Api for reading employee details
* Improvements to data filtering
* Multiple tabs for settings module
* Overtime reports - now its possible to calculate overtime for employees.compatible with US overtime rules
* Logout the user if tried accessing an unauthorized module
* Setting for updating module names
### Fixes ### Fixes
* Add missing S3FileSystem class
* Fix issue: passing result of a method call directly into empty method is not supported in php v5.3
* Fix issue: classes should be loaded even the module is disabled
* Deleting the only Admin user is not allowed
* Fixes for handling non UTF-8
* Fix for non-mandatory select boxes are shown as mandatory
## Release note v15.2 Release note v9.0
-----------------
### Features ### Features
* New user interface
* Decimal leave counts supported
Update icehrm v8.4 to v9.0
--------------------------
* Overtime Reports * Make a backup of your icehrm db
* Overtime calculation for california * Run db script "icehrmdb_update_v8.4_to_v9.0.sql" which can be found inside script folder of icehrm_v9.0
* remove all folders except app folder in icehrm root folder
* copy all folders except app folder from new installation to icehrm root folder
Release note v8.4
-----------------
### Fixes ### Fixes
* Fix leave carry forward rounding issues
* Fix issue: select2 default value not getting set for select2
* Fix issue: email not sent when admin changing leave status
* Fix issue: uncaught error when placeholder value is empty Release note v8.3
* Log email sending success status -----------------
* Fix broken longer company name issue
* Make the application accessible when client on an intranet with no internet connection
* Fix issue: when a module is disabled other modules depend on it stops working
## Release note v15.0
### Features
* Clear HTML5 local storage when logging in and switching users
* Showing a loading message while getting data from server
* Adding a new field to show total time of each time sheet
* New report added for listing Employee Time Sheets
* Company logo uploaded via settings will be used for all email headers
### Fixes ### Fixes
* Fix user table issue on windows, this will resolve errors such as: (Note that this fix has no effect on unix based installations)
* Admin not able to view user uploaded documents
* Admin not able to upload documants for users
* Admin can not view employee attendance records
* Employee projects can not be added
* Fix issue: default module URL is incorrect for Employees
* Fix date parsing issue in time sheets
* AWS phar is included only when required
## Release note v14.1 Release note v8.2
-----------------
### Features ### Features
* Add Quick access menu
### Fixes
* Fix issue: salary module not loading
* Add travel report
## Release note v14.0
### Features
* IceHrm is now fully compatible with PHP 7
* Improvements to travel management module to change the process of applying for travel requests
* New report add for getting travel requests
* Improvements to user interface
* Bunch of UI improvements including changing menu order and font sizes
* Add a setting to use server time for time zone defined on department that a user is attached to create new attendance records
* Improvements to admin/manager and user dashboard
* Managers allowed to view/add/edit employee documents
* New reports added for employee expenses and travel
### Fixes
* Fix unavailable help links
## Release note v13.4
### Features
### Fixes
* Fix employee leave report leave type field
## Release note v13.0
### Features
* Recruitment module
* Allow managers to edit attendance of direct report employees
### Fixes
* Employee switching issue fixed
* Fix terminated employee labels
* Fix issue with punch-in
## Release note v12.6
### Features
* Charts module
* Code level security improvements
### Fixes
* Employee switching issue fixed
## Release note v11.1
### Features
* Add/Edit or remove employee fields
## Release note v11.0
### Features
* Employee data archiving
* Leave cancellation requests
* Adding view employee feature
### Fixes
* Improvements to date time pickers
## Release note v10.1
### Features
* Integration with ice-framework \([http://githun.com/thilinah/ice-framework](http://githun.com/thilinah/ice-framework)\)
* Option for only allow users to add an entry to a timesheet only if they have marked atteandance for the selected period
* Restricting availability of leave types to employees using leave groups
* Admins and add notes to employees
## Release note v9.1
### Fixes
* Add missing S3FileSystem class
* Fix issue: passing result of a method call directly into empty method is not supported in php v5.3
## Release note v9.0
### Features
* New user interface
* Decimal leave counts supported
## Update icehrm v8.4 to v9.0
* Make a backup of your icehrm db
* Run db script "icehrmdb\_update\_v8.4\_to\_v9.0.sql" which can be found inside script folder of icehrm\_v9.0
* remove all folders except app folder in icehrm root folder
* copy all folders except app folder from new installation to icehrm root folder
## Release note v8.4
### Fixes
* Fix leave carry forward rounding issues
* Fix issue: select2 default value not getting set for select2
* Fix issue: email not sent when admin changing leave status
## Release note v8.3
### Fixes
* Fix user table issue on windows, this will resolve errors such as: \(Note that this fix has no effect on unix based installations\)
* Admin not able to view user uploaded documents
* Admin not able to upload documants for users
* Admin can not view employee attendance records
* Employee projects can not be added
## Release note v8.2
### Features
* Instance verification added * Instance verification added
## Release note v8.1 Release note v8.1
-----------------
### Fixes ### Fixes
* Fixed bug that caused a fatal error in php v5.4 * Fixed bug that caused a fatal error in php v5.4
* aws2.7.11 phar file replaced by a aws2.7.11 extracted files * aws2.7.11 phar file replaced by a aws2.7.11 extracted files
* old aws sdk removed * old aws sdk removed
## Release note v8.0 Release note v8.0
-----------------
### Features ### Features
* Admin dashbord module * Admin dashbord module
* If the employee joined in current leave period, his leave entitlement is calculated proportional to joined date * If the employee joined in current leave period, his leave entitlement is calculated proportional to joined date
* Improvements to reporting module * Improvements to reporting module
@@ -514,22 +462,22 @@ This release include some very critical security fixes. We recommend upgrading y
* Upgrade aws sdk to v2.7.11 * Upgrade aws sdk to v2.7.11
* Allow employees to change password * Allow employees to change password
* Use only the email address defined under user for sending mails * Use only the email address defined under user for sending mails
* Making work\_email and private\_email fields optional * Making work_email and private_email fields optional
### Fixes ### Fixes
* Upload dialog close button issue fixed * Upload dialog close button issue fixed
## Release note v7.2 Release note v7.2
-----------------
### Fixes ### Fixes
* Some critical vulnerabilities are fixed as recommend by http://zeroscience.mk/en/
* Some critical vulnerabilities are fixed as recommend by [http://zeroscience.mk/en/](http://zeroscience.mk/en/) Release note v7.1
-----------------
## Release note v7.1
### Features ### Features
* Improved company structure graph * Improved company structure graph
* Leave notes implementation <20> Supervisor can add a note when approving or rejecting leaves * Leave notes implementation <20> Supervisor can add a note when approving or rejecting leaves
* Filtering support * Filtering support
@@ -538,20 +486,20 @@ This release include some very critical security fixes. We recommend upgrading y
* Add ability to disable employee information editing * Add ability to disable employee information editing
### Fixes ### Fixes
* Make loans editable only by admin * Make loans editable only by admin
* Fix: permissions not getting applied to employee documents * Fix: permissions not getting applied to employee documents
* Fix error adding employee documents when no user assigned to the admin * Fix error adding employee documents when no user assigned to the admin
### Code Quality ### Code Quality
* Moving all module related code and data into module folders * Moving all module related code and data into module folders
## Release note v6.1 Release note v6.1
-----------------
Leave carry forwared related isue fixed Leave carry forwared related isue fixed
## Release note v6.0 Release note v6.0
-----------------
* Features * Features
* Notifications for leaves and timesheets * Notifications for leaves and timesheets
@@ -565,18 +513,21 @@ Leave carry forwared related isue fixed
* Admin can make all projects available to employees or just the set of prjects assigned to them using Setting "Projects: Make All Projects Available to Employees" * Admin can make all projects available to employees or just the set of prjects assigned to them using Setting "Projects: Make All Projects Available to Employees"
* Employee document, date added field can not be changed by the employee anymore * Employee document, date added field can not be changed by the employee anymore
* About dialog added for admins * About dialog added for admins
* Fixes * Fixes
* Fix default employee delete issue \(when the default employee is deleted the admin user attached to it also get deleted\) * Fix default employee delete issue (when the default employee is deleted the admin user attached to it also get deleted)
* Fix user duplicate email issue * Fix user duplicate email issue
* Fix manager can not logout from switched employee * Fix manager can not logout from switched employee
* Remove admin guide from non admin users * Remove admin guide from non admin users
## Release note v5.3 Release note v5.3
-----------------
* Fixes * Fixes
* Fix missing employee name in employee details report * Fix missing employee name in employee details report
## Release note v5.2 Release note v5.2
-----------------
* Fixes * Fixes
* Remove unwanted error logs * Remove unwanted error logs
@@ -585,33 +536,38 @@ Leave carry forwared related isue fixed
* Remove add new button from subordinates module * Remove add new button from subordinates module
* Adding administrators' guide * Adding administrators' guide
## Release note v5.1 Release note v5.1
-----------------
* Fixes * Fixes
* Fixing for non updating null fields * Fixing for non updating null fields
* [https://bitbucket.org/thilina/icehrm-opensource/commits/df57308b53484a2e43ef5c72967ed1cd0dc756cc](https://bitbucket.org/thilina/icehrm-opensource/commits/df57308b53484a2e43ef5c72967ed1cd0dc756cc) * https://bitbucket.org/thilina/icehrm-opensource/commits/df57308b53484a2e43ef5c72967ed1cd0dc756cc
## Release note v5.0 Release note v5.0
-----------------
* Features * Features
* New user permission implementation * New user permission implementation
* Adding new user level - Manager * Adding new user level - Manager
* Fixes * Fixes
* Fixing remote table loading issue * Fixing remote table loading issue
## Release note v4.2 Release note v4.2
-----------------
### Fixes ### Fixes
* https://bitbucket.org/thilina/icehrm-opensource/issue/23/subordinate-leaves-pagination-not-working
* https://bitbucket.org/thilina/icehrm-opensource/issue/20/error-occured-while-time-punch
* [https://bitbucket.org/thilina/icehrm-opensource/issue/23/subordinate-leaves-pagination-not-working](https://bitbucket.org/thilina/icehrm-opensource/issue/23/subordinate-leaves-pagination-not-working)
* [https://bitbucket.org/thilina/icehrm-opensource/issue/20/error-occured-while-time-punch](https://bitbucket.org/thilina/icehrm-opensource/issue/20/error-occured-while-time-punch)
## Release note v4.1 Release note v4.1
-----------------
### Features ### Features
* Better email format for notifications * Better email format for notifications
* Convert upload dialog to a bootstrp model * Convert upload dialog to a bootstrp model
* Fixes * Fixes
* Fix error sending emails with amazon SES * Fix error sending emails with amazon SES
* Fix errors related to XAMPP and WAMPP servers * Fix errors related to XAMPP and WAMPP servers
@@ -620,4 +576,3 @@ Leave carry forwared related isue fixed
* Allow icehrm client to work without an internet connection * Allow icehrm client to work without an internet connection
* Fix installer incorrect base url issue * Fix installer incorrect base url issue
* Fix empty user creation issue * Fix empty user creation issue

View File

@@ -426,7 +426,7 @@ class EmployeeAdapter extends ReactModalAdapterBase {
&& ( && (
<Tag color="volcano" onClick={() => modJs.terminateEmployee(record.id)} style={{ cursor: 'pointer' }}> <Tag color="volcano" onClick={() => modJs.terminateEmployee(record.id)} style={{ cursor: 'pointer' }}>
<DeleteOutlined /> <DeleteOutlined />
{` ${adapter.gt('Deactivate')}`} {` ${adapter.gt('Delete')}`}
</Tag> </Tag>
)} )}
{adapter.hasAccess('save') {adapter.hasAccess('save')

View File

@@ -943,3 +943,7 @@ table.dataTable{
.table-row-dark { .table-row-dark {
background-color: #fbfbfb; background-color: #fbfbfb;
} }
.mod-tab {
margin-bottom:0px;margin-left:5px;border-bottom: none;
}

File diff suppressed because one or more lines are too long

4
web/dist/common.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long