111 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!-- Buttons to add to the header. -->
 | |
| <core-navbar-buttons end>
 | |
|     <core-context-menu>
 | |
|         <core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate" [href]="externalUrl" [iconAction]="'open'"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="description" [priority]="800" [content]="'core.moduleintro' | translate" (action)="expandDescription()" [iconAction]="'arrow-forward'"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="blog" [priority]="750" content="{{'addon.blog.blog' | translate}}" [iconAction]="'fa-newspaper-o'" (action)="gotoBlog($event)"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="loaded && !(hasOffline || hasOfflineRatings) && isOnline" [priority]="700" [content]="'addon.mod_forum.refreshdiscussions' | translate" (action)="doRefresh(null, $event)" [iconAction]="refreshIcon" [closeOnClick]="false"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="loaded && (hasOffline || hasOfflineRatings) && isOnline"  [priority]="600" [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(null, $event, true)" [iconAction]="syncIcon" [closeOnClick]="false"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="prefetchStatusIcon" [priority]="500" [content]="prefetchText" (action)="prefetch($event)" [iconAction]="prefetchStatusIcon" [closeOnClick]="false"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="size" [priority]="400" [content]="'core.removefiles' | translate:{$a: size}" [iconDescription]="'cube'" (action)="removeFiles()" [iconAction]="'trash'"></core-context-menu-item>
 | |
|         <core-context-menu-item *ngIf="sortingAvailable" [priority]="300" [content]="'core.sort' | translate" (action)="showSortOrderSelector($event)" iconAction="fa-sort"></core-context-menu-item>
 | |
|     </core-context-menu>
 | |
| </core-navbar-buttons>
 | |
| 
 | |
| <!-- Content. -->
 | |
| <core-split-view>
 | |
|     <ion-content>
 | |
|         <ion-refresher [enabled]="loaded" (ionRefresh)="doRefresh($event)">
 | |
|             <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
 | |
|         </ion-refresher>
 | |
|         <core-loading [hideUntil]="loaded" class="core-loading-center">
 | |
|             <core-course-module-description *ngIf="forum && forum.type != 'single'" [description]="description" [component]="component" [componentId]="componentId" [note]="descriptionNote" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-course-module-description>
 | |
| 
 | |
|             <!-- Forum discussions found to be synchronized -->
 | |
|             <ion-card class="core-warning-card" icon-start *ngIf="hasOffline || hasOfflineRatings">
 | |
|                 <ion-icon name="warning"></ion-icon> {{ 'core.hasdatatosync' | translate:{$a: moduleName} }}
 | |
|             </ion-card>
 | |
| 
 | |
|             <!-- Cut-off date or due date message -->
 | |
|             <ion-card class="core-info-card" icon-start *ngIf="availabilityMessage">
 | |
|                 <ion-icon name="information-circle"></ion-icon> {{ availabilityMessage }}
 | |
|             </ion-card>
 | |
| 
 | |
|             <ng-container *ngIf="forum">
 | |
|                 <core-empty-box *ngIf="discussions.length == 0 && offlineDiscussions.length == 0" icon="chatbubbles" [message]="'addon.mod_forum.forumnodiscussionsyet' | translate">
 | |
|                 </core-empty-box>
 | |
| 
 | |
|                 <div text-wrap *ngIf="discussions.length > 0 && sortingAvailable && selectedSortOrder" ion-row padding-horizontal padding-top margin-bottom>
 | |
|                     <button *ngIf="sortingAvailable" ion-button padding-horizontal icon-end ion-col (click)="showSortOrderSelector($event)" color="light" class="core-button-select button-no-uppercase" [attr.aria-label]="('core.sort' | translate)" aria-haspopup="true" [attr.aria-expanded]="sortOrderSelectorExpanded" aria-controls="addon-mod-forum-sort-order-selector" id="addon-mod-forum-sort-order-button">
 | |
|                         <span class="core-button-select-text">{{ selectedSortOrder.label | translate }}</span>
 | |
|                         <ion-icon name="arrow-dropdown" ios="md-arrow-dropdown"></ion-icon>
 | |
|                     </button>
 | |
|                 </div>
 | |
| 
 | |
|                 <ng-container *ngFor="let discussion of offlineDiscussions">
 | |
|                     <ion-item text-wrap (click)="openNewDiscussion(discussion.timecreated)" [attr.no-lines]="discussion.groupname" [class.core-split-item-selected]="discussion.timecreated == -selectedDiscussion" class="addon-mod-forum-discussion">
 | |
|                         <div class="addon-mod-forum-discussion-title">
 | |
|                             <h2>
 | |
|                                 <core-format-text [text]="discussion.subject" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-format-text>
 | |
|                             </h2>
 | |
|                         </div>
 | |
|                         <div class="addon-mod-forum-discussion-info">
 | |
|                             <ion-avatar core-user-avatar [user]="discussion" item-start [courseId]="courseId" *ngIf="discussion.userfullname"></ion-avatar>
 | |
|                             <div class="addon-mod-forum-discussion-author">
 | |
|                                 <h3 *ngIf="discussion.userfullname">{{discussion.userfullname}}</h3>
 | |
|                                 <p *ngIf="discussion.groupname"><ion-icon name="people"></ion-icon> {{ discussion.groupname }}</p>
 | |
|                                 <p><ion-icon name="time"></ion-icon> {{ 'core.notsent' | translate }}</p>
 | |
|                             </div>
 | |
|                         </div>
 | |
|                     </ion-item>
 | |
|                 </ng-container>
 | |
|                 <ng-container *ngFor="let discussion of discussions">
 | |
|                     <ion-item (click)="openDiscussion(discussion)" [class.core-split-item-selected]="discussion.discussion == selectedDiscussion" class="addon-mod-forum-discussion">
 | |
|                         <div class="addon-mod-forum-discussion-title">
 | |
|                             <h2 text-wrap>
 | |
|                                 <core-icon name="fa-map-pin" *ngIf="discussion.pinned"></core-icon>
 | |
|                                 <core-icon name="fa-star" class="addon-forum-star" *ngIf="!discussion.pinned && discussion.starred"></core-icon>
 | |
|                                 <core-format-text [text]="discussion.subject" contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId"></core-format-text>
 | |
|                             </h2>
 | |
|                             <button ion-button icon-only clear color="dark" (click)="showOptionsMenu($event, discussion)" *ngIf="canPin || discussion.canlock || discussion.canfavourite">
 | |
|                                 <core-icon name="more"></core-icon>
 | |
|                             </button>
 | |
|                         </div>
 | |
|                         <div class="addon-mod-forum-discussion-info">
 | |
|                             <ion-avatar *ngIf="discussion.userfullname" core-user-avatar [user]="discussion" item-start [courseId]="courseId"></ion-avatar>
 | |
|                             <div class="addon-mod-forum-discussion-author">
 | |
|                                 <h3 *ngIf="discussion.userfullname">{{discussion.userfullname}}</h3>
 | |
|                                 <p *ngIf="discussion.groupname"><ion-icon name="people"></ion-icon> {{ discussion.groupname }}</p>
 | |
|                                 <p>{{discussion.created * 1000 | coreFormatDate: "strftimerecentfull"}}</p>
 | |
|                             </div>
 | |
|                         </div>
 | |
|                         <ion-row text-center class="addon-mod-forum-discussion-more-info">
 | |
|                             <ion-col text-start>
 | |
|                                 <ion-note>
 | |
|                                     <ion-icon name="time"></ion-icon> {{ 'addon.mod_forum.lastpost' | translate }}
 | |
|                                     <ng-container *ngIf="discussion.timemodified > discussion.created">{{discussion.timemodified | coreTimeAgo}}</ng-container>
 | |
|                                     <ng-container *ngIf="discussion.timemodified <= discussion.created">{{discussion.created | coreTimeAgo}}</ng-container>
 | |
|                                 </ion-note>
 | |
|                             </ion-col>
 | |
|                             <ion-col text-end>
 | |
|                                 <ion-note>
 | |
|                                     <ion-icon name="chatboxes"></ion-icon> {{ 'addon.mod_forum.numreplies' | translate:{numreplies: discussion.numreplies} }}
 | |
|                                     <ion-badge text-center *ngIf="discussion.numunread" [attr.aria-label]="'addon.mod_forum.unreadpostsnumber' | translate:{ '$a' : discussion.numunread}">{{ discussion.numunread }}</ion-badge>
 | |
|                                 </ion-note>
 | |
|                             </ion-col>
 | |
|                         </ion-row>
 | |
|                     </ion-item>
 | |
|                 </ng-container>
 | |
| 
 | |
|                 <core-infinite-loading [enabled]="canLoadMore" (action)="fetchMoreDiscussions($event)" [error]="loadMoreError"></core-infinite-loading>
 | |
|             </ng-container>
 | |
|         </core-loading>
 | |
| 
 | |
|         <ion-fab core-fab bottom end *ngIf="forum && canAddDiscussion">
 | |
|             <button ion-fab (click)="openNewDiscussion()" [attr.aria-label]="addDiscussionText">
 | |
|                 <ion-icon name="add"></ion-icon>
 | |
|             </button>
 | |
|         </ion-fab>
 | |
|     </ion-content>
 | |
| </core-split-view>
 |