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;