From 65c202c998adc5a1aecd6e96e392d1065ac9b462 Mon Sep 17 00:00:00 2001
From: Dani Palou <dani@moodle.com>
Date: Fri, 26 Apr 2019 15:36:43 +0200
Subject: [PATCH] MOBILE-2975 comments: Allow disable comments

---
 .../entries/addon-blog-entries.html           |  2 +-
 src/addon/blog/components/entries/entries.ts  |  7 +++-
 .../addon-mod-assign-submission-comments.html |  2 +-
 .../submission/comments/component/comments.ts |  4 ++
 src/addon/mod/data/pages/entry/entry.html     |  2 +-
 src/addon/mod/data/pages/entry/entry.ts       |  5 ++-
 .../comments/components/comments/comments.ts  | 38 +++++++++++++++++--
 .../components/comments/core-comments.html    |  2 +-
 src/core/comments/providers/comments.ts       | 25 ++++++++++++
 9 files changed, 77 insertions(+), 10 deletions(-)

diff --git a/src/addon/blog/components/entries/addon-blog-entries.html b/src/addon/blog/components/entries/addon-blog-entries.html
index 9312a00cd..670e4d276 100644
--- a/src/addon/blog/components/entries/addon-blog-entries.html
+++ b/src/addon/blog/components/entries/addon-blog-entries.html
@@ -29,7 +29,7 @@
                 </ion-item>
                 <ion-card-content>
                     <core-format-text [text]="entry.summary" [component]="this.component" [componentId]="entry.id"></core-format-text>
-                    <ion-item>
+                    <ion-item *ngIf="commentsEnabled">
                         <core-comments [component]="this.component" [itemId]="entry.id" area="format_blog" [instanceId]="entry.userid" contextLevel="user"></core-comments>
                     </ion-item>
                     <core-file *ngFor="let file of entry.attachmentfiles" [file]="file" [component]="this.component" [componentId]="entry.id"></core-file>
diff --git a/src/addon/blog/components/entries/entries.ts b/src/addon/blog/components/entries/entries.ts
index 54f84d30a..b66db02a3 100644
--- a/src/addon/blog/components/entries/entries.ts
+++ b/src/addon/blog/components/entries/entries.ts
@@ -18,6 +18,7 @@ import { CoreDomUtilsProvider } from '@providers/utils/dom';
 import { CoreSitesProvider } from '@providers/sites';
 import { CoreUserProvider } from '@core/user/providers/user';
 import { AddonBlogProvider } from '../../providers/blog';
+import { CoreCommentsProvider } from '@core/comments/providers/comments';
 
 /**
  * Component that displays the blog entries.
@@ -47,9 +48,11 @@ export class AddonBlogEntriesComponent implements OnInit {
     showMyIssuesToggle = false;
     onlyMyEntries = false;
     component = AddonBlogProvider.COMPONENT;
+    commentsEnabled: boolean;
 
     constructor(protected blogProvider: AddonBlogProvider, protected domUtils: CoreDomUtilsProvider,
-            protected userProvider: CoreUserProvider, sitesProvider: CoreSitesProvider) {
+            protected userProvider: CoreUserProvider, sitesProvider: CoreSitesProvider,
+            protected commentsProvider: CoreCommentsProvider) {
         this.currentUserId = sitesProvider.getCurrentSiteUserId();
     }
 
@@ -81,6 +84,8 @@ export class AddonBlogEntriesComponent implements OnInit {
             this.filter['tagid'] = this.tagId;
         }
 
+        this.commentsEnabled = !this.commentsProvider.areCommentsDisabledInSite();
+
         this.fetchEntries().then(() => {
             this.blogProvider.logView(this.filter).catch(() => {
                 // Ignore errors.
diff --git a/src/addon/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html b/src/addon/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html
index 07a5ae68e..be2ba466f 100644
--- a/src/addon/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html
+++ b/src/addon/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html
@@ -1,4 +1,4 @@
-<a ion-item text-wrap (click)="showComments()" detail-none>
+<a *ngIf="commentsEnabled" ion-item text-wrap (click)="showComments()" detail-none>
     <h2>{{plugin.name}}</h2>
     <core-comments contextLevel="module" [instanceId]="assign.cmid" component="assignsubmission_comments" [itemId]="submission.id" area="submission_comments" [title]="plugin.name"></core-comments>
 </a>
diff --git a/src/addon/mod/assign/submission/comments/component/comments.ts b/src/addon/mod/assign/submission/comments/component/comments.ts
index 31f62de86..98c8be9e0 100644
--- a/src/addon/mod/assign/submission/comments/component/comments.ts
+++ b/src/addon/mod/assign/submission/comments/component/comments.ts
@@ -27,8 +27,12 @@ import { AddonModAssignSubmissionPluginComponent } from '../../../classes/submis
 export class AddonModAssignSubmissionCommentsComponent extends AddonModAssignSubmissionPluginComponent {
     @ViewChild(CoreCommentsCommentsComponent) commentsComponent: CoreCommentsCommentsComponent;
 
+    commentsEnabled: boolean;
+
     constructor(protected commentsProvider: CoreCommentsProvider) {
         super();
+
+        this.commentsEnabled = !commentsProvider.areCommentsDisabledInSite();
     }
 
     /**
diff --git a/src/addon/mod/data/pages/entry/entry.html b/src/addon/mod/data/pages/entry/entry.html
index 20e8d31d0..ebbc2e2fa 100644
--- a/src/addon/mod/data/pages/entry/entry.html
+++ b/src/addon/mod/data/pages/entry/entry.html
@@ -31,7 +31,7 @@
         <core-rating-rate *ngIf="data && entry && ratingInfo && (!data.approval || entry.approved)" [ratingInfo]="ratingInfo" contextLevel="module" [instanceId]="data.coursemodule" [itemId]="entry.id" [itemSetId]="0" [courseId]="courseId" [aggregateMethod]="data.assessed" [scaleId]="data.scale" [userId]="entry.userid" (onLoading)="setLoadingRating($event)" (onUpdate)="ratingUpdated()"></core-rating-rate>
         <core-rating-aggregate *ngIf="data && entry && ratingInfo" [ratingInfo]="ratingInfo" contextLevel="module" [instanceId]="data.coursemodule" [itemId]="entry.id" [courseId]="courseId" [aggregateMethod]="data.assessed" [scaleId]="data.scale"></core-rating-aggregate>
 
-        <ion-item *ngIf="data && entry && entry.id > 0">
+        <ion-item *ngIf="data && entry && entry.id > 0 && commentsEnabled">
             <core-comments contextLevel="module" [instanceId]="data.coursemodule" component="mod_data" [itemId]="entry.id" area="database_entry" [displaySpinner]="false" (onLoading)="setLoadingComments($event)"></core-comments>
         </ion-item>
 
diff --git a/src/addon/mod/data/pages/entry/entry.ts b/src/addon/mod/data/pages/entry/entry.ts
index cb17d7dfa..51e95ce9c 100644
--- a/src/addon/mod/data/pages/entry/entry.ts
+++ b/src/addon/mod/data/pages/entry/entry.ts
@@ -26,6 +26,7 @@ import { AddonModDataHelperProvider } from '../../providers/helper';
 import { AddonModDataSyncProvider } from '../../providers/sync';
 import { AddonModDataFieldsDelegate } from '../../providers/fields-delegate';
 import { AddonModDataComponentsModule } from '../../components/components.module';
+import { CoreCommentsProvider } from '@core/comments/providers/comments';
 
 /**
  * Page that displays the view entry page.
@@ -68,13 +69,14 @@ export class AddonModDataEntryPage implements OnDestroy {
     jsData;
     ratingInfo: CoreRatingInfo;
     isPullingToRefresh = false; // Whether the last fetching of data was started by a pull-to-refresh action
+    commentsEnabled: boolean;
 
     constructor(params: NavParams, protected utils: CoreUtilsProvider, protected groupsProvider: CoreGroupsProvider,
             protected domUtils: CoreDomUtilsProvider, protected fieldsDelegate: AddonModDataFieldsDelegate,
             protected courseProvider: CoreCourseProvider, protected dataProvider: AddonModDataProvider,
             protected dataHelper: AddonModDataHelperProvider,
             sitesProvider: CoreSitesProvider, protected navCtrl: NavController, protected eventsProvider: CoreEventsProvider,
-            private cdr: ChangeDetectorRef) {
+            private cdr: ChangeDetectorRef, protected commentsProvider: CoreCommentsProvider) {
         this.module = params.get('module') || {};
         this.entryId = params.get('entryId') || null;
         this.courseId = params.get('courseId');
@@ -91,6 +93,7 @@ export class AddonModDataEntryPage implements OnDestroy {
      * View loaded.
      */
     ionViewDidLoad(): void {
+        this.commentsEnabled = !this.commentsProvider.areCommentsDisabledInSite();
         this.fetchEntryData();
 
         // Refresh data if this discussion is synchronized automatically.
diff --git a/src/core/comments/components/comments/comments.ts b/src/core/comments/components/comments/comments.ts
index 2e5303a8e..6538a0874 100644
--- a/src/core/comments/components/comments/comments.ts
+++ b/src/core/comments/components/comments/comments.ts
@@ -12,9 +12,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import { Component, EventEmitter, Input, OnChanges, Output, SimpleChange } from '@angular/core';
+import { Component, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChange } from '@angular/core';
 import { NavController } from 'ionic-angular';
 import { CoreCommentsProvider } from '../../providers/comments';
+import { CoreEventsProvider } from '@providers/events';
+import { CoreSitesProvider } from '@providers/sites';
 
 /**
  * Component that displays the count of comments.
@@ -23,7 +25,7 @@ import { CoreCommentsProvider } from '../../providers/comments';
     selector: 'core-comments',
     templateUrl: 'core-comments.html',
 })
-export class CoreCommentsCommentsComponent implements OnChanges {
+export class CoreCommentsCommentsComponent implements OnChanges, OnDestroy {
     @Input() contextLevel: string;
     @Input() instanceId: number;
     @Input() component: string;
@@ -36,9 +38,26 @@ export class CoreCommentsCommentsComponent implements OnChanges {
 
     commentsLoaded = false;
     commentsCount: number;
+    disabled = false;
 
-    constructor(private navCtrl: NavController, private commentsProvider: CoreCommentsProvider) {
+    protected updateSiteObserver;
+
+    constructor(private navCtrl: NavController, private commentsProvider: CoreCommentsProvider,
+            sitesProvider: CoreSitesProvider, eventsProvider: CoreEventsProvider) {
         this.onLoading = new EventEmitter<boolean>();
+
+        this.disabled = this.commentsProvider.areCommentsDisabledInSite();
+
+        // Update visibility if current site info is updated.
+        this.updateSiteObserver = eventsProvider.on(CoreEventsProvider.SITE_UPDATED, () => {
+            const wasDisabled = this.disabled;
+
+            this.disabled = this.commentsProvider.areCommentsDisabledInSite();
+
+            if (wasDisabled && !this.disabled) {
+                this.fetchData();
+            }
+        }, sitesProvider.getCurrentSiteId());
     }
 
     /**
@@ -59,6 +78,10 @@ export class CoreCommentsCommentsComponent implements OnChanges {
     }
 
     protected fetchData(): void {
+        if (this.disabled) {
+            return;
+        }
+
         this.commentsLoaded = false;
         this.onLoading.emit(true);
 
@@ -77,7 +100,7 @@ export class CoreCommentsCommentsComponent implements OnChanges {
      * Opens the comments page.
      */
     openComments(): void {
-        if (this.commentsCount > 0) {
+        if (!this.disabled && this.commentsCount > 0) {
             // Open a new state with the interpolated contents.
             this.navCtrl.push('CoreCommentsViewerPage', {
                 contextLevel: this.contextLevel,
@@ -90,4 +113,11 @@ export class CoreCommentsCommentsComponent implements OnChanges {
             });
         }
     }
+
+    /**
+     * Component destroyed.
+     */
+    ngOnDestroy(): void {
+        this.updateSiteObserver && this.updateSiteObserver.off();
+    }
 }
diff --git a/src/core/comments/components/comments/core-comments.html b/src/core/comments/components/comments/core-comments.html
index 7dad81877..e7b71e041 100644
--- a/src/core/comments/components/comments/core-comments.html
+++ b/src/core/comments/components/comments/core-comments.html
@@ -1,4 +1,4 @@
-<core-loading [hideUntil]="commentsLoaded || !displaySpinner">
+<core-loading *ngIf="!disabled" [hideUntil]="commentsLoaded || !displaySpinner">
     <div (click)="openComments()" *ngIf="commentsCount >= 0">
         {{ 'core.commentscount' | translate : {'$a': commentsCount} }}
     </div>
diff --git a/src/core/comments/providers/comments.ts b/src/core/comments/providers/comments.ts
index db3978029..2d876990d 100644
--- a/src/core/comments/providers/comments.ts
+++ b/src/core/comments/providers/comments.ts
@@ -14,6 +14,7 @@
 
 import { Injectable } from '@angular/core';
 import { CoreSitesProvider } from '@providers/sites';
+import { CoreSite } from '@classes/site';
 
 /**
  * Service that provides some features regarding comments.
@@ -25,6 +26,30 @@ export class CoreCommentsProvider {
 
     constructor(private sitesProvider: CoreSitesProvider) {}
 
+    /**
+     * Check if Calendar is disabled in a certain site.
+     *
+     * @param {CoreSite} [site] Site. If not defined, use current site.
+     * @return {boolean} Whether it's disabled.
+     */
+    areCommentsDisabledInSite(site?: CoreSite): boolean {
+        site = site || this.sitesProvider.getCurrentSite();
+
+        return site.isFeatureDisabled('NoDelegate_CoreComments');
+    }
+
+    /**
+     * Check if comments are disabled in a certain site.
+     *
+     * @param  {string} [siteId] Site Id. If not defined, use current site.
+     * @return {Promise<boolean>} Promise resolved with true if disabled, rejected or resolved with false otherwise.
+     */
+    areCommentsDisabled(siteId?: string): Promise<boolean> {
+        return this.sitesProvider.getSite(siteId).then((site) => {
+            return this.areCommentsDisabledInSite(site);
+        });
+    }
+
     /**
      * Get cache key for get comments data WS calls.
      *