From 0ddfe1217ac32168fa4493f9d0d6998bff94e633 Mon Sep 17 00:00:00 2001
From: Uma <uma.s@vtiger.com>
Date: Wed, 13 May 2020 12:51:26 +0530
Subject: [PATCH] Fixes #1261 Report sharing has been addressed

---
 layouts/v7/modules/Reports/Step1.tpl          | 10 +++++++++-
 .../v7/modules/Reports/resources/Detail.js    | 20 +++++++++++++++++++
 layouts/v7/modules/Reports/resources/Edit.js  | 19 ++++++++++++++++++
 modules/Reports/models/Record.php             | 13 +++++++-----
 4 files changed, 56 insertions(+), 6 deletions(-)

diff --git a/layouts/v7/modules/Reports/Step1.tpl b/layouts/v7/modules/Reports/Step1.tpl
index d58127340..f58aa9cf4 100644
--- a/layouts/v7/modules/Reports/Step1.tpl
+++ b/layouts/v7/modules/Reports/Step1.tpl
@@ -104,10 +104,18 @@
                     <label class='col-lg-3 control-label textAlignLeft'>{vtranslate('LBL_SHARE_REPORT',$MODULE)}</label>
                     <div class='col-lg-4'>
                         <select id="memberList" class="col-lg-12 select2-container select2 members " multiple="true" name="members[]" data-placeholder="{vtranslate('LBL_ADD_USERS_ROLES', $MODULE)}">
+                            <optgroup label="{vtranslate('LBL_ALL',$MODULE)}">
+                                    <option value="All::Users" data-member-type="{vtranslate('LBL_ALL',$MODULE)}" 
+                                                    {if ($REPORT_MODEL->get('sharingtype') == 'Public')} selected="selected"{/if}>
+                                            {vtranslate('LBL_ALL_USERS',$MODULE)}
+                                    </option>
+                            </optgroup>
                             {foreach from=$MEMBER_GROUPS key=GROUP_LABEL item=ALL_GROUP_MEMBERS}
                                 <optgroup label="{$GROUP_LABEL}">
                                     {foreach from=$ALL_GROUP_MEMBERS item=MEMBER}
-                                        <option value="{$MEMBER->getId()}"  data-member-type="{$GROUP_LABEL}" {if isset($SELECTED_MEMBERS_GROUP[$GROUP_LABEL][$MEMBER->getId()])}selected="true"{/if}>{$MEMBER->getName()}</option>
+                                        {if $GROUP_LABEL neq 'Users' || $MEMBER->getId() neq 'Users:'|cat:$CURRENT_USER->getId()}
+                                            <option value="{$MEMBER->getId()}"  data-member-type="{$GROUP_LABEL}" {if isset($SELECTED_MEMBERS_GROUP[$GROUP_LABEL][$MEMBER->getId()])}selected="true"{/if}>{$MEMBER->getName()}</option>
+                                        {/if}
                                     {/foreach}
                                 </optgroup>
                             {/foreach}
diff --git a/layouts/v7/modules/Reports/resources/Detail.js b/layouts/v7/modules/Reports/resources/Detail.js
index 411ccf11e..5792f5776 100644
--- a/layouts/v7/modules/Reports/resources/Detail.js
+++ b/layouts/v7/modules/Reports/resources/Detail.js
@@ -162,6 +162,25 @@ Vtiger_Detail_Js("Reports_Detail_Js",{},{
 		});
 	},
 	
+        registerOnlyAllUsersInSharedList : function(){
+            var self = this;
+            jQuery('#memberList').on('change',function(e){
+                var element = jQuery(e.currentTarget);
+                if(self.isAllUsersSelected()){
+                    element.find('option').not('[value="All::Users"]').prop('disabled',true);
+                    element.select2('val',['All::Users']);
+                    element.select2('close');
+                }else{
+                    element.find('option').removeProp('disabled');
+                }
+            });
+        },
+
+        isAllUsersSelected : function() {
+            var memberList = jQuery('#memberList').val();
+            return (memberList != null && (memberList.indexOf('All::Users') != -1)) ? true : false
+        },
+    
 	registerEvents : function(){
 		this.registerSaveOrGenerateReportEvent();
         this.registerEventsForActions();
@@ -170,5 +189,6 @@ Vtiger_Detail_Js("Reports_Detail_Js",{},{
         this.generateReportCount(parseInt(jQuery("#countValue").text()));
 		this.registerConditionBlockChangeEvent();
 		this.registerEventForModifyCondition();
+                this.registerOnlyAllUsersInSharedList();
 	}
 });
\ No newline at end of file
diff --git a/layouts/v7/modules/Reports/resources/Edit.js b/layouts/v7/modules/Reports/resources/Edit.js
index ae9d06696..1b7670878 100644
--- a/layouts/v7/modules/Reports/resources/Edit.js
+++ b/layouts/v7/modules/Reports/resources/Edit.js
@@ -157,6 +157,24 @@ Vtiger_Edit_Js("Reports_Edit_Js",{
 	},
 	registerPageLeaveEvents : function() {
 	},
+        registerOnlyAllUsersInSharedList : function(){
+            var self = this;
+            jQuery('#memberList').on('change',function(e){
+                var element = jQuery(e.currentTarget);
+                if(self.isAllUsersSelected()){
+                    element.find('option').not('[value="All::Users"]').prop('disabled',true);
+                    element.select2('val',['All::Users']);
+                    element.select2('close');
+                }else{
+                    element.find('option').removeProp('disabled');
+                }
+            });
+        },
+
+        isAllUsersSelected : function() {
+            var memberList = jQuery('#memberList').val();
+            return (memberList != null && (memberList.indexOf('All::Users') != -1)) ? true : false
+        },
 	registerEvents : function(){
 		this._super();
 		var statusToProceed = this.proceedRegisterEvents();
@@ -166,6 +184,7 @@ Vtiger_Edit_Js("Reports_Edit_Js",{
 		var form = this.currentInstance.getContainer();
 		this.registerFormSubmitEvent(form);
 		this.registerBackStepClickEvent();
+                this.registerOnlyAllUsersInSharedList();
 	}
 });
 
diff --git a/modules/Reports/models/Record.php b/modules/Reports/models/Record.php
index c16e3dc92..cf8b79339 100644
--- a/modules/Reports/models/Record.php
+++ b/modules/Reports/models/Record.php
@@ -445,12 +445,15 @@ class Reports_Record_Model extends Vtiger_Record_Model {
 
 		$reportId = $this->getId();
 
-		//When members variable is not empty, it means record shared with other users, so
-		//sharing type of a report should be private
-		$sharingType = 'Public';
+		//Newly created records are always as Private, only shared users can see report
+		$sharingType = 'Private';
+		
 		$members = $this->get('members',array());
-		if(!empty($members)){
-			$sharingType = 'Private';
+		
+		if($members && count($members) == 1){
+			if($members[0] == 'All::Users'){
+				$sharingType = 'Public';
+			}
 		}
 
 		if(empty($reportId)) {
-- 
GitLab