forked from EVOgeek/Vmeda.Online
Offline events can now be deleted in the event page, this Discard option is redundant and causes some navigation problems
245 lines
13 KiB
HTML
245 lines
13 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>{{ title | translate }}</h1>
|
|
</ion-title>
|
|
</ion-toolbar>
|
|
</ion-header>
|
|
<ion-content>
|
|
<ion-refresher slot="fixed" [disabled]="!loaded" (ionRefresh)="refreshData($event.target)">
|
|
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
|
|
</ion-refresher>
|
|
|
|
<core-loading [hideUntil]="loaded">
|
|
<form [formGroup]="form" *ngIf="!error" #editEventForm>
|
|
<!-- Event name. -->
|
|
<ion-item class="ion-text-wrap">
|
|
<ion-label position="stacked">
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventname' | translate }}</p>
|
|
</ion-label>
|
|
<ion-input type="text" name="name" [placeholder]="'addon.calendar.eventname' | translate" formControlName="name">
|
|
</ion-input>
|
|
<core-input-errors [control]="form.controls.name" [errorMessages]="errors"></core-input-errors>
|
|
</ion-item>
|
|
|
|
<!-- Date. -->
|
|
<ion-item class="ion-text-wrap">
|
|
<ion-label position="stacked">
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'core.date' | translate }}</p>
|
|
</ion-label>
|
|
<ion-datetime formControlName="timestart" [placeholder]="'core.date' | translate" [displayFormat]="dateFormat"
|
|
[max]="maxDate" [min]="minDate" [displayTimezone]="displayTimezone">
|
|
</ion-datetime>
|
|
<core-input-errors [control]="form.controls.timestart" [errorMessages]="errors"></core-input-errors>
|
|
</ion-item>
|
|
|
|
<!-- Type. -->
|
|
<ion-item class="ion-text-wrap addon-calendar-eventtype-container">
|
|
<ion-label>
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'addon.calendar.eventkind' | translate }}</p>
|
|
</ion-label>
|
|
<p *ngIf="eventTypes.length == 1" slot="end">{{eventTypes[0].name | translate }}</p>
|
|
<ion-select *ngIf="eventTypes.length > 1" formControlName="eventtype" interface="action-sheet"
|
|
[interfaceOptions]="{header: 'addon.calendar.eventkind' | translate}">
|
|
<ion-select-option *ngFor="let type of eventTypes" [value]="type.value">
|
|
{{ type.name | translate }}
|
|
</ion-select-option>
|
|
</ion-select>
|
|
</ion-item>
|
|
|
|
<!-- Category. -->
|
|
<ion-item class="ion-text-wrap" *ngIf="typeControl.value == 'category'">
|
|
<ion-label>
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'core.category' | translate }}</p>
|
|
</ion-label>
|
|
<ion-select formControlName="categoryid" interface="action-sheet" [placeholder]="'core.noselection' | translate"
|
|
[interfaceOptions]="{header: 'core.category' | translate}">
|
|
<ion-select-option *ngFor="let category of categories" [value]="category.id">
|
|
{{ category.name }}
|
|
</ion-select-option>
|
|
</ion-select>
|
|
</ion-item>
|
|
|
|
<!-- Course. -->
|
|
<ion-item class="ion-text-wrap" *ngIf="typeControl.value == 'course'">
|
|
<ion-label>
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p>
|
|
</ion-label>
|
|
<ion-select formControlName="courseid" interface="action-sheet" [placeholder]="'core.noselection' | translate"
|
|
[interfaceOptions]="{header: 'core.course' | translate}">
|
|
<ion-select-option *ngFor="let course of courses" [value]="course.id">{{ course.fullname }}</ion-select-option>
|
|
</ion-select>
|
|
</ion-item>
|
|
|
|
<!-- Group. -->
|
|
<ng-container *ngIf="typeControl.value == 'group'">
|
|
<!-- Select the course. -->
|
|
<ion-item class="ion-text-wrap">
|
|
<ion-label>
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'core.course' | translate }}</p>
|
|
</ion-label>
|
|
<ion-select formControlName="groupcourseid" interface="action-sheet" [placeholder]="'core.noselection' | translate"
|
|
(ionChange)="groupCourseSelected()" [interfaceOptions]="{header: 'core.course' | translate}">
|
|
<ion-select-option *ngFor="let course of courses" [value]="course.id">
|
|
{{ course.fullname }}
|
|
</ion-select-option>
|
|
</ion-select>
|
|
</ion-item>
|
|
<!-- The course has no groups. -->
|
|
<ion-item class="ion-text-wrap core-danger-item" *ngIf="!loadingGroups && courseGroupSet && !groups.length">
|
|
<ion-label>
|
|
<p>{{ 'core.coursenogroups' | translate }}</p>
|
|
</ion-label>
|
|
</ion-item>
|
|
<!-- Select the group. -->
|
|
<ion-item class="ion-text-wrap core-edit-set-group" *ngIf="!loadingGroups && groups.length > 0">
|
|
<ion-label>
|
|
<p class="item-heading" [core-mark-required]="true">{{ 'core.group' | translate }}</p>
|
|
</ion-label>
|
|
<ion-select formControlName="groupid" interface="action-sheet" [placeholder]="'core.noselection' | translate"
|
|
[interfaceOptions]="{header: 'core.group' | translate}">
|
|
<ion-select-option *ngFor="let group of groups" [value]="group.id">{{ group.name }}</ion-select-option>
|
|
</ion-select>
|
|
</ion-item>
|
|
<!-- Loading groups. -->
|
|
<ion-item class="ion-text-wrap" *ngIf="loadingGroups">
|
|
<ion-label>
|
|
<ion-spinner *ngIf="loadingGroups" [attr.aria-label]="'core.loading' | translate"></ion-spinner>
|
|
</ion-label>
|
|
</ion-item>
|
|
</ng-container>
|
|
|
|
<!-- Reminders. Right now, only allow adding them here for new events. -->
|
|
<ng-container *ngIf="remindersEnabled && !eventId">
|
|
<ion-item-divider class="addon-calendar-reminders-title">
|
|
<ion-label>
|
|
<p class="item-heading">{{ 'addon.calendar.reminders' | translate }}</p>
|
|
</ion-label>
|
|
<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>
|
|
</ion-item-divider>
|
|
<ion-item *ngFor="let reminder of reminders" class="ion-text-wrap">
|
|
<ion-label>
|
|
<p>{{ reminder.label }}</p>
|
|
</ion-label>
|
|
<ion-button fill="clear" (click)="removeReminder(reminder)" [attr.aria-label]="'core.delete' | translate" slot="end">
|
|
<ion-icon name="fas-trash" color="danger" slot="icon-only" aria-hidden="true"></ion-icon>
|
|
</ion-button>
|
|
</ion-item>
|
|
</ng-container>
|
|
|
|
<!-- Duration. -->
|
|
<div class="ion-text-wrap addon-calendar-radio-container">
|
|
<ion-radio-group formControlName="duration">
|
|
<ion-item-divider class="addon-calendar-radio-title">
|
|
<ion-label>
|
|
<p class="item-heading">{{ 'addon.calendar.eventduration' | translate }}</p>
|
|
</ion-label>
|
|
</ion-item-divider>
|
|
<ion-item>
|
|
<ion-label>
|
|
<p>{{ 'addon.calendar.durationnone' | translate }}</p>
|
|
</ion-label>
|
|
<ion-radio slot="end" [value]="0"></ion-radio>
|
|
</ion-item>
|
|
<ion-item>
|
|
<ion-label>
|
|
<p>{{ 'addon.calendar.durationuntil' | translate }}</p>
|
|
</ion-label>
|
|
<ion-radio slot="end" [value]="1"></ion-radio>
|
|
</ion-item>
|
|
<ion-item *ngIf="form.controls.duration.value === 1">
|
|
<ion-label position="stacked"></ion-label>
|
|
<ion-datetime formControlName="timedurationuntil" [max]="maxDate" [min]="minDate"
|
|
[placeholder]="'addon.calendar.durationuntil' | translate" [displayFormat]="dateFormat"
|
|
[displayTimezone]="displayTimezone">
|
|
</ion-datetime>
|
|
</ion-item>
|
|
<ion-item>
|
|
<ion-label>
|
|
<p>{{ 'addon.calendar.durationminutes' | translate }}</p>
|
|
</ion-label>
|
|
<ion-radio slot="end" [value]="2"></ion-radio>
|
|
</ion-item>
|
|
<ion-item *ngIf="form.controls.duration.value === 2">
|
|
<ion-label class="sr-only">{{ 'addon.calendar.durationminutes' | translate }}</ion-label>
|
|
<ion-input type="number" name="timedurationminutes" slot="end"
|
|
[placeholder]="'addon.calendar.durationminutes' | translate" formControlName="timedurationminutes"></ion-input>
|
|
</ion-item>
|
|
</ion-radio-group>
|
|
</div>
|
|
|
|
<!-- Repeat (for new events). -->
|
|
<ng-container *ngIf="!eventId || eventId < 0">
|
|
<ion-item class="ion-text-wrap divider">
|
|
<ion-label>
|
|
<p class="item-heading">{{ 'addon.calendar.repeatevent' | translate }}</p>
|
|
</ion-label>
|
|
<ion-checkbox slot="end" formControlName="repeat"></ion-checkbox>
|
|
</ion-item>
|
|
<ion-item class="ion-text-wrap">
|
|
<ion-label position="stacked">
|
|
<p class="item-heading">{{ 'addon.calendar.repeatweeksl' | translate }}</p>
|
|
</ion-label>
|
|
<ion-input type="number" name="repeats" formControlName="repeats" [disabled]="!form.controls.repeat.value">
|
|
</ion-input>
|
|
</ion-item>
|
|
</ng-container>
|
|
|
|
<!-- Apply to all events or just this one (editing repeated events). -->
|
|
<div *ngIf="eventRepeatId" class="ion-text-wrap addon-calendar-radio-container">
|
|
<ion-radio-group formControlName="repeateditall">
|
|
<ion-item-divider class="addon-calendar-radio-title">
|
|
<ion-label>
|
|
<p class="item-heading">{{ 'addon.calendar.repeatedevents' | translate }}</p>
|
|
</ion-label>
|
|
</ion-item-divider>
|
|
<ion-item>
|
|
<ion-label>
|
|
<p>{{ 'addon.calendar.repeateditall' | translate:{$a: otherEventsCount} }}</p>
|
|
</ion-label>
|
|
<ion-radio slot="end" value="1"></ion-radio>
|
|
</ion-item>
|
|
<ion-item>
|
|
<ion-label>
|
|
<p>{{ 'addon.calendar.repeateditthis' | translate }}</p>
|
|
</ion-label>
|
|
<ion-radio slot="end" value="0"></ion-radio>
|
|
</ion-item>
|
|
</ion-radio-group>
|
|
</div>
|
|
|
|
<!-- Description. -->
|
|
<ion-item class="ion-text-wrap">
|
|
<ion-label position="stacked">
|
|
<p class="item-heading">{{ 'core.description' | translate }}</p>
|
|
</ion-label>
|
|
<core-rich-text-editor [control]="descriptionControl" [attr.aria-label]="'core.description' | translate"
|
|
[placeholder]="'core.description' | translate" name="description" [component]="component" [componentId]="eventId"
|
|
[autoSave]="false"></core-rich-text-editor>
|
|
</ion-item>
|
|
|
|
<!-- Location. -->
|
|
<ion-item class="ion-text-wrap">
|
|
<ion-label position="stacked">
|
|
<p class="item-heading">{{ 'core.location' | translate }}</p>
|
|
</ion-label>
|
|
<ion-input type="text" name="location" [placeholder]="'core.location' | translate" formControlName="location">
|
|
</ion-input>
|
|
</ion-item>
|
|
</form>
|
|
<div collapsible-footer appearOnBottom *ngIf="loaded && !error" slot="fixed">
|
|
<div class="list-item-limited-width adaptable-buttons-row">
|
|
<ion-button expand="block" (click)="submit()" [disabled]="!form.valid" type="submit" class="ion-margin ion-text-wrap">
|
|
{{ 'core.save' | translate }}
|
|
</ion-button>
|
|
</div>
|
|
</div>
|
|
</core-loading>
|
|
</ion-content>
|