2023-11-20 11:33:26 +01:00

167 lines
10 KiB
HTML

<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<ion-back-button [text]="'core.back' | translate"></ion-back-button>
</ion-buttons>
<ion-title>
<h1>
<core-format-text [text]="title" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
</core-format-text>
</h1>
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content class="limited-width">
<core-loading [hideUntil]="feedbackLoaded" class="has-spacer">
<ng-container *ngIf="items && items.length">
<ion-list class="ion-no-margin has-spacer">
<ion-item class="ion-text-wrap">
<ion-label>
<p class="item-heading">{{ 'addon.mod_feedback.mode' | translate }}</p>
<p *ngIf="access!.isanonymous">{{ 'addon.mod_feedback.anonymous' | translate }}</p>
<p *ngIf="!access!.isanonymous">{{ 'addon.mod_feedback.non_anonymous' | translate }}</p>
</ion-label>
</ion-item>
<ng-container *ngFor="let item of items">
<core-spacer *ngIf="item.typ === 'pagebreak'"></core-spacer>
<ng-container *ngIf="item.typ !== 'pagebreak'">
<ion-item class="ion-text-wrap addon-mod_feedback-item" [color]="item.dependitem > 0 ? 'light' : ''"
[class.core-danger-item]="item.isEmpty || item.hasError">
<ion-label [position]="item.hasTextInput ? 'stacked' : undefined">
<p *ngIf="item.name" [core-mark-required]="item.required">
<span *ngIf="feedback!.autonumbering && item.itemnumber">{{item.itemnumber}}. </span>
<core-format-text [component]="component" [componentId]="cmId" [text]="item.name" contextLevel="module"
[contextInstanceId]="cmId" [courseId]="courseId" [wsNotFiltered]="true">
</core-format-text>
<span *ngIf="item.postfix" class="addon-mod_feedback-postfix">{{item.postfix}}</span>
</p>
<p *ngIf="item.templateName === 'label'">
<core-format-text [component]="component" [componentId]="cmId" [text]="item.presentation"
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
</core-format-text>
</p>
</ion-label>
<ion-input *ngIf="item.templateName === 'textfield'" type="text" [(ngModel)]="item.value" autocorrect="off"
name="{{item.typ}}_{{item.id}}" maxlength="{{item.length}}" [required]="item.required">
</ion-input>
<ng-container *ngIf="item.templateName === 'numeric'">
<ion-input type="number" [(ngModel)]="item.value" name="{{item.typ}}_{{item.id}}"
[required]="item.required">
</ion-input>
<ion-text *ngIf="item.hasError" color="danger" class="addon-mod_feedback-item-error">
{{ 'addon.mod_feedback.numberoutofrange' | translate }} [{{item.rangefrom}}
<span *ngIf="item.rangefrom && item.rangeto">, </span>{{item.rangeto}}]
</ion-text>
</ng-container>
<ion-textarea *ngIf="item.templateName === 'textarea'" [required]="item.required" name="{{item.typ}}_{{item.id}}"
[(ngModel)]="item.value">
</ion-textarea>
<ion-select *ngIf="item.templateName === 'multichoice-d'" [required]="item.required"
name="{{item.typ}}_{{item.id}}" [(ngModel)]="item.value" interface="action-sheet"
[cancelText]="'core.cancel' | translate" [interfaceOptions]="{header: item.name}">
<ion-select-option *ngFor="let option of item.choices" [value]="option.value">
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
</core-format-text>
</ion-select-option>
</ion-select>
</ion-item>
<ion-radio-group *ngIf="item.templateName === 'multichoice-r'" [(ngModel)]="item.value" [required]="item.required"
name="{{item.typ}}_{{item.id}}">
<ion-item *ngFor="let option of item.choices">
<ion-label>
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
</core-format-text>
</ion-label>
<ion-radio slot="start" [value]="option.value"></ion-radio>
</ion-item>
</ion-radio-group>
<ng-container *ngIf="item.templateName === 'multichoice-c'">
<ion-item *ngFor="let option of item.choices">
<ion-label>
<core-format-text [component]="component" [componentId]="cmId" [text]="option.label"
contextLevel="module" [contextInstanceId]="cmId" [wsNotFiltered]="true" [courseId]="courseId">
</core-format-text>
</ion-label>
<ion-checkbox [required]="item.required" name="{{item.typ}}_{{item.id}}" [(ngModel)]="option.checked"
value="option.value">
</ion-checkbox>
</ion-item>
</ng-container>
<ng-container *ngIf="item.templateName === 'captcha'">
<core-recaptcha *ngIf="!preview && !offline" [publicKey]="item.captcha.recaptchapublickey" [model]="item"
modelValueName="value">
</core-recaptcha>
<div *ngIf="!preview && (!item.captcha || offline)" class="core-warning-card">
<ion-item>
<ion-icon name="fas-triangle-exclamation" slot="start" aria-hidden="true"></ion-icon>
<ion-label>{{ 'addon.mod_feedback.captchaofflinewarning' | translate }}</ion-label>
</ion-item>
</div>
</ng-container>
</ng-container>
</ng-container>
<ion-row class="ion-align-items-center spacer-top" *ngIf="!preview">
<ion-col *ngIf="hasPrevPage">
<ion-button expand="block" fill="outline" (click)="gotoPage(true)" class="ion-text-wrap">
<ion-icon name="fas-chevron-left" slot="start" aria-hidden="true"></ion-icon>
{{ 'core.previous' | translate }}
</ion-button>
</ion-col>
<ion-col *ngIf="hasNextPage">
<ion-button expand="block" (click)="gotoPage(false)" class="ion-text-wrap">
{{ 'core.next' | translate }}
<ion-icon name="fas-chevron-right" slot="end" aria-hidden="true"></ion-icon>
</ion-button>
</ion-col>
<ion-col *ngIf="!hasNextPage">
<ion-button expand="block" (click)="gotoPage(false)" class="ion-text-wrap">
{{ 'core.submit' | translate }}
</ion-button>
</ion-col>
</ion-row>
</ion-list>
</ng-container>
<ion-card class="core-success-card" *ngIf="completed">
<ion-item class="ion-text-wrap">
<ion-icon name="fas-check" slot="start" aria-hidden="true"></ion-icon>
<ion-label>
<p *ngIf="!completionPageContents && !completedOffline">
{{ 'addon.mod_feedback.this_feedback_is_already_submitted' | translate }}
</p>
<p *ngIf="!completionPageContents && completedOffline">
{{ 'addon.mod_feedback.feedback_submitted_offline' | translate }}
</p>
<core-format-text *ngIf="completionPageContents" [component]="component" componentId="componentId"
[text]="completionPageContents" contextLevel="module" [contextInstanceId]="cmId" [courseId]="courseId">
</core-format-text>
</ion-label>
</ion-item>
</ion-card>
<div collapsible-footer *ngIf="feedbackLoaded && completed" slot="fixed" appearOnBottom>
<div class="list-item-limited-width adaptable-buttons-row">
<ion-button expand="block" fill="outline" (click)="showAnalysis()" class="ion-text-wrap ion-margin"
*ngIf="access!.canviewanalysis">
<ion-icon name="fas-chart-bar" slot="start" aria-hidden="true"></ion-icon>
{{ 'addon.mod_feedback.completed_feedbacks' | translate }}
</ion-button>
<ion-button expand="block" (click)="continue()" class="ion-text-wrap ion-margin">
<ng-container *ngIf="!siteAfterSubmit">{{ 'core.continue' | translate }}</ng-container>
<ng-container *ngIf="siteAfterSubmit">{{ 'core.course.nextactivity' | translate }}</ng-container>
</ion-button>
</div>
</div>
</core-loading>
</ion-content>