commit
						aca867cd53
					
				| @ -292,6 +292,7 @@ module.exports = { | ||||
|                 '@angular-eslint/template/no-positive-tabindex': 'error', | ||||
|                 '@angular-eslint/template/accessibility-table-scope': 'error', | ||||
|                 '@angular-eslint/template/accessibility-valid-aria': 'error', | ||||
|                 '@angular-eslint/template/no-duplicate-attributes': 'error', | ||||
|             }, | ||||
|         }, | ||||
|         { | ||||
|  | ||||
| @ -20,10 +20,10 @@ | ||||
|     "issuerurl": "Issuer URL", | ||||
|     "language": "Language", | ||||
|     "noalignment": "This badge does not have any external skills or standards specified.", | ||||
|     "nobadges": "There are no badges available.", | ||||
|     "nobadges": "There are currently no badges available for users to earn.", | ||||
|     "norelated": "This badge does not have any related badges.", | ||||
|     "recipientdetails": "Recipient details", | ||||
|     "relatedbages": "Related badges", | ||||
|     "version": "Version", | ||||
|     "warnexpired": "(This badge has expired!)" | ||||
| } | ||||
| } | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
|     <div slot="end" class="flex-row"> | ||||
|         <!-- Download all courses. --> | ||||
|         <div *ngIf="downloadCoursesEnabled && filteredCourses.length > 1" class="core-button-spinner"> | ||||
|             <ion-button *ngIf="!prefetchCoursesData.loading" fill="clear" color="dark" (click)="prefetchCourses()" | ||||
|             <ion-button *ngIf="!prefetchCoursesData.loading" fill="clear" (click)="prefetchCourses()" | ||||
|                 [attr.aria-label]="prefetchCoursesData.statusTranslatable | translate"> | ||||
|                 <ion-icon [name]="prefetchCoursesData.icon" slot="icon-only" aria-hidden="true"> | ||||
|                 </ion-icon> | ||||
|  | ||||
| @ -53,7 +53,7 @@ | ||||
|                         </ion-row> | ||||
|                     </ion-col> | ||||
|                     <ion-col class="addon-block-timeline-activity-action ion-no-padding" *ngIf="event.action?.actionable"> | ||||
|                         <ion-button fill="outline" color="medium" (click)="action($event, event.action.url)" [title]="event.action.name"> | ||||
|                         <ion-button fill="outline" (click)="action($event, event.action.url)" [title]="event.action.name"> | ||||
|                             {{event.action.name}} | ||||
|                             <ion-badge slot="end" class="ion-margin-start" *ngIf="event.action.showitemcount"> | ||||
|                                 {{event.action.itemcount}} | ||||
|  | ||||
| @ -118,7 +118,7 @@ | ||||
|                     <ion-label> | ||||
|                         <p class="item-heading">{{ 'addon.calendar.reminders' | translate }}</p> | ||||
|                     </ion-label> | ||||
|                     <ion-button fill="clear" color="dark" (click)="addReminder()" slot="end" | ||||
|                     <ion-button fill="clear" (click)="addReminder()" slot="end" | ||||
|                         [attr.aria-label]="'addon.calendar.setnewreminder' | translate"> | ||||
|                         <ion-icon name="fas-plus" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|  | ||||
| @ -120,7 +120,7 @@ | ||||
|             </ion-item> | ||||
|             <ion-item *ngIf="moduleUrl"> | ||||
|                 <ion-label> | ||||
|                     <ion-button expand="block" color="primary" [href]="moduleUrl" core-link capture="true"> | ||||
|                     <ion-button expand="block" [href]="moduleUrl" core-link capture="true"> | ||||
|                         {{ 'addon.calendar.gotoactivity' | translate }} | ||||
|                     </ion-button> | ||||
|                 </ion-label> | ||||
| @ -148,7 +148,7 @@ | ||||
|             <ng-container *ngIf="event.timestart > currentTime"> | ||||
|                 <ion-item> | ||||
|                     <ion-label> | ||||
|                         <ion-button expand="block" color="primary" (click)="addReminder()"> | ||||
|                         <ion-button expand="block" (click)="addReminder()"> | ||||
|                             {{ 'addon.calendar.setnewreminder' | translate }} | ||||
|                         </ion-button> | ||||
|                     </ion-label> | ||||
|  | ||||
| @ -28,18 +28,19 @@ | ||||
|             <core-context-menu-item [hidden]="isSelf || !showInfo || !isGroup" [priority]="1000" | ||||
|                 [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" iconAction="fas-info-circle"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : | ||||
|                 'addon.messages.addtofavourites') | translate" (action)="changeFavourite($event)" [closeOnClick]="false" | ||||
|                 [iconAction]="favouriteIcon" [iconSlash]="favouriteIconSlash"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!groupMessagingEnabled || !conversation" [priority]="800" (action)="changeFavourite($event)" | ||||
|                 [closeOnClick]="false" [content]="(conversation && conversation.isfavourite ? 'addon.messages.removefromfavourites' : | ||||
|                 'addon.messages.addtofavourites') | translate" [iconAction]="favouriteIcon" [iconSlash]="favouriteIconSlash"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || otherMember.isblocked" [priority]="700" | ||||
|                 [content]="'addon.messages.blockuser' | translate" (action)="blockUser()" [iconAction]="blockIcon"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !otherMember || !otherMember.isblocked" [priority]="700" | ||||
|                 [content]="'addon.messages.unblockuser' | translate" (action)="unblockUser()" [iconAction]="blockIcon"> | ||||
|             </core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : | ||||
|                 'addon.messages.muteconversation') | translate" (action)="changeMute($event)" [closeOnClick]="false" | ||||
|                 [iconAction]="muteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="isSelf || !muteEnabled || !conversation" [priority]="600" (action)="changeMute($event)" | ||||
|                 [closeOnClick]="false" [content]="(conversation && conversation.ismuted ? 'addon.messages.unmuteconversation' : | ||||
|                 'addon.messages.muteconversation') | translate" [iconAction]="muteIcon"></core-context-menu-item> | ||||
|             <core-context-menu-item [hidden]="!canDelete || !messages || !messages.length" [priority]="400" | ||||
|                 [content]="'addon.messages.showdeletemessages' | translate" iconAction="toggle" [(toggle)]="showDelete"> | ||||
|             </core-context-menu-item> | ||||
| @ -157,7 +158,7 @@ | ||||
|             <ion-button expand="block" class="ion-text-wrap ion-margin-bottom" (click)="confirmContactRequest()"> | ||||
|                 {{ 'addon.messages.acceptandaddcontact' | translate }} | ||||
|             </ion-button> | ||||
|             <ion-button expand="block" class="ion-text-wrap ion-margin-bottom" color="light" (click)="declineContactRequest()"> | ||||
|             <ion-button expand="block" class="ion-text-wrap ion-margin-bottom" fill="outline" (click)="declineContactRequest()"> | ||||
|                 {{ 'addon.messages.decline' | translate }} | ||||
|             </ion-button> | ||||
|         </div> | ||||
|  | ||||
| @ -146,9 +146,11 @@ | ||||
| <!-- Template to render a list of conversations. --> | ||||
| <ng-template #conversationsTemplate let-conversations="conversations"> | ||||
|     <ion-item class="ion-text-wrap addon-message-discussion" *ngFor="let conversation of conversations" button detail="false" | ||||
|         [attr.aria-label]="conversation.name" (click)="gotoConversation(conversation.id, conversation.userid)" [attr.aria-current]="((conversation.id && conversation.id == selectedConversationId) || | ||||
|             (conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'" | ||||
|         id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}"> | ||||
|         (click)="gotoConversation(conversation.id, conversation.userid)" | ||||
|         [attr.aria-current]="((conversation.id && | ||||
|             conversation.id == selectedConversationId) || (conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'" | ||||
|         id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}" | ||||
|         [attr.aria-label]="conversation.name"> | ||||
|         <!-- Group conversation image. --> | ||||
|         <ion-avatar slot="start" *ngIf="conversation.type == typeGroup"> | ||||
|             <img [src]="conversation.imageurl" [alt]="conversation.name" core-external-content | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline"> | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|         <ion-list inset="true" description *ngIf="assign && assign.introattachments && assign.introattachments.length"> | ||||
|             <core-file *ngFor="let file of assign.introattachments" [file]="file" [component]="component" [componentId]="componentId"> | ||||
|             </core-file> | ||||
| @ -127,6 +127,5 @@ | ||||
|     </addon-mod-assign-submission> | ||||
| </core-loading> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|     (completionChanged)="onCompletionChange()"> | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
| </core-course-module-navigation> | ||||
|  | ||||
| @ -103,27 +103,26 @@ | ||||
|                     <ion-label> | ||||
|                         <div *ngIf="!unsupportedEditPlugins.length && !showErrorStatementEdit"> | ||||
|                             <!-- If has offline data, show edit. --> | ||||
|                             <ion-button expand="block" class="ion-text-wrap" color="primary" *ngIf="hasOffline" (click)="goToEdit()"> | ||||
|                             <ion-button expand="block" class="ion-text-wrap" *ngIf="hasOffline" (click)="goToEdit()"> | ||||
|                                 {{ 'addon.mod_assign.editsubmission' | translate }} | ||||
|                             </ion-button> | ||||
|                             <!-- If no submission or is new, show add submission. --> | ||||
|                             <ion-button expand="block" class="ion-text-wrap" color="primary" *ngIf="!hasOffline && | ||||
|                                     (!userSubmission || !userSubmission!.status || userSubmission!.status == statusNew)" | ||||
|                                 (click)="goToEdit()"> | ||||
|                             <ion-button expand="block" class="ion-text-wrap" (click)="goToEdit()" *ngIf="!hasOffline && | ||||
|                                     (!userSubmission || !userSubmission!.status || userSubmission!.status == statusNew)"> | ||||
|                                 {{ 'addon.mod_assign.addsubmission' | translate }} | ||||
|                             </ion-button> | ||||
|                             <!-- If reopened, show addfromprevious and addnewattempt. --> | ||||
|                             <ng-container *ngIf="!hasOffline && userSubmission?.status == statusReopened"> | ||||
|                                 <ion-button *ngIf="!isPreviousAttemptEmpty" expand="block" class="ion-text-wrap" color="primary" | ||||
|                                     (click)="copyPrevious()"> | ||||
|                                 <ion-button *ngIf="!isPreviousAttemptEmpty" expand="block" class="ion-text-wrap" (click)="copyPrevious()"> | ||||
|                                     {{ 'addon.mod_assign.addnewattemptfromprevious' | translate }} | ||||
|                                 </ion-button> | ||||
|                                 <ion-button expand="block" class="ion-text-wrap" color="primary" (click)="goToEdit()"> | ||||
|                                 <ion-button expand="block" class="ion-text-wrap" (click)="goToEdit()"> | ||||
|                                     {{ 'addon.mod_assign.addnewattempt' | translate }} | ||||
|                                 </ion-button> | ||||
|                             </ng-container> | ||||
|                             <!-- Else show editsubmission. --> | ||||
|                             <ion-button expand="block" class="ion-text-wrap" color="primary" *ngIf="!hasOffline && userSubmission && userSubmission!.status && | ||||
|                             <ion-button expand="block" class="ion-text-wrap" *ngIf="!hasOffline && | ||||
|                                     userSubmission && userSubmission!.status && | ||||
|                                     userSubmission!.status != statusNew && | ||||
|                                     userSubmission!.status != statusReopened" (click)="goToEdit()"> | ||||
|                                 {{ 'addon.mod_assign.editsubmission' | translate }} | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
|     </ion-label> | ||||
|     <div slot="end"> | ||||
|         <div class="ion-text-end"> | ||||
|             <ion-button fill="clear" *ngIf="canEdit" (click)="editComment()" color="dark" [attr.aria-label]="'core.edit' | translate"> | ||||
|             <ion-button fill="clear" *ngIf="canEdit" (click)="editComment()" [attr.aria-label]="'core.edit' | translate"> | ||||
|                 <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|         </div> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId"> | ||||
|         [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ng-container *ngIf="groupInfo && (groupInfo.separateGroups || groupInfo.visibleGroups)"> | ||||
| @ -114,7 +114,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -1,15 +1,15 @@ | ||||
| { | ||||
|     "end_session_confirm": "Are you sure you want to end the virtual classroom session?", | ||||
|     "end_session_confirm": "Are you sure you want to end the session?", | ||||
|     "end_session_confirm_title": "Really end session?", | ||||
|     "mod_form_field_closingtime": "Join closed", | ||||
|     "mod_form_field_openingtime": "Join open", | ||||
|     "userlimitreached": "The number of users allowed in a meeting has been reached.", | ||||
|     "mod_form_field_closingtime": "Close", | ||||
|     "mod_form_field_openingtime": "Open", | ||||
|     "userlimitreached": "The number of users allowed in a session has been reached.", | ||||
|     "view_conference_action_end": "End session", | ||||
|     "view_conference_action_join": "Join session", | ||||
|     "view_error_unable_join_student": "Unable to connect to the BigBlueButton server. Please contact your Teacher or the Administrator.", | ||||
|     "view_groups_selection_warning": "There is a conference room for each group and you have access to more than one. Be sure to select the correct one.", | ||||
|     "view_message_conference_in_progress": "This conference is in progress.", | ||||
|     "view_message_conference_room_ready": "This conference room is ready. You can join the session now.", | ||||
|     "view_error_unable_join_student": "Unable to connect to the BigBlueButton server.", | ||||
|     "view_groups_selection_warning": "There is a room for each group and you have access to more than one. Be sure to select the correct one.", | ||||
|     "view_message_conference_in_progress": "The session is in progress.", | ||||
|     "view_message_conference_room_ready": "This room is ready. You can join the session now.", | ||||
|     "view_message_moderator": "moderator", | ||||
|     "view_message_moderators": "moderators", | ||||
|     "view_message_session_started_at": "This session started at", | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId"> | ||||
|         [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-list> | ||||
| @ -41,7 +41,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId"> | ||||
|         [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-card *ngIf="chatInfo" class="core-info-card"> | ||||
| @ -26,12 +26,12 @@ | ||||
| 
 | ||||
|     <div collapsible-footer *ngIf="!showLoading" slot="fixed"> | ||||
|         <div class="list-item-limited-width" *ngIf="chat"> | ||||
|             <ion-button class="ion-margin ion-text-wrap" expand="block" color="primary" (click)="enterChat()"> | ||||
|             <ion-button class="ion-margin ion-text-wrap" expand="block" (click)="enterChat()"> | ||||
|                 {{ 'addon.mod_chat.enterchat' | translate }} | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
|     <div class="list-item-limited-width"> | ||||
|         <!-- Activity info. --> | ||||
|         <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|             [courseId]="courseId" [hasDataToSync]="hasOffline"> | ||||
|             [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|         </core-course-module-info> | ||||
| 
 | ||||
|         <!-- Activity availability messages --> | ||||
| @ -146,7 +146,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -1,24 +1,27 @@ | ||||
| <ion-button *ngIf="action == 'more'" fill="clear" (click)="viewEntry()" [attr.aria-label]="'addon.mod_data.more' | translate"> | ||||
| <ion-button size="small" *ngIf="action == 'more'" fill="clear" (click)="viewEntry()" [attr.aria-label]="'addon.mod_data.more' | translate"> | ||||
|     <ion-icon name="fas-search" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
| 
 | ||||
| <ion-button *ngIf="action == 'edit'" fill="clear" (click)="editEntry()" [attr.aria-label]="'core.edit' | translate"> | ||||
| <ion-button size="small" *ngIf="action == 'edit'" fill="clear" (click)="editEntry()" [attr.aria-label]="'core.edit' | translate"> | ||||
|     <ion-icon name="fas-cog" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
| 
 | ||||
| <ion-button *ngIf="action == 'delete' && !entry.deleted" fill="clear" (click)="deleteEntry()" [attr.aria-label]="'core.delete' | translate"> | ||||
| <ion-button size="small" *ngIf="action == 'delete' && !entry.deleted" fill="clear" color="danger" (click)="deleteEntry()" | ||||
|     [attr.aria-label]="'core.delete' | translate"> | ||||
|     <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
| 
 | ||||
| <ion-button *ngIf="action == 'delete' && entry.deleted" fill="clear" (click)="undoDelete()" [attr.aria-label]="'core.restore' | translate"> | ||||
| <ion-button size="small" *ngIf="action == 'delete' && entry.deleted" fill="clear" color="danger" (click)="undoDelete()" | ||||
|     [attr.aria-label]="'core.restore' | translate"> | ||||
|     <ion-icon name="fas-undo-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
| 
 | ||||
| <ion-button *ngIf="action == 'approve'" fill="clear" (click)="approveEntry()" [attr.aria-label]="'addon.mod_data.approve' | translate"> | ||||
| <ion-button size="small" *ngIf="action == 'approve'" fill="clear" (click)="approveEntry()" | ||||
|     [attr.aria-label]="'addon.mod_data.approve' | translate"> | ||||
|     <ion-icon name="fas-thumbs-up" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
| 
 | ||||
| <ion-button *ngIf="action == 'disapprove'" fill="clear" (click)="disapproveEntry()" | ||||
| <ion-button size="small" *ngIf="action == 'disapprove'" fill="clear" (click)="disapproveEntry()" | ||||
|     [attr.aria-label]="'addon.mod_data.disapprove' | translate"> | ||||
|     <ion-icon name="far-thumbs-down" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
|  | ||||
| @ -22,7 +22,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings"> | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-item class="ion-text-wrap core-group-selector" *ngIf="groupInfo && (groupInfo.separateGroups || groupInfo.visibleGroups)"> | ||||
| @ -72,8 +72,8 @@ | ||||
| 
 | ||||
|     <!-- Reset search. --> | ||||
|     <ng-container *ngIf="search.searching && !isEmpty"> | ||||
|         <ion-item (click)="searchReset()" button detail="false"> | ||||
|             <ion-label color="primary"> | ||||
|         <ion-item (click)="searchReset()" button detail="false" *ngIf="!foundRecordsTranslationData"> | ||||
|             <ion-label color="info"> | ||||
|                 {{ 'addon.mod_data.resetsettings' | translate}} | ||||
|             </ion-label> | ||||
|         </ion-item> | ||||
| @ -120,8 +120,7 @@ | ||||
| 
 | ||||
| </core-loading> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|     (completionChanged)="onCompletionChange()"> | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
| </core-course-module-navigation> | ||||
| 
 | ||||
| <ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canAdd"> | ||||
|  | ||||
| @ -64,7 +64,7 @@ | ||||
|         <div collapsible-footer *ngIf="entryLoaded && hasPrevious || hasNext" slot="fixed"> | ||||
|             <ion-row class="ion-justify-content-between ion-align-items-center ion-no-padding ion-wrap"> | ||||
|                 <ion-col class="ion-text-start ion-no-padding core-navigation-arrow" size="auto"> | ||||
|                     <ion-button [disabled]="!hasPrevious" fill="clear" color="dark" [attr.aria-label]="'core.previous' | translate" | ||||
|                     <ion-button [disabled]="!hasPrevious" fill="clear" [attr.aria-label]="'core.previous' | translate" | ||||
|                         (click)="gotoEntry(offset! -1)"> | ||||
|                         <ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
| @ -72,7 +72,7 @@ | ||||
|                 <ion-col class="ion-text-center"> | ||||
|                 </ion-col> | ||||
|                 <ion-col class="ion-text-end ion-no-padding core-navigation-arrow" size="auto"> | ||||
|                     <ion-button [disabled]="!hasNext" fill="clear" color="dark" [attr.aria-label]=" 'core.next' | translate" | ||||
|                     <ion-button [disabled]="!hasNext" fill="clear" [attr.aria-label]=" 'core.next' | translate" | ||||
|                         (click)="gotoEntry(offset! + 1)"> | ||||
|                         <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline"> | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <core-tabs [hideUntil]="tabsReady" [selectedIndex]="firstSelectedTab"> | ||||
| @ -52,7 +52,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -32,6 +32,6 @@ | ||||
| 
 | ||||
| </core-loading> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id" | ||||
|     (completionChanged)="onCompletionChange()"> | ||||
| </core-course-module-navigation> | ||||
|  | ||||
| @ -14,7 +14,8 @@ | ||||
|     <core-loading [hideUntil]="!showLoading && discussions && discussions.loaded"> | ||||
|         <!-- Activity info. --> | ||||
|         <core-course-module-info [module]="module" [description]="forum && forum.type != 'single' && description" [component]="component" | ||||
|             [componentId]="componentId" [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings"> | ||||
|             [componentId]="componentId" [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings" | ||||
|             (completionChanged)="onCompletionChange()"> | ||||
|             <ion-item class="ion-text-wrap"> | ||||
|                 <ion-label> | ||||
|                     {{descriptionNote}} | ||||
| @ -56,7 +57,7 @@ | ||||
|                                 [courseId]="courseId"> | ||||
|                             </core-format-text> | ||||
|                         </p> | ||||
|                         <ion-button *ngIf="canPin || discussion.canlock || discussion.canfavourite" fill="clear" color="dark" | ||||
|                         <ion-button *ngIf="canPin || discussion.canlock || discussion.canfavourite" fill="clear" | ||||
|                             [attr.aria-label]="('core.displayoptions' | translate)" (click)="showOptionsMenu($event, discussion)"> | ||||
|                             <ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true"> | ||||
|                             </ion-icon> | ||||
| @ -114,8 +115,7 @@ | ||||
|         </ng-container> | ||||
|     </core-loading> | ||||
| 
 | ||||
|     <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|         (completionChanged)="onCompletionChange()"> | ||||
|     <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|     </core-course-module-navigation> | ||||
| 
 | ||||
|     <ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="forum && canAddDiscussion"> | ||||
|  | ||||
| @ -19,8 +19,8 @@ | ||||
|                             [attr.aria-label]="'addon.mod_forum.unread' | translate"> | ||||
|                             <ion-icon name="fas-circle" color="primary" aria-hidden="true"></ion-icon> | ||||
|                         </ion-note> | ||||
|                         <ion-button *ngIf="optionsMenuEnabled" fill="clear" color="dark" | ||||
|                             [attr.aria-label]="('core.displayoptions' | translate)" (click)="showOptionsMenu($event)"> | ||||
|                         <ion-button *ngIf="optionsMenuEnabled" fill="clear" [attr.aria-label]="('core.displayoptions' | translate)" | ||||
|                             (click)="showOptionsMenu($event)"> | ||||
|                             <ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true"> | ||||
|                             </ion-icon> | ||||
|                         </ion-button> | ||||
| @ -47,8 +47,8 @@ | ||||
|                                 [attr.aria-label]="'addon.mod_forum.unread' | translate"> | ||||
|                                 <ion-icon name="fas-circle" color="primary" aria-hidden="true"></ion-icon> | ||||
|                             </ion-note> | ||||
|                             <ion-button *ngIf="optionsMenuEnabled" fill="clear" color="dark" | ||||
|                                 [attr.aria-label]="('core.displayoptions' | translate)" (click)="showOptionsMenu($event)"> | ||||
|                             <ion-button *ngIf="optionsMenuEnabled" fill="clear" [attr.aria-label]="('core.displayoptions' | translate)" | ||||
|                                 (click)="showOptionsMenu($event)"> | ||||
|                                 <ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                             </ion-button> | ||||
|                         </ng-container> | ||||
|  | ||||
| @ -27,7 +27,8 @@ | ||||
|     <core-loading [hideUntil]="!showLoading"> | ||||
|         <!-- Activity info. --> | ||||
|         <core-course-module-info *ngIf="!isSearch" [module]="module" [description]="description" [component]="component" | ||||
|             [componentId]="componentId" [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings"> | ||||
|             [componentId]="componentId" [courseId]="courseId" [hasDataToSync]="hasOffline || hasOfflineRatings" | ||||
|             (completionChanged)="onCompletionChange()"> | ||||
|         </core-course-module-info> | ||||
| 
 | ||||
|         <ion-list *ngIf="!isSearch && entries && entries.offlineEntries.length > 0"> | ||||
| @ -72,8 +73,7 @@ | ||||
|         </core-infinite-loading> | ||||
|     </core-loading> | ||||
| 
 | ||||
|     <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|         (completionChanged)="onCompletionChange()"> | ||||
|     <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|     </core-course-module-navigation> | ||||
| 
 | ||||
|     <ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canAdd"> | ||||
|  | ||||
| @ -20,7 +20,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline"> | ||||
|         [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <!-- Offline disabled. --> | ||||
| @ -68,6 +68,5 @@ | ||||
|     </core-h5p-iframe> | ||||
| </core-loading> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|     (completionChanged)="onCompletionChange()"> | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
| </core-course-module-navigation> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId"> | ||||
|         [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-list> | ||||
| @ -38,7 +38,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -14,7 +14,7 @@ | ||||
| 
 | ||||
|                 <!-- Activity info. --> | ||||
|                 <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|                     [courseId]="courseId" [hasDataToSync]="hasOffline"> | ||||
|                     [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|                 </core-course-module-info> | ||||
| 
 | ||||
|                 <!-- Prevent access messages. Only show the first one. --> | ||||
| @ -214,7 +214,7 @@ | ||||
|             <ng-container *ngTemplateOutlet="buttons"></ng-container> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" | ||||
|         [componentId]="componentId" [courseId]="courseId"> | ||||
|         [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <div collapsible-footer *ngIf="!showLoading" slot="fixed"> | ||||
| @ -21,7 +21,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" | ||||
|         [componentId]="componentId" [courseId]="courseId"> | ||||
|         [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-card class="core-warning-card" *ngIf="warning"> | ||||
| @ -32,6 +32,5 @@ | ||||
| 
 | ||||
| </core-loading> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|     (completionChanged)="onCompletionChange()"> | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
| </core-course-module-navigation> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId" [hasDataToSync]="buttonText && hasOffline"> | ||||
|         [courseId]="courseId" [hasDataToSync]="buttonText && hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <!-- Access rules description messages. --> | ||||
| @ -213,7 +213,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
| 
 | ||||
|     </div> | ||||
|  | ||||
| @ -116,7 +116,7 @@ | ||||
|         <div collapsible-footer *ngIf="loaded && numPages > 1" slot="fixed"> | ||||
|             <ion-row class="ion-justify-content-between ion-align-items-center ion-no-padding ion-wrap"> | ||||
|                 <ion-col class="ion-text-start ion-no-padding core-navigation-arrow" size="auto" *ngIf="!showAll"> | ||||
|                     <ion-button [disabled]="previousPage < 0" fill="clear" color="dark" [attr.aria-label]="'core.previous' | translate" | ||||
|                     <ion-button [disabled]="previousPage < 0" fill="clear" [attr.aria-label]="'core.previous' | translate" | ||||
|                         (click)="changePage(previousPage)"> | ||||
|                         <ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
| @ -129,7 +129,7 @@ | ||||
|                     </ion-button> | ||||
|                 </ion-col> | ||||
|                 <ion-col class="ion-text-end ion-no-padding core-navigation-arrow" size="auto" *ngIf="!showAll"> | ||||
|                     <ion-button [disabled]="nextPage >= numPages" fill="clear" color="dark" [attr.aria-label]="'core.next' | translate" | ||||
|                     <ion-button [disabled]="nextPage >= numPages" fill="clear" [attr.aria-label]="'core.next' | translate" | ||||
|                         (click)="changePage(nextPage)"> | ||||
|                         <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [courseId]="courseId" [description]="displayDescription && description" | ||||
|         [component]="component" [componentId]="componentId"> | ||||
|         [component]="component" [componentId]="componentId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-card class="core-warning-card" *ngIf="warning"> | ||||
| @ -98,7 +98,7 @@ | ||||
|                 {{ 'core.openwith' | translate }} | ||||
|             </ion-button> | ||||
|         </div> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId" [hasDataToSync]="!errorMessage && hasOffline"> | ||||
|         [courseId]="courseId" [hasDataToSync]="!errorMessage && hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <!-- Warning message. --> | ||||
| @ -221,7 +221,7 @@ | ||||
|                 </ion-item> | ||||
|             </ng-container> | ||||
|         </div> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,8 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="survey && !survey.surveydone && !hasOffline && description" | ||||
|         [component]="component" [componentId]="componentId" [courseId]="courseId" [hasDataToSync]="hasOffline"> | ||||
|         [component]="component" [componentId]="componentId" [courseId]="courseId" [hasDataToSync]="hasOffline" | ||||
|         (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <!-- Survey already done --> | ||||
| @ -130,7 +131,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="displayDescription && description" [component]="component" | ||||
|         [componentId]="componentId" [courseId]="courseId"> | ||||
|         [componentId]="componentId" [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <div *ngIf="shouldIframe || (shouldEmbed && isOther)" class="addon-mod_url-embedded-url"> | ||||
| @ -44,7 +44,7 @@ | ||||
|                 {{ 'addon.mod_url.accessurl' | translate }} | ||||
|             </ion-button> | ||||
|         </div> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -31,7 +31,7 @@ | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" | ||||
|         [courseId]="courseId"> | ||||
|         [courseId]="courseId" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <div *ngIf="pageIsOffline || hasOffline || pageWarning"> | ||||
| @ -71,8 +71,7 @@ | ||||
|     </div> | ||||
| </core-loading> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModule]="module" | ||||
|     (completionChanged)="onCompletionChange()"> | ||||
| <core-course-module-navigation collapsible-footer [hidden]="showLoading" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
| </core-course-module-navigation> | ||||
| 
 | ||||
| <ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="canEdit"> | ||||
|  | ||||
| @ -13,8 +13,8 @@ | ||||
|                     {{ 'addon.mod_workshop_assessment_accumulative.dimensiongradefor' | translate : {'$a': field.dimtitle } }} | ||||
|                 </span> | ||||
|             </ion-label> | ||||
|             <ion-select [(ngModel)]="selectedValues[n].grade" interface="action-sheet" [interfaceOptions]="{header: 'addon.mod_workshop_assessment_accumulative.dimensiongradefor' | | ||||
|                     translate : {'$a': field.dimtitle }}"> | ||||
|             <ion-select [interfaceOptions]="{header: 'addon.mod_workshop_assessment_accumulative.dimensiongradefor' | | ||||
|                     translate : {'$a': field.dimtitle }}" [(ngModel)]="selectedValues[n].grade" interface="action-sheet"> | ||||
|                 <ion-select-option *ngFor="let grade of field.grades" [value]="grade.value">{{grade.label}}</ion-select-option> | ||||
|             </ion-select> | ||||
|             <core-input-errors *ngIf="fieldErrors['grade_' + n]" [errorText]="fieldErrors['grade_' + n]"> | ||||
|  | ||||
| @ -9,7 +9,7 @@ | ||||
| <core-loading [hideUntil]="!showLoading" class="list-item-limited-width"> | ||||
| 
 | ||||
|     <!-- Activity info. --> | ||||
|     <core-course-module-info [module]="module" [hasDataToSync]="hasOffline"> | ||||
|     <core-course-module-info [module]="module" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> | ||||
|     </core-course-module-info> | ||||
| 
 | ||||
|     <ion-card *ngIf="phases"> | ||||
| @ -235,7 +235,7 @@ | ||||
|             </ion-button> | ||||
|         </div> | ||||
| 
 | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModule]="module" (completionChanged)="onCompletionChange()"> | ||||
|         <core-course-module-navigation [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|         </core-course-module-navigation> | ||||
|     </div> | ||||
| </core-loading> | ||||
|  | ||||
| @ -34,9 +34,9 @@ | ||||
|                     </span> | ||||
|                 </ion-label> | ||||
|                 <core-rich-text-editor [control]="editForm.controls['content']" name="content" | ||||
|                     [placeholder]="'addon.mod_workshop.submissioncontent' | translate" name="content" [component]="component" | ||||
|                     [componentId]="componentId" [autoSave]="true" contextLevel="module" [contextInstanceId]="module.id" | ||||
|                     elementId="content_editor" [draftExtraParams]="editorExtraParams"></core-rich-text-editor> | ||||
|                     [placeholder]="'addon.mod_workshop.submissioncontent' | translate" [component]="component" [componentId]="componentId" | ||||
|                     [autoSave]="true" contextLevel="module" [contextInstanceId]="module.id" elementId="content_editor" | ||||
|                     [draftExtraParams]="editorExtraParams"></core-rich-text-editor> | ||||
|             </ion-item> | ||||
| 
 | ||||
|             <core-attachments *ngIf="fileAvailable" [files]="attachments" [maxSize]="workshop.maxbytes" | ||||
|  | ||||
| @ -19,7 +19,7 @@ | ||||
|                         <p class="item-heading ion-text-wrap">{{ 'addon.storagemanager.totaldownloads' | translate }}</p> | ||||
|                         <ion-badge color="light">{{ totalSize | coreBytesToSize }}</ion-badge> | ||||
|                     </ion-label> | ||||
|                     <ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0" color="danger" fill="outline"> | ||||
|                     <ion-button slot="end" (click)="deleteForCourse()" [disabled]="totalSize == 0" color="danger" fill="clear"> | ||||
|                         <ion-icon name="fas-trash" slot="icon-only" [attr.aria-label]="'addon.storagemanager.deletedatafrom' | translate: | ||||
|                         { name: title }"> | ||||
|                         </ion-icon> | ||||
| @ -48,7 +48,7 @@ | ||||
|                             </p> | ||||
|                         </ion-label> | ||||
|                         <div class="storage-buttons" slot="end" *ngIf="section.totalSize > 0 || downloadEnabled"> | ||||
|                             <ion-button (click)="deleteForSection(section)" *ngIf="section.totalSize > 0" color="danger" fill="outline"> | ||||
|                             <ion-button (click)="deleteForSection(section)" *ngIf="section.totalSize > 0" color="danger" fill="clear"> | ||||
|                                 <ion-icon name="fas-trash" slot="icon-only" | ||||
|                                     [attr.aria-label]="'addon.storagemanager.deletedatafrom' | translate: { name: section.name }"> | ||||
|                                 </ion-icon> | ||||
|  | ||||
| @ -21,7 +21,7 @@ | ||||
|                 </ion-label> | ||||
|                 <ion-button fill="clear" color="danger" slot="end" (click)="deleteSiteStorage($event)" | ||||
|                     [hidden]="spaceUsage.spaceUsage! + spaceUsage.cacheEntries! <= 0" | ||||
|                     [attr.aria-label]="'addon.storagemanager.deleteallsitedata' | translate" fill="outline"> | ||||
|                     [attr.aria-label]="'addon.storagemanager.deleteallsitedata' | translate"> | ||||
|                     <ion-icon name="fas-trash" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                 </ion-button> | ||||
|             </ion-item> | ||||
| @ -37,7 +37,7 @@ | ||||
|                     <ion-badge color="light">{{ totalSize | coreBytesToSize }}</ion-badge> | ||||
|                 </ion-label> | ||||
|                 <ion-button slot="end" (click)="deleteCompletelyDownloadedCourses($event)" | ||||
|                     [disabled]="completelyDownloadedCourses.length === 0" color="danger" fill="outline"> | ||||
|                     [disabled]="completelyDownloadedCourses.length === 0" color="danger" fill="clear"> | ||||
|                     <ion-icon name="fas-trash" slot="icon-only" ariaLabel="{{ 'addon.storagemanager.deletecourses' | translate }}"> | ||||
|                     </ion-icon> | ||||
|                 </ion-button> | ||||
|  | ||||
| @ -1,14 +1,13 @@ | ||||
| <ng-container *ngIf="enabled && !loading"> | ||||
|     <!-- Download button. --> | ||||
|     <ion-button *ngIf="status == statusNotDownloaded" fill="clear" (click)="download($event, false)" color="dark" @coreShowHideAnimation | ||||
|     <ion-button *ngIf="status == statusNotDownloaded" fill="clear" (click)="download($event, false)" @coreShowHideAnimation | ||||
|         [attr.aria-label]="(statusTranslatable || 'core.download') | translate"> | ||||
|         <ion-icon slot="icon-only" name="fas-cloud-download-alt" aria-hidden="true"></ion-icon> | ||||
|     </ion-button> | ||||
| 
 | ||||
|     <!-- Refresh button. --> | ||||
|     <ion-button *ngIf="status == statusOutdated || (status == statusDownloaded && !canTrustDownload)" fill="clear" | ||||
|         (click)="download($event, true)" color="primary" @coreShowHideAnimation | ||||
|         [attr.aria-label]="(statusTranslatable || 'core.refresh') | translate"> | ||||
|         (click)="download($event, true)" @coreShowHideAnimation [attr.aria-label]="(statusTranslatable || 'core.refresh') | translate"> | ||||
|         <ion-icon slot="icon-only" name="fam-cloud-refresh" aria-hidden="true"></ion-icon> | ||||
|     </ion-button> | ||||
| 
 | ||||
|  | ||||
| @ -12,8 +12,7 @@ | ||||
|             (action)="download()"> | ||||
|         </core-download-refresh> | ||||
| 
 | ||||
|         <ion-button fill="clear" *ngIf="isDownloaded && isIOS" (click)="openFile($event, true)" color="dark" | ||||
|             [title]="openButtonLabel | translate"> | ||||
|         <ion-button fill="clear" *ngIf="isDownloaded && isIOS" (click)="openFile($event, true)" [title]="openButtonLabel | translate"> | ||||
|             <ion-icon slot="icon-only" [name]="openButtonIcon" aria-hidden="true"></ion-icon> | ||||
|         </ion-button> | ||||
| 
 | ||||
|  | ||||
| @ -1,9 +1,9 @@ | ||||
| <ion-button fill="clear" color="dark" (click)="scroll('backward')" [hidden]="scrollPosition === 'hidden'" | ||||
|     [disabled]="scrollPosition === 'start'" [attr.aria-label]="'core.scrollbackward' | translate" [attr.aria-controls]="targetId"> | ||||
| <ion-button fill="clear" (click)="scroll('backward')" [hidden]="scrollPosition === 'hidden'" [disabled]="scrollPosition === 'start'" | ||||
|     [attr.aria-label]="'core.scrollbackward' | translate" [attr.aria-controls]="targetId"> | ||||
|     <ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
| 
 | ||||
| <ion-button fill="clear" color="dark" (click)="scroll('forward')" [hidden]="scrollPosition === 'hidden'" | ||||
|     [disabled]="scrollPosition === 'end'" [attr.aria-label]="'core.scrollforward' | translate" [attr.aria-controls]="targetId"> | ||||
| <ion-button fill="clear" (click)="scroll('forward')" [hidden]="scrollPosition === 'hidden'" [disabled]="scrollPosition === 'end'" | ||||
|     [attr.aria-label]="'core.scrollforward' | translate" [attr.aria-controls]="targetId"> | ||||
|     <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
| </ion-button> | ||||
|  | ||||
| @ -13,8 +13,8 @@ | ||||
|         [src]="safeUrl" [attr.allowfullscreen]="allowFullscreen ? 'allowfullscreen' : null"> | ||||
|     </iframe> | ||||
| 
 | ||||
|     <ion-button *ngIf="!loading && displayHelp" color="dark" expand="block" fill="clear" (click)="openIframeHelpModal()" | ||||
|         aria-haspopup="dialog" class="core-button-as-link core-iframe-help"> | ||||
|     <ion-button *ngIf="!loading && displayHelp" expand="block" fill="clear" (click)="openIframeHelpModal()" aria-haspopup="dialog" | ||||
|         class="core-button-as-link core-iframe-help"> | ||||
|         {{ 'core.iframehelp' | translate }} | ||||
|     </ion-button> | ||||
| 
 | ||||
|  | ||||
| @ -24,7 +24,7 @@ | ||||
| 
 | ||||
|             <ng-container *ngIf="manage"> | ||||
|                 <ion-button *ngIf="!editMode" fill="clear" [core-suppress-events] (onClick)="activateEdit($event)" | ||||
|                     [attr.aria-label]="'core.edit' | translate" color="dark"> | ||||
|                     [attr.aria-label]="'core.edit' | translate"> | ||||
|                     <ion-icon name="fas-pen" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                 </ion-button> | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| <ion-row class="ion-justify-content-between ion-align-items-center ion-no-padding ion-wrap" *ngIf="items.length > 1"> | ||||
|     <ion-col class="ion-text-start ion-no-padding core-navigation-arrow" size="auto"> | ||||
|         <ion-button [disabled]="previousIndex < 0" fill="clear" color="dark" [attr.aria-label]="previousTitle" | ||||
|             (click)="navigate(previousIndex)"> | ||||
|         <ion-button [disabled]="previousIndex < 0" fill="clear" [attr.aria-label]="previousTitle" (click)="navigate(previousIndex)"> | ||||
|             <ion-icon name="fas-chevron-left" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|         </ion-button> | ||||
|     </ion-col> | ||||
| @ -10,7 +9,7 @@ | ||||
|         </core-progress-bar> | ||||
|     </ion-col> | ||||
|     <ion-col class="ion-text-end ion-no-padding core-navigation-arrow" size="auto"> | ||||
|         <ion-button [disabled]="nextIndex < 0" fill="clear" color="dark" [attr.aria-label]="nextTitle" (click)="navigate(nextIndex)"> | ||||
|         <ion-button [disabled]="nextIndex < 0" fill="clear" [attr.aria-label]="nextTitle" (click)="navigate(nextIndex)"> | ||||
|             <ion-icon name="fas-chevron-right" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|         </ion-button> | ||||
|     </ion-col> | ||||
|  | ||||
| @ -7,6 +7,6 @@ | ||||
|     </textarea> | ||||
|     <ion-button fill="clear" size="large" type="submit" [disabled]="!message || sendDisabled" [attr.aria-label]="'core.send' | translate" | ||||
|         [core-suppress-events] (onClick)="submitForm($event)"> | ||||
|         <ion-icon name="send" color="dark" slot="icon-only" aria-hidden="true" flip-rtl></ion-icon> | ||||
|         <ion-icon name="send" slot="icon-only" aria-hidden="true" flip-rtl></ion-icon> | ||||
|     </ion-button> | ||||
| </form> | ||||
|  | ||||
| @ -27,13 +27,13 @@ | ||||
| 
 | ||||
|         <ion-buttons class="ion-padding core-course-section-nav-buttons safe-area-padding-horizontal list-item-limited-width" | ||||
|             *ngIf="displayCourseIndex && (previousSection || nextSection)"> | ||||
|             <ion-button *ngIf="previousSection" (click)="sectionChanged(previousSection)" color="primary" fill="solid" expand="block" | ||||
|             <ion-button *ngIf="previousSection" (click)="sectionChanged(previousSection)" fill="solid" expand="block" | ||||
|                 [attr.aria-label]="('core.previous' | translate) + ': ' + previousSection.name"> | ||||
|                 <ion-icon name="fas-arrow-left" slot="start" aria-hidden="true"></ion-icon> | ||||
|                 <core-format-text [text]="previousSection.name" contextLevel="course" [contextInstanceId]="course.id"> | ||||
|                 </core-format-text> | ||||
|             </ion-button> | ||||
|             <ion-button *ngIf="nextSection" (click)="sectionChanged(nextSection)" color="primary" fill="solid" expand="block" | ||||
|             <ion-button *ngIf="nextSection" (click)="sectionChanged(nextSection)" fill="solid" expand="block" | ||||
|                 [attr.aria-label]="('core.next' | translate) + ': ' + nextSection.name"> | ||||
|                 <core-format-text [text]="nextSection.name" contextLevel="course" [contextInstanceId]="course.id"> | ||||
|                 </core-format-text> | ||||
| @ -49,7 +49,7 @@ | ||||
| 
 | ||||
| <!-- Course Index button. --> | ||||
| <ion-fab slot="fixed" core-fab vertical="bottom" horizontal="end" *ngIf="loaded && displayCourseIndex"> | ||||
|     <ion-fab-button (click)="openCourseIndex()" [attr.aria-label]="'core.course.courseindex' | translate"> | ||||
|     <ion-fab-button (click)="openCourseIndex()" [attr.aria-label]="'core.course.courseindex' | translate" color="secondary"> | ||||
|         <ion-icon name="fas-list-ul" aria-hidden="true"></ion-icon> | ||||
|         <span class="sr-only">{{'core.course.courseindex' | translate }}</span> | ||||
|     </ion-fab-button> | ||||
|  | ||||
| @ -30,8 +30,7 @@ ion-item.core-course-index-all::part(native) { | ||||
| } | ||||
| 
 | ||||
| ion-item.item.item-current { | ||||
|     --background: var(--primary); | ||||
|     --color: var(--primary-contrast); | ||||
|     --background: var(--primary-tint); | ||||
|     border: 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -23,10 +23,12 @@ | ||||
| <ng-content select="[description]"></ng-content> | ||||
| 
 | ||||
| <!-- Module completion. --> | ||||
| <ion-item class="ion-text-wrap" *ngIf="showCompletion && module.completiondata && module.completiondata.isautomatic"> | ||||
| <ion-item class="ion-text-wrap" | ||||
|     *ngIf="showCompletion && module.completiondata && (module.completiondata.isautomatic || (showManualCompletion && module.uservisible))"> | ||||
|     <ion-label> | ||||
|         <core-course-module-completion [completion]="module.completiondata" [moduleName]="module.name" [moduleId]="module.id" | ||||
|             [showCompletionConditions]="true"> | ||||
|             [showCompletionConditions]="true" [showManualCompletion]="showManualCompletion && module.uservisible" | ||||
|             (completionChanged)="completionChanged.emit($event)"> | ||||
|         </core-course-module-completion> | ||||
|     </ion-label> | ||||
| </ion-item> | ||||
|  | ||||
| @ -12,9 +12,9 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Component, Input, OnInit } from '@angular/core'; | ||||
| import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; | ||||
| import { CoreCourse } from '@features/course/services/course'; | ||||
| import { CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||
| import { CoreCourseModuleCompletionData, CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||
| import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; | ||||
| import { CoreSites } from '@services/sites'; | ||||
| 
 | ||||
| @ -48,6 +48,9 @@ export class CoreCourseModuleInfoComponent implements OnInit { | ||||
| 
 | ||||
|     @Input() hasDataToSync = false; // If the activity has any data to be synced.
 | ||||
| 
 | ||||
|     @Input() showManualCompletion = true; // Whether to show manual completion, true by default.
 | ||||
|     @Output() completionChanged = new EventEmitter<CoreCourseModuleCompletionData>(); // Notify when completion changes.
 | ||||
| 
 | ||||
|     modicon = ''; | ||||
|     showCompletion = false; // Whether to show completion.
 | ||||
|     moduleNameTranslated = ''; | ||||
|  | ||||
| @ -7,8 +7,8 @@ | ||||
|             <ion-icon *ngIf="completion?.offline" name="fas-sync" [attr.aria-label]="'core.course.manualcompletionnotsynced' | translate" | ||||
|                 slot="end"></ion-icon> | ||||
|         </ion-button> | ||||
|         <ion-button *ngIf="!completion.state" color="dark" fill="outline" [attr.aria-label]="accessibleDescription" | ||||
|             (click)="completionClicked($event)" class="ion-text-wrap" [class.chip]="mode == 'basic'"> | ||||
|         <ion-button *ngIf="!completion.state" fill="outline" [attr.aria-label]="accessibleDescription" (click)="completionClicked($event)" | ||||
|             class="ion-text-wrap" [class.chip]="mode == 'basic'"> | ||||
|             {{ 'core.course.completion_manual:markdone' | translate }} | ||||
|             <ion-icon *ngIf="completion?.offline" name="fas-sync" [attr.aria-label]="'core.course.manualcompletionnotsynced' | translate" | ||||
|                 slot="end"></ion-icon> | ||||
| @ -16,7 +16,7 @@ | ||||
|     </ng-container> | ||||
| 
 | ||||
|     <ng-container *ngIf="!completion.istrackeduser"> | ||||
|         <ion-button disabled="true" color="dark" fill="outline" class="ion-text-wrap" [class.chip]="mode == 'basic'"> | ||||
|         <ion-button disabled="true" fill="outline" class="ion-text-wrap" [class.chip]="mode == 'basic'"> | ||||
|             {{ 'core.course.completion_manual:markdone' | translate }} | ||||
|         </ion-button> | ||||
|     </ng-container> | ||||
|  | ||||
| @ -6,13 +6,6 @@ | ||||
|                 <ion-icon name="fas-arrow-left" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|         </ion-col> | ||||
|         <ion-col class="ion-no-padding" | ||||
|             *ngIf="showCompletion && (currentModule.completiondata && showManualCompletion && currentModule.uservisible)"> | ||||
|             <!-- Module completion. --> | ||||
|             <core-course-module-completion [completion]="currentModule.completiondata" [moduleName]="currentModule.name" | ||||
|                 [moduleId]="currentModule.id" [showManualCompletion]="true" (completionChanged)="completionChanged.emit($event)"> | ||||
|             </core-course-module-completion> | ||||
|         </ion-col> | ||||
|         <ion-col size="auto" class="ion-no-padding core-course-module-navigation-arrow"> | ||||
|             <ion-button fill="clear" class="core-course-next-module" [disabled]="!nextModule" (click)="goToActivity(true)" | ||||
|                 [attr.aria-label]="'core.course.gotonextactivity' | translate"> | ||||
|  | ||||
| @ -12,9 +12,9 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; | ||||
| import { Component, Input, OnDestroy, OnInit } from '@angular/core'; | ||||
| import { CoreCourse, CoreCourseProvider, CoreCourseWSSection } from '@features/course/services/course'; | ||||
| import { CoreCourseModuleCompletionData, CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||
| import { CoreCourseModuleData } from '@features/course/services/course-helper'; | ||||
| import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; | ||||
| import { IonContent } from '@ionic/angular'; | ||||
| import { CoreNavigationOptions, CoreNavigator } from '@services/navigator'; | ||||
| @ -27,7 +27,7 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events'; | ||||
|  * Component to show a button to go to the next resource/activity. | ||||
|  * | ||||
|  * Example usage: | ||||
|  * <core-course-module-navigation [courseId]="courseId" [currentModule]="module"></core-course-module-navigation> | ||||
|  * <core-course-module-navigation [courseId]="courseId" [currentModuleId]="moduleId"></core-course-module-navigation> | ||||
|  */ | ||||
| @Component({ | ||||
|     selector: 'core-course-module-navigation', | ||||
| @ -37,21 +37,17 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events'; | ||||
| export class CoreCourseModuleNavigationComponent implements OnInit, OnDestroy { | ||||
| 
 | ||||
|     @Input() courseId!: number; // Course ID.
 | ||||
|     @Input() currentModule!: CoreCourseModuleData; // Current module.
 | ||||
|     @Input() showManualCompletion = true; // Whether to show manual completion, true by default.
 | ||||
| 
 | ||||
|     @Output() completionChanged = new EventEmitter<CoreCourseModuleCompletionData>(); // Notify when completion changes.
 | ||||
|     @Input() currentModuleId!: number; // Current module Id.
 | ||||
| 
 | ||||
|     nextModule?: CoreCourseModuleData; | ||||
|     previousModule?: CoreCourseModuleData; | ||||
|     nextModuleSection?: CoreCourseWSSection; | ||||
|     previousModuleSection?: CoreCourseWSSection; | ||||
|     loaded = false; | ||||
|     showCompletion = false; // Whether to show completion.
 | ||||
| 
 | ||||
|     protected completionObserver: CoreEventObserver; | ||||
| 
 | ||||
|     constructor(el: ElementRef, protected ionContent: IonContent) { | ||||
|     constructor(protected ionContent: IonContent) { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         this.completionObserver = CoreEvents.on(CoreEvents.COMPLETION_MODULE_VIEWED, async (data) => { | ||||
| @ -70,8 +66,6 @@ export class CoreCourseModuleNavigationComponent implements OnInit, OnDestroy { | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     async ngOnInit(): Promise<void> { | ||||
|         this.showCompletion = CoreSites.getRequiredCurrentSite().isVersionGreaterEqualThan('3.11'); | ||||
| 
 | ||||
|         try { | ||||
|             await this.setNextAndPreviousModules(CoreSitesReadingStrategy.PREFER_CACHE); | ||||
|         } finally { | ||||
| @ -104,7 +98,6 @@ export class CoreCourseModuleNavigationComponent implements OnInit, OnDestroy { | ||||
|         } | ||||
| 
 | ||||
|         const preSets = CoreSites.getReadingStrategyPreSets(readingStrategy); | ||||
|         const currentModuleId = this.currentModule.id; | ||||
| 
 | ||||
|         const sections = await CoreCourse.getSections(this.courseId, false, true, preSets); | ||||
| 
 | ||||
| @ -117,7 +110,7 @@ export class CoreCourseModuleNavigationComponent implements OnInit, OnDestroy { | ||||
|                 return false; | ||||
|             } | ||||
| 
 | ||||
|             currentModuleIndex = section.modules.findIndex((module: CoreCourseModuleData) => module.id == currentModuleId); | ||||
|             currentModuleIndex = section.modules.findIndex((module: CoreCourseModuleData) => module.id == this.currentModuleId); | ||||
| 
 | ||||
|             return currentModuleIndex >= 0; | ||||
|         }); | ||||
|  | ||||
| @ -25,7 +25,7 @@ | ||||
|                 </h1> | ||||
|             </ion-label> | ||||
|             <ion-button fill="clear" *ngIf="displayOptions.displayOpenInBrowser" [href]="externalUrl" core-link [showBrowserWarning]="false" | ||||
|                 color="dark" [attr.aria-label]="'core.openinbrowser' | translate" slot="end"> | ||||
|                 [attr.aria-label]="'core.openinbrowser' | translate" slot="end"> | ||||
|                 <ion-icon name="fas-external-link-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|         </ion-item> | ||||
| @ -80,7 +80,7 @@ | ||||
|                 </ion-label> | ||||
|             </ion-item> | ||||
|             <ion-button fill="outline" expand="block" *ngIf="canPrefetch && displayOptions.displayPrefetch" class="ion-text-wrap" | ||||
|                 (click)="prefetch()" color="primary" [disabled]="prefetchDisabled"> | ||||
|                 (click)="prefetch()" [disabled]="prefetchDisabled"> | ||||
|                 <ion-icon *ngIf="!prefetchLoading" name="fas-cloud-download-alt" slot="start" aria-hidden="true"></ion-icon> | ||||
|                 <ion-spinner *ngIf="prefetchLoading" slot="start" aria-hidden="true"></ion-spinner> | ||||
|                 <ion-label> | ||||
| @ -197,14 +197,14 @@ | ||||
|     </core-loading> | ||||
| </ion-content> | ||||
| <ion-footer *ngIf="loaded && isOnline && displayOptions.displayRefresh"> | ||||
|     <ion-button class="ion-margin" *ngIf="!hasOffline" (click)="refresh()" expand="block"> | ||||
|     <ion-button class="ion-margin" *ngIf="!hasOffline" (click)="refresh()" expand="block" fill="outline"> | ||||
|         <ion-icon name="fas-redo-alt" slot="start" aria-hidden="true"></ion-icon> | ||||
|         <ion-label> | ||||
|             {{ 'core.refresh' | translate }} | ||||
|         </ion-label> | ||||
|     </ion-button> | ||||
| 
 | ||||
|     <ion-button class="ion-margin" *ngIf="hasOffline" (click)="sync()" expand="block"> | ||||
|     <ion-button class="ion-margin" *ngIf="hasOffline" (click)="sync()" expand="block" fill="outline"> | ||||
|         <ion-icon name="fas-sync-alt" slot="start" aria-hidden="true"></ion-icon> | ||||
|         <ion-label> | ||||
|             {{ 'core.settings.synchronizenow' | translate }} | ||||
|  | ||||
| @ -53,7 +53,7 @@ | ||||
| 
 | ||||
|                 <div class="core-module-buttons-more"> | ||||
|                     <!-- Buttons defined by the module handler. --> | ||||
|                     <ion-button fill="clear" *ngFor="let button of module.handlerData.buttons" color="dark" | ||||
|                     <ion-button fill="clear" *ngFor="let button of module.handlerData.buttons" | ||||
|                         [hidden]="button.hidden || module.handlerData.spinner" class="core-animate-show-hide" | ||||
|                         (click)="buttonClicked($event, button)" [attr.aria-label]="button.label | translate:{$a: module.handlerData.title}"> | ||||
|                         <ion-icon [name]="button.icon" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|  | ||||
| @ -36,7 +36,7 @@ | ||||
|                         <core-format-text [text]="course.fullname" contextLevel="course" [contextInstanceId]="course.id"> | ||||
|                         </core-format-text> | ||||
|                     </h2> | ||||
|                     <ion-chip color="brand" *ngIf="course.categoryname" class="core-course-category ion-text-nowrap"> | ||||
|                     <ion-chip color="primary" *ngIf="course.categoryname" class="core-course-category ion-text-nowrap"> | ||||
|                         <span class="sr-only">{{ 'core.courses.aria:coursecategory' | translate }}</span> | ||||
|                         <ion-label> | ||||
|                             <core-format-text [text]="course.categoryname" contextLevel="coursecat" [contextInstanceId]="course.categoryid"> | ||||
| @ -61,7 +61,7 @@ | ||||
|                         </p> | ||||
|                     </div> | ||||
|                 </ion-label> | ||||
|                 <ion-button fill="clear" [href]="courseUrl" core-link [showBrowserWarning]="false" color="dark" | ||||
|                 <ion-button fill="clear" [href]="courseUrl" core-link [showBrowserWarning]="false" | ||||
|                     [attr.aria-label]="'core.openinbrowser' | translate" slot="end"> | ||||
|                     <ion-icon name="fas-external-link-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|                 </ion-button> | ||||
| @ -143,7 +143,7 @@ | ||||
|     </ion-card> | ||||
| 
 | ||||
|     <ng-container *ngIf="canAccessCourse"> | ||||
|         <ion-button class="ion-margin" *ngFor="let item of courseMenuHandlers" (click)="openMenuItem(item)" [class]="item.data.class" | ||||
|         <ion-button *ngFor="let item of courseMenuHandlers" (click)="openMenuItem(item)" [class]="'ion-margin' + item.data.class" | ||||
|             expand="block"> | ||||
|             <ion-icon *ngIf="item.data.icon" [name]="item.data.icon" slot="start" aria-hidden="true"></ion-icon> | ||||
|             <ion-label>{{item.data.title | translate }}</ion-label> | ||||
|  | ||||
| @ -12,7 +12,7 @@ | ||||
| 
 | ||||
|         <ion-buttons slot="end"> | ||||
|             <ion-button fill="clear" *ngIf="module.url && module.uservisible && !unsupported" [href]="module.url" core-link | ||||
|                 [showBrowserWarning]="false" color="dark" [attr.aria-label]="'core.openinbrowser' | translate"> | ||||
|                 [showBrowserWarning]="false" [attr.aria-label]="'core.openinbrowser' | translate"> | ||||
|                 <ion-icon name="fas-external-link-alt" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|         </ion-buttons> | ||||
| @ -24,7 +24,8 @@ | ||||
|     </ion-refresher> | ||||
|     <core-loading [hideUntil]="loaded" class="has-spacer list-item-limited-width"> | ||||
|         <core-course-module-info [module]="module" [courseId]="courseId" [description]="module.description" [component]="module.modname" | ||||
|             [componentId]="module.id" [expandDescription]="true" [showAvailabilityInfo]="true"> | ||||
|             [componentId]="module.id" [expandDescription]="true" [showAvailabilityInfo]="true" (completionChanged)="onCompletionChange()" | ||||
|             [showManualCompletion]="showManualCompletion"> | ||||
|             <div class="core-module-additional-info" title> | ||||
|                 <ion-chip *ngIf="module.handlerData?.extraBadge" [color]="module.handlerData?.extraBadgeColor" | ||||
|                     class="ion-text-wrap ion-text-start" [outline]="true"> | ||||
| @ -44,6 +45,6 @@ | ||||
|         <core-course-unsupported-module *ngIf="unsupported" [module]="module"></core-course-unsupported-module> | ||||
|     </core-loading> | ||||
| 
 | ||||
|     <core-course-module-navigation collapsible-footer [hidden]="!loaded" [courseId]="courseId" [currentModule]="module" | ||||
|         (completionChanged)="onCompletionChange()" [showManualCompletion]="showManualCompletion"></core-course-module-navigation> | ||||
|     <core-course-module-navigation collapsible-footer [hidden]="!loaded" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
|     </core-course-module-navigation> | ||||
| </ion-content> | ||||
|  | ||||
| @ -17,7 +17,7 @@ | ||||
| 
 | ||||
|         <div class="core-button-spinner" *ngIf="courseOptionMenuEnabled"> | ||||
|             <!-- Options menu. --> | ||||
|             <ion-button fill="clear" color="dark" (click)="showCourseOptionsMenu($event)" *ngIf="!showSpinner" | ||||
|             <ion-button fill="clear" (click)="showCourseOptionsMenu($event)" *ngIf="!showSpinner" | ||||
|                 [attr.aria-label]="('core.displayoptions' | translate)"> | ||||
|                 <ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
| @ -66,7 +66,7 @@ | ||||
|                         color="success" role="status" [attr.aria-label]="'core.downloaded' | translate"></ion-icon> | ||||
|                 </p> | ||||
| 
 | ||||
|                 <ion-chip color="brand" *ngIf="course.categoryname" | ||||
|                 <ion-chip color="primary" *ngIf="course.categoryname" | ||||
|                     class="core-course-category core-course-additional-info ion-text-nowrap"> | ||||
|                     <span class="sr-only">{{ 'core.courses.aria:coursecategory' | translate }}</span> | ||||
|                     <ion-label> | ||||
|  | ||||
| @ -47,7 +47,7 @@ | ||||
|                 name="fam-cloud-done" color="success" role="status" [attr.aria-label]="'core.downloaded' | translate"></ion-icon> | ||||
| 
 | ||||
|             <!-- Options menu. --> | ||||
|             <ion-button fill="clear" color="dark" (click)="showCourseOptionsMenu($event)" *ngIf="!showSpinner" | ||||
|             <ion-button fill="clear" (click)="showCourseOptionsMenu($event)" *ngIf="!showSpinner" | ||||
|                 [attr.aria-label]="('core.displayoptions' | translate)"> | ||||
|                 <ion-icon name="ellipsis-vertical" slot="icon-only" aria-hidden="true"></ion-icon> | ||||
|             </ion-button> | ||||
|  | ||||
| @ -31,7 +31,7 @@ | ||||
|                 <!-- Download all courses. --> | ||||
|                 <div *ngIf="downloadCoursesEnabled && myOverviewBlock && myOverviewBlock.filteredCourses.length > 1" | ||||
|                     class="core-button-spinner"> | ||||
|                     <ion-button *ngIf="!myOverviewBlock.prefetchCoursesData.loading" fill="clear" color="dark" | ||||
|                     <ion-button *ngIf="!myOverviewBlock.prefetchCoursesData.loading" fill="clear" | ||||
|                         (click)="myOverviewBlock.prefetchCourses()" | ||||
|                         [attr.aria-label]="myOverviewBlock.prefetchCoursesData.statusTranslatable | translate"> | ||||
|                         <ion-icon [name]="myOverviewBlock.prefetchCoursesData.icon" slot="icon-only" aria-hidden="true"> | ||||
|  | ||||
| @ -80,8 +80,7 @@ | ||||
|         </ion-slide> | ||||
|         <ion-slide> | ||||
|             <button [disabled]="!rteEnabled" [attr.aria-pressed]="toolbarStyles.ul" [title]="'core.editor.unorderedlist' | translate" | ||||
|                 (click)="buttonAction($event, 'insertUnorderedList')" (click)="buttonAction($event, 'insertUnorderedList')" | ||||
|                 (mousedown)="downAction($event)" (keydown)="downAction($event)"> | ||||
|                 (click)="buttonAction($event, 'insertUnorderedList')" (mousedown)="downAction($event)" (keydown)="downAction($event)"> | ||||
|                 <ion-icon name="fas-list-ul" aria-hidden="true"></ion-icon> | ||||
|             </button> | ||||
|         </ion-slide> | ||||
|  | ||||
| @ -62,7 +62,7 @@ | ||||
|         </form> | ||||
| 
 | ||||
|         <!-- Forgotten password option. --> | ||||
|         <ion-button *ngIf="showForgottenPassword" expand="block" fill="clear" color="dark" | ||||
|         <ion-button *ngIf="showForgottenPassword" expand="block" fill="clear" | ||||
|             class="core-login-forgotten-password core-button-as-link ion-text-wrap" (click)="forgottenPassword()"> | ||||
|             {{ 'core.login.forgotten' | translate }} | ||||
|         </ion-button> | ||||
|  | ||||
| @ -76,7 +76,7 @@ | ||||
|         </form> | ||||
| 
 | ||||
|         <!-- Forgotten password option. --> | ||||
|         <ion-button *ngIf="showForgottenPassword && !isOAuth" expand="block" fill="clear" color="dark" | ||||
|         <ion-button *ngIf="showForgottenPassword && !isOAuth" expand="block" fill="clear" | ||||
|             class="core-login-forgotten-password core-button-as-link ion-text-wrap" (click)="forgottenPassword()"> | ||||
|             {{ 'core.login.forgotten' | translate }} | ||||
|         </ion-button> | ||||
|  | ||||
| @ -110,7 +110,7 @@ | ||||
| 
 | ||||
|         <!-- Help. --> | ||||
|         <ion-button class="ion-margin-top core-login-need-help core-button-as-link ion-text-wrap" (click)="showHelp()" | ||||
|             aria-haspopup="dialog" expand="block" fill="clear" color="dark"> | ||||
|             aria-haspopup="dialog" expand="block" fill="clear"> | ||||
|             {{ 'core.needhelp' | translate }} | ||||
|         </ion-button> | ||||
|     </div> | ||||
|  | ||||
| @ -1,161 +1,178 @@ | ||||
| @import "~theme/globals"; | ||||
| 
 | ||||
| :host{ | ||||
|     --menutabbar-size: var(--bottom-tabs-size); | ||||
| 
 | ||||
|     ion-tab-bar { | ||||
|         height: var(--menutabbar-size); | ||||
|     } | ||||
| 
 | ||||
|     @if ($core-always-show-main-menu) { | ||||
|         ion-tabs.placement-bottom ion-tab-bar { | ||||
|             height: var(--menutabbar-size) !important; | ||||
|             visibility: visible !important; | ||||
|             transform: translateY(0) !important; | ||||
|         } | ||||
|     } @else { | ||||
|         ion-tabs.tabshidden.placement-bottom ion-tab-bar { | ||||
|             pointer-events: none; | ||||
| 
 | ||||
|             ion-tab-button { | ||||
|                 height: auto; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     ion-tab-button ion-icon.core-tab-icon { | ||||
|         text-overflow: unset; | ||||
|         overflow: visible; | ||||
|         text-align: center; | ||||
|     } | ||||
| 
 | ||||
|     ion-tab-button.ios ion-icon.core-tab-icon { | ||||
|         font-size: 25px; | ||||
|     } | ||||
| 
 | ||||
|     ion-tab-button.md ion-badge.core-tab-badge { | ||||
|         font-size: 12px; | ||||
|         font-weight: bold; | ||||
|         border-radius: 10px; | ||||
|         padding-left: 6px; | ||||
|         padding-right: 6px; | ||||
|         line-height: 14px; | ||||
|     } | ||||
| 
 | ||||
|     ion-tab-button.tab-selected { | ||||
|         background: var(--background-selected); | ||||
|     } | ||||
| 
 | ||||
|     ion-icon.core-tab-badge { | ||||
|         color: var(--core-bottom-tabs-badge-color); | ||||
|         padding: 3px 6px 2px; | ||||
|         @include position(8px, null, null, calc(50% + 6px)); | ||||
|         min-width: 12px; | ||||
|         font-size: 8px; | ||||
|         font-weight: normal; | ||||
|         box-sizing: border-box; | ||||
|         position: absolute; | ||||
|         z-index: 1; | ||||
|     } | ||||
| 
 | ||||
|     ion-badge.core-tab-badge { | ||||
|         --background: var(--core-bottom-tabs-badge-color); | ||||
|         --color: var(--core-bottom-tabs-badge-text-color); | ||||
|     } | ||||
| 
 | ||||
|     ion-tabs.placement-bottom ion-tab-button { | ||||
|         ion-icon.core-tab-icon { | ||||
|             transition: margin 500ms ease-in-out, transform 300ms ease-in-out; | ||||
|         } | ||||
|         ion-icon.core-tab-badge, | ||||
|         ion-badge.core-tab-badge { | ||||
|             top: 8px; | ||||
|         } | ||||
| :host { | ||||
|     ion-tabs { | ||||
|         --menutabbar-size: var(--bottom-tabs-size); | ||||
|     } | ||||
| 
 | ||||
|     ion-tabs.placement-side { | ||||
|         flex-direction: row; | ||||
|         ion-tab-bar { | ||||
|             order: -1; | ||||
|             width: var(--menutabbar-size); | ||||
|             height: calc(100% - var(--ion-safe-area-top) - var(--ion-safe-area-bottom)); | ||||
|             flex-direction: column; | ||||
|             @include border-end(var(--border)); | ||||
|             border-top: 0; | ||||
|             justify-content: flex-start; | ||||
| 
 | ||||
|             @include padding(var(--ion-safe-area-top), 0px, var(--ion-safe-area-bottom), var(--ion-safe-area-left)); | ||||
| 
 | ||||
|             ion-tab-button, core-user-menu-button { | ||||
|                 width: 100%; | ||||
|                 min-height: var(--menutabbar-size); | ||||
|                 flex: 0; | ||||
| 
 | ||||
|                 ion-icon.core-tab-badge, | ||||
|                 ion-badge.core-tab-badge { | ||||
|                     top: calc(50% - 20px); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         --menutabbar-size: var(--side-tabs-size); | ||||
|     } | ||||
| 
 | ||||
|     --network-margin-bottom: 0px; | ||||
|     --network-message-background: transparent; | ||||
|     --network-message-offline: none; | ||||
|     --network-message-online: none; | ||||
|     --network-message-height: 16px; | ||||
| } | ||||
| 
 | ||||
| :host-context(.core-online), | ||||
| :host-context(.core-offline) { | ||||
|     .core-network-message { | ||||
|         visibility: visible; | ||||
|         height: var(--network-message-height); | ||||
|         padding-bottom: calc(var(--ion-safe-area-bottom, 0px) + var(--network-message-height)); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| :host-context(.core-online) { | ||||
|     --network-margin-bottom: 8px; | ||||
| 
 | ||||
|     --network-message-background: var(--success); | ||||
|     --network-message-online: block; | ||||
| } | ||||
| 
 | ||||
| :host-context(.core-offline) { | ||||
|     --network-margin-bottom: 8px; | ||||
| 
 | ||||
|     --network-message-background: var(--danger); | ||||
|     --network-message-offline: block; | ||||
| } | ||||
| 
 | ||||
| ion-tab-bar { | ||||
|     height: var(--menutabbar-size); | ||||
| 
 | ||||
|     core-user-menu-button { | ||||
|         align-items: center; | ||||
|         display: flex; | ||||
|         justify-content: center; | ||||
|     } | ||||
| 
 | ||||
|     .core-network-message { | ||||
|         --network-message-height: 16px; | ||||
|         position: absolute; | ||||
|         bottom: 0; | ||||
|         left: 0; | ||||
|         right: 0; | ||||
|         padding-left: 10px; | ||||
|         padding-right: 10px; | ||||
|         text-align: center; | ||||
|         color: white; | ||||
|         visibility: hidden; | ||||
|         height: 0; | ||||
|         transition: all 500ms ease-in-out; | ||||
|         opacity: .8; | ||||
|         z-index: 12; | ||||
|     } | ||||
|     ion-tab-button { | ||||
|         &.tab-selected { | ||||
|             background: var(--background-selected); | ||||
|         } | ||||
| 
 | ||||
|     .core-online-message, | ||||
|     .core-offline-message { | ||||
|         display: none; | ||||
|         ion-icon.core-tab-icon { | ||||
|             text-overflow: unset; | ||||
|             overflow: visible; | ||||
|             text-align: center; | ||||
|             font-size: 24px; | ||||
|         } | ||||
| 
 | ||||
|         ion-badge.core-tab-badge { | ||||
|             font-size: 12px; | ||||
|             font-weight: bold; | ||||
|             border-radius: 10px; | ||||
|             padding-left: 6px; | ||||
|             padding-right: 6px; | ||||
|             line-height: 14px; | ||||
|             --background: var(--core-bottom-tabs-badge-color); | ||||
|             --color: var(--core-bottom-tabs-badge-text-color); | ||||
|         } | ||||
| 
 | ||||
|         ion-icon.core-tab-badge { | ||||
|             color: var(--core-bottom-tabs-badge-color); | ||||
|             padding: 3px 6px 2px; | ||||
|             @include position(8px, null, null, calc(50% + 6px)); | ||||
|             min-width: 12px; | ||||
|             font-size: 8px; | ||||
|             font-weight: normal; | ||||
|             box-sizing: border-box; | ||||
|             position: absolute; | ||||
|             z-index: 1; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| :host-context(.core-online), | ||||
| :host-context(.core-offline) { | ||||
|     ion-tabs.placement-bottom ion-tab-button ion-icon.core-tab-icon { | ||||
|         margin-bottom: 8px; | ||||
| ion-tabs.placement-bottom { | ||||
|     ion-tab-button { | ||||
|         ion-icon.core-tab-icon { | ||||
|             margin-bottom: var(--network-margin-bottom); | ||||
|             transition: margin 500ms ease-in-out, transform 300ms ease-in-out; | ||||
|         } | ||||
| 
 | ||||
|         ion-icon.core-tab-badge, | ||||
|         ion-badge.core-tab-badge { | ||||
|             top: 8px; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     ion-tabs.placement-bottom ion-tab-button.ios ion-icon.core-tab-icon { | ||||
|         margin-bottom: 14px; | ||||
|     } | ||||
|     @if ($core-always-show-main-menu) { | ||||
|         ion-tab-bar { | ||||
|             height: var(--menutabbar-size) !important; | ||||
|             visibility: visible !important; | ||||
|             transform: translateY(0) !important; | ||||
|         } | ||||
|     } @else { | ||||
|         &.tabshidden ion-tab-bar { | ||||
|             pointer-events: none; | ||||
| 
 | ||||
|     .core-network-message { | ||||
|         visibility: visible; | ||||
|         height: var(--network-message-height); | ||||
|         padding-bottom: calc(var(--ion-safe-area-bottom, 0px) + var(--network-message-height)); | ||||
|         pointer-events: none; | ||||
|             ion-tab-button { | ||||
|                 height: auto; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| :host-context(.core-offline) .core-offline-message, | ||||
| :host-context(.core-online) .core-online-message { | ||||
|     display: block; | ||||
| ion-tabs.placement-side { | ||||
|     flex-direction: row; | ||||
| 
 | ||||
|     ion-tab-bar { | ||||
|         order: -1; | ||||
|         width: var(--menutabbar-size); | ||||
|         height: calc(100% - var(--ion-safe-area-top) - var(--ion-safe-area-bottom)); | ||||
|         flex-direction: column; | ||||
|         @include border-end(var(--border)); | ||||
|         border-top: 0; | ||||
|         justify-content: flex-start; | ||||
| 
 | ||||
|         @include padding(var(--ion-safe-area-top), 0px, var(--ion-safe-area-bottom), var(--ion-safe-area-left)); | ||||
| 
 | ||||
|         ion-tab-button { | ||||
|             --padding-start: 0; | ||||
|             --padding-end: 0; | ||||
|             ion-badge.core-tab-badge { | ||||
|                 @include position(null, 1px, null, auto); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         ion-tab-button, core-user-menu-button { | ||||
|             width: 100%; | ||||
|             min-height: var(--menutabbar-size); | ||||
|             flex: 0; | ||||
| 
 | ||||
|             ion-icon.core-tab-badge, | ||||
|             ion-badge.core-tab-badge { | ||||
|                 top: calc(50% - 20px); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| :host-context(.core-online) .core-network-message { | ||||
|     background: var(--success); | ||||
| } | ||||
| .core-network-message { | ||||
|     background: var(--network-message-background); | ||||
|     pointer-events: none; | ||||
|     position: absolute; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     right: 0; | ||||
|     padding-left: 10px; | ||||
|     padding-right: 10px; | ||||
|     text-align: center; | ||||
|     color: white; | ||||
|     visibility: hidden; | ||||
|     height: 0; | ||||
|     transition: all 500ms ease-in-out; | ||||
|     opacity: .8; | ||||
|     z-index: 12; | ||||
| 
 | ||||
| :host-context(.core-offline) .core-network-message { | ||||
|     background: var(--danger); | ||||
|     .core-online { | ||||
|         display: var(--network-message-online); | ||||
|     } | ||||
| 
 | ||||
|     .core-offline { | ||||
|         display: var(--network-message-offline); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -14,5 +14,5 @@ | ||||
|     (onLoadingContent)="contentLoading()"> | ||||
| </core-site-plugins-plugin-content> | ||||
| 
 | ||||
| <core-course-module-navigation collapsible-footer *ngIf="module" [courseId]="courseId" [currentModule]="module"> | ||||
| <core-course-module-navigation collapsible-footer *ngIf="module" [courseId]="courseId" [currentModuleId]="module.id"> | ||||
| </core-course-module-navigation> | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| <ion-item button class="divider ion-text-wrap" detail="true" (click)="gotoBlock()" detail="true"> | ||||
| <ion-item button class="divider ion-text-wrap" detail="true" (click)="gotoBlock()"> | ||||
|     <ion-label> | ||||
|         <h2>{{ title | translate }}</h2> | ||||
|     </ion-label> | ||||
|  | ||||
| @ -17,7 +17,7 @@ | ||||
|             <ion-item class="ion-text-center core-user-profile-maininfo ion-text-wrap" lines="full"> | ||||
|                 <core-user-avatar [user]="user" [userId]="user.id" [linkProfile]="false" [checkOnline]="!canChangeProfilePicture"> | ||||
|                     <ion-button class="edit-avatar" *ngIf="canChangeProfilePicture" (click)="changeProfilePicture()" | ||||
|                         [attr.aria-label]="'core.user.newpicture' | translate" fill="clear" color="dark"> | ||||
|                         [attr.aria-label]="'core.user.newpicture' | translate" fill="clear"> | ||||
|                         <ion-icon slot="icon-only" name="fas-pen" aria-hidden="true"></ion-icon> | ||||
|                     </ion-button> | ||||
|                 </core-user-avatar> | ||||
| @ -94,7 +94,7 @@ | ||||
|                             </a></p> | ||||
|                     </ion-label> | ||||
|                 </ion-item> | ||||
|                 <ion-item class="ion-text-wrap" *ngIf="interests" class="core-user-profile-interests"> | ||||
|                 <ion-item class="ion-text-wrap core-user-profile-interests" *ngIf="interests"> | ||||
|                     <ion-label> | ||||
|                         <h2>{{ 'core.user.interests' | translate}}</h2> | ||||
|                         <ion-badge *ngFor="let interest of interests" role="link" (click)="openInterest(interest)"> | ||||
|  | ||||
| @ -25,7 +25,6 @@ interface ColorComponents { | ||||
|  * Ionic color names. | ||||
|  */ | ||||
| export enum CoreIonicColorNames { | ||||
|     BRAND = 'brand', | ||||
|     PRIMARY = 'primary', | ||||
|     SECONDARY = 'secondary', | ||||
|     SUCCESS = 'success', | ||||
|  | ||||
| @ -17,7 +17,7 @@ $gray-900:    #1d2125 !default; // Copy text | ||||
| $black:       #000000 !default; // Avoid usage | ||||
| 
 | ||||
| $blue:        #0f6cbf !default; | ||||
| $cyan:        #008196 !default; | ||||
| $cyan:        #008196 !default; // Not used. | ||||
| $green:       #357a32 !default; | ||||
| $red:         #ca3120 !default; | ||||
| $yellow:      #f0ad4e !default; | ||||
| @ -39,19 +39,19 @@ $ion-item-background-rgb:  color-to-rgb-list($ion-item-background) !default; | ||||
| $ion-item-background-dark: $gray-900 !default; | ||||
| $ion-item-background-dark-rgb: color-to-rgb-list($ion-item-background-dark) !default; | ||||
| 
 | ||||
| $primary:    $blue !default; | ||||
| $secondary:  $gray-400 !default; | ||||
| $primary:    $brand-color !default; | ||||
| $secondary:  $gray-300 !default; | ||||
| $danger:     $red !default; | ||||
| $warning:    $yellow !default; | ||||
| $success:    $green !default; | ||||
| $info:       $cyan !default; | ||||
| $info:       $blue !default; | ||||
| $light:      $gray-100 !default; | ||||
| $medium:     $gray-600 !default; | ||||
| $dark:       $gray-800 !default; | ||||
| 
 | ||||
| $colors:  ( | ||||
|     primary: (light: $primary), | ||||
|     secondary: (light: $secondary), | ||||
|     primary: (light: $primary, dark: $primary), | ||||
|     secondary: (light: $secondary, dark: $gray-700), | ||||
|     success: (light: $success), | ||||
|     warning: (light: $warning), | ||||
|     danger:  (light: $danger), | ||||
| @ -59,7 +59,6 @@ $colors:  ( | ||||
|     light: (light: $light, dark: $dark), | ||||
|     medium: (light: $medium, dark: $gray-200), | ||||
|     dark: (light: $dark, dark: $light), | ||||
|     brand: (light: $brand-color, dark: $brand-color), | ||||
| ) !default; | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -370,6 +370,10 @@ ion-button.button.button-clear.button-has-icon-only { | ||||
|     --border-radius: var(--huge-radius); | ||||
| } | ||||
| 
 | ||||
| ion-button.button.button-clear { | ||||
|     --color: var(--dark); | ||||
| } | ||||
| 
 | ||||
| ion-button.button.button-solid, | ||||
| ion-button.button.button-outline { | ||||
|     --border-radius: var(--core-input-radius); | ||||
|  | ||||
| @ -65,7 +65,7 @@ | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     --core-link-color: var(--primary-tint); | ||||
|     --core-link-color: var(--info-tint); | ||||
| 
 | ||||
|     --core-header-toolbar-background:   var(--gray-900); | ||||
|     --core-header-toolbar-color:        var(--white); | ||||
|  | ||||
| @ -47,7 +47,8 @@ | ||||
|         @include generate-color($color-name, $colors); | ||||
|     } | ||||
| 
 | ||||
|     --brand-color: var(--brand); | ||||
|     --brand-color: var(--primary); | ||||
|     --brand-contrast: var(--primary-contrast); | ||||
| 
 | ||||
|     // Accessibility vars. | ||||
|     --a11y-min-target-size: 44px; | ||||
| @ -112,11 +113,12 @@ | ||||
| 
 | ||||
|     --core-bottom-tabs-background: var(--white); | ||||
|     --core-bottom-tabs-color: var(--gray-700); | ||||
|     --core-bottom-tabs-color-selected: var(--brand); | ||||
|     --core-bottom-tabs-color-selected: var(--brand-color); | ||||
|     --core-bottom-tabs-background-selected: transparent; | ||||
|     --core-bottom-tabs-badge-color: var(--brand); | ||||
|     --core-bottom-tabs-badge-color: var(--brand-color); | ||||
|     --core-bottom-tabs-badge-text-color: var(--brand-contrast); | ||||
|     --bottom-tabs-size: 48px; | ||||
|     --side-tabs-size: 56px; | ||||
|     ion-tab-bar.mainmenu-tabs { | ||||
|         --background: var(--core-bottom-tabs-background); | ||||
|         --color: var(--core-bottom-tabs-color); | ||||
| @ -124,7 +126,7 @@ | ||||
|         --background-selected: var(--core-bottom-tabs-background-selected); | ||||
|     } | ||||
| 
 | ||||
|     --core-link-color: var(--primary); | ||||
|     --core-link-color: var(--info); | ||||
|     a { | ||||
|         color: var(--core-link-color); | ||||
|     } | ||||
| @ -201,7 +203,7 @@ | ||||
|     ion-action-sheet { | ||||
|         --button-color: var(--ion-text-color); | ||||
|         --button-color-selected: var(--ion-text-color); | ||||
|         --title-border-color: var(--brand); | ||||
|         --title-border-color: var(--brand-color); | ||||
| 
 | ||||
|         .action-sheet-title { | ||||
|             --color: var(--ion-text-color); | ||||
| @ -223,7 +225,7 @@ | ||||
|     --core-tab-color: var(--subdued-text-color); | ||||
|     --core-tab-border-color: var(--stroke); | ||||
|     --core-tab-color-active: var(--dark); | ||||
|     --core-tab-border-color-active: var(--brand); | ||||
|     --core-tab-border-color-active: var(--brand-color); | ||||
|     --core-tab-font-weight-active: normal; | ||||
|     --core-tabs-height: 48px; | ||||
|     core-tabs, core-tabs-outlet { | ||||
| @ -237,7 +239,7 @@ | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     --core-loading-spinner: var(--brand); | ||||
|     --core-loading-spinner: var(--brand-color); | ||||
|     ion-loading { | ||||
|         --spinner-color: var(--core-loading-spinner); | ||||
|     } | ||||
| @ -248,7 +250,7 @@ | ||||
|     } | ||||
| 
 | ||||
|     --core-progressbar-height: 8px; | ||||
|     --core-progressbar-color: var(--brand); | ||||
|     --core-progressbar-color: var(--brand-color); | ||||
|     --core-progressbar-text-color: var(--medium); | ||||
|     --core-progressbar-background: var(--brand-tint); | ||||
| 
 | ||||
| @ -302,7 +304,7 @@ | ||||
|     --core-login-input-background: var(--white); | ||||
|     --core-login-input-color: var(--gray-900); | ||||
| 
 | ||||
|     --core-star-color: var(--brand); | ||||
|     --core-star-color: var(--brand-color); | ||||
| 
 | ||||
|     --core-large-avatar-size: 90px; | ||||
|     --core-avatar-size: var(--a11y-min-target-size); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user