From af4e9985ea0cfc96c7e875f2bc1d1f4cdf4cf592 Mon Sep 17 00:00:00 2001 From: satish <satish.dvnk@vtiger.com> Date: Wed, 27 Jul 2016 13:07:16 +0530 Subject: [PATCH] Separating Create/Edit into 2 separate Role/Profile permissions --- include/Webservices/Create.php | 2 +- include/Webservices/EntityMeta.php | 1 + include/Webservices/VtigerActorOperation.php | 2 +- include/Webservices/VtigerCRMActorMeta.php | 10 +- include/Webservices/VtigerCRMObjectMeta.php | 19 ++- languages/en_us/Settings/Profiles.php | 35 ++--- .../Calendar/CalendarViewPreProcess.tpl | 3 + .../modules/Calendar/ListViewContents.tpl | 2 +- .../Calendar/resources/CalendarView.js | 72 ++++++----- .../modules/Settings/Profiles/DetailView.tpl | 29 ++--- .../modules/Settings/Profiles/EditView.tpl | 12 +- .../Settings/Profiles/EditViewContents.tpl | 12 +- .../Settings/Profiles/resources/Profiles.js | 51 ++++++-- layouts/vlayout/modules/Vtiger/Comment.tpl | 120 +++++++++--------- .../modules/Vtiger/CommentThreadList.tpl | 98 +++++++------- .../vlayout/modules/Vtiger/CommonActions.tpl | 2 +- .../modules/Vtiger/FindDuplicateContents.tpl | 38 +++--- .../modules/Vtiger/ListViewContents.tpl | 2 +- layouts/vlayout/modules/Vtiger/MenuBar.tpl | 2 +- .../vlayout/modules/Vtiger/RecentComments.tpl | 80 ++++++------ .../modules/Vtiger/RelatedActivities.tpl | 30 +++-- .../modules/Vtiger/ShowAllComments.tpl | 56 ++++---- modules/Calendar/models/ListView.php | 4 +- modules/Calendar/views/Calendar.php | 7 +- modules/Campaigns/models/ListView.php | 2 +- modules/Documents/Documents.php | 2 +- modules/Documents/models/ListView.php | 2 +- modules/Documents/views/AddFolder.php | 2 +- modules/HelpDesk/actions/ConvertFAQ.php | 2 +- modules/HelpDesk/models/DetailView.php | 2 +- modules/Inventory/models/ListView.php | 2 +- modules/Inventory/models/RelationListView.php | 42 +++--- modules/Leads/models/Record.php | 6 +- modules/Potentials/models/DetailView.php | 14 +- modules/Users/DefaultDataPopulator.php | 1 + modules/Vtiger/models/Action.php | 2 +- modules/Vtiger/models/DetailView.php | 2 +- modules/Vtiger/models/ListView.php | 4 +- modules/Vtiger/models/RelationListView.php | 56 ++++---- modules/Vtiger/views/Edit.php | 7 +- modules/Vtiger/views/FindDuplicates.php | 18 ++- modules/Vtiger/views/Import.php | 2 +- modules/Vtiger/views/List.php | 1 + modules/Vtiger/views/QuickCreateAjax.php | 2 +- packages/vtiger/mandatory/Import.zip | Bin 52482 -> 52571 bytes packages/vtiger/mandatory/MailManager.zip | Bin 124241 -> 124246 bytes packages/vtiger/optional/ModComments.zip | Bin 25178 -> 25206 bytes packages/vtiger/optional/Projects.zip | Bin 43561 -> 43561 bytes .../Import/modules/Import/actions/Data.php | 66 +++++----- .../Import/modules/Import/helpers/Utils.php | 12 +- .../modules/MailManager/MailManager.php | 2 +- .../modules/MailManager/views/Relation.php | 2 + .../modules/ModComments/views/Edit.php | 7 +- .../modules/Project/models/DetailView.php | 8 +- .../modules/ProjectTask/ProjectTask.php | 2 +- tabdata.php | 2 +- ...igration-split-create-edit-permissions.php | 38 ++++++ 57 files changed, 580 insertions(+), 419 deletions(-) create mode 100644 wip-migration-split-create-edit-permissions.php diff --git a/include/Webservices/Create.php b/include/Webservices/Create.php index 394ddf7d3..6c12d905a 100644 --- a/include/Webservices/Create.php +++ b/include/Webservices/Create.php @@ -33,7 +33,7 @@ function vtws_create($elementType, $element, $user) { $handler = new $handlerClass($webserviceObject, $user, $adb, $log); $meta = $handler->getMeta(); - if ($meta->hasWriteAccess() !== true) { + if ($meta->hasCreateAccess() !== true) { throw new WebServiceException(WebServiceErrorCode::$ACCESSDENIED, "Permission to write is denied"); } diff --git a/include/Webservices/EntityMeta.php b/include/Webservices/EntityMeta.php index ee1af2949..68845eafb 100644 --- a/include/Webservices/EntityMeta.php +++ b/include/Webservices/EntityMeta.php @@ -259,6 +259,7 @@ abstract class EntityMeta{ abstract function hasDeleteAccess(); abstract function hasAccess(); abstract function hasReadAccess(); + abstract function hasCreateAccess(); abstract function hasWriteAccess(); abstract function getEntityName(); abstract function getEntityId(); diff --git a/include/Webservices/VtigerActorOperation.php b/include/Webservices/VtigerActorOperation.php index 8099d3c3b..6b26288df 100644 --- a/include/Webservices/VtigerActorOperation.php +++ b/include/Webservices/VtigerActorOperation.php @@ -245,7 +245,7 @@ class VtigerActorOperation extends WebserviceEntityOperation { $app_strings = VTWS_PreserveGlobal::getGlobal('app_strings'); $current_user = vtws_preserveGlobal('current_user',$this->user);; $label = (isset($app_strings[$elementType]))? $app_strings[$elementType]:$elementType; - $createable = $this->meta->hasWriteAccess(); + $createable = $this->meta->hasCreateAccess(); $updateable = $this->meta->hasWriteAccess(); $deleteable = $this->meta->hasDeleteAccess(); $retrieveable = $this->meta->hasReadAccess(); diff --git a/include/Webservices/VtigerCRMActorMeta.php b/include/Webservices/VtigerCRMActorMeta.php index f36c5513e..cab7a7c92 100644 --- a/include/Webservices/VtigerCRMActorMeta.php +++ b/include/Webservices/VtigerCRMActorMeta.php @@ -241,7 +241,15 @@ class VtigerCRMActorMeta extends EntityMeta { public function hasReadAccess(){ return true; } - + + public function hasCreateAccess() { + if (is_admin($this->user)) { + return true; + } else { + return false; + } + } + public function hasWriteAccess(){ if(is_admin($this->user)){ return true; diff --git a/include/Webservices/VtigerCRMObjectMeta.php b/include/Webservices/VtigerCRMObjectMeta.php index 46d70feb5..19ee9e0da 100644 --- a/include/Webservices/VtigerCRMObjectMeta.php +++ b/include/Webservices/VtigerCRMObjectMeta.php @@ -16,7 +16,8 @@ class VtigerCRMObjectMeta extends EntityMeta { private $assign; private $hasAccess; private $hasReadAccess; - private $hasWriteAccess; + private $hasCreateAccess; + private $hasWriteAccess;//Edit Access private $hasDeleteAccess; private $assignUsers; @@ -34,6 +35,7 @@ class VtigerCRMObjectMeta extends EntityMeta { $this->moduleFields = array(); $this->hasAccess = false; $this->hasReadAccess = false; + $this->hasCreateAccess = false; $this->hasWriteAccess = false; $this->hasDeleteAccess = false; $instance = vtws_getModuleInstance($this->webserviceObject); @@ -84,6 +86,7 @@ class VtigerCRMObjectMeta extends EntityMeta { if($active == false){ $this->hasAccess = false; $this->hasReadAccess = false; + $this->hasCreateAccess = false; $this->hasWriteAccess = false; $this->hasDeleteAccess = false; return; @@ -93,6 +96,7 @@ class VtigerCRMObjectMeta extends EntityMeta { if($is_admin == true || $profileGlobalPermission[1] == 0 || $profileGlobalPermission[2] == 0){ $this->hasAccess = true; $this->hasReadAccess = true; + $this->hasCreateAccess = true; $this->hasWriteAccess = true; $this->hasDeleteAccess = true; }else{ @@ -113,6 +117,7 @@ class VtigerCRMObjectMeta extends EntityMeta { if($permission != 1 || $permission != "1"){ $this->hasAccess = true; if($globalactionid == 2 || $globalactionid == "2"){ + $this->hasCreateAccess = true; $this->hasWriteAccess = true; $this->hasDeleteAccess = true; }else{ @@ -158,11 +163,14 @@ class VtigerCRMObjectMeta extends EntityMeta { $this->hasDeleteAccess = true; }else if($operation == 4 || $operation == "4"){ $this->hasReadAccess = true; + }else if($operation == 7 || $operation == "7"){ + $this->hasCreateAccess = true; } } } if(!$standardDefined){ $this->hasReadAccess = true; + $this->hasCreateAccess = true; $this->hasWriteAccess = true; $this->hasDeleteAccess = true; } @@ -183,7 +191,14 @@ class VtigerCRMObjectMeta extends EntityMeta { } return $this->hasWriteAccess; } - + + function hasCreateAccess() { + if(!$this->meta) { + $this->retrieveMeta(); + } + return $this->hasCreateAccess; + } + function hasReadAccess(){ if(!$this->meta){ $this->retrieveMeta(); diff --git a/languages/en_us/Settings/Profiles.php b/languages/en_us/Settings/Profiles.php index f0e9de052..26c394bf2 100644 --- a/languages/en_us/Settings/Profiles.php +++ b/languages/en_us/Settings/Profiles.php @@ -17,10 +17,11 @@ $languageStrings = array( 'LBL_DESCRIPTION' => 'Description', 'LBL_DUPLICATE_RECORD' => 'Duplicate', 'LBL_DUPLICATES_EXIST' => 'Duplicate Profile Exists', - 'LBL_EDIT_ALL_DESC' => 'Can edit all the module\'s information', - 'LBL_EDIT_ALL' => 'Edit All', + 'LBL_EDIT_ALL_DESC' => 'Can edit all the module\'s information', + 'LBL_EDIT_ALL' => 'Edit All', 'LBL_EDIT_PRIVILIGES_FOR_THIS_PROFILE' => 'Edit privileges for this profile', - 'LBL_EDIT_PRVILIGE' => 'Create/Edit', + 'LBL_CREATE_PRVILIGE' => 'Create', + 'LBL_EDIT_PRVILIGE' => 'Edit', 'LBL_EDIT_RECORD' => 'Edit', 'LBL_FIELD_AND_TOOL_PRVILIGES' => 'Field and Tool Privileges', 'LBL_FIELDS' => 'Fields', @@ -32,25 +33,25 @@ $languageStrings = array( 'LBL_READ_ONLY' => 'Read only', 'LBL_TOOLS' => 'Tools', 'LBL_TRANSFER_ROLES_TO_PROFILE' => 'Transfer roles to profile', - 'LBL_VIEW_ALL_DESC' => 'Can view all the module\'s information', - 'LBL_VIEW_ALL' => 'View All', + 'LBL_VIEW_ALL_DESC' => 'Can view all the module\'s information', + 'LBL_VIEW_ALL' => 'View All', 'LBL_VIEW_PRVILIGE' => 'View', 'LBL_WRITE' => 'Write', 'Profiles' => 'Profiles', 'SINGLE_Profiles' => 'Profile', - - 'Import' => 'Import', - 'Export' => 'Export', + + 'Import' => 'Import', + 'Export' => 'Export', 'Merge' => 'Merge', - 'ConvertLead' => 'Convert Lead', - 'DuplicatesHandling' => 'Duplicates Handling', - 'ReceiveIncomingCalls' => 'Receive Incoming Calls', - 'MakeOutgoingCalls' => 'Make Outgoing Calls', - 'Print' => 'Print', - - //Patch provided by http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/7884 - //Field names - 'Name' => 'Profile Name', + 'ConvertLead' => 'Convert Lead', + 'DuplicatesHandling' => 'Duplicates Handling', + 'ReceiveIncomingCalls' => 'Receive Incoming Calls', + 'MakeOutgoingCalls' => 'Make Outgoing Calls', + 'Print' => 'Print', + + //Patch provided by http://trac.vtiger.com/cgi-bin/trac.cgi/ticket/7884 + //Field names + 'Name' => 'Profile Name', ); $jsLanguageStrings = array( diff --git a/layouts/vlayout/modules/Calendar/CalendarViewPreProcess.tpl b/layouts/vlayout/modules/Calendar/CalendarViewPreProcess.tpl index 490bb8d60..a54007762 100644 --- a/layouts/vlayout/modules/Calendar/CalendarViewPreProcess.tpl +++ b/layouts/vlayout/modules/Calendar/CalendarViewPreProcess.tpl @@ -18,5 +18,8 @@ <div class="span2 row-fluid"> {include file="SideBar.tpl"|vtemplate_path:$MODULE_NAME} </div> + <input type="hidden" class="isRecordCreatable" value="{$IS_RECORD_CREATABLE}"> + <input type="hidden" class="isModuleEditable" value="{$IS_MODULE_EDITABLE}"> + <input type="hidden" class="isModuleDeletable" value="{$IS_MODULE_DELETABLE}"> <div class="contentsDiv span10 marginLeftZero"> {/strip} \ No newline at end of file diff --git a/layouts/vlayout/modules/Calendar/ListViewContents.tpl b/layouts/vlayout/modules/Calendar/ListViewContents.tpl index bed13072c..9f2c3d350 100755 --- a/layouts/vlayout/modules/Calendar/ListViewContents.tpl +++ b/layouts/vlayout/modules/Calendar/ListViewContents.tpl @@ -159,7 +159,7 @@ <tr> <td> {assign var=SINGLE_MODULE value="SINGLE_$MODULE"} - {vtranslate('LBL_EQ_ZERO')} {vtranslate($MODULE, $MODULE)} {vtranslate('LBL_FOUND')}.{if $IS_MODULE_EDITABLE} {vtranslate('LBL_CREATE')} <a href="{$MODULE_MODEL->getCreateRecordUrl()}">{vtranslate($SINGLE_MODULE, $MODULE)}</a>{/if} + {vtranslate('LBL_EQ_ZERO')} {vtranslate($MODULE, $MODULE)} {vtranslate('LBL_FOUND')}.{if $IS_RECORD_CREATABLE} {vtranslate('LBL_CREATE')} <a href="{$MODULE_MODEL->getCreateRecordUrl()}">{vtranslate($SINGLE_MODULE, $MODULE)}</a>{/if} </td> </tr> </tbody> diff --git a/layouts/vlayout/modules/Calendar/resources/CalendarView.js b/layouts/vlayout/modules/Calendar/resources/CalendarView.js index 5ef342d31..276b3cd3a 100644 --- a/layouts/vlayout/modules/Calendar/resources/CalendarView.js +++ b/layouts/vlayout/modules/Calendar/resources/CalendarView.js @@ -62,17 +62,20 @@ jQuery.Class("Calendar_CalendarView_Js",{ aDeferred.resolve(this.calendarCreateView.clone(true,true)); return aDeferred.promise(); } - var progressInstance = jQuery.progressIndicator(); - this.loadCalendarCreateView().then( - function(data){ - progressInstance.hide(); - thisInstance.calendarCreateView = data; - aDeferred.resolve(data.clone(true,true)); - }, - function(){ - progressInstance.hide(); - } - ); + + if (jQuery('.isRecordCreatable').val()) { + var progressInstance = jQuery.progressIndicator(); + this.loadCalendarCreateView().then( + function(data){ + progressInstance.hide(); + thisInstance.calendarCreateView = data; + aDeferred.resolve(data.clone(true,true)); + }, + function(){ + progressInstance.hide(); + } + ); + } return aDeferred.promise(); }, @@ -501,15 +504,17 @@ jQuery.Class("Calendar_CalendarView_Js",{ var targetElement = jQuery(this).find('.fc-event-time'); var trashElement = jQuery(this).find('a.delete'); if(!trashElement.length) { - if(!targetElement.length) { - targetElement = jQuery(this).find('.fc-event-title'); - targetElement.append('<a class="delete" style="position:absolute;right:1px;" href="javascript:void(0)"><i class="icon-trash icon-white"></i></a>'); - } - else { - if(view.name == 'month') targetElement = jQuery(this).find('.fc-event-inner'); - targetElement.append('<a class="delete" style="position:absolute;right:1px;" href="javascript:void(0)"><i class="icon-trash icon-white"></i></a>'); - } - thisInstance.registerEventDelete(targetElement,calEvent); + if (jQuery('.isModuleDeletable').val()) { + if(!targetElement.length) { + targetElement = jQuery(this).find('.fc-event-title'); + targetElement.append('<a class="delete" style="position:absolute;right:1px;" href="javascript:void(0)"><i class="icon-trash icon-white"></i></a>'); + } + else { + if(view.name == 'month') targetElement = jQuery(this).find('.fc-event-inner'); + targetElement.append('<a class="delete" style="position:absolute;right:1px;" href="javascript:void(0)"><i class="icon-trash icon-white"></i></a>'); + } + thisInstance.registerEventDelete(targetElement,calEvent); + } } else { trashElement.removeClass('hide'); @@ -521,22 +526,29 @@ jQuery.Class("Calendar_CalendarView_Js",{ jQuery(this).find('.delete').addClass('hide'); } } + + if (!jQuery('.isModuleEditable').val()) { + config['editable'] = false; + } + if(typeof customConfig != 'undefined'){ config = jQuery.extend(config,customConfig); } calendarview.fullCalendar(config); - //To create custom button to create event or task - jQuery('<span class="pull-left"><button class="btn addButton">'+ app.vtranslate('LBL_ADD_EVENT_TASK') +'</button></span>') - .prependTo(calendarview.find('.fc-header .fc-header-right')).on('click', 'button', function(e){ - thisInstance.getCalendarCreateView().then(function(data){ - var headerInstance = new Vtiger_Header_Js(); - headerInstance.handleQuickCreateData(data,{callbackFunction:function(data){ - thisInstance.addCalendarEvent(data.result); - }}); - }); + if (jQuery('.isRecordCreatable').val()) { + //To create custom button to create event or task + jQuery('<span class="pull-left"><button class="btn addButton">'+ app.vtranslate('LBL_ADD_EVENT_TASK') +'</button></span>') + .prependTo(calendarview.find('.fc-header .fc-header-right')).on('click', 'button', function(e){ + thisInstance.getCalendarCreateView().then(function(data){ + var headerInstance = new Vtiger_Header_Js(); + headerInstance.handleQuickCreateData(data,{callbackFunction:function(data){ + thisInstance.addCalendarEvent(data.result); + }}); + }); - }) + }) + } jQuery('<span class="pull-right marginLeft5px"><button class="btn"><i id="calendarSettings" class="icon-cog"></i></button></span>') .prependTo(calendarview.find('.fc-header .fc-header-right')).on('click', 'button', function(e){ var params = { diff --git a/layouts/vlayout/modules/Settings/Profiles/DetailView.tpl b/layouts/vlayout/modules/Settings/Profiles/DetailView.tpl index e5799f0b9..8f2fa3a0f 100644 --- a/layouts/vlayout/modules/Settings/Profiles/DetailView.tpl +++ b/layouts/vlayout/modules/Settings/Profiles/DetailView.tpl @@ -58,22 +58,19 @@ <th width="27%" style="border-left: 1px solid #DDD !important;"> {vtranslate('LBL_MODULES', $QUALIFIED_MODULE)} </th> - <th width="11%" style="border-left: 1px solid #DDD !important;"> - <span class="horizontalAlignCenter"> - - {'LBL_VIEW_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} - </span> + <th width="12%" style="border-left: 1px solid #DDD !important; text-align: center;"> + <span>{'LBL_VIEW_PRVILIGE'|vtranslate:$QUALIFIED_MODULE}</span> </th> - <th width="12%" style="border-left: 1px solid #DDD !important;"> - <span class="horizontalAlignCenter" > - - {'LBL_EDIT_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} - </span> + <th width="12%" style="border-left: 1px solid #DDD !important; text-align: center;"> + <span>{'LBL_CREATE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE}</span> + </th> + <th width="12%" style="border-left: 1px solid #DDD !important; text-align: center;"> + <span>{'LBL_EDIT_PRVILIGE'|vtranslate:$QUALIFIED_MODULE}</span> </th> - <th width="11%" style="border-left: 1px solid #DDD !important;"> - <span class="horizontalAlignCenter" >{'LBL_DELETE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE}</span> + <th width="12%" style="border-left: 1px solid #DDD !important; text-align: center;"> + <span>{'LBL_DELETE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE}</span> </th> - <th width="39%" style="border-left: 1px solid #DDD !important;" nowrap="nowrap">{'LBL_FIELD_AND_TOOL_PRVILIGES'|vtranslate:$QUALIFIED_MODULE}</th> + <th width="12%" style="border-left: 1px solid #DDD !important; text-align: center;" nowrap="nowrap">{'LBL_FIELD_AND_TOOL_PRVILIGES'|vtranslate:$QUALIFIED_MODULE}</th> </tr> </thead> <tbody> @@ -83,12 +80,12 @@ <td> <img src="{if $RECORD_MODEL->hasModulePermission($PROFILE_MODULE)}{$ENABLE_IMAGE_PATH}{else}{$DISABLE_IMAGE_PATH}{/if}" class="alignMiddle" /> {$PROFILE_MODULE->get('label')|vtranslate:$PROFILE_MODULE->getName()} </td> - {assign var="BASIC_ACTION_ORDER" value=array(2,0,1)} + {assign var="BASIC_ACTION_ORDER" value=array(2,3,0,1)} {foreach from=$BASIC_ACTION_ORDER item=ACTION_ID} - <td style="border-left: 1px solid #DDD !important;"> + <td style="border-left: 1px solid #DDD !important; text-align: center;"> {assign var="ACTION_MODEL" value=$ALL_BASIC_ACTIONS[$ACTION_ID]} {if !$IS_RESTRICTED_MODULE && $ACTION_MODEL->isModuleEnabled($PROFILE_MODULE)} - <img style="margin-left: 40%" class="alignMiddle" src="{if $RECORD_MODEL->hasModuleActionPermission($PROFILE_MODULE, $ACTION_MODEL)}{$ENABLE_IMAGE_PATH}{else}{$DISABLE_IMAGE_PATH}{/if}" /> + <img class="alignMiddle" src="{if $RECORD_MODEL->hasModuleActionPermission($PROFILE_MODULE, $ACTION_MODEL)}{$ENABLE_IMAGE_PATH}{else}{$DISABLE_IMAGE_PATH}{/if}" /> {/if} </td> {/foreach} diff --git a/layouts/vlayout/modules/Settings/Profiles/EditView.tpl b/layouts/vlayout/modules/Settings/Profiles/EditView.tpl index d814a90ca..0057cf167 100644 --- a/layouts/vlayout/modules/Settings/Profiles/EditView.tpl +++ b/layouts/vlayout/modules/Settings/Profiles/EditView.tpl @@ -40,7 +40,7 @@ <div class="summaryWidgetContainer"> <label class="checkbox"> <input type="hidden" name="viewall" value="0" /> - <input type="checkbox" name="viewall" {if $RECORD_MODEL->hasGlobalReadPermission()}checked="true"{/if} value="1" /> + <input type="checkbox" name="viewall" {if $RECORD_MODEL->hasGlobalReadPermission()}checked="true"{/if} value="1" /> {vtranslate('LBL_VIEW_ALL',$QUALIFIED_MODULE)} <span style="margin-left:25px"> <i class="icon-info-sign"></i> @@ -49,7 +49,7 @@ </label> <label class="checkbox"> <input type="hidden" name="editall" value="0" /> - <input type="checkbox" name="editall" {if $RECORD_MODEL->hasGlobalWritePermission()}checked="true"{/if} value="1"/> + <input type="checkbox" name="editall" {if $RECORD_MODEL->hasGlobalWritePermission()}checked="true"{/if} value="1"/> {vtranslate('LBL_EDIT_ALL',$QUALIFIED_MODULE)} <span style="margin-left:30px"> <i class="icon-info-sign"></i> @@ -70,6 +70,10 @@ <input {if empty($RECORD_ID) && empty($IS_DUPLICATE_RECORD)} class="alignTop" checked="true" {/if} type="checkbox" id="mainAction4CheckBox" /> {'LBL_VIEW_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} </th> + <th width="14%" style="border-left: 1px solid #DDD !important;"> + <input {if empty($RECORD_ID) && empty($IS_DUPLICATE_RECORD)} class="alignTop" checked="true"{/if} type="checkbox" id="mainAction7CheckBox" /> + {'LBL_CREATE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} + </th> <th width="14%" style="border-left: 1px solid #DDD !important;"> <input {if empty($RECORD_ID) && empty($IS_DUPLICATE_RECORD)} class="alignTop" checked="true"{/if} type="checkbox" id="mainAction1CheckBox" /> {'LBL_EDIT_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} @@ -78,7 +82,7 @@ <input checked="true" class="alignTop" type="checkbox" id="mainAction2CheckBox" /> {'LBL_DELETE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} </th> - <th width="28%" style="border-left: 1px solid #DDD !important;" nowrap="nowrap">{'LBL_FIELD_AND_TOOL_PRVILIGES'|vtranslate:$QUALIFIED_MODULE}</th> + <th width="14%" style="border-left: 1px solid #DDD !important;" nowrap="nowrap">{'LBL_FIELD_AND_TOOL_PRVILIGES'|vtranslate:$QUALIFIED_MODULE}</th> </tr> </thead> <tbody> @@ -91,7 +95,7 @@ <td> <input class="modulesCheckBox alignTop" type="checkbox" name="permissions[{$TABID}][is_permitted]" data-value="{$TABID}" data-module-state="" {if $RECORD_MODEL->hasModulePermission($PROFILE_MODULE)}checked="true"{else} data-module-unchecked="true" {/if}> {$PROFILE_MODULE->get('label')|vtranslate:$PROFILE_MODULE->getName()} </td> - {assign var="BASIC_ACTION_ORDER" value=array(2,0,1)} + {assign var="BASIC_ACTION_ORDER" value=array(2,3,0,1)} {foreach from=$BASIC_ACTION_ORDER item=ORDERID} <td style="border-left: 1px solid #DDD !important;"> {assign var="ACTION_MODEL" value=$ALL_BASIC_ACTIONS[$ORDERID]} diff --git a/layouts/vlayout/modules/Settings/Profiles/EditViewContents.tpl b/layouts/vlayout/modules/Settings/Profiles/EditViewContents.tpl index 5aca8602f..9f3fccb38 100644 --- a/layouts/vlayout/modules/Settings/Profiles/EditViewContents.tpl +++ b/layouts/vlayout/modules/Settings/Profiles/EditViewContents.tpl @@ -30,7 +30,7 @@ <div class="summaryWidgetContainer"> <label class="checkbox"> <input type="hidden" name="viewall" value="0" /> - <input type="checkbox" name="viewall" {if $RECORD_MODEL->hasGlobalReadPermission()}checked="true"{/if} /> + <input type="checkbox" name="viewall" {if $RECORD_MODEL->hasGlobalReadPermission()}checked="true"{/if} /> {vtranslate('LBL_VIEW_ALL',$QUALIFIED_MODULE)} <span style="margin-left:25px"> <i class="icon-info-sign"></i> @@ -39,7 +39,7 @@ </label> <label class="checkbox"> <input type="hidden" name="editall" value="0" /> - <input type="checkbox" name="editall" {if $RECORD_MODEL->hasGlobalWritePermission()}checked="true"{/if} /> + <input type="checkbox" name="editall" {if $RECORD_MODEL->hasGlobalWritePermission()}checked="true"{/if} /> {vtranslate('LBL_EDIT_ALL',$QUALIFIED_MODULE)} <span style="margin-left:30px"> <i class="icon-info-sign"></i> @@ -58,6 +58,10 @@ <input type="checkbox" {if !$RECORD_ID} class="alignTop" checked="true" {/if} id="mainAction4CheckBox" /> {'LBL_VIEW_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} </th> + <th width="14%" style="border-left: 1px solid #DDD !important;"> + <input {if empty($RECORD_ID) && empty($IS_DUPLICATE_RECORD)} class="alignTop" checked="true"{/if} type="checkbox" id="mainAction7CheckBox" /> + {'LBL_CREATE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} + </th> <th width="14%" style="border-left: 1px solid #DDD !important;"> <input {if !$RECORD_ID} class="alignTop" checked="true" {/if} type="checkbox" id="mainAction1CheckBox" /> {'LBL_EDIT_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} @@ -66,7 +70,7 @@ <input checked="true" class="alignTop" type="checkbox" id="mainAction2CheckBox" /> {'LBL_DELETE_PRVILIGE'|vtranslate:$QUALIFIED_MODULE} </th> - <th width="28%" style="border-left: 1px solid #DDD !important;" nowrap="nowrap">{'LBL_FIELD_AND_TOOL_PRVILIGES'|vtranslate:$QUALIFIED_MODULE}</th> + <th width="14%" style="border-left: 1px solid #DDD !important;" nowrap="nowrap">{'LBL_FIELD_AND_TOOL_PRVILIGES'|vtranslate:$QUALIFIED_MODULE}</th> </tr> </thead> <tbody> @@ -79,7 +83,7 @@ <td> <input class="modulesCheckBox alignTop" type="checkbox" name="permissions[{$TABID}][is_permitted]" data-value="{$TABID}" data-module-state="" {if $RECORD_MODEL->hasModulePermission($PROFILE_MODULE)}checked="true"{else} data-module-unchecked="true" {/if}> {$PROFILE_MODULE->get('label')|vtranslate:$PROFILE_MODULE->getName()} </td> - {assign var="BASIC_ACTION_ORDER" value=array(2,0,1)} + {assign var="BASIC_ACTION_ORDER" value=array(2,3,0,1)} {foreach from=$BASIC_ACTION_ORDER item=ORDERID} <td style="border-left: 1px solid #DDD !important;"> {assign var="ACTION_MODEL" value=$ALL_BASIC_ACTIONS[$ORDERID]} diff --git a/layouts/vlayout/modules/Settings/Profiles/resources/Profiles.js b/layouts/vlayout/modules/Settings/Profiles/resources/Profiles.js index b873ba298..1191e556b 100644 --- a/layouts/vlayout/modules/Settings/Profiles/resources/Profiles.js +++ b/layouts/vlayout/modules/Settings/Profiles/resources/Profiles.js @@ -60,8 +60,7 @@ var Settings_Profiles_Js = { var target = jQuery(e.currentTarget); var parent = target.closest('tr'); var checked = target.attr('checked')? true : false; - - if (target.data('action-state') == 'EditView' || target.data('action-state') == 'Delete') { + if (jQuery.inArray(target.data('action-state'), ['EditView', 'Delete', 'CreateView']) != -1) { if (checked) { jQuery('[data-action-state="DetailView"]', parent).attr('checked', 'checked'); jQuery('[data-module-state]', parent).attr('checked', 'checked'); @@ -93,7 +92,7 @@ var Settings_Profiles_Js = { jQuery('[data-module-state]').change(handleModuleSelectionState); jQuery('[data-action-state]').change(handleActionSelectionState); - jQuery('#mainAction1CheckBox,#mainAction2CheckBox').change(selectAllModulesViewAndToolPriviliges); + jQuery('#mainAction1CheckBox,#mainAction2CheckBox,#mainAction7CheckBox').change(selectAllModulesViewAndToolPriviliges); jQuery('[data-togglehandler]').click(toggleEditViewTableRow); jQuery('[data-range]').each(function(index, item) { @@ -116,8 +115,9 @@ var Settings_Profiles_Js = { registerSelectAllModulesEvent : function() { var moduleCheckBoxes = jQuery('.modulesCheckBox'); var viewAction = jQuery('#mainAction4CheckBox'); - var createAction = jQuery('#mainAction1CheckBox'); - var deleteACtion = jQuery('#mainAction2CheckBox'); + var editAction = jQuery('#mainAction1CheckBox'); + var createAction = jQuery('#mainAction7CheckBox'); + var deleteAction = jQuery('#mainAction2CheckBox'); var mainModulesCheckBox = jQuery('#mainModulesCheckBox'); mainModulesCheckBox.on('change',function(e) { var mainCheckBox = jQuery(e.currentTarget); @@ -125,22 +125,25 @@ var Settings_Profiles_Js = { moduleCheckBoxes.attr('checked',true); viewAction.attr('checked',true); createAction.show().attr('checked',true); - deleteACtion.show().attr('checked',true); + editAction.show().attr('checked',true); + deleteAction.show().attr('checked',true); moduleCheckBoxes.trigger('change'); } else { moduleCheckBoxes.attr('checked',false); - moduleCheckBoxes.trigger('change'); viewAction.attr('checked',false); createAction.attr('checked', false); - deleteACtion.attr('checked', false); + editAction.attr('checked', false); + deleteAction.attr('checked', false); + moduleCheckBoxes.trigger('change'); } }); moduleCheckBoxes.on('change',function(){ Settings_Profiles_Js.checkSelectAll(moduleCheckBoxes,mainModulesCheckBox); Settings_Profiles_Js.checkSelectAll(jQuery('.action4CheckBox'),viewAction); - Settings_Profiles_Js.checkSelectAll(jQuery('.action1CheckBox'),createAction); - Settings_Profiles_Js.checkSelectAll(jQuery('.action2CheckBox'),deleteACtion); + Settings_Profiles_Js.checkSelectAll(jQuery('.action7CheckBox'),createAction); + Settings_Profiles_Js.checkSelectAll(jQuery('.action1CheckBox'),editAction); + Settings_Profiles_Js.checkSelectAll(jQuery('.action2CheckBox'),deleteAction); }); }, @@ -167,8 +170,8 @@ var Settings_Profiles_Js = { }, registerSelectAllCreateActionsEvent : function() { - var createActionCheckBoxes = jQuery('.action1CheckBox'); - var mainCreateActionCheckBox = jQuery('#mainAction1CheckBox'); + var createActionCheckBoxes = jQuery('.action7CheckBox'); + var mainCreateActionCheckBox = jQuery('#mainAction7CheckBox'); mainCreateActionCheckBox.on('change',function(e){ var mainCheckBox = jQuery(e.currentTarget); if(mainCheckBox.is(':checked')){ @@ -182,7 +185,23 @@ var Settings_Profiles_Js = { }); }, - + + registerSelectAllEditActionsEvent: function () { + var editActionCheckBoxes = jQuery('.action1CheckBox'); + var mainEditActionCheckBox = jQuery('#mainAction1CheckBox'); + mainEditActionCheckBox.on('change', function (e) { + var mainCheckBox = jQuery(e.currentTarget); + if (mainCheckBox.is(':checked')) { + editActionCheckBoxes.attr('checked', true); + } else { + editActionCheckBoxes.attr('checked', false); + } + }); + editActionCheckBoxes.on('change', function () { + Settings_Profiles_Js.checkSelectAll(editActionCheckBoxes, mainEditActionCheckBox); + }); + }, + registerSelectAllDeleteActionsEvent : function() { var deleteActionCheckBoxes = jQuery('.action2CheckBox'); var mainDeleteActionCheckBox = jQuery('#mainAction2CheckBox'); @@ -223,7 +242,10 @@ var Settings_Profiles_Js = { if(jQuery('[data-module-unchecked]').length > 0){ jQuery('#mainModulesCheckBox').attr('checked',false); } - + + if (jQuery('[data-action7-unchecked]').length <= 0) { + jQuery('#mainAction7CheckBox').attr('checked', true); + } if(jQuery('[data-action4-unchecked]').length <= 0){ jQuery('#mainAction4CheckBox').attr('checked',true); } @@ -345,6 +367,7 @@ var Settings_Profiles_Js = { Settings_Profiles_Js.registerSelectAllModulesEvent(); Settings_Profiles_Js.registerSelectAllViewActionsEvent(); Settings_Profiles_Js.registerSelectAllCreateActionsEvent(); + Settings_Profiles_Js.registerSelectAllEditActionsEvent(); Settings_Profiles_Js.registerSelectAllDeleteActionsEvent(); Settings_Profiles_Js.performSelectAllActionsOnLoad(); Settings_Profiles_Js.registerSubmitEvent(); diff --git a/layouts/vlayout/modules/Vtiger/Comment.tpl b/layouts/vlayout/modules/Vtiger/Comment.tpl index ecedc2526..0a865f945 100644 --- a/layouts/vlayout/modules/Vtiger/Comment.tpl +++ b/layouts/vlayout/modules/Vtiger/Comment.tpl @@ -38,72 +38,72 @@ </div> </div> <div class="row-fluid commentActionsContainer"> - - {assign var="REASON_TO_EDIT" value=$COMMENT->get('reasontoedit')} - <div class="row-fluid editedStatus" name="editStatus"> - <div class="row-fluid"> - <span class="{if empty($REASON_TO_EDIT)}hide{/if} span6 editReason"> - <p><small>[ {vtranslate('LBL_EDIT_REASON',$MODULE_NAME)} ] : <span name="editReason" class="textOverflowEllipsis">{nl2br($REASON_TO_EDIT)}</span></small></p> - </span> - {if $COMMENT->getCommentedTime() neq $COMMENT->getModifiedTime()} - <span class="{if empty($REASON_TO_EDIT)}row-fluid{else} span6{/if}"> - <span class="pull-right"> - <p class="muted"><small><em>{vtranslate('LBL_MODIFIED',$MODULE_NAME)}</em></small> <small title="{Vtiger_Util_Helper::formatDateTimeIntoDayString($COMMENT->getModifiedTime())}" class="commentModifiedTime">{Vtiger_Util_Helper::formatDateDiffInStrings($COMMENT->getModifiedTime())}</small></p> - </span> + {if $EDIT_PERMISSION} + {assign var="REASON_TO_EDIT" value=$COMMENT->get('reasontoedit')} + <div class="row-fluid editedStatus" name="editStatus"> + <div class="row-fluid"> + <span class="{if empty($REASON_TO_EDIT)}hide{/if} span6 editReason"> + <p><small>[ {vtranslate('LBL_EDIT_REASON',$MODULE_NAME)} ] : <span name="editReason" class="textOverflowEllipsis">{nl2br($REASON_TO_EDIT)}</span></small></p> </span> - {/if} + {if $COMMENT->getCommentedTime() neq $COMMENT->getModifiedTime()} + <span class="{if empty($REASON_TO_EDIT)}row-fluid{else} span6{/if}"> + <span class="pull-right"> + <p class="muted"><small><em>{vtranslate('LBL_MODIFIED',$MODULE_NAME)}</em></small> <small title="{Vtiger_Util_Helper::formatDateTimeIntoDayString($COMMENT->getModifiedTime())}" class="commentModifiedTime">{Vtiger_Util_Helper::formatDateDiffInStrings($COMMENT->getModifiedTime())}</small></p> + </span> + </span> + {/if} + </div> </div> - </div> + {/if} <div class="row-fluid commentActionsDiv"> - {assign var=COMMENTS_MODULE_MODEL value = Vtiger_Module_Model::getInstance('ModComments')} - <div class="pull-right commentActions"> - {if $CHILDS_ROOT_PARENT_MODEL} - {assign var=CHILDS_ROOT_PARENT_ID value=$CHILDS_ROOT_PARENT_MODEL->getId()} + <div class="pull-right commentActions"> + {if $CHILDS_ROOT_PARENT_MODEL} + {assign var=CHILDS_ROOT_PARENT_ID value=$CHILDS_ROOT_PARENT_MODEL->getId()} + {/if} + <span> + {if $CREATE_PERMISSION} + <a class="cursorPointer replyComment"><i class="icon-share-alt"></i>{vtranslate('LBL_REPLY',$MODULE_NAME)}</a> {/if} - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} - <span> - <a class="cursorPointer replyComment"><i class="icon-share-alt"></i>{vtranslate('LBL_REPLY',$MODULE_NAME)}</a> - {if $CURRENTUSER->getId() eq $COMMENT->get('userid')} - <span style="color:black">|</span> - <a class="cursorPointer editComment feedback"> - {vtranslate('LBL_EDIT',$MODULE_NAME)} - </a> - {/if} - </span> + {if $CURRENTUSER->getId() eq $COMMENT->get('userid') && $EDIT_PERMISSION} + {if $CREATE_PERMISSION} <span style="color:black">|</span> {/if} + <a class="cursorPointer editComment feedback"> + {vtranslate('LBL_EDIT',$MODULE_NAME)} + </a> {/if} - {assign var=CHILD_COMMENTS_COUNT value=$COMMENT->getChildCommentsCount()} - {if $CHILD_COMMENTS_MODEL neq null and ($CHILDS_ROOT_PARENT_ID neq $PARENT_COMMENT_ID)} - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} <span style="color:black">|</span> {/if} - <span class="viewThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> - <a class="cursorPointer viewThread"> - <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} - <img class="alignMiddle" src="{vimage_path('rightArrowSmall.png')}" /> - </a> - </span> - <span class="hide hideThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> - <a class="cursorPointer hideThread"> - <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} - <img class="alignMiddle" src="{vimage_path('downArrowSmall.png')}" /> - </a> - </span> + </span> + {assign var=CHILD_COMMENTS_COUNT value=$COMMENT->getChildCommentsCount()} + {if $CHILD_COMMENTS_MODEL neq null and ($CHILDS_ROOT_PARENT_ID neq $PARENT_COMMENT_ID)} + {if $EDIT_PERMISSION} <span style="color:black">|</span> {/if} + <span class="viewThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> + <a class="cursorPointer viewThread"> + <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} + <img class="alignMiddle" src="{vimage_path('rightArrowSmall.png')}" /> + </a> + </span> + <span class="hide hideThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> + <a class="cursorPointer hideThread"> + <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} + <img class="alignMiddle" src="{vimage_path('downArrowSmall.png')}" /> + </a> + </span> - {elseif $CHILD_COMMENTS_MODEL neq null and ($CHILDS_ROOT_PARENT_ID eq $PARENT_COMMENT_ID)} - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} <span style="color:black">|</span> {/if} - <span class="hide viewThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> - <a class="cursorPointer viewThread"> - <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} - <img class="alignMiddle" src="{vimage_path('rightArrowSmall.png')}" /> - </a> - </span> - <span class="hideThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> - <a class="cursorPointer hideThread"> - <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} - <img class="alignMiddle" src="{vimage_path('downArrowSmall.png')}" /> - </a> - </span> - {/if} - </small></p> - </div> + {elseif $CHILD_COMMENTS_MODEL neq null and ($CHILDS_ROOT_PARENT_ID eq $PARENT_COMMENT_ID)} + {if $CREATE_PERMISSION || $EDIT_PERMISSION} <span style="color:black">|</span> {/if} + <span class="hide viewThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> + <a class="cursorPointer viewThread"> + <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} + <img class="alignMiddle" src="{vimage_path('rightArrowSmall.png')}" /> + </a> + </span> + <span class="hideThreadBlock" data-child-comments-count="{$CHILD_COMMENTS_COUNT}"> + <a class="cursorPointer hideThread"> + <span class="childCommentsCount">{$CHILD_COMMENTS_COUNT}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} + <img class="alignMiddle" src="{vimage_path('downArrowSmall.png')}" /> + </a> + </span> + {/if} + </small></p> + </div> </div> </div> </div> diff --git a/layouts/vlayout/modules/Vtiger/CommentThreadList.tpl b/layouts/vlayout/modules/Vtiger/CommentThreadList.tpl index cfa8bcecb..00263201e 100644 --- a/layouts/vlayout/modules/Vtiger/CommentThreadList.tpl +++ b/layouts/vlayout/modules/Vtiger/CommentThreadList.tpl @@ -37,60 +37,60 @@ </div> </div> <div class="row-fluid commentActionsContainer"> - - {assign var="REASON_TO_EDIT" value=$COMMENT->get('reasontoedit')} - <div class="row-fluid editedStatus" name="editStatus"> - <div class="row-fluid"> - <p class="span6 marginLeftZero"><small> - <span class="{if empty($REASON_TO_EDIT)}hide{/if} span6 marginLeftZero editReason"> - [ {vtranslate('LBL_EDIT_REASON',$MODULE_NAME)} ] : <span name="editReason" class="textOverflowEllipsis">{nl2br($REASON_TO_EDIT)}</span> - </span> - </small></p> - {if $COMMENT->getCommentedTime() neq $COMMENT->getModifiedTime()} - <span class="{if empty($REASON_TO_EDIT)}row-fluid{else} span6{/if}"> - <span class="pull-right"> - <p class="muted"><small title="{Vtiger_Util_Helper::formatDateTimeIntoDayString($COMMENT->getModifiedTime())}">{Vtiger_Util_Helper::formatDateDiffInStrings($COMMENT->getModifiedTime())}</small></p> - </span> + {if $EDIT_PERMISSION} + {assign var="REASON_TO_EDIT" value=$COMMENT->get('reasontoedit')} + <div class="row-fluid editedStatus" name="editStatus"> + <div class="row-fluid"> + <p class="span6 marginLeftZero"><small> + <span class="{if empty($REASON_TO_EDIT)}hide{/if} span6 marginLeftZero editReason"> + [ {vtranslate('LBL_EDIT_REASON',$MODULE_NAME)} ] : <span name="editReason" class="textOverflowEllipsis">{nl2br($REASON_TO_EDIT)}</span> </span> - {/if} - + </small></p> + {if $COMMENT->getCommentedTime() neq $COMMENT->getModifiedTime()} + <span class="{if empty($REASON_TO_EDIT)}row-fluid{else} span6{/if}"> + <span class="pull-right"> + <p class="muted"><small title="{Vtiger_Util_Helper::formatDateTimeIntoDayString($COMMENT->getModifiedTime())}">{Vtiger_Util_Helper::formatDateDiffInStrings($COMMENT->getModifiedTime())}</small></p> + </span> + </span> + {/if} + + </div> </div> - </div> + {/if} <div class="row-fluid commentActionsDiv"> - {assign var=COMMENTS_MODULE_MODEL value = Vtiger_Module_Model::getInstance('ModComments')} - <span class="pull-right commentActions"> - {assign var=CHILD_COMMENTS_COUNT value=$COMMENT->getChildCommentsCount()} - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} - <span> - <a class="cursorPointer replyComment"> - <i class="icon-share-alt"></i> - {vtranslate('LBL_REPLY',$MODULE_NAME)} - </a> - {if $CURRENTUSER->getId() eq $COMMENT->get('userid')} - <span style="color:black">|</span> - <a class="cursorPointer editComment feedback"> - {vtranslate('LBL_EDIT',$MODULE_NAME)} - </a> - {/if} - </span> + <span class="pull-right commentActions"> + {assign var=CHILD_COMMENTS_COUNT value=$COMMENT->getChildCommentsCount()} + <span> + {if $CREATE_PERMISSION} + <a class="cursorPointer replyComment"> + <i class="icon-share-alt"></i> + {vtranslate('LBL_REPLY',$MODULE_NAME)} + </a> {/if} - {if $CHILD_COMMENTS_COUNT neq 0} - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} <span style="color:black">|</span> {/if} - <span class="hide viewThreadBlock" data-child-comments-count="{$COMMENT->getChildCommentsCount()}"> - <a class="cursorPointer viewThread"> - <span class="childCommentsCount">{$COMMENT->getChildCommentsCount()}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} - <img class="alignMiddle" src="{vimage_path('rightArrowSmall.png')}" /> - </a> - </span> - <span class="hideThreadBlock" data-child-comments-count="{$COMMENT->getChildCommentsCount()}"> - <a class="cursorPointer hideThread"> - <span class="childCommentsCount">{$COMMENT->getChildCommentsCount()}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} - <img class="alignMiddle" src="{vimage_path('downArrowSmall.png')}" /> - </a> - </span> + {if $CURRENTUSER->getId() eq $COMMENT->get('userid') && $EDIT_PERMISSION} + {if $CREATE_PERMISSION} <span style="color:black">|</span> {/if} + <a class="cursorPointer editComment feedback"> + {vtranslate('LBL_EDIT',$MODULE_NAME)} + </a> {/if} </span> + {if $CHILD_COMMENTS_COUNT neq 0} + {if $CREATE_PERMISSION || $EDIT_PERMISSION} <span style="color:black">|</span> {/if} + <span class="hide viewThreadBlock" data-child-comments-count="{$COMMENT->getChildCommentsCount()}"> + <a class="cursorPointer viewThread"> + <span class="childCommentsCount">{$COMMENT->getChildCommentsCount()}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} + <img class="alignMiddle" src="{vimage_path('rightArrowSmall.png')}" /> + </a> + </span> + <span class="hideThreadBlock" data-child-comments-count="{$COMMENT->getChildCommentsCount()}"> + <a class="cursorPointer hideThread"> + <span class="childCommentsCount">{$COMMENT->getChildCommentsCount()}</span> {if $CHILD_COMMENTS_COUNT eq 1}{vtranslate('LBL_REPLY',$MODULE_NAME)}{else}{vtranslate('LBL_REPLIES',$MODULE_NAME)}{/if} + <img class="alignMiddle" src="{vimage_path('downArrowSmall.png')}" /> + </a> + </span> + {/if} + </span> </div> </div> - </div> - </div> + </div> +</div> diff --git a/layouts/vlayout/modules/Vtiger/CommonActions.tpl b/layouts/vlayout/modules/Vtiger/CommonActions.tpl index 8ef98a1f9..4cb0a213c 100644 --- a/layouts/vlayout/modules/Vtiger/CommonActions.tpl +++ b/layouts/vlayout/modules/Vtiger/CommonActions.tpl @@ -67,7 +67,7 @@ <div class="row-fluid"> <div class="span12"> {foreach key=moduleName item=moduleModel from=$MENUS} - {if $moduleModel->isPermitted('EditView')} + {if $moduleModel->isPermitted('CreateView')} {assign var='quickCreateModule' value=$moduleModel->isQuickCreateSupported()} {assign var='singularLabel' value=$moduleModel->getSingularLabelKey()} {if $singularLabel == 'SINGLE_Calendar'} diff --git a/layouts/vlayout/modules/Vtiger/FindDuplicateContents.tpl b/layouts/vlayout/modules/Vtiger/FindDuplicateContents.tpl index 82314b357..6b52fca0b 100644 --- a/layouts/vlayout/modules/Vtiger/FindDuplicateContents.tpl +++ b/layouts/vlayout/modules/Vtiger/FindDuplicateContents.tpl @@ -37,16 +37,20 @@ <table class="table-bordered row-fluid textAlignCenter"> <thead> <tr class="listViewHeaders"> - <th width="5%"> - <input type="checkbox" id="listViewEntriesMainCheckBox" /> - </th> + {if $LISTVIEW_LINKS} + <th width="5%"> + <input type="checkbox" id="listViewEntriesMainCheckBox" /> + </th> + {/if} {foreach item=LISTVIEW_HEADER from=$LISTVIEW_HEADERS} <th nowrap {*if $LISTVIEW_HEADER@last} colspan="2" {/if*}> <a class="listViewHeaderValues">{vtranslate($LISTVIEW_HEADER->get('label'), $MODULE)}</a> </th> {/foreach} - <th>{vtranslate('LBL_MERGE_SELECT', $MODULE)}</th> - <th>{vtranslate('LBL_ACTION', $MODULE)}</th> + {if $IS_MODULE_EDITABLE} + <th>{vtranslate('LBL_MERGE_SELECT', $MODULE)}</th> + <th>{vtranslate('LBL_ACTION', $MODULE)}</th> + {/if} </tr> </thead> {assign var=mergeRecordCount value=0} @@ -55,9 +59,11 @@ {assign var=recordCount value=0} {foreach item=RECORD from=$LISTVIEW_ENTRY name=listview} <tr class="listViewEntries" data-id='{$RECORD.recordid}' id="{$MODULE}_listView_row_{$smarty.foreach.listview.index+1}"> - <td width="5%" style='border-bottom:1px solid #DDD;'> - <input type="checkbox" value="{$RECORD.recordid}" class="listViewEntriesCheckBox"/> - </td> + {if $LISTVIEW_LINKS} + <td width="5%" style='border-bottom:1px solid #DDD;'> + <input type="checkbox" value="{$RECORD.recordid}" class="listViewEntriesCheckBox"/> + </td> + {/if} {assign var=sameRowValues value=true} {foreach item=LISTVIEW_HEADER from=$LISTVIEW_HEADERS} {if $LISTVIEW_HEADER->get('name') eq 'recordid'} @@ -70,13 +76,15 @@ </td> {/if} {/foreach} - <td style='border-bottom:1px solid #DDD;'> - <input type="checkbox" data-id='{$RECORD.recordid}' name="mergeRecord" data-group="{$GROUP_NAME}"/> - </td> - {if $recordCount eq 0} - <td align='center' rowspan="{$groupCount}" style="border-left:1px solid #DDD;border-bottom:1px solid #DDD;vertical-align: middle;text-align: center"> - <input type="button" value="{vtranslate("LBL_MERGE",'Vtiger')}" name="merge" class="btn btn-success" data-group="{$GROUP_NAME}"> - </td> + {if $IS_MODULE_EDITABLE} + <td style='border-bottom:1px solid #DDD;'> + <input type="checkbox" data-id='{$RECORD.recordid}' name="mergeRecord" data-group="{$GROUP_NAME}"/> + </td> + {if $recordCount eq 0} + <td align='center' rowspan="{$groupCount}" style="border-left:1px solid #DDD;border-bottom:1px solid #DDD;vertical-align: middle;text-align: center"> + <input type="button" value="{vtranslate("LBL_MERGE",'Vtiger')}" name="merge" class="btn btn-success" data-group="{$GROUP_NAME}"> + </td> + {/if} {/if} {assign var=recordCount value=$recordCount+1} </tr> diff --git a/layouts/vlayout/modules/Vtiger/ListViewContents.tpl b/layouts/vlayout/modules/Vtiger/ListViewContents.tpl index 3a3e316d6..3b3d99416 100644 --- a/layouts/vlayout/modules/Vtiger/ListViewContents.tpl +++ b/layouts/vlayout/modules/Vtiger/ListViewContents.tpl @@ -137,7 +137,7 @@ <tr> <td> {assign var=SINGLE_MODULE value="SINGLE_$MODULE"} - {vtranslate('LBL_EQ_ZERO')} {vtranslate($SINGLE_MODULE, $MODULE)} {vtranslate('LBL_FOUND')}.{if $IS_MODULE_EDITABLE} {vtranslate('LBL_CREATE')} <a href="{$MODULE_MODEL->getCreateRecordUrl()}">{vtranslate($SINGLE_MODULE, $MODULE)}</a>{/if} + {vtranslate('LBL_EQ_ZERO')} {vtranslate($SINGLE_MODULE, $MODULE)} {vtranslate('LBL_FOUND')}.{if $IS_RECORD_CREATABLE} {vtranslate('LBL_CREATE')} <a href="{$MODULE_MODEL->getCreateRecordUrl()}">{vtranslate($SINGLE_MODULE, $MODULE)}</a>{/if} </td> </tr> </tbody> diff --git a/layouts/vlayout/modules/Vtiger/MenuBar.tpl b/layouts/vlayout/modules/Vtiger/MenuBar.tpl index 2fdfcdc5a..a9e38089e 100644 --- a/layouts/vlayout/modules/Vtiger/MenuBar.tpl +++ b/layouts/vlayout/modules/Vtiger/MenuBar.tpl @@ -198,7 +198,7 @@ <li id="compactquickCreate"> <div class="CompactQC"> {foreach key=moduleName item=moduleModel from=$MENUS} - {if $moduleModel->isPermitted('EditView')} + {if $moduleModel->isPermitted('CreateView')} {assign var='quickCreateModule' value=$moduleModel->isQuickCreateSupported()} {assign var='singularLabel' value=$moduleModel->getSingularLabelKey()} {if $quickCreateModule == '1'} diff --git a/layouts/vlayout/modules/Vtiger/RecentComments.tpl b/layouts/vlayout/modules/Vtiger/RecentComments.tpl index 5c6380f07..4506357c6 100644 --- a/layouts/vlayout/modules/Vtiger/RecentComments.tpl +++ b/layouts/vlayout/modules/Vtiger/RecentComments.tpl @@ -16,7 +16,9 @@ <div class="commentContainer recentComments"> <div class="commentTitle row-fluid"> - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} + {assign var=CREATE_PERMISSION value=$COMMENTS_MODULE_MODEL->isPermitted('CreateView')} + {assign var=EDIT_PERMISSION value=$COMMENTS_MODULE_MODEL->isPermitted('EditView')} + {if $CREATE_PERMISSION} <div class="addCommentBlock"> <div> <textarea name="commentcontent" class="commentcontent" placeholder="{vtranslate('LBL_ADD_YOUR_COMMENT_HERE', $MODULE_NAME)}" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}"></textarea> @@ -82,22 +84,22 @@ </div> <div class="row-fluid"> <div class="pull-right commentActions"> - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} - <span> + <span> + {if $CREATE_PERMISSION} <a class="cursorPointer replyComment feedback"> <i class="icon-share-alt"></i>{vtranslate('LBL_REPLY',$MODULE_NAME)} </a> - {if $CURRENTUSER->getId() eq $COMMENT->get('userid')} - <span>|</span> - <a class="cursorPointer editComment feedback"> - {vtranslate('LBL_EDIT',$MODULE_NAME)} - </a> - {/if} - </span> - {/if} + {/if} + {if $CURRENTUSER->getId() eq $COMMENT->get('userid') && $EDIT_PERMISSION} + {if $CREATE_PERMISSION} <span>|</span> {/if} + <a class="cursorPointer editComment feedback"> + {vtranslate('LBL_EDIT',$MODULE_NAME)} + </a> + {/if} + </span> <span> {if $PARENT_COMMENT_MODEL neq false or $CHILD_COMMENTS_MODEL neq null} - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} <span>|</span> {/if} + {if $CREATE_PERMISSION || $EDIT_PERMISSION} <span>|</span> {/if} <a href="javascript:void(0);" class="cursorPointer detailViewThread">{vtranslate('LBL_VIEW_THREAD',$MODULE_NAME)}</a> {/if} </span> @@ -119,35 +121,39 @@ </div> </div> {/if} - <div class="hide basicAddCommentBlock"> - <div class="row-fluid"> - <span class="span1"> </span> - <div class="span11"> - <textarea class="commentcontenthidden fullWidthAlways" name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}" placeholder="{vtranslate('LBL_ADD_YOUR_COMMENT_HERE', $MODULE_NAME)}"></textarea> + {if $CREATE_PERMISSION} + <div class="hide basicAddCommentBlock"> + <div class="row-fluid"> + <span class="span1"> </span> + <div class="span11"> + <textarea class="commentcontenthidden fullWidthAlways" name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}" placeholder="{vtranslate('LBL_ADD_YOUR_COMMENT_HERE', $MODULE_NAME)}"></textarea> + </div> </div> - </div> - <div class="pull-right"> - <button class="btn btn-success detailViewSaveComment" type="button" data-mode="add"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> - <a class="cursorPointer closeCommentBlock cancelLink" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> - </div> - </div> - <div class="hide basicEditCommentBlock" style="min-height: 150px;"> - <div class="row-fluid"> - <span class="span1"> </span> - <div class="span11"> - <input type="text" name="reasonToEdit" placeholder="{vtranslate('LBL_REASON_FOR_CHANGING_COMMENT', $MODULE_NAME)}" class="input-block-level"/> + <div class="pull-right"> + <button class="btn btn-success detailViewSaveComment" type="button" data-mode="add"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> + <a class="cursorPointer closeCommentBlock cancelLink" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> </div> </div> - <div class="row-fluid"> - <span class="span1"> </span> - <div class="span11"> - <textarea class="commentcontenthidden fullWidthAlways" name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}"></textarea> + {/if} + {if $EDIT_PERMISSION} + <div class="hide basicEditCommentBlock" style="min-height: 150px;"> + <div class="row-fluid"> + <span class="span1"> </span> + <div class="span11"> + <input type="text" name="reasonToEdit" placeholder="{vtranslate('LBL_REASON_FOR_CHANGING_COMMENT', $MODULE_NAME)}" class="input-block-level"/> + </div> + </div> + <div class="row-fluid"> + <span class="span1"> </span> + <div class="span11"> + <textarea class="commentcontenthidden fullWidthAlways" name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}"></textarea> + </div> + </div> + <div class="pull-right"> + <button class="btn btn-success detailViewSaveComment" type="button" data-mode="edit"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> + <a class="cursorPointer closeCommentBlock cancelLink" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> </div> </div> - <div class="pull-right"> - <button class="btn btn-success detailViewSaveComment" type="button" data-mode="edit"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> - <a class="cursorPointer closeCommentBlock cancelLink" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> - </div> - </div> + {/if} </div> {/strip} \ No newline at end of file diff --git a/layouts/vlayout/modules/Vtiger/RelatedActivities.tpl b/layouts/vlayout/modules/Vtiger/RelatedActivities.tpl index 5bfc7a414..e930cc68b 100644 --- a/layouts/vlayout/modules/Vtiger/RelatedActivities.tpl +++ b/layouts/vlayout/modules/Vtiger/RelatedActivities.tpl @@ -14,7 +14,13 @@ <div class="summaryWidgetContainer"> <div class="widget_header row-fluid"> <span class="span8"><h4 class="textOverflowEllipsis">{vtranslate('LBL_ACTIVITIES',$MODULE_NAME)}</h4></span> - <span class="span4"><button class="btn pull-right addButton createActivity" data-url="sourceModule={$RECORD->getModuleName()}&sourceRecord={$RECORD->getId()}&relationOperation=true" type="button"><strong>{vtranslate('LBL_ADD',$MODULE_NAME)}</strong></button></span> + <span class="span4"> + {if isPermitted('Calendar', 'CreateView') eq 'yes'} + <button class="btn pull-right addButton createActivity" data-url="sourceModule={$RECORD->getModuleName()}&sourceRecord={$RECORD->getId()}&relationOperation=true" type="button"> + <strong>{vtranslate('LBL_ADD',$MODULE_NAME)}</strong> + </button> + {/if} + </span> </div> <div class="widget_contents"> {if count($ACTIVITIES) neq '0'} @@ -33,16 +39,18 @@ {assign var=MODULE_NAME value=$RECORD->getModuleName()} <input type="hidden" class="activityModule" value="{$RECORD->getModuleName()}"/> <input type="hidden" class="activityType" value="{$RECORD->get('activitytype')}"/> - <div class="pull-right"> - <strong><span class="value">{vtranslate($RECORD->get('status'),$MODULE_NAME)}</span></strong>  - <span class="editStatus cursorPointer"><i class="icon-pencil" title="{vtranslate('LBL_EDIT',$MODULE_NAME)}"></i></span> - <span class="edit hide"> - {assign var=FIELD_MODEL value=$RECORD->getModule()->getField('taskstatus')} - {assign var=FIELD_VALUE value=$FIELD_MODEL->set('fieldvalue', $RECORD->get('status'))} - {include file=vtemplate_path($FIELD_MODEL->getUITypeModel()->getTemplateName(),$MODULE_NAME) FIELD_MODEL=$FIELD_MODEL USER_MODEL=$USER_MODEL MODULE=$MODULE_NAME OCCUPY_COMPLETE_WIDTH='true'} - <input type="hidden" class="fieldname" value='{$FIELD_MODEL->get('name')}' data-prev-value='{$FIELD_MODEL->get('fieldvalue')}' /> - </span> - </div> + {if $EDITVIEW_PERMITTED == 'yes'} + <div class="pull-right"> + <strong><span class="value">{vtranslate($RECORD->get('status'),$MODULE_NAME)}</span></strong>  + <span class="editStatus cursorPointer"><i class="icon-pencil" title="{vtranslate('LBL_EDIT',$MODULE_NAME)}"></i></span> + <span class="edit hide"> + {assign var=FIELD_MODEL value=$RECORD->getModule()->getField('taskstatus')} + {assign var=FIELD_VALUE value=$FIELD_MODEL->set('fieldvalue', $RECORD->get('status'))} + {include file=vtemplate_path($FIELD_MODEL->getUITypeModel()->getTemplateName(),$MODULE_NAME) FIELD_MODEL=$FIELD_MODEL USER_MODEL=$USER_MODEL MODULE=$MODULE_NAME OCCUPY_COMPLETE_WIDTH='true'} + <input type="hidden" class="fieldname" value='{$FIELD_MODEL->get('name')}' data-prev-value='{$FIELD_MODEL->get('fieldvalue')}' /> + </span> + </div> + {/if} </div> {else} {assign var=MODULE_NAME value="Events"} diff --git a/layouts/vlayout/modules/Vtiger/ShowAllComments.tpl b/layouts/vlayout/modules/Vtiger/ShowAllComments.tpl index 3c0854d48..5a4acbb71 100644 --- a/layouts/vlayout/modules/Vtiger/ShowAllComments.tpl +++ b/layouts/vlayout/modules/Vtiger/ShowAllComments.tpl @@ -15,7 +15,9 @@ <div class="commentContainer"> <div class="commentTitle row-fluid"> - {if $COMMENTS_MODULE_MODEL->isPermitted('EditView')} + {assign var=CREATE_PERMISSION value=$COMMENTS_MODULE_MODEL->isPermitted('CreateView')} + {assign var=EDIT_PERMISSION value=$COMMENTS_MODULE_MODEL->isPermitted('EditView')} + {if $CREATE_PERMISSION} <div class="addCommentBlock"> <div> <textarea name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}" class="commentcontent" placeholder="{vtranslate('LBL_ADD_YOUR_COMMENT_HERE', $MODULE_NAME)}"></textarea> @@ -30,34 +32,38 @@ <div class="commentsList commentsBody"> {include file='CommentsList.tpl'|@vtemplate_path COMMENT_MODULE_MODEL=$COMMENTS_MODULE_MODEL} </div> - <div class="hide basicAddCommentBlock"> - <div class="row-fluid"> - <span class="span1"> </span> - <div class="span11"> - <textarea class="commentcontenthidden fullWidthAlways" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}" name="commentcontent" placeholder="{vtranslate('LBL_ADD_YOUR_COMMENT_HERE', $MODULE_NAME)}"></textarea> + {if $CREATE_PERMISSION} + <div class="hide basicAddCommentBlock"> + <div class="row-fluid"> + <span class="span1"> </span> + <div class="span11"> + <textarea class="commentcontenthidden fullWidthAlways" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}" name="commentcontent" placeholder="{vtranslate('LBL_ADD_YOUR_COMMENT_HERE', $MODULE_NAME)}"></textarea> + </div> + </div> + <div class="pull-right"> + <button class="btn btn-success saveComment" type="button" data-mode="add"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> + <a class="cursorPointer closeCommentBlock" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> </div> </div> - <div class="pull-right"> - <button class="btn btn-success saveComment" type="button" data-mode="add"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> - <a class="cursorPointer closeCommentBlock" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> - </div> - </div> + {/if} + {if $EDIT_PERMISSION} <div class="hide basicEditCommentBlock" style="min-height: 150px;"> - <div class="row-fluid"> - <span class="span1"> </span> - <div class="span11"> - <input type="text" name="reasonToEdit" placeholder="{vtranslate('LBL_REASON_FOR_CHANGING_COMMENT', $MODULE_NAME)}" class="input-block-level"/> + <div class="row-fluid"> + <span class="span1"> </span> + <div class="span11"> + <input type="text" name="reasonToEdit" placeholder="{vtranslate('LBL_REASON_FOR_CHANGING_COMMENT', $MODULE_NAME)}" class="input-block-level"/> + </div> </div> - </div> - <div class="row-fluid"> - <span class="span1"> </span> - <div class="span11"> - <textarea class="commentcontenthidden fullWidthAlways" name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}"></textarea> + <div class="row-fluid"> + <span class="span1"> </span> + <div class="span11"> + <textarea class="commentcontenthidden fullWidthAlways" name="commentcontent" rows="{$COMMENT_TEXTAREA_DEFAULT_ROWS}"></textarea> + </div> + </div> + <div class="pull-right"> + <button class="btn btn-success saveComment" type="button" data-mode="edit"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> + <a class="cursorPointer closeCommentBlock cancelLink" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> </div> </div> - <div class="pull-right"> - <button class="btn btn-success saveComment" type="button" data-mode="edit"><strong>{vtranslate('LBL_POST', $MODULE_NAME)}</strong></button> - <a class="cursorPointer closeCommentBlock cancelLink" type="reset">{vtranslate('LBL_CANCEL', $MODULE_NAME)}</a> - </div> - </div> + {/if} </div> \ No newline at end of file diff --git a/modules/Calendar/models/ListView.php b/modules/Calendar/models/ListView.php index b189c02da..6b1588aec 100644 --- a/modules/Calendar/models/ListView.php +++ b/modules/Calendar/models/ListView.php @@ -17,7 +17,7 @@ class Calendar_ListView_Model extends Vtiger_ListView_Model { public function getBasicLinks() { $basicLinks = array(); $moduleModel = $this->getModule(); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); if($createPermission) { $basicLinks[] = array( 'linktype' => 'LISTVIEWBASIC', @@ -43,7 +43,7 @@ class Calendar_ListView_Model extends Vtiger_ListView_Model { */ public function getAdvancedLinks(){ $moduleModel = $this->getModule(); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); $advancedLinks = array(); $importPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'Import'); if($importPermission && $createPermission) { diff --git a/modules/Calendar/views/Calendar.php b/modules/Calendar/views/Calendar.php index 8b0f2ece6..cd5009b67 100644 --- a/modules/Calendar/views/Calendar.php +++ b/modules/Calendar/views/Calendar.php @@ -12,7 +12,12 @@ class Calendar_Calendar_View extends Vtiger_Index_View { public function preProcess(Vtiger_Request $request, $display = true) { $viewer = $this->getViewer($request); - $viewer->assign('MODULE_NAME', $request->getModule()); + $moduleName = $request->getModule(); + $viewer->assign('MODULE_NAME', $moduleName); + $moduleModel = Vtiger_Module_Model::getInstance($moduleName); + $viewer->assign('IS_RECORD_CREATABLE', $moduleModel->isPermitted('CreateView')); + $viewer->assign('IS_MODULE_EDITABLE', $moduleModel->isPermitted('EditView')); + $viewer->assign('IS_MODULE_DELETABLE', $moduleModel->isPermitted('Delete')); parent::preProcess($request, false); if($display) { diff --git a/modules/Campaigns/models/ListView.php b/modules/Campaigns/models/ListView.php index e496ee06d..07d1e2042 100644 --- a/modules/Campaigns/models/ListView.php +++ b/modules/Campaigns/models/ListView.php @@ -24,7 +24,7 @@ class Campaigns_ListView_Model extends Vtiger_ListView_Model { $basicLinks = array(); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); if($createPermission) { $basicLinks[] = array( 'linktype' => 'LISTVIEWBASIC', diff --git a/modules/Documents/Documents.php b/modules/Documents/Documents.php index 163d239e0..843f8aad5 100644 --- a/modules/Documents/Documents.php +++ b/modules/Documents/Documents.php @@ -524,7 +524,7 @@ class Documents extends CRMEntity { */ static function isLinkPermitted($linkData) { $moduleName = "Documents"; - if(vtlib_isModuleActive($moduleName) && isPermitted($moduleName, 'EditView') == 'yes') { + if(vtlib_isModuleActive($moduleName) && isPermitted($moduleName, 'CreateView') == 'yes') { return true; } return false; diff --git a/modules/Documents/models/ListView.php b/modules/Documents/models/ListView.php index 53b7513bd..a143b8099 100644 --- a/modules/Documents/models/ListView.php +++ b/modules/Documents/models/ListView.php @@ -22,7 +22,7 @@ class Documents_ListView_Model extends Vtiger_ListView_Model { $linkTypes = array('LISTVIEWBASIC', 'LISTVIEW', 'LISTVIEWSETTING'); $links = Vtiger_Link_Model::getAllByType($moduleModel->getId(), $linkTypes, $linkParams); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); if($createPermission) { $basicLinks = array( array( diff --git a/modules/Documents/views/AddFolder.php b/modules/Documents/views/AddFolder.php index 500596016..eed645d58 100644 --- a/modules/Documents/views/AddFolder.php +++ b/modules/Documents/views/AddFolder.php @@ -13,7 +13,7 @@ class Documents_AddFolder_View extends Vtiger_IndexAjax_View { public function checkPermission(Vtiger_Request $request) { $moduleName = $request->getModule(); - if(!Users_Privileges_Model::isPermitted($moduleName, 'EditView')) { + if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) { throw new AppException(vtranslate('LBL_PERMISSION_DENIED', $moduleName)); } } diff --git a/modules/HelpDesk/actions/ConvertFAQ.php b/modules/HelpDesk/actions/ConvertFAQ.php index b64eb2f4f..797453abb 100644 --- a/modules/HelpDesk/actions/ConvertFAQ.php +++ b/modules/HelpDesk/actions/ConvertFAQ.php @@ -11,7 +11,7 @@ class HelpDesk_ConvertFAQ_Action extends Vtiger_Action_Controller { public function checkPermission(Vtiger_Request $request) { - $recordPermission = Users_Privileges_Model::isPermitted('Faq', 'EditView'); + $recordPermission = Users_Privileges_Model::isPermitted('Faq', 'CreateView'); if(!$recordPermission) { throw new AppException('LBL_PERMISSION_DENIED'); diff --git a/modules/HelpDesk/models/DetailView.php b/modules/HelpDesk/models/DetailView.php index 9212955bc..22a57bf6d 100644 --- a/modules/HelpDesk/models/DetailView.php +++ b/modules/HelpDesk/models/DetailView.php @@ -47,7 +47,7 @@ class HelpDesk_DetailView_Model extends Vtiger_DetailView_Model { $documentsInstance = Vtiger_Module_Model::getInstance('Documents'); if($userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'Documents', diff --git a/modules/Inventory/models/ListView.php b/modules/Inventory/models/ListView.php index af9d7e6a9..8acb18a73 100644 --- a/modules/Inventory/models/ListView.php +++ b/modules/Inventory/models/ListView.php @@ -35,7 +35,7 @@ class Inventory_ListView_Model extends Vtiger_ListView_Model { $basicLinks = array(); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); if($createPermission) { $basicLinks[] = array( 'linktype' => 'LISTVIEWBASIC', diff --git a/modules/Inventory/models/RelationListView.php b/modules/Inventory/models/RelationListView.php index c4665b6ea..561ef7d0f 100644 --- a/modules/Inventory/models/RelationListView.php +++ b/modules/Inventory/models/RelationListView.php @@ -19,26 +19,28 @@ class Inventory_RelationListView_Model extends Vtiger_RelationListView_Model { } $relatedModel = $relationModel->getRelationModuleModel(); - if($relatedModel->get('label') == 'Calendar'){ - $addLinkList[] = array( - 'linktype' => 'LISTVIEWBASIC', - 'linklabel' => vtranslate('LBL_ADD_TASK'), - 'linkurl' => $this->getCreateTaskRecordUrl(), - 'linkicon' => '', - ); - }else{ - $addLinkList = array( - array( - 'linktype' => 'LISTVIEWBASIC', - 'linklabel' => vtranslate('LBL_ADD')." ".vtranslate($relatedModel->get('label')), - 'linkurl' => $this->getCreateViewUrl(), - 'linkicon' => '', - ) - ); - } - - foreach($addLinkList as $addLink) { - $addLinkModel[] = Vtiger_Link_Model::getInstanceFromValues($addLink); + if ($relatedModel->isPermitted('CreateView')) { + if($relatedModel->get('label') == 'Calendar'){ + $addLinkList[] = array( + 'linktype' => 'LISTVIEWBASIC', + 'linklabel' => vtranslate('LBL_ADD_TASK'), + 'linkurl' => $this->getCreateTaskRecordUrl(), + 'linkicon' => '', + ); + }else{ + $addLinkList = array( + array( + 'linktype' => 'LISTVIEWBASIC', + 'linklabel' => vtranslate('LBL_ADD')." ".vtranslate($relatedModel->get('label')), + 'linkurl' => $this->getCreateViewUrl(), + 'linkicon' => '', + ) + ); + } + + foreach($addLinkList as $addLink) { + $addLinkModel[] = Vtiger_Link_Model::getInstanceFromValues($addLink); + } } return $addLinkModel; } diff --git a/modules/Leads/models/Record.php b/modules/Leads/models/Record.php index a519cce82..c56f41381 100644 --- a/modules/Leads/models/Record.php +++ b/modules/Leads/models/Record.php @@ -59,7 +59,7 @@ class Leads_Record_Model extends Vtiger_Record_Model { $privilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel(); $moduleName = 'Accounts'; - if(!Users_Privileges_Model::isPermitted($moduleName, 'EditView')) { + if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) { return; } @@ -101,7 +101,7 @@ class Leads_Record_Model extends Vtiger_Record_Model { $privilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel(); $moduleName = 'Contacts'; - if(!Users_Privileges_Model::isPermitted($moduleName, 'EditView')) { + if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) { return; } @@ -148,7 +148,7 @@ class Leads_Record_Model extends Vtiger_Record_Model { $privilegeModel = Users_Privileges_Model::getCurrentUserPrivilegesModel(); $moduleName = 'Potentials'; - if(!Users_Privileges_Model::isPermitted($moduleName, 'EditView')) { + if(!Users_Privileges_Model::isPermitted($moduleName, 'CreateView')) { return; } diff --git a/modules/Potentials/models/DetailView.php b/modules/Potentials/models/DetailView.php index 1b9ca0c45..2e17e7cdb 100644 --- a/modules/Potentials/models/DetailView.php +++ b/modules/Potentials/models/DetailView.php @@ -23,7 +23,7 @@ class Potentials_DetailView_Model extends Vtiger_DetailView_Model { $invoiceModuleModel = Vtiger_Module_Model::getInstance('Invoice'); $quoteModuleModel = Vtiger_Module_Model::getInstance('Quotes'); - if($currentUserModel->hasModuleActionPermission($invoiceModuleModel->getId(), 'EditView')) { + if($currentUserModel->hasModuleActionPermission($invoiceModuleModel->getId(), 'CreateView')) { $basicActionLink = array( 'linktype' => 'DETAILVIEW', 'linklabel' => vtranslate('LBL_CREATE').' '.vtranslate($invoiceModuleModel->getSingularLabelKey(), 'Invoice'), @@ -32,8 +32,8 @@ class Potentials_DetailView_Model extends Vtiger_DetailView_Model { ); $linkModelList['DETAILVIEW'][] = Vtiger_Link_Model::getInstanceFromValues($basicActionLink); } - - if($currentUserModel->hasModuleActionPermission($quoteModuleModel->getId(), 'EditView')) { + + if($currentUserModel->hasModuleActionPermission($quoteModuleModel->getId(), 'CreateView')) { $basicActionLink = array( 'linktype' => 'DETAILVIEW', 'linklabel' => vtranslate('LBL_CREATE').' '.vtranslate($quoteModuleModel->getSingularLabelKey(), 'Quotes'), @@ -45,7 +45,7 @@ class Potentials_DetailView_Model extends Vtiger_DetailView_Model { $CalendarActionLinks[] = array(); $CalendarModuleModel = Vtiger_Module_Model::getInstance('Calendar'); - if($currentUserModel->hasModuleActionPermission($CalendarModuleModel->getId(), 'EditView')) { + if($currentUserModel->hasModuleActionPermission($CalendarModuleModel->getId(), 'CreateView')) { $CalendarActionLinks[] = array( 'linktype' => 'DETAILVIEW', 'linklabel' => 'LBL_ADD_EVENT', @@ -79,7 +79,7 @@ class Potentials_DetailView_Model extends Vtiger_DetailView_Model { $documentsInstance = Vtiger_Module_Model::getInstance('Documents'); if($userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'Documents', @@ -93,7 +93,7 @@ class Potentials_DetailView_Model extends Vtiger_DetailView_Model { $contactsInstance = Vtiger_Module_Model::getInstance('Contacts'); if($userPrivilegesModel->hasModuleActionPermission($contactsInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($contactsInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($contactsInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'LBL_RELATED_CONTACTS', @@ -107,7 +107,7 @@ class Potentials_DetailView_Model extends Vtiger_DetailView_Model { $productsInstance = Vtiger_Module_Model::getInstance('Products'); if($userPrivilegesModel->hasModuleActionPermission($productsInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($productsInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($productsInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'LBL_RELATED_PRODUCTS', diff --git a/modules/Users/DefaultDataPopulator.php b/modules/Users/DefaultDataPopulator.php index f10fc0114..eef5ead0f 100644 --- a/modules/Users/DefaultDataPopulator.php +++ b/modules/Users/DefaultDataPopulator.php @@ -1870,6 +1870,7 @@ Should any need arise,please do give us a call.'; $this->db->query("insert into vtiger_actionmapping values(4,'DetailView',0)"); $this->db->query("insert into vtiger_actionmapping values(5,'Import',0)"); $this->db->query("insert into vtiger_actionmapping values(6,'Export',0)"); + $this->db->query("insert into vtiger_actionmapping values(7,'CreateView',0)"); //$this->db->query("insert into vtiger_actionmapping values(7,'AddBusinessCard',0)"); $this->db->query("insert into vtiger_actionmapping values(8,'Merge',0)"); $this->db->query("insert into vtiger_actionmapping values(1,'VendorEditView',1)"); diff --git a/modules/Vtiger/models/Action.php b/modules/Vtiger/models/Action.php index 76ceda4d1..e14de37f8 100644 --- a/modules/Vtiger/models/Action.php +++ b/modules/Vtiger/models/Action.php @@ -13,7 +13,7 @@ */ class Vtiger_Action_Model extends Vtiger_Base_Model { - static $standardActions = array('0' => 'Save','1' => 'EditView','2' => 'Delete','3' => 'index','4' => 'DetailView'); + static $standardActions = array('0' => 'Save','1' => 'EditView','2' => 'Delete','3' => 'index','4' => 'DetailView', '7' => 'CreateView'); static $nonConfigurableActions = array('Save', 'index', 'SavePriceBook', 'SaveVendor', 'DetailViewAjax', 'PriceBookEditView', 'QuickCreate', 'VendorEditView', 'DeletePriceBook', 'DeleteVendor', 'Popup', 'PriceBookDetailView', diff --git a/modules/Vtiger/models/DetailView.php b/modules/Vtiger/models/DetailView.php index 04184ea2d..f239259c8 100644 --- a/modules/Vtiger/models/DetailView.php +++ b/modules/Vtiger/models/DetailView.php @@ -94,7 +94,7 @@ class Vtiger_DetailView_Model extends Vtiger_Base_Model { $linkModelList['DETAILVIEW'][] = Vtiger_Link_Model::getInstanceFromValues($deletelinkModel); } - if(Users_Privileges_Model::isPermitted($moduleName, 'EditView', $recordId)) { + if(Users_Privileges_Model::isPermitted($moduleName, 'CreateView', $recordId)) { $duplicateLinkModel = array( 'linktype' => 'DETAILVIEWBASIC', 'linklabel' => 'LBL_DUPLICATE', diff --git a/modules/Vtiger/models/ListView.php b/modules/Vtiger/models/ListView.php index aaa6028f7..c249c1ec1 100644 --- a/modules/Vtiger/models/ListView.php +++ b/modules/Vtiger/models/ListView.php @@ -424,7 +424,7 @@ class Vtiger_ListView_Model extends Vtiger_Base_Model { */ public function getAdvancedLinks(){ $moduleModel = $this->getModule(); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); $advancedLinks = array(); $importPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'Import'); if($importPermission && $createPermission) { @@ -475,7 +475,7 @@ class Vtiger_ListView_Model extends Vtiger_Base_Model { public function getBasicLinks(){ $basicLinks = array(); $moduleModel = $this->getModule(); - $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'EditView'); + $createPermission = Users_Privileges_Model::isPermitted($moduleModel->getName(), 'CreateView'); if($createPermission) { $basicLinks[] = array( 'linktype' => 'LISTVIEWBASIC', diff --git a/modules/Vtiger/models/RelationListView.php b/modules/Vtiger/models/RelationListView.php index 94803f0d1..bd8b767cc 100644 --- a/modules/Vtiger/models/RelationListView.php +++ b/modules/Vtiger/models/RelationListView.php @@ -143,34 +143,36 @@ class Vtiger_RelationListView_Model extends Vtiger_Base_Model { } $relatedModel = $relationModel->getRelationModuleModel(); - if($relatedModel->get('label') == 'Calendar'){ - - $addLinkList[] = array( - 'linktype' => 'LISTVIEWBASIC', - 'linklabel' => vtranslate('LBL_ADD_EVENT'), - 'linkurl' => $this->getCreateEventRecordUrl(), - 'linkicon' => '', - ); - $addLinkList[] = array( - 'linktype' => 'LISTVIEWBASIC', - 'linklabel' => vtranslate('LBL_ADD_TASK'), - 'linkurl' => $this->getCreateTaskRecordUrl(), - 'linkicon' => '', - ); - }else{ - $addLinkList = array( - array( - 'linktype' => 'LISTVIEWBASIC', - // NOTE: $relatedModel->get('label') assuming it to be a module name - we need singular label for Add action. - 'linklabel' => vtranslate('LBL_ADD')." ".vtranslate('SINGLE_' . $relatedModel->getName(), $relatedModel->getName()), - 'linkurl' => $this->getCreateViewUrl(), - 'linkicon' => '', - ) - ); - } + if ($relatedModel->isPermitted('CreateView')) { + if($relatedModel->get('label') == 'Calendar'){ + + $addLinkList[] = array( + 'linktype' => 'LISTVIEWBASIC', + 'linklabel' => vtranslate('LBL_ADD_EVENT'), + 'linkurl' => $this->getCreateEventRecordUrl(), + 'linkicon' => '', + ); + $addLinkList[] = array( + 'linktype' => 'LISTVIEWBASIC', + 'linklabel' => vtranslate('LBL_ADD_TASK'), + 'linkurl' => $this->getCreateTaskRecordUrl(), + 'linkicon' => '', + ); + }else{ + $addLinkList = array( + array( + 'linktype' => 'LISTVIEWBASIC', + // NOTE: $relatedModel->get('label') assuming it to be a module name - we need singular label for Add action. + 'linklabel' => vtranslate('LBL_ADD')." ".vtranslate('SINGLE_' . $relatedModel->getName(), $relatedModel->getName()), + 'linkurl' => $this->getCreateViewUrl(), + 'linkicon' => '', + ) + ); + } - foreach($addLinkList as $addLink) { - $addLinkModel[] = Vtiger_Link_Model::getInstanceFromValues($addLink); + foreach($addLinkList as $addLink) { + $addLinkModel[] = Vtiger_Link_Model::getInstanceFromValues($addLink); + } } return $addLinkModel; } diff --git a/modules/Vtiger/views/Edit.php b/modules/Vtiger/views/Edit.php index c7500e7f4..de975fb38 100644 --- a/modules/Vtiger/views/Edit.php +++ b/modules/Vtiger/views/Edit.php @@ -18,9 +18,12 @@ Class Vtiger_Edit_View extends Vtiger_Index_View { $moduleName = $request->getModule(); $record = $request->get('record'); - $recordPermission = Users_Privileges_Model::isPermitted($moduleName, 'EditView', $record); + $actionName = 'CreateView'; + if ($record && !$request->get('isDuplicate')) { + $actionName = 'EditView'; + } - if(!$recordPermission) { + if(!Users_Privileges_Model::isPermitted($moduleName, $actionName, $record)) { throw new AppException(vtranslate('LBL_PERMISSION_DENIED')); } } diff --git a/modules/Vtiger/views/FindDuplicates.php b/modules/Vtiger/views/FindDuplicates.php index 007822e3a..f726c7b2e 100644 --- a/modules/Vtiger/views/FindDuplicates.php +++ b/modules/Vtiger/views/FindDuplicates.php @@ -60,13 +60,16 @@ class Vtiger_FindDuplicates_View extends Vtiger_List_View { $module = $request->getModule(); $moduleModel = Vtiger_Module_Model::getInstance($module); - $massActionLink = array( - 'linktype' => 'LISTVIEWBASIC', - 'linklabel' => 'LBL_DELETE', - 'linkurl' => 'Javascript:Vtiger_FindDuplicates_Js.massDeleteRecords("index.php?module='.$module.'&action=MassDelete");', - 'linkicon' => '' - ); - $massActionLinks[] = Vtiger_Link_Model::getInstanceFromValues($massActionLink); + $massActionLinks = array(); + if ($moduleModel->isPermitted('Delete')) { + $massActionLink = array( + 'linktype' => 'LISTVIEWBASIC', + 'linklabel' => 'LBL_DELETE', + 'linkurl' => 'Javascript:Vtiger_FindDuplicates_Js.massDeleteRecords("index.php?module='.$module.'&action=MassDelete");', + 'linkicon' => '' + ); + $massActionLinks[] = Vtiger_Link_Model::getInstanceFromValues($massActionLink); + } $viewer->assign('LISTVIEW_LINKS', $massActionLinks); $viewer->assign('MODULE_MODEL', $moduleModel); @@ -116,6 +119,7 @@ class Vtiger_FindDuplicates_View extends Vtiger_List_View { $viewer->assign('PAGING_MODEL', $pagingModel); $viewer->assign('PAGE_NUMBER',$pageNumber); $viewer->assign('MODULE', $module); + $viewer->assign('IS_MODULE_EDITABLE', $moduleModel->isPermitted('EditView')); $viewer->assign('DUPLICATE_SEARCH_FIELDS', $duplicateSearchFields); $customViewModel = CustomView_Record_Model::getAllFilterByModule($module); diff --git a/modules/Vtiger/views/Import.php b/modules/Vtiger/views/Import.php index cea066b77..4046572bb 100644 --- a/modules/Vtiger/views/Import.php +++ b/modules/Vtiger/views/Import.php @@ -84,7 +84,7 @@ class Vtiger_Import_View extends Vtiger_Index_View { $viewer->assign('SUPPORTED_FILE_TYPES', Import_Utils_Helper::getSupportedFileExtensions()); $viewer->assign('SUPPORTED_FILE_ENCODING', Import_Utils_Helper::getSupportedFileEncoding()); $viewer->assign('SUPPORTED_DELIMITERS', Import_Utils_Helper::getSupportedDelimiters()); - $viewer->assign('AUTO_MERGE_TYPES', Import_Utils_Helper::getAutoMergeTypes()); + $viewer->assign('AUTO_MERGE_TYPES', Import_Utils_Helper::getAutoMergeTypes($moduleName)); //Duplicate records handling not supported for inventory moduels $duplicateHandlingNotSupportedModules = getInventoryModules(); diff --git a/modules/Vtiger/views/List.php b/modules/Vtiger/views/List.php index 0f1cdbaba..97a3a8218 100644 --- a/modules/Vtiger/views/List.php +++ b/modules/Vtiger/views/List.php @@ -216,6 +216,7 @@ class Vtiger_List_View extends Vtiger_Index_View { } $viewer->assign('LIST_VIEW_MODEL', $listViewModel); $viewer->assign('GROUPS_IDS', Vtiger_Util_Helper::getGroupsIdsForUsers($currentUser->getId())); + $viewer->assign('IS_RECORD_CREATABLE', $listViewModel->getModule()->isPermitted('CreateView')); $viewer->assign('IS_MODULE_EDITABLE', $listViewModel->getModule()->isPermitted('EditView')); $viewer->assign('IS_MODULE_DELETABLE', $listViewModel->getModule()->isPermitted('Delete')); $viewer->assign('SEARCH_DETAILS', $searchParmams); diff --git a/modules/Vtiger/views/QuickCreateAjax.php b/modules/Vtiger/views/QuickCreateAjax.php index 586d8f892..7a0bbcca5 100644 --- a/modules/Vtiger/views/QuickCreateAjax.php +++ b/modules/Vtiger/views/QuickCreateAjax.php @@ -13,7 +13,7 @@ class Vtiger_QuickCreateAjax_View extends Vtiger_IndexAjax_View { public function checkPermission(Vtiger_Request $request) { $moduleName = $request->getModule(); - if (!(Users_Privileges_Model::isPermitted($moduleName, 'EditView'))) { + if (!(Users_Privileges_Model::isPermitted($moduleName, 'CreateView'))) { throw new AppException(vtranslate('LBL_PERMISSION_DENIED', $moduleName)); } } diff --git a/packages/vtiger/mandatory/Import.zip b/packages/vtiger/mandatory/Import.zip index a5ab5cc482a2ecb9de2f898af15452dc9c48576d..effcae65f41b030ee57f0e61235427d50d0fc555 100644 GIT binary patch delta 14207 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 delta 13267 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 USMzt3fA{ka4FJ%q`}yww0oGToMF0Q* diff --git a/packages/vtiger/mandatory/MailManager.zip b/packages/vtiger/mandatory/MailManager.zip index e76809c693ddbeacf28cf7f32db3027fd9299c10..e71f5343a1281bb51b7980c718503413d7a6421d 100644 GIT binary patch delta 9732 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 delta 9825 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 diff --git a/packages/vtiger/optional/ModComments.zip b/packages/vtiger/optional/ModComments.zip index 38d0f773a3c661cbd7348f56afbf14a1f71674f6..aff4040abc6ba2367d661e93db524783e602788b 100644 GIT binary patch delta 3394 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 L13}+Wfc*Rq`A4U= delta 3400 zcmex%gz?r9M&1B#W)?065U^-iH<4FCW%56>@P^{z@X`uy21b@|j0_Ac0YF()b%AR5 z)QJGqbAZj8Z7KpX&t!5kig_EKtYzectC}1hq=Z%3=H8$MEZj)$n>>q24xhzvk4(P9 zq(z)U0Rtm^3K5R%wz0wP$lEqa$e!72;)GqDu&Ep~Gcb@Rrx{pbSFy!_jRma2#KI1{ ziZ+Ws%$x{ceo`?e&hehAj@S*Hr}`Gz@dmP%*wxj_ma~GL#>HccT}3p{B>}JsEoKMo zD(aX!IlwBuE4g7;5vV+m5v;<^&X72do$<lp99iGL5Tj<>*<-ito!thA3R!;~X5{%l zV*)#8p@TJcGd?)DLgLiI1&4}u7aI<w7@MMQK%B?)v~VPn8m(T4vsdckNF={?d6>lE z3D?8u^pU;ifZ2F0GXsOtBvtXr0x<&hoD9s^GA1zNZVmG7zic32Yrg-{+pMK(tYr^x zJ$3fJ<-D}cMKk1)$kKCL3{|#moI9=S?*G2IO9FJmH`HuMyI1`=?O4A3iXhhV#o~+W z>zR5!tW+`3)ZxrlDBqxJe&b`;gzTowZSkFv5if;WnxEEJU+TEbIw>u>u+1`Eg(uPZ zR)OY+XWzDl^REAWq_m`8f0N_f`3g&1A8)Aly1?&ts);*&VVLN7R%Mx;y0^3T9=Z9{ z>$9zRWov{OOWv^^Up5D+Y?#)Ywx84Zpl<mOPT3WcPBGs8_b=>KX`Zd	O=EcxEiS z6V&+jWy~>tm1(b@+^ApbD&anTPx~sTSHf(Xl9$-EYW~#E*{#sA`i_K7is0#8-&UVq z#=8Ax+vSVAS9LcV+}QF=PsqMGVZpAgZ>0{_%uZ0<n9uogmh}Gp8`PJ6*{hgbxOlhw zlM~Gcd9$~aUA5c&FD7@@2flx~GV?rRQ*sMz?oIBUuXy;yJ?<-;GPI(enbupriu`l6 z+C5^+Ou1#zJD*P|xN)>yx8uD)T;SR_nr}V|%E=dAmGm;P-yy$Ez1Zxi@9kx!*1Y;P zdyZW2Kf#|NQJTw_v+}9nq24!+D>Hw)|IKOp-2Yi;=CbaaRkqQ(n@^Tl&i1o1_ix<o zzaLz3BT~ad&QD7m87B+t7-CP+5jt*+^^8n%%<xji1DGh_fQvx_$`)XF>j+}zB<7`; zCZ?wr>xYK0LQ)k*)q&eQ0TlCGAm&X><yXaL6x=tHAB0OXE}8r*TvG{@nz7o8P%N7y zS-+&Qmx+NPH!&|WEw#8ruOc^x99MIoxH^v=Xkva!X%68qPz47buo6HCR1p;8Hn30L z5Fu@k(?i%JMh3-<f9#VV#K}!Q5X(wTz!=6$vMgx~;Q;H&iRULqPhcEK4?h=JPfwgE zZui0?z{7+qHTNg56gtMuz@P$kFR)-@Skl<W3p7W`L$4sC0DpWS3@a6@(E18AY%b6+ z4HU!f3IYw&cOWqUWl;jqM2unbMhDT!_R*Z`M7n4)PqZZKlE!YhP8njtME2T`16iyL z45tMd7?e@GaZO@!K$PO-1X(sBGec}7C`#tafwj$!<RvB=-$sD+9M%Wx(T)@##>p@C zKU**n7;kOB&^JJG^4rG67C>{%aoY<|x|8R|OR~OooM#0JWf>PDL)b(7;>2YifHtSF zFfgbi*}SCjv(@B;L_OR#!_&>=e?Xg;G`iS=ZJunAAWV#=4T&I4UiJ`8uM!1`(UhA2 z($wMv(xl-`RDtGUm*X#I%E7?!Q;C5=6~%|rZeYs|gHn_8i&6;Z6hv6p0@LMN$Mt?7 z{i2gMM04ZL8t`E9@b_J)+W-t|F<>O4=2d2Ym_cll17g`G$7`_>>AA%P)7)8s#qUmF z^r2?ihXKfD3KQc%lx7V|NO=T93=@bUDsI=ufTF1=6ybswF}#{sOAl5yQ28wbgr>k! Jhd&&|0{|qfph^G$ diff --git a/packages/vtiger/optional/Projects.zip b/packages/vtiger/optional/Projects.zip index f85a778a156e3ad15481fc4e673bc137a7e374c0..1b959c6144e7007e1bf84012a05653bac82c114f 100644 GIT binary patch delta 8628 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 TI3T5%m4QGM?!y2WO4$Dg{4Bkp delta 6407 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 D%;zpr diff --git a/pkg/vtiger/modules/Import/modules/Import/actions/Data.php b/pkg/vtiger/modules/Import/modules/Import/actions/Data.php index df0779552..f9669098f 100644 --- a/pkg/vtiger/modules/Import/modules/Import/actions/Data.php +++ b/pkg/vtiger/modules/Import/modules/Import/actions/Data.php @@ -435,15 +435,15 @@ class Import_Data_Action extends Vtiger_Action_Controller { } } if ((empty($entityId) || $entityId == 0) && !empty($referenceModuleName)) { - if(isPermitted($referenceModuleName, 'EditView') == 'yes') { - try { - $wsEntityIdInfo = $this->createEntityRecord($referenceModuleName, $entityLabel); - $wsEntityId = $wsEntityIdInfo['id']; - $entityIdComponents = vtws_getIdComponents($wsEntityId); - $entityId = $entityIdComponents[1]; - } catch (Exception $e) { - $entityId = false; - } + if(isPermitted($referenceModuleName, 'CreateView') == 'yes') { + try { + $wsEntityIdInfo = $this->createEntityRecord($referenceModuleName, $entityLabel); + $wsEntityId = $wsEntityIdInfo['id']; + $entityIdComponents = vtws_getIdComponents($wsEntityId); + $entityId = $entityIdComponents[1]; + } catch (Exception $e) { + $entityId = false; + } } } $fieldData[$fieldName] = $entityId; @@ -574,32 +574,32 @@ class Import_Data_Action extends Vtiger_Action_Controller { $fieldData = DataTransform::sanitizeData($fieldData, $moduleMeta); $entityIdInfo = vtws_create($moduleName, $fieldData, $this->user); - $adb = PearDatabase::getInstance(); - $entityIdComponents = vtws_getIdComponents($entityIdInfo['id']); - $recordId = $entityIdComponents[1]; - $entityfields = getEntityFieldNames($moduleName); - switch($moduleName) { - case 'HelpDesk': $entityfields['fieldname'] = array('ticket_title');break; - case 'Documents':$entityfields['fieldname'] = array('notes_title');break; - case 'Documents': $entityfields['fieldname'] = array('notes_title');break; - } - $label = ''; - if(is_array($entityfields['fieldname'])){ - foreach($entityfields['fieldname'] as $field){ - $label .= $fieldData[$field]." "; - } - }else { - $label = $fieldData[$entityfields['fieldname']]; - } + $adb = PearDatabase::getInstance(); + $entityIdComponents = vtws_getIdComponents($entityIdInfo['id']); + $recordId = $entityIdComponents[1]; + $entityfields = getEntityFieldNames($moduleName); + switch($moduleName) { + case 'HelpDesk': $entityfields['fieldname'] = array('ticket_title');break; + case 'Documents':$entityfields['fieldname'] = array('notes_title');break; + case 'Documents': $entityfields['fieldname'] = array('notes_title');break; + } + $label = ''; + if(is_array($entityfields['fieldname'])){ + foreach($entityfields['fieldname'] as $field){ + $label .= $fieldData[$field]." "; + } + }else { + $label = $fieldData[$entityfields['fieldname']]; + } - $label = trim($label); - $adb->pquery('UPDATE vtiger_crmentity SET label=? WHERE crmid=?', array($label, $recordId)); + $label = trim($label); + $adb->pquery('UPDATE vtiger_crmentity SET label=? WHERE crmid=?', array($label, $recordId)); - $recordModel = Vtiger_Record_Model::getCleanInstance($moduleName); - $focus = $recordModel->getEntity(); - $focus->id = $recordId; - $focus->column_fields = $fieldData; - $this->entityData[] = VTEntityData::fromCRMEntity($focus); + $recordModel = Vtiger_Record_Model::getCleanInstance($moduleName); + $focus = $recordModel->getEntity(); + $focus->id = $recordId; + $focus->column_fields = $fieldData; + $this->entityData[] = VTEntityData::fromCRMEntity($focus); $focus->updateMissingSeqNumber($moduleName); return $entityIdInfo; } diff --git a/pkg/vtiger/modules/Import/modules/Import/helpers/Utils.php b/pkg/vtiger/modules/Import/modules/Import/helpers/Utils.php index 0b42706ea..507c6637a 100644 --- a/pkg/vtiger/modules/Import/modules/Import/helpers/Utils.php +++ b/pkg/vtiger/modules/Import/modules/Import/helpers/Utils.php @@ -44,11 +44,13 @@ class Import_Utils_Helper { return self::$supportedDelimiters; } - public static function getAutoMergeTypes() { - return array( - self::$AUTO_MERGE_IGNORE => 'Skip', - self::$AUTO_MERGE_OVERWRITE => 'Overwrite', - self::$AUTO_MERGE_MERGEFIELDS => 'Merge'); + public static function getAutoMergeTypes($moduleName) { + $mergeTypes = array(self::$AUTO_MERGE_IGNORE => 'Skip'); + if (Users_Privileges_Model::isPermitted($moduleName, 'EditView')) { + $mergeTypes[self::$AUTO_MERGE_OVERWRITE] = 'Overwrite'; + $mergeTypes[self::$AUTO_MERGE_MERGEFIELDS] = 'Merge'; + } + return $mergeTypes; } public static function getMaxUploadSize() { diff --git a/pkg/vtiger/modules/MailManager/modules/MailManager/MailManager.php b/pkg/vtiger/modules/MailManager/modules/MailManager/MailManager.php index 0ae0bd989..ad9e819e6 100644 --- a/pkg/vtiger/modules/MailManager/modules/MailManager/MailManager.php +++ b/pkg/vtiger/modules/MailManager/modules/MailManager/MailManager.php @@ -105,7 +105,7 @@ class MailManager { static function checkModuleWriteAccessForCurrentUser($module) { global $current_user; - if (isPermitted($module, 'EditView') == "yes" && vtlib_isModuleActive($module)) { + if (isPermitted($module, 'CreateView') == "yes" && vtlib_isModuleActive($module)) { return true; } return false; diff --git a/pkg/vtiger/modules/MailManager/modules/MailManager/views/Relation.php b/pkg/vtiger/modules/MailManager/modules/MailManager/views/Relation.php index 5a6744ed3..bfcfa60d0 100755 --- a/pkg/vtiger/modules/MailManager/modules/MailManager/views/Relation.php +++ b/pkg/vtiger/modules/MailManager/modules/MailManager/views/Relation.php @@ -361,6 +361,7 @@ class MailManager_Relation_View extends MailManager_Abstract_View { public function getCurrentUserMailManagerAllowedModules() { $moduleListForCreateRecordFromMail = array('Contacts', 'Accounts', 'Leads', 'HelpDesk', 'Calendar'); + $mailManagerAllowedModules = array(); foreach($moduleListForCreateRecordFromMail as $module) { if(MailManager::checkModuleWriteAccessForCurrentUser($module)) { $mailManagerAllowedModules[] = $module; @@ -376,6 +377,7 @@ class MailManager_Relation_View extends MailManager_Abstract_View { public function linkToAvailableActions() { $moduleListForLinkTo = array('Calendar','HelpDesk','ModComments','Emails'); + $mailManagerAllowedModules = array(); foreach($moduleListForLinkTo as $module) { if(MailManager::checkModuleWriteAccessForCurrentUser($module)) { $mailManagerAllowedModules[] = $module; diff --git a/pkg/vtiger/modules/ModComments/modules/ModComments/views/Edit.php b/pkg/vtiger/modules/ModComments/modules/ModComments/views/Edit.php index 3242ffa59..b29198a62 100644 --- a/pkg/vtiger/modules/ModComments/modules/ModComments/views/Edit.php +++ b/pkg/vtiger/modules/ModComments/modules/ModComments/views/Edit.php @@ -14,7 +14,12 @@ Class ModComments_Edit_View extends Vtiger_Edit_View { $currentUserModel = Users_Record_Model::getCurrentUserModel(); $moduleName = $request->getModule(); $record = $request->get('record'); - if (!empty($record) || !Users_Privileges_Model::isPermitted($moduleName, 'EditView')) { + $actionName = 'CreateView'; + if ($record && !$request->get('isDuplicate')) { + $actionName = 'EditView'; + } + + if(!Users_Privileges_Model::isPermitted($moduleName, $actionName, $record)) { throw new AppException('LBL_PERMISSION_DENIED'); } } diff --git a/pkg/vtiger/modules/Projects/Project/modules/Project/models/DetailView.php b/pkg/vtiger/modules/Projects/Project/modules/Project/models/DetailView.php index f01a2a490..2c6b7db52 100644 --- a/pkg/vtiger/modules/Projects/Project/modules/Project/models/DetailView.php +++ b/pkg/vtiger/modules/Projects/Project/modules/Project/models/DetailView.php @@ -21,7 +21,7 @@ class Project_DetailView_Model extends Vtiger_DetailView_Model { $helpDeskInstance = Vtiger_Module_Model::getInstance('HelpDesk'); if($userPrivilegesModel->hasModuleActionPermission($helpDeskInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($helpDeskInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($helpDeskInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'HelpDesk', @@ -35,7 +35,7 @@ class Project_DetailView_Model extends Vtiger_DetailView_Model { $projectMileStoneInstance = Vtiger_Module_Model::getInstance('ProjectMilestone'); if($userPrivilegesModel->hasModuleActionPermission($projectMileStoneInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($projectMileStoneInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($projectMileStoneInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'LBL_MILESTONES', @@ -49,7 +49,7 @@ class Project_DetailView_Model extends Vtiger_DetailView_Model { $projectTaskInstance = Vtiger_Module_Model::getInstance('ProjectTask'); if($userPrivilegesModel->hasModuleActionPermission($projectTaskInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($projectTaskInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($projectTaskInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'LBL_TASKS', @@ -64,7 +64,7 @@ class Project_DetailView_Model extends Vtiger_DetailView_Model { $documentsInstance = Vtiger_Module_Model::getInstance('Documents'); if($userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'DetailView')) { - $createPermission = $userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'EditView'); + $createPermission = $userPrivilegesModel->hasModuleActionPermission($documentsInstance->getId(), 'CreateView'); $widgets[] = array( 'linktype' => 'DETAILVIEWWIDGET', 'linklabel' => 'Documents', diff --git a/pkg/vtiger/modules/Projects/ProjectTask/modules/ProjectTask/ProjectTask.php b/pkg/vtiger/modules/Projects/ProjectTask/modules/ProjectTask/ProjectTask.php index 2873f4f1e..703285c6e 100644 --- a/pkg/vtiger/modules/Projects/ProjectTask/modules/ProjectTask/ProjectTask.php +++ b/pkg/vtiger/modules/Projects/ProjectTask/modules/ProjectTask/ProjectTask.php @@ -391,7 +391,7 @@ class ProjectTask extends CRMEntity { */ static function isLinkPermitted($linkData) { $moduleName = "ProjectTask"; - if(vtlib_isModuleActive($moduleName) && isPermitted($moduleName, 'EditView') == 'yes') { + if(vtlib_isModuleActive($moduleName) && isPermitted($moduleName, 'CreateView') == 'yes') { return true; } return false; diff --git a/tabdata.php b/tabdata.php index d3dd4e110..96e6c7d88 100644 --- a/tabdata.php +++ b/tabdata.php @@ -17,7 +17,7 @@ $tab_seq_array=array('1'=>0,'2'=>0,'3'=>0,'4'=>0,'6'=>0,'7'=>0,'8'=>0,'9'=>0,'10 $tab_ownedby_array=array('1'=>1,'2'=>0,'3'=>1,'4'=>0,'6'=>0,'7'=>0,'8'=>0,'9'=>0,'10'=>1,'13'=>0,'14'=>1,'15'=>1,'16'=>0,'18'=>1,'19'=>1,'20'=>0,'21'=>0,'22'=>0,'23'=>0,'24'=>1,'25'=>1,'26'=>0,'27'=>1,'28'=>1,'29'=>1,); -$action_id_array=array('Save'=>0,'SavePriceBook'=>0,'SaveVendor'=>0,'DetailViewAjax'=>1,'EditView'=>1,'PriceBookEditView'=>1,'QuickCreate'=>1,'VendorEditView'=>1,'Delete'=>2,'DeletePriceBook'=>2,'DeleteVendor'=>2,'index'=>3,'Popup'=>3,'DetailView'=>4,'PriceBookDetailView'=>4,'TagCloud'=>4,'VendorDetailView'=>4,'Import'=>5,'Export'=>6,'Merge'=>8,'ConvertLead'=>9,'DuplicatesHandling'=>10); +$action_id_array=array('Save'=>0,'SavePriceBook'=>0,'SaveVendor'=>0,'DetailViewAjax'=>1,'EditView'=>1,'PriceBookEditView'=>1,'QuickCreate'=>1,'VendorEditView'=>1,'Delete'=>2,'DeletePriceBook'=>2,'DeleteVendor'=>2,'index'=>3,'Popup'=>3,'DetailView'=>4,'PriceBookDetailView'=>4,'TagCloud'=>4,'VendorDetailView'=>4,'Import'=>5,'Export'=>6,'Merge'=>8,'ConvertLead'=>9,'DuplicatesHandling'=>10,'CreateView'=>7); $action_name_array=array(0=>'Save',1=>'EditView',2=>'Delete',3=>'index',4=>'DetailView',5=>'Import',6=>'Export',8=>'Merge',9=>'ConvertLead',10=>'DuplicatesHandling'); ?> \ No newline at end of file diff --git a/wip-migration-split-create-edit-permissions.php b/wip-migration-split-create-edit-permissions.php new file mode 100644 index 000000000..96724152e --- /dev/null +++ b/wip-migration-split-create-edit-permissions.php @@ -0,0 +1,38 @@ +<?php +/*+********************************************************************************** + * The contents of this file are subject to the vtiger CRM Public License Version 1.0 + * ("License"); You may not use this file except in compliance with the License + * The Original Code is: vtiger CRM Open Source + * The Initial Developer of the Original Code is vtiger. + * Portions created by vtiger are Copyright (C) vtiger. + * All Rights Reserved. + ************************************************************************************/ + +require_once 'include/utils/utils.php'; +$adb = PearDatabase::getInstance(); + +$actionMappingResult = $adb->pquery('SELECT 1 FROM vtiger_actionmapping WHERE actionname=?', array('CreateView')); +if (!$adb->num_rows($actionMappingResult)) { + $adb->pquery('INSERT INTO vtiger_actionmapping VALUES(?, ?, ?)', array(7, 'CreateView', 0)); +} + +$createActionResult = $adb->pquery('SELECT * FROM vtiger_profile2standardpermissions WHERE operation=?', array(1)); +$query = 'INSERT INTO vtiger_profile2standardpermissions VALUES'; +while($rowData = $adb->fetch_array($createActionResult)) { + $tabId = $rowData['tabid']; + $profileId = $rowData['profileid']; + $permissions = $rowData['permissions']; + $query .= "('$profileId', '$tabId', '7', '$permissions'),"; +} +$adb->pquery(trim($query, ','), array()); + +require_once './modules/Users/CreateUserPrivilegeFile.php'; +$usersResult = $adb->pquery('SELECT id FROM vtiger_users', array()); +$numOfRows = $adb->num_rows($usersResult); +$userIdsList = array(); +for($i=0; $i<$numOfRows; $i++) { + $userId = $adb->query_result($usersResult, $i, 'id'); + createUserPrivilegesfile($userId); +} + +echo '<br>Successfully updated create and edit permissions<br>'; \ No newline at end of file -- GitLab