feat(ui): models: Provide Job class

This commit is contained in:
Ferdinand Thiessen 2021-12-23 03:25:18 +01:00
parent 166073fb55
commit 30173ec87d
2 changed files with 57 additions and 21 deletions

View File

@ -111,7 +111,7 @@ import { notEmpty } from '@flaschengeist/api';
import { IsoDateInput } from '@flaschengeist/api/components'; import { IsoDateInput } from '@flaschengeist/api/components';
import { useEventStore } from '../../store'; import { useEventStore } from '../../store';
import { emptyEvent, emptyJob, EditableEvent } from '../../store/models'; import { emptyEvent, Job, EditableEvent } from '../../store/models';
import { date, ModifyDateOptions } from 'quasar'; import { date, ModifyDateOptions } from 'quasar';
import { computed, defineComponent, PropType, ref, onBeforeMount, watch } from 'vue'; import { computed, defineComponent, PropType, ref, onBeforeMount, watch } from 'vue';
@ -164,11 +164,11 @@ export default defineComponent({
); );
function addJob() { function addJob() {
if (!activeJob.value) event.value.jobs.push(emptyJob()); if (!activeJob.value) event.value.jobs.push(new Job());
else else
void activeJob.value.validate().then((success) => { void activeJob.value.validate().then((success) => {
if (success) { if (success) {
event.value.jobs.push(emptyJob()); event.value.jobs.push(new Job());
active.value = event.value.jobs.length - 1; active.value = event.value.jobs.length - 1;
} }
}); });

View File

@ -4,32 +4,68 @@ import { date } from 'quasar';
export type EditableEvent = Omit<Omit<Omit<FG.Event, 'jobs'>, 'type'>, 'id'> & { export type EditableEvent = Omit<Omit<Omit<FG.Event, 'jobs'>, 'type'>, 'id'> & {
type?: FG.EventType | number; type?: FG.EventType | number;
id?: number; id?: number;
jobs: EditableJob[]; jobs: Job[];
}; };
/** A new job does not have an id or type assigned */ export class Job implements FG.Job {
export type EditableJob = Omit<Omit<FG.Job, 'type'>, 'id'> & { id = NaN;
type?: FG.EventType | number; start: Date;
id?: number; end?: Date = undefined;
}; type: FG.JobType | number = NaN;
comment?: string = undefined;
locked = false;
services = [] as FG.Service[];
required_services = 0;
export function emptyJob(startDate = new Date()): EditableJob { /**
const start = date.adjustDate(startDate, { * Build Job from API Job interface
* @param iJob Object following the API Job interface
*/
constructor(iJob?: Partial<FG.Job>) {
if (!iJob || iJob.start === undefined)
this.start = date.buildDate({
hours: new Date().getHours(), hours: new Date().getHours(),
minutes: 0,
seconds: 0,
milliseconds: 0,
}); });
return { else this.start = new Date(); // <-- make TS happy "no initalizer"
if (iJob !== undefined) Object.assign(this, iJob);
}
/**
* Create Job from start Date
* @param start when does the event start?
* @param adjustTime Set hours to current value, zero minutes and seconds
* @param duration How long should the job go? Value in hours or undefined
* @returns new Job event
*/
static fromDate(start: Date, adjustTime = true, duration?: number) {
if (adjustTime)
start = date.adjustDate(start, {
hours: new Date().getHours(),
minutes: 0,
seconds: 0,
milliseconds: 0,
});
return new Job({
start: start, start: start,
end: date.addToDate(start, { hours: 1 }), end: duration === undefined ? undefined : date.addToDate(start, { hours: duration }),
services: [], });
locked: false, }
required_services: 2,
}; /**
* Check if this instance was loaded from API
*/
isPersistent() {
return !isNaN(this.id);
}
} }
export function emptyEvent(startDate: Date = new Date()): EditableEvent { export function emptyEvent(startDate: Date = new Date()): EditableEvent {
return { return {
start: date.adjustDate(startDate, { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 }), start: date.adjustDate(startDate, { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 }),
jobs: [emptyJob(startDate)], jobs: [Job.fromDate(startDate, true, 4)],
is_template: false, is_template: false,
}; };
} }