From 6ca648c46d9575eaf860c8c544055aee2a7b164d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Wed, 25 Apr 2018 12:25:40 +0200
Subject: [PATCH] MOBILE-2334 assign: Fix styles

---
 .../mod/assign/components/index/index.html    |   3 +-
 .../components/submission/submission.html     | 336 +++++++++---------
 .../feedback/comments/component/comments.html |   6 +-
 src/addon/mod/assign/providers/assign.ts      |   2 +-
 src/components/file/file.scss                 |  11 +-
 src/components/local-file/local-file.html     |  49 ++-
 src/components/local-file/local-file.ts       |  10 +-
 7 files changed, 213 insertions(+), 204 deletions(-)

diff --git a/src/addon/mod/assign/components/index/index.html b/src/addon/mod/assign/components/index/index.html
index 8f0e96a3a..900d3bb60 100644
--- a/src/addon/mod/assign/components/index/index.html
+++ b/src/addon/mod/assign/components/index/index.html
@@ -14,10 +14,9 @@
 <core-loading [hideUntil]="loaded" class="core-loading-center">
 
     <!-- Description and intro attachments. -->
-    <ion-card *ngIf="description">
+    <ion-card *ngIf="description" (click)="expandDescription($event)">
         <ion-item text-wrap>
             <core-format-text [text]="description" [component]="component" [componentId]="componentId" maxHeight="120" (click)="expandDescription($event)"></core-format-text>
-            <ion-note *ngIf="note" item-end>{{ note }}</ion-note>
         </ion-item>
     </ion-card>
 
diff --git a/src/addon/mod/assign/components/submission/submission.html b/src/addon/mod/assign/components/submission/submission.html
index f9cf275bc..8d4cb9ffc 100644
--- a/src/addon/mod/assign/components/submission/submission.html
+++ b/src/addon/mod/assign/components/submission/submission.html
@@ -26,205 +26,199 @@
         <!-- View the submission tab. -->
         <core-tab [title]="'addon.mod_assign.submission' | translate">
             <ng-template>
-                <ion-content>
-                    <addon-mod-assign-submission-plugin *ngFor="let plugin of submissionPlugins" [assign]="assign" [submission]="userSubmission" [plugin]="plugin"></addon-mod-assign-submission-plugin>
+                <addon-mod-assign-submission-plugin *ngFor="let plugin of submissionPlugins" [assign]="assign" [submission]="userSubmission" [plugin]="plugin"></addon-mod-assign-submission-plugin>
 
-                    <!-- Render some data about the submission. -->
-                    <ion-item text-wrap *ngIf="userSubmission && userSubmission.status != statusNew && userSubmission.timemodified">
-                        <h2>{{ 'addon.mod_assign.timemodified' | translate }}</h2>
-                        <p>{{ userSubmission.timemodified * 1000 | coreFormatDate:"dfmediumdate" }}</p>
-                    </ion-item>
+                <!-- Render some data about the submission. -->
+                <ion-item text-wrap *ngIf="userSubmission && userSubmission.status != statusNew && userSubmission.timemodified">
+                    <h2>{{ 'addon.mod_assign.timemodified' | translate }}</h2>
+                    <p>{{ userSubmission.timemodified * 1000 | coreFormatDate:"dfmediumdate" }}</p>
+                </ion-item>
 
-                    <ion-item text-wrap *ngIf="timeRemaining" [ngClass]="[timeRemainingClass]">
-                        <h2>{{ 'addon.mod_assign.timeremaining' | translate }}</h2>
-                        <p><core-format-text [text]="timeRemaining"></core-format-text></p>
-                    </ion-item>
+                <ion-item text-wrap *ngIf="timeRemaining" [ngClass]="[timeRemainingClass]">
+                    <h2>{{ 'addon.mod_assign.timeremaining' | translate }}</h2>
+                    <p><core-format-text [text]="timeRemaining"></core-format-text></p>
+                </ion-item>
 
-                    <ion-item text-wrap *ngIf="fromDate && !isSubmittedForGrading">
-                        <p *ngIf="assign.intro" [innerHTML]="'addon.mod_assign.allowsubmissionsfromdatesummary' | translate: {'$a': fromDate}"></p>
-                        <p *ngIf="!assign.intro" [innerHTML]="'addon.mod_assign.allowsubmissionsanddescriptionfromdatesummary' | translate: {'$a': fromDate}"></p>
-                    </ion-item>
+                <ion-item text-wrap *ngIf="fromDate && !isSubmittedForGrading">
+                    <p *ngIf="assign.intro" [innerHTML]="'addon.mod_assign.allowsubmissionsfromdatesummary' | translate: {'$a': fromDate}"></p>
+                    <p *ngIf="!assign.intro" [innerHTML]="'addon.mod_assign.allowsubmissionsanddescriptionfromdatesummary' | translate: {'$a': fromDate}"></p>
+                </ion-item>
 
-                    <ion-item text-wrap *ngIf="assign.duedate && !isSubmittedForGrading">
-                        <h2>{{ 'addon.mod_assign.duedate' | translate }}</h2>
-                        <p *ngIf="assign.duedate" >{{ assign.duedate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
-                        <p *ngIf="!assign.duedate" >{{ 'addon.mod_assign.duedateno' | translate }}</p>
-                    </ion-item>
+                <ion-item text-wrap *ngIf="assign.duedate && !isSubmittedForGrading">
+                    <h2>{{ 'addon.mod_assign.duedate' | translate }}</h2>
+                    <p *ngIf="assign.duedate" >{{ assign.duedate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
+                    <p *ngIf="!assign.duedate" >{{ 'addon.mod_assign.duedateno' | translate }}</p>
+                </ion-item>
 
-                    <ion-item text-wrap *ngIf="assign.duedate && assign.cutoffdate && isSubmittedForGrading">
-                        <h2>{{ 'addon.mod_assign.cutoffdate' | translate }}</h2>
-                        <p>{{ assign.cutoffdate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
-                    </ion-item>
+                <ion-item text-wrap *ngIf="assign.duedate && assign.cutoffdate && isSubmittedForGrading">
+                    <h2>{{ 'addon.mod_assign.cutoffdate' | translate }}</h2>
+                    <p>{{ assign.cutoffdate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
+                </ion-item>
 
-                    <ion-item text-wrap *ngIf="assign.duedate && lastAttempt && lastAttempt.extensionduedate && !isSubmittedForGrading">
-                        <h2>{{ 'addon.mod_assign.extensionduedate' | translate }}</h2>
-                        <p>{{ lastAttempt.extensionduedate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
-                    </ion-item>
+                <ion-item text-wrap *ngIf="assign.duedate && lastAttempt && lastAttempt.extensionduedate && !isSubmittedForGrading">
+                    <h2>{{ 'addon.mod_assign.extensionduedate' | translate }}</h2>
+                    <p>{{ lastAttempt.extensionduedate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
+                </ion-item>
 
-                    <ion-item text-wrap *ngIf="currentAttempt && !isGrading">
-                        <h2>{{ 'addon.mod_assign.attemptnumber' | translate }}</h2>
-                        <p *ngIf="assign.maxattempts == unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }}</p>
-                        <p *ngIf="assign.maxattempts != unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': assign.maxattempts} } }}</p>
-                    </ion-item>
+                <ion-item text-wrap *ngIf="currentAttempt && !isGrading">
+                    <h2>{{ 'addon.mod_assign.attemptnumber' | translate }}</h2>
+                    <p *ngIf="assign.maxattempts == unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }}</p>
+                    <p *ngIf="assign.maxattempts != unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': assign.maxattempts} } }}</p>
+                </ion-item>
 
-                    <!-- Add or edit submission. -->
-                    <ion-item text-wrap *ngIf="canEdit">
-                        <div *ngIf="!unsupportedEditPlugins.length && !showErrorStatementEdit">
-                            <!-- If has offline data, show edit. -->
-                            <a ion-button block color="primary" *ngIf="hasOffline" (click)="goToEdit()">{{ 'addon.mod_assign.editsubmission' | translate }}</a>
-                            <!-- If no submission or is new, show add submission. -->
-                            <a ion-button block color="primary" *ngIf="!hasOffline && (!userSubmission || !userSubmission.status || userSubmission.status == statusNew)" (click)="goToEdit()">{{ 'addon.mod_assign.addsubmission' | translate }}</a>
-                            <!-- If reopened, show addfromprevious and addnewattempt. -->
-                            <ng-container *ngIf="!hasOffline && userSubmission && userSubmission.status == statusReopened">
-                                <a ion-button block color="primary" (click)="copyPrevious()">{{ 'addon.mod_assign.addnewattemptfromprevious' | translate }}</a>
-                                <a ion-button block color="primary" (click)="goToEdit()">{{ 'addon.mod_assign.addnewattempt' | translate }}</a>
-                            </ng-container>
-                            <!-- Else show editsubmission. -->
-                            <a ion-button block color="primary" *ngIf="!hasOffline && userSubmission && userSubmission.status && userSubmission.status != statusNew && userSubmission.status != statusReopened" (click)="goToEdit()">{{ 'addon.mod_assign.editsubmission' | translate }}</a>
-                        </div>
-                        <div *ngIf="unsupportedEditPlugins && unsupportedEditPlugins.length && !showErrorStatementEdit">
-                            <p class="core-danger-item">{{ 'addon.mod_assign.erroreditpluginsnotsupported' | translate }}</p>
-                            <p class="core-danger-item" *ngFor="let name of unsupportedEditPlugins">{{ name }}</p>
-                        </div>
-                        <div *ngIf="showErrorStatementEdit">
-                            <p class="core-danger-item">{{ 'addon.mod_assign.cannoteditduetostatementsubmission' | translate }}</p>
-                        </div>
-                    </ion-item>
-
-                    <!-- Submit for grading form. -->
-                    <div *ngIf="canSubmit">
-                        <ion-item text-wrap *ngIf="submissionStatement">
-                            <ion-label><core-format-text [text]="submissionStatement"></core-format-text></ion-label>
-                            <ion-checkbox item-end name="submissionstatement" [(ngModel)]="submitModel.submissionStatement">
-                            </ion-checkbox>
-                        </ion-item>
-                        <!-- Submit button. -->
-                        <ion-item text-wrap *ngIf="!showErrorStatementSubmit">
-                            <a ion-button block (click)="submitForGrading(submitModel.submissionStatement)">{{ 'addon.mod_assign.submitassignment' | translate }}</a>
-                            <p>{{ 'addon.mod_assign.submitassignment_help' | translate }}</p>
-                        </ion-item>
-                        <!-- Error because we lack submissions statement. -->
-                        <ion-item text-wrap *ngIf="showErrorStatementSubmit">
-                            <p class="core-danger-item">{{ 'addon.mod_assign.cannotsubmitduetostatementsubmission' | translate }}</p>
-                        </ion-item>
+                <!-- Add or edit submission. -->
+                <ion-item text-wrap *ngIf="canEdit">
+                    <div *ngIf="!unsupportedEditPlugins.length && !showErrorStatementEdit">
+                        <!-- If has offline data, show edit. -->
+                        <a ion-button block color="primary" *ngIf="hasOffline" (click)="goToEdit()">{{ 'addon.mod_assign.editsubmission' | translate }}</a>
+                        <!-- If no submission or is new, show add submission. -->
+                        <a ion-button block color="primary" *ngIf="!hasOffline && (!userSubmission || !userSubmission.status || userSubmission.status == statusNew)" (click)="goToEdit()">{{ 'addon.mod_assign.addsubmission' | translate }}</a>
+                        <!-- If reopened, show addfromprevious and addnewattempt. -->
+                        <ng-container *ngIf="!hasOffline && userSubmission && userSubmission.status == statusReopened">
+                            <a ion-button block color="primary" (click)="copyPrevious()">{{ 'addon.mod_assign.addnewattemptfromprevious' | translate }}</a>
+                            <a ion-button block color="primary" (click)="goToEdit()">{{ 'addon.mod_assign.addnewattempt' | translate }}</a>
+                        </ng-container>
+                        <!-- Else show editsubmission. -->
+                        <a ion-button block color="primary" *ngIf="!hasOffline && userSubmission && userSubmission.status && userSubmission.status != statusNew && userSubmission.status != statusReopened" (click)="goToEdit()">{{ 'addon.mod_assign.editsubmission' | translate }}</a>
                     </div>
+                    <div *ngIf="unsupportedEditPlugins && unsupportedEditPlugins.length && !showErrorStatementEdit">
+                        <p class="core-danger-item">{{ 'addon.mod_assign.erroreditpluginsnotsupported' | translate }}</p>
+                        <p class="core-danger-item" *ngFor="let name of unsupportedEditPlugins">{{ name }}</p>
+                    </div>
+                    <div *ngIf="showErrorStatementEdit">
+                        <p class="core-danger-item">{{ 'addon.mod_assign.cannoteditduetostatementsubmission' | translate }}</p>
+                    </div>
+                </ion-item>
 
-                    <!-- Team members that need to submit it too. -->
-                    <ion-item text-wrap *ngIf="membersToSubmit && membersToSubmit.length > 0">
-                        <h2>{{ 'addon.mod_assign.userswhoneedtosubmit' | translate }}</h2>
-                        <div *ngFor="let user of membersToSubmit">
-                            <a *ngIf="user.fullname" (click)="openUserProfile(user.id)" [title]="user.fullname">
-                                <ion-avatar item-start>
-                                    <img [src]="user.profileimageurl" core-external-content [alt]="'core.pictureof' | translate:{$a: user.fullname}" role="presentation" onError="this.src='assets/img/user-avatar.png'">
-                                </ion-avatar>
-                                <h2>{{ user.fullname }}</h2>
-                            </a>
-                            <p *ngIf="!user.fullname">
-                                {{ 'addon.mod_assign.hiddenuser' | translate }} <core-format-text [text]="user"></core-format-text>
-                            </p>
-                        </div>
+                <!-- Submit for grading form. -->
+                <div *ngIf="canSubmit">
+                    <ion-item text-wrap *ngIf="submissionStatement">
+                        <ion-label><core-format-text [text]="submissionStatement"></core-format-text></ion-label>
+                        <ion-checkbox item-end name="submissionstatement" [(ngModel)]="submitModel.submissionStatement">
+                        </ion-checkbox>
                     </ion-item>
+                    <!-- Submit button. -->
+                    <ion-item text-wrap *ngIf="!showErrorStatementSubmit">
+                        <a ion-button block (click)="submitForGrading(submitModel.submissionStatement)">{{ 'addon.mod_assign.submitassignment' | translate }}</a>
+                        <p>{{ 'addon.mod_assign.submitassignment_help' | translate }}</p>
+                    </ion-item>
+                    <!-- Error because we lack submissions statement. -->
+                    <ion-item text-wrap *ngIf="showErrorStatementSubmit">
+                        <p class="core-danger-item">{{ 'addon.mod_assign.cannotsubmitduetostatementsubmission' | translate }}</p>
+                    </ion-item>
+                </div>
 
-                    <!-- Submission is locked. -->
-                    <ion-item text-wrap *ngIf="lastAttempt && lastAttempt.locked">
-                        <h2>{{ 'addon.mod_assign.submissionslocked' | translate }}</h2>
-                    </ion-item>
+                <!-- Team members that need to submit it too. -->
+                <ion-item text-wrap *ngIf="membersToSubmit && membersToSubmit.length > 0">
+                    <h2>{{ 'addon.mod_assign.userswhoneedtosubmit' | translate }}</h2>
+                    <div *ngFor="let user of membersToSubmit">
+                        <a *ngIf="user.fullname" (click)="openUserProfile(user.id)" [title]="user.fullname">
+                            <ion-avatar item-start>
+                                <img [src]="user.profileimageurl" core-external-content [alt]="'core.pictureof' | translate:{$a: user.fullname}" role="presentation" onError="this.src='assets/img/user-avatar.png'">
+                            </ion-avatar>
+                            <h2>{{ user.fullname }}</h2>
+                        </a>
+                        <p *ngIf="!user.fullname">
+                            {{ 'addon.mod_assign.hiddenuser' | translate }} <core-format-text [text]="user"></core-format-text>
+                        </p>
+                    </div>
+                </ion-item>
 
-                    <!-- Editing status. -->
-                    <ion-item text-wrap *ngIf="lastAttempt && isSubmittedForGrading && lastAttempt.caneditowner !== undefined" [ngClass]="{submissioneditable: lastAttempt.caneditowner, submissionnoteditable: !lastAttempt.caneditowner}">
-                        <h2>{{ 'addon.mod_assign.editingstatus' | translate }}</h2>
-                        <p *ngIf="lastAttempt.caneditowner">{{ 'addon.mod_assign.submissioneditable' | translate }}</p>
-                        <p *ngIf="!lastAttempt.caneditowner">{{ 'addon.mod_assign.submissionnoteditable' | translate }}</p>
-                    </ion-item>
-                </ion-content>
+                <!-- Submission is locked. -->
+                <ion-item text-wrap *ngIf="lastAttempt && lastAttempt.locked">
+                    <h2>{{ 'addon.mod_assign.submissionslocked' | translate }}</h2>
+                </ion-item>
+
+                <!-- Editing status. -->
+                <ion-item text-wrap *ngIf="lastAttempt && isSubmittedForGrading && lastAttempt.caneditowner !== undefined" [ngClass]="{submissioneditable: lastAttempt.caneditowner, submissionnoteditable: !lastAttempt.caneditowner}">
+                    <h2>{{ 'addon.mod_assign.editingstatus' | translate }}</h2>
+                    <p *ngIf="lastAttempt.caneditowner">{{ 'addon.mod_assign.submissioneditable' | translate }}</p>
+                    <p *ngIf="!lastAttempt.caneditowner">{{ 'addon.mod_assign.submissionnoteditable' | translate }}</p>
+                </ion-item>
             </ng-template>
         </core-tab>
 
         <!-- Grade the submission tab. -->
         <core-tab [title]="'addon.mod_assign.grade' | translate" *ngIf="feedback || isGrading">
             <ng-template>
-                <ion-content>
-                    <!-- Current grade if method is advanced. -->
-                    <ion-item text-wrap *ngIf="feedback.gradefordisplay && (!isGrading || grade.method != 'simple')" class="core-grading-summary">
-                        <h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2>
-                        <p><core-format-text [text]="feedback.gradefordisplay"></core-format-text></p>
-                        <a ion-button item-end icon-only *ngIf="feedback.advancedgrade" (click)="showAdvancedGrade()">
-                            <ion-icon name="search"></ion-icon>
-                        </a>
-                    </ion-item>
+                <!-- Current grade if method is advanced. -->
+                <ion-item text-wrap *ngIf="feedback.gradefordisplay && (!isGrading || grade.method != 'simple')" class="core-grading-summary">
+                    <h2>{{ 'addon.mod_assign.currentgrade' | translate }}</h2>
+                    <p><core-format-text [text]="feedback.gradefordisplay"></core-format-text></p>
+                    <a ion-button item-end icon-only *ngIf="feedback.advancedgrade" (click)="showAdvancedGrade()">
+                        <ion-icon name="search"></ion-icon>
+                    </a>
+                </ion-item>
 
-                    <!-- Numeric grade. -->
-                    <ion-item text-wrap *ngIf="grade.method == 'simple' && !grade.scale">
-                        <ion-label stacked>{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo.grade} }}</ion-label>
-                        <ion-input type="number" [(ngModel)]="grade.grade" min="0" [max]="gradeInfo.grade" [lang]="grade.lang" core-input-errors></ion-input>
-                    </ion-item>
+                <!-- Numeric grade. -->
+                <ion-item text-wrap *ngIf="grade.method == 'simple' && !grade.scale">
+                    <ion-label stacked>{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo.grade} }}</ion-label>
+                    <ion-input type="number" [(ngModel)]="grade.grade" min="0" [max]="gradeInfo.grade" [lang]="grade.lang" core-input-errors></ion-input>
+                </ion-item>
 
-                    <!-- Grade using a scale. -->
-                    <ion-item text-wrap *ngIf="grade.method == 'simple' && grade.scale">
-                        <ion-label>{{ 'addon.mod_assign.grade' | translate }}</ion-label>
-                        <ion-select [(ngModel)]="grade.grade" interface="popover">
-                            <ion-option *ngFor="let grade of grade.scale" [value]="grade.value">{{grade.label}}</ion-option>
-                        </ion-select>
-                    </ion-item>
+                <!-- Grade using a scale. -->
+                <ion-item text-wrap *ngIf="grade.method == 'simple' && grade.scale">
+                    <ion-label>{{ 'addon.mod_assign.grade' | translate }}</ion-label>
+                    <ion-select [(ngModel)]="grade.grade" interface="popover">
+                        <ion-option *ngFor="let grade of grade.scale" [value]="grade.value">{{grade.label}}</ion-option>
+                    </ion-select>
+                </ion-item>
 
-                    <!-- Outcomes. -->
-                    <ion-item text-wrap *ngFor="let outcome of gradeInfo.outcomes">
-                        <ion-label>{{ outcome.name }}</ion-label>
-                        <ion-select *ngIf="canSaveGrades && outcome.itemNumber" [(ngModel)]="outcome.selectedId" interface="popover">
-                            <ion-option *ngFor="let grade of outcome.options" [value]="grade.value">{{grade.label}}</ion-option>
-                        </ion-select>
-                        <p item-content *ngIf="!canSaveGrades || !outcome.itemNumber">{{ outcome.selected }}</p>
-                    </ion-item>
+                <!-- Outcomes. -->
+                <ion-item text-wrap *ngFor="let outcome of gradeInfo.outcomes">
+                    <ion-label>{{ outcome.name }}</ion-label>
+                    <ion-select *ngIf="canSaveGrades && outcome.itemNumber" [(ngModel)]="outcome.selectedId" interface="popover">
+                        <ion-option *ngFor="let grade of outcome.options" [value]="grade.value">{{grade.label}}</ion-option>
+                    </ion-select>
+                    <p item-content *ngIf="!canSaveGrades || !outcome.itemNumber">{{ outcome.selected }}</p>
+                </ion-item>
 
-                    <addon-mod-assign-feedback-plugin *ngFor="let plugin of feedback.plugins" [assign]="assign" [submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades"></addon-mod-assign-feedback-plugin>
+                <addon-mod-assign-feedback-plugin *ngFor="let plugin of feedback.plugins" [assign]="assign" [submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades"></addon-mod-assign-feedback-plugin>
 
-                    <!-- Workflow status. -->
-                    <ion-item text-wrap *ngIf="workflowStatusTranslationId">
-                        <h2>{{ 'addon.mod_assign.markingworkflowstate' | translate }}</h2>
-                        <p>{{ workflowStatusTranslationId | translate }}</p>
-                    </ion-item>
+                <!-- Workflow status. -->
+                <ion-item text-wrap *ngIf="workflowStatusTranslationId">
+                    <h2>{{ 'addon.mod_assign.markingworkflowstate' | translate }}</h2>
+                    <p>{{ workflowStatusTranslationId | translate }}</p>
+                </ion-item>
 
-                    <!--- Apply grade to all team members. -->
-                    <ion-item text-wrap *ngIf="assign.teamsubmission && canSaveGrades">
-                        <h2>{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}</h2>
-                        <ion-label>{{ 'addon.mod_assign.applytoteam' | translate }}</ion-label>
-                        <ion-toggle [(ngModel)]="grade.applyToAll"></ion-toggle>
-                    </ion-item>
+                <!--- Apply grade to all team members. -->
+                <ion-item text-wrap *ngIf="assign.teamsubmission && canSaveGrades">
+                    <h2>{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}</h2>
+                    <ion-label>{{ 'addon.mod_assign.applytoteam' | translate }}</ion-label>
+                    <ion-toggle [(ngModel)]="grade.applyToAll"></ion-toggle>
+                </ion-item>
 
-                    <!-- Attempt status. -->
-                    <ion-item text-wrap *ngIf="isGrading && assign.attemptreopenmethod != attemptReopenMethodNone">
-                        <h2>{{ 'addon.mod_assign.attemptsettings' | translate }}</h2>
-                        <p *ngIf="assign.maxattempts == unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }}</p>
-                        <p *ngIf="assign.maxattempts != unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': assign.maxattempts} } }}</p>
-                        <p>{{ 'addon.mod_assign.attemptreopenmethod' | translate }}: {{ 'addon.mod_assign.attemptreopenmethod_' + assign.attemptreopenmethod | translate }}</p>
-                        <ng-container *ngIf="canSaveGrades && allowAddAttempt" >
-                            <ion-label>{{ 'addon.mod_assign.addattempt' | translate }}</ion-label>
-                            <ion-toggle [(ngModel)]="grade.addAttempt"></ion-toggle>
-                        </ng-container>
-                    </ion-item>
+                <!-- Attempt status. -->
+                <ion-item text-wrap *ngIf="isGrading && assign.attemptreopenmethod != attemptReopenMethodNone">
+                    <h2>{{ 'addon.mod_assign.attemptsettings' | translate }}</h2>
+                    <p *ngIf="assign.maxattempts == unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }}</p>
+                    <p *ngIf="assign.maxattempts != unlimitedAttempts">{{ 'addon.mod_assign.outof' | translate : {'$a': {'current': currentAttempt, 'total': assign.maxattempts} } }}</p>
+                    <p>{{ 'addon.mod_assign.attemptreopenmethod' | translate }}: {{ 'addon.mod_assign.attemptreopenmethod_' + assign.attemptreopenmethod | translate }}</p>
+                    <ng-container *ngIf="canSaveGrades && allowAddAttempt" >
+                        <ion-label>{{ 'addon.mod_assign.addattempt' | translate }}</ion-label>
+                        <ion-toggle [(ngModel)]="grade.addAttempt"></ion-toggle>
+                    </ng-container>
+                </ion-item>
 
-                    <!-- Data about the grader (teacher who graded). -->
-                    <ion-item text-wrap *ngIf="grader">
-                        <h2>{{ 'addon.mod_assign.gradedby' | translate }}</h2>
-                        <a (click)="openUserProfile(grader.id)" [title]="grader.fullname">
-                            <ion-avatar item-start>
-                                <img [src]="grader.profileimageurl" core-external-content [alt]="'core.pictureof' | translate:{$a: grader.fullname}" role="presentation" onError="this.src='assets/img/user-avatar.png'">
-                            </ion-avatar>
-                            <h2>{{ grader.fullname }}</h2>
-                            <p *ngIf="feedback.gradeddate">{{ feedback.gradeddate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
-                        </a>
-                    </ion-item>
+                <!-- Data about the grader (teacher who graded). -->
+                <ion-item text-wrap *ngIf="grader" (click)="openUserProfile(grader.id)" [title]="grader.fullname" detail-push>
+                    <ion-avatar item-start>
+                        <img [src]="grader.profileimageurl" core-external-content [alt]="'core.pictureof' | translate:{$a: grader.fullname}" role="presentation" onError="this.src='assets/img/user-avatar.png'">
+                    </ion-avatar>
+                    <h2>{{ 'addon.mod_assign.gradedby' | translate }}</h2>
+                    <h2>{{ grader.fullname }}</h2>
+                    <p *ngIf="feedback.gradeddate">{{ feedback.gradeddate * 1000 | coreFormatDate:"dfmediumdate" }}</p>
+                </ion-item>
 
-                    <!-- Warning message if cannot save grades. -->
-                    <div *ngIf="isGrading && !canSaveGrades" class="core-warning-card" icon-start>
-                        <ion-icon name="warning"></ion-icon>
-                        <p>{{ 'addon.mod_assign.cannotgradefromapp' | translate:{$a: moduleName} }}</p>
-                        <a ion-button block *ngIf="gradeUrl" [href]="gradeUrl" core-link icon-end>
-                            {{ 'core.openinbrowser' | translate }}
-                            <ion-icon name="open"></ion-icon>
-                        </a>
-                    </div>
-                </ion-content>
+                <!-- Warning message if cannot save grades. -->
+                <div *ngIf="isGrading && !canSaveGrades" class="core-warning-card" icon-start>
+                    <ion-icon name="warning"></ion-icon>
+                    <p>{{ 'addon.mod_assign.cannotgradefromapp' | translate:{$a: moduleName} }}</p>
+                    <a ion-button block *ngIf="gradeUrl" [href]="gradeUrl" core-link icon-end>
+                        {{ 'core.openinbrowser' | translate }}
+                        <ion-icon name="open"></ion-icon>
+                    </a>
+                </div>
             </ng-template>
         </core-tab>
     </core-tabs>
diff --git a/src/addon/mod/assign/feedback/comments/component/comments.html b/src/addon/mod/assign/feedback/comments/component/comments.html
index 8c68abdb8..1a0fcbcad 100644
--- a/src/addon/mod/assign/feedback/comments/component/comments.html
+++ b/src/addon/mod/assign/feedback/comments/component/comments.html
@@ -6,11 +6,11 @@
     </p>
     <div item-end>
         <div text-right>
-            <a ion-button *ngIf="canEdit" (click)="editComment()" color="light">
+            <button ion-button icon-only clear *ngIf="canEdit" (click)="editComment()" color="dark">
                 <ion-icon name="create"></ion-icon>
-            </a>
+            </button>
         </div>
-        <ion-note *ngIf="!isSent">
+        <ion-note *ngIf="!isSent" color="dark">
             <ion-icon name="clock"></ion-icon>
             {{ 'core.notsent' | translate }}
         </ion-note>
diff --git a/src/addon/mod/assign/providers/assign.ts b/src/addon/mod/assign/providers/assign.ts
index a945bc914..fbaec2622 100644
--- a/src/addon/mod/assign/providers/assign.ts
+++ b/src/addon/mod/assign/providers/assign.ts
@@ -488,7 +488,7 @@ export class AddonModAssignProvider {
             case 'nosubmission':
                 return 'danger';
             default:
-                return '';
+                return 'light';
         }
     }
 
diff --git a/src/components/file/file.scss b/src/components/file/file.scss
index 95127e438..d39844487 100644
--- a/src/components/file/file.scss
+++ b/src/components/file/file.scss
@@ -1,2 +1,11 @@
-core-file {
+.card-md core-file + core-file > .item-md.item-block > .item-inner {
+    border-top: 1px solid $list-md-border-color;
+}
+
+.card-ios core-file + core-file > .item-ios.item-block > .item-inner {
+    border-top: $hairlines-width solid $list-ios-border-color;
+}
+
+.card-wp core-file + core-file > .item-wp.item-block > .item-inner {
+    border-top: 1px solid $list-wp-border-color;
 }
\ No newline at end of file
diff --git a/src/components/local-file/local-file.html b/src/components/local-file/local-file.html
index 62eeafe76..cad6c9347 100644
--- a/src/components/local-file/local-file.html
+++ b/src/components/local-file/local-file.html
@@ -1,29 +1,28 @@
-<a ion-item text-wrap class="item-media" (click)="fileClicked($event)" detail-none>
-    <img [src]="fileIcon" alt="{{fileExtension}}" role="presentation" item-start />
+<form (ngSubmit)="changeName(newFileName, $event)">
+    <a ion-item text-wrap stacked class="item-media" [class.item-input]="editMode" (click)="fileClicked($event)" detail-none>
+        <img [src]="fileIcon" alt="{{fileExtension}}" role="presentation" item-start />
 
-    <!-- File name and edit button (if editable). -->
-    <p *ngIf="!editMode" class="core-text-with-icon-right">
-        {{fileName}}
-        <a ion-button icon-only clear *ngIf="manage" (click)="activateEdit($event)" [attr.aria-label]="'core.edit' | translate">
-            <ion-icon name="create" ios="md-create"></ion-icon>
-        </a>
-    </p>
+        <!-- File name and edit button (if editable). -->
+        <h2 *ngIf="!editMode">{{fileName}}</h2>
+        <!-- More data about the file. -->
+        <p *ngIf="size && !editMode">{{ size }}</p>
+        <p *ngIf="timemodified && !editMode">{{ timemodified }}</p>
 
-    <!-- Form to edit the file's name. -->
-    <form *ngIf="editMode" (ngSubmit)="changeName(newFileName)">
-        <ion-input type="text" name="filename" [(ngModel)]="newFileName" [placeholder]="'core.filename' | translate" autocapitalize="none" autocorrect="off" (click)="$event.stopPropagation()" [core-auto-focus]></ion-input>
-        <button type="submit" ion-button icon-only clear class="core-button-icon-small" [attr.aria-label]="'core.save' | translate">
-            <ion-icon name="checkmark"></ion-icon>
-        </button>
-    </form>
+        <!-- Form to edit the file's name. -->
+        <ion-input type="text" name="filename" [placeholder]="'core.filename' | translate" autocapitalize="none" autocorrect="off" (click)="$event.stopPropagation()" [core-auto-focus] [(ngModel)]="newFileName" *ngIf="editMode"></ion-input>
 
-    <!-- More data about the file. -->
-    <p *ngIf="size">{{ size }}</p>
-    <p *ngIf="timemodified">{{ timemodified }}</p>
+        <div class="buttons" item-end *ngIf="manage">
+            <button *ngIf="!editMode" ion-button icon-only clear (click)="activateEdit($event)" [attr.aria-label]="'core.edit' | translate" color="dark">
+                <ion-icon name="create" ios="md-create"></ion-icon>
+            </button>
 
-    <div class="buttons" item-end *ngIf="manage">
-        <button ion-button clear icon-only (click)="deleteFile($event)" [attr.aria-label]="'core.delete' | translate" color="danger">
-            <ion-icon name="trash"></ion-icon>
-        </button>
-    </div>
-</a>
+            <button *ngIf="editMode" ion-button icon-only clear [attr.aria-label]="'core.save' | translate" color="success" type="submit">
+                <ion-icon name="checkmark"></ion-icon>
+            </button>
+
+            <button ion-button clear icon-only (click)="deleteFile($event)" [attr.aria-label]="'core.delete' | translate" color="danger">
+                <ion-icon name="trash"></ion-icon>
+            </button>
+        </div>
+    </a>
+</form>
diff --git a/src/components/local-file/local-file.ts b/src/components/local-file/local-file.ts
index ac7284306..47ab54c6e 100644
--- a/src/components/local-file/local-file.ts
+++ b/src/components/local-file/local-file.ts
@@ -96,6 +96,10 @@ export class CoreLocalFileComponent implements OnInit {
      * @param {Event} e Click event.
      */
     fileClicked(e: Event): void {
+        if (this.editMode) {
+            return;
+        }
+
         e.preventDefault();
         e.stopPropagation();
 
@@ -127,8 +131,12 @@ export class CoreLocalFileComponent implements OnInit {
      * Rename the file.
      *
      * @param {string} newName New name.
+     * @param {Event}  e       Click event.
      */
-    changeName(newName: string): void {
+    changeName(newName: string, e: Event): void {
+        e.preventDefault();
+        e.stopPropagation();
+
         if (newName == this.file.name) {
             // Name hasn't changed, stop.
             this.editMode = false;