From cb8cc5332ab013e2981ea308fb09b60419afd5b1 Mon Sep 17 00:00:00 2001
From: Uma <uma.s@vtiger.com>
Date: Tue, 24 Mar 2020 16:11:45 +0530
Subject: [PATCH] Fixes #89 Default module can be set for all users from
 MyPreferences page

---
 include/Webservices/WebserviceField.php       | 22 ++++++++-
 include/utils/VtlibUtils.php                  |  2 +
 includes/main/WebUI.php                       |  2 +-
 .../v7/modules/Users/DetailViewBlockView.tpl  |  4 ++
 modules/Migration/schema/720_to_721.php       | 45 +++++++++++++++++++
 .../Settings/ModuleManager/actions/Basic.php  |  2 +-
 modules/Users/Users.php                       |  2 +-
 modules/Users/actions/SaveAjax.php            |  3 ++
 modules/Users/models/Field.php                | 26 ++++++++++-
 modules/Users/models/Module.php               |  8 ++++
 10 files changed, 111 insertions(+), 5 deletions(-)

diff --git a/include/Webservices/WebserviceField.php b/include/Webservices/WebserviceField.php
index 3499c3a19..0db6fc176 100644
--- a/include/Webservices/WebserviceField.php
+++ b/include/Webservices/WebserviceField.php
@@ -336,6 +336,7 @@ class WebserviceField{
 
 	function getPicklistDetails(){
 		$cache = Vtiger_Cache::getInstance();
+        $fieldName = $this->getFieldName();
 		if($cache->getPicklistDetails($this->getTabId(),$this->getFieldName())){
 			return $cache->getPicklistDetails($this->getTabId(),$this->getFieldName());
 		} else {
@@ -346,7 +347,26 @@ class WebserviceField{
 				foreach ($allRegions as $regionId => $regionDetails) {
 					$picklistDetails[] = array('value' => $regionId, 'label' => $regionDetails['name']);
 				}
-			} else {
+			}elseif ($fieldName == 'defaultlandingpage') {
+                $picklistDetails = array(); 
+                $presence = array(0);
+                $restrictedModules = array('Emails', 'Dashboard', 'ModComments', 'PBXManager');
+                $query = 'SELECT name, tablabel, tabid FROM vtiger_tab WHERE presence IN (' . generateQuestionMarks($presence) . ') AND isentitytype = ? AND name NOT IN (' . generateQuestionMarks($restrictedModules) . ')';
+
+                $result = $this->pearDB->pquery($query, array($presence, '1', $restrictedModules));
+                $numOfRows = $this->pearDB->num_rows($result);
+
+                $picklistDetails[] = array('value' => 'Home', 'label' => vtranslate('Home', 'Home'));
+                for ($i = 0; $i < $numOfRows; $i++) {
+                    $moduleName = $this->pearDB->query_result($result, $i, 'name');
+
+                    // check the module access permission, if user has permission then show it in default module list
+                    if (vtlib_isModuleActive($moduleName)) {
+                        $moduleLabel = $this->pearDB->query_result($result, $i, 'tablabel');
+                        $picklistDetails[] = array('value' => $moduleName, 'label' => vtranslate($moduleLabel, $moduleName));
+                    }
+                }
+            } else {
 				$hardCodedPickListNames = array('hdntaxtype','email_flag');
 				$hardCodedPickListValues = array('hdntaxtype'=> array(	array('label' => 'Individual',	'value' => 'individual'),
 																		array('label' => 'Group',		'value' => 'group')),
diff --git a/include/utils/VtlibUtils.php b/include/utils/VtlibUtils.php
index c7f108a2b..50fb37599 100644
--- a/include/utils/VtlibUtils.php
+++ b/include/utils/VtlibUtils.php
@@ -158,6 +158,8 @@ function vtlib_toggleModuleAccess($modules, $enable_disable) {
 	} else if($enable_disable === false) {
 		$enable_disable = 1;
 		$event_type = Vtiger_Module::EVENT_MODULE_DISABLED;
+        //Update default landing page to dashboard if module is disabled.
+        $adb->pquery('UPDATE vtiger_users SET defaultlandingpage = ? WHERE defaultlandingpage IN(' . generateQuestionMarks($modules) . ')', array_merge(array('Home'), $modules));
 	}
 
 	$checkResult = $adb->pquery('SELECT name FROM vtiger_tab WHERE name IN ('. generateQuestionMarks($modules) .')', array($modules));
diff --git a/includes/main/WebUI.php b/includes/main/WebUI.php
index bbc6e0aaf..96ba9788f 100644
--- a/includes/main/WebUI.php
+++ b/includes/main/WebUI.php
@@ -151,7 +151,7 @@ class Vtiger_WebUI extends Vtiger_EntryPoint {
 
 			if(empty($module)) {
 				if ($this->hasLogin()) {
-					$defaultModule = vglobal('default_module');
+					$defaultModule = $currentUser->defaultlandingpage;
 					$moduleModel = Vtiger_Module_Model::getInstance($defaultModule);
 					if(!empty($defaultModule) && $defaultModule != 'Home' && $moduleModel && $moduleModel->isActive()) {
 						$module = $defaultModule; $qualifiedModuleName = $defaultModule; $view = 'List';
diff --git a/layouts/v7/modules/Users/DetailViewBlockView.tpl b/layouts/v7/modules/Users/DetailViewBlockView.tpl
index b0ab68b8f..33ba6ff00 100644
--- a/layouts/v7/modules/Users/DetailViewBlockView.tpl
+++ b/layouts/v7/modules/Users/DetailViewBlockView.tpl
@@ -107,7 +107,11 @@
 											{/if}
 
 											<span class="value textOverflowEllipsis" data-field-type="{$FIELD_MODEL->getFieldDataType()}" {if $FIELD_MODEL->get('uitype') eq '19' or $FIELD_MODEL->get('uitype') eq '20' or $FIELD_MODEL->get('uitype') eq '21'} style="white-space:normal;" {/if} {if $fieldDataType eq 'email'}title='{$FIELD_MODEL->get('fieldvalue')}'{/if} >
+                                                                                            {if $FIELD_MODEL->getName() neq 'defaultlandingpage'}
 												{include file=vtemplate_path($FIELD_MODEL->getUITypeModel()->getDetailViewTemplateName(),$MODULE_NAME) FIELD_MODEL=$FIELD_MODEL USER_MODEL=$USER_MODEL MODULE=$MODULE_NAME RECORD=$RECORD}
+                                                                                            {else}
+                                                                                                {vtranslate($FIELD_MODEL->get('fieldvalue'),$FIELD_MODEL->get('fieldvalue'))}
+                                                                                            {/if}
 											</span>
 											{if $IS_AJAX_ENABLED && $FIELD_MODEL->isEditable() eq 'true' && $FIELD_MODEL->isAjaxEditable() eq 'true'}
 												<span class="hide edit pull-left">
diff --git a/modules/Migration/schema/720_to_721.php b/modules/Migration/schema/720_to_721.php
index 94d12a36f..0e09a716a 100644
--- a/modules/Migration/schema/720_to_721.php
+++ b/modules/Migration/schema/720_to_721.php
@@ -92,4 +92,49 @@ if (defined('VTIGER_UPGRADE')) {
     $db->pquery('UPDATE vtiger_emailtemplates SET module=? WHERE templatename IN ('. generateQuestionMarks($defaultContactTemplates).')', $updateContactParams);
     
     echo 'Email templates default moduleName updated';
+    
+    //Migrate default module data from config editor to database
+    $moduleModel = Settings_Vtiger_ConfigModule_Model::getInstance();
+    $configFieldData = $moduleModel->getViewableData();
+    $defaultModule = $configFieldData['default_module'];
+    if(empty($defaultModule)){
+        $defaultModule = 'Home';
+    }
+
+    $moduleInstance = Vtiger_Module_Model::getInstance('Users');
+    $blockInstance = Vtiger_Block::getInstance('LBL_MORE_INFORMATION', $moduleInstance);
+    if ($blockInstance) {
+        $fieldInstance = Vtiger_Field::getInstance('defaultlandingpage', $moduleInstance);
+        if (!$fieldInstance) {
+            $fieldInstance = new Vtiger_Field();
+            $fieldInstance->name		= 'defaultlandingpage';
+            $fieldInstance->column		= 'defaultlandingpage';
+            $fieldInstance->label		= 'Default Landing Page';
+            $fieldInstance->table		= 'vtiger_users';
+            $fieldInstance->columntype = 'VARCHAR(100)';
+            $fieldInstance->defaultvalue = $defaultModule;
+            $fieldInstance->typeofdata = 'V~O';
+            $fieldInstance->uitype		= '32';
+            $fieldInstance->presence	= '0';
+
+            $blockInstance->addField($fieldInstance);
+            $configModuleInstance = Settings_Vtiger_ConfigModule_Model::getInstance();
+            $defaultModules = $configModuleInstance->getPicklistValues('default_module');
+            $fieldInstance->setPicklistValues($defaultModules);
+            echo "<br> Default landing page field added <br>";
+        }
+    }
+
+    $allUsers = Users_Record_Model::getAll(true);
+    $allUserIds = array_keys($allUsers);
+
+    $db->pquery('UPDATE vtiger_users SET defaultlandingpage = ? WHERE id in ('. generateQuestionMarks($allUserIds) .')', array($defaultModule, $allUserIds));
+    echo "Default landing page updated for all active users <br>";
+    
+    //Recalculating user-preivilege file, as defaultlandingpage and other preference changes should be updated
+    foreach ($allUserIds as $userId) {
+        createUserPrivilegesfile($userId);
+        createUserSharingPrivilegesfile($userId);
+    }
+    echo "Re-calculated user privilege and sharing privileges files";
 }
\ No newline at end of file
diff --git a/modules/Settings/ModuleManager/actions/Basic.php b/modules/Settings/ModuleManager/actions/Basic.php
index 3f488c505..34af36d4c 100644
--- a/modules/Settings/ModuleManager/actions/Basic.php
+++ b/modules/Settings/ModuleManager/actions/Basic.php
@@ -36,7 +36,7 @@ class Settings_ModuleManager_Basic_Action extends Settings_Vtiger_IndexAjax_View
 		}else{
 			$moduleManagerModel->disableModule($moduleName);
 		}
-
+        Vtiger_Cache::delete('UserPicklistDetails','defaultlandingpage');
 		$response = new Vtiger_Response();
 		$response->emit();
 	}
diff --git a/modules/Users/Users.php b/modules/Users/Users.php
index 5aafae460..fc81bbf7f 100755
--- a/modules/Users/Users.php
+++ b/modules/Users/Users.php
@@ -860,7 +860,7 @@ class Users extends CRMEntity {
 				if($current_user->id == $this->id) {
 					$_SESSION['vtiger_authenticated_user_theme'] = $fldvalue;
 				}
-			} elseif($uitype == 32) {
+			} elseif($uitype == 32 && $fieldname == 'language') {
 				$languageList = Vtiger_Language::getAll();
 				$languageList = array_keys($languageList);
 				if(!in_array($fldvalue, $languageList) || $fldvalue == '') {
diff --git a/modules/Users/actions/SaveAjax.php b/modules/Users/actions/SaveAjax.php
index 5188833bb..61aaea632 100644
--- a/modules/Users/actions/SaveAjax.php
+++ b/modules/Users/actions/SaveAjax.php
@@ -65,6 +65,9 @@ class Users_SaveAjax_Action extends Vtiger_SaveAjax_Action {
 				if(($fieldName == 'currency_decimal_separator' || $fieldName == 'currency_grouping_separator') && ($displayValue == '&nbsp;')) {
 					$displayValue = vtranslate('Space', 'Users');
 				}
+                if($fieldName == 'defaultlandingpage'){
+                    $displayValue = vtranslate($fieldValue, $fieldValue);
+                }
 				$result[$fieldName] = array('value' => $fieldValue, 'display_value' => $displayValue);
 			}
 		}
diff --git a/modules/Users/models/Field.php b/modules/Users/models/Field.php
index a7dd3518a..f3ed17795 100644
--- a/modules/Users/models/Field.php
+++ b/modules/Users/models/Field.php
@@ -74,8 +74,32 @@ class Users_Field_Model extends Vtiger_Field_Model {
 	 * @return <Array> List of picklist values if the field is of type picklist or multipicklist, null otherwise.
 	 */
 	public function getPicklistValues() {
+        $fieldName = $this->getName(); 
 		if($this->get('uitype') == 32) {
-			return Vtiger_Language_Handler::getAllLanguages();
+			 if($fieldName == 'language'){ 
+                return Vtiger_Language_Handler::getAllLanguages(); 
+            } else if($fieldName == 'defaultlandingpage'){
+				$db = PearDatabase::getInstance();
+                    $currentUserPriviligesModel = Users_Privileges_Model::getCurrentUserPrivilegesModel();
+                    $presence = array(0);
+                    $restrictedModules = array('Emails', 'Dashboard', 'ModComments', 'PBXManager');
+                    $query = 'SELECT name, tablabel, tabid FROM vtiger_tab WHERE presence IN (' . generateQuestionMarks($presence) . ') AND isentitytype = ? AND name NOT IN (' . generateQuestionMarks($restrictedModules) . ')';
+
+                    $result = $db->pquery($query, array($presence, '1', $restrictedModules));
+                    $numOfRows = $db->num_rows($result);
+
+                    $moduleData = array('Home' => vtranslate('Home','Home'));
+                    for ($i = 0; $i < $numOfRows; $i++) {
+                        $tabId = $db->query_result($result, $i, 'tabid');
+                        // check the module access permission, if user has permission then show it in default module list
+                        if($currentUserPriviligesModel->hasModulePermission($tabId)){
+                            $moduleName = $db->query_result($result, $i, 'name');
+                            $moduleLabel = $db->query_result($result, $i, 'tablabel');
+                            $moduleData[$moduleName] = vtranslate($moduleLabel,$moduleName);
+                        }
+                    }
+                    return $moduleData;
+			}
 		}
 		else if ($this->get('uitype') == '115') {
 			$db = PearDatabase::getInstance();
diff --git a/modules/Users/models/Module.php b/modules/Users/models/Module.php
index 5658b32f4..0a38b53fc 100644
--- a/modules/Users/models/Module.php
+++ b/modules/Users/models/Module.php
@@ -240,11 +240,19 @@ class Users_Module_Model extends Vtiger_Module_Model {
 	 * @param Vtiger_Record_Model $recordModel
 	 */
 	public function saveRecord(Vtiger_Record_Model $recordModel) {
+        global $log;
+        $log->fatal('ModuleSAve record api');
 		$moduleName = $this->get('name');
 		$focus = CRMEntity::getInstance($moduleName);
+        $log->fatal('focus class => ');
+        $log->fatal(get_class($focus));
 		$fields = $focus->column_fields;
+        $log->fatal('column fields => ');
+        $log->fatal($fields);
 		foreach ($fields as $fieldName => $fieldValue) {
 			$fieldValue = $recordModel->get($fieldName);
+            $log->fatal('recordModel field value => '. $fieldName);
+            $log->fatal($recordModel->get($fieldName));
 			if (is_array($fieldValue)) {
 				$focus->column_fields[$fieldName] = $fieldValue;
 			} else if ($fieldValue !== null) {
-- 
GitLab