refactor: move Model classes
This commit is contained in:
parent
5267825e8f
commit
fe8cb1b693
6 changed files with 72 additions and 70 deletions
12
ui/src/assets/Model.ts
Normal file
12
ui/src/assets/Model.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
export class Model {
|
||||
public get hash(): string {
|
||||
const str = JSON.stringify(this);
|
||||
|
||||
// source: https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0?permalink_comment_id=2775538#gistcomment-2775538
|
||||
let hash = 0;
|
||||
for (let i = 0; i < str.length; i++)
|
||||
hash = Math.imul(31, hash) + str.charCodeAt(i) | 0;
|
||||
|
||||
return new Uint32Array([hash])[0].toString(36);
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@
|
|||
<script lang="ts">
|
||||
import { Component, Prop, Vue } from "vue-property-decorator";
|
||||
import Calendar from "./Calendar.vue";
|
||||
import { CalendarData, CalendarJSONData } from "./model";
|
||||
import { CalendarData, CalendarModel } from "./CalendarModel";
|
||||
|
||||
@Component({
|
||||
components: {
|
||||
|
@ -27,7 +27,7 @@ export default class CalendarCarousel extends Vue {
|
|||
@Prop({ default: 10000 })
|
||||
private readonly speed!: number;
|
||||
|
||||
private readonly data: Array<CalendarJSONData> = [
|
||||
private readonly data: Array<CalendarData> = [
|
||||
{
|
||||
title: "Lorem Ipsum",
|
||||
events: [
|
||||
|
@ -78,11 +78,11 @@ export default class CalendarCarousel extends Vue {
|
|||
},
|
||||
];
|
||||
|
||||
private get calendars(): Array<CalendarData> {
|
||||
private get calendars(): Array<CalendarModel> {
|
||||
let arr = [];
|
||||
|
||||
for (const json_data of this.data) {
|
||||
arr.push(new CalendarData(json_data));
|
||||
arr.push(new CalendarModel(json_data));
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
|
23
ui/src/components/calendar/CalendarModel.ts
Normal file
23
ui/src/components/calendar/CalendarModel.ts
Normal file
|
@ -0,0 +1,23 @@
|
|||
import { Model } from "@/assets/Model";
|
||||
import { EventData, EventModel } from "./EventModel";
|
||||
|
||||
export type CalendarData = {
|
||||
title: string;
|
||||
events: Array<EventData>;
|
||||
};
|
||||
|
||||
export class CalendarModel extends Model {
|
||||
public title: string;
|
||||
public events: Array<EventModel>;
|
||||
|
||||
public constructor(json_data: CalendarData) {
|
||||
super();
|
||||
|
||||
this.title = json_data.title
|
||||
|
||||
this.events = [];
|
||||
for (const event_data of json_data.events) {
|
||||
this.events.push(new EventModel(event_data))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -31,7 +31,7 @@
|
|||
<script lang="ts">
|
||||
import { Component, Prop, Vue } from "vue-property-decorator";
|
||||
import { DateTime, DurationLikeObject } from "luxon";
|
||||
import { EventData } from "./model";
|
||||
import { EventModel } from "./EventModel";
|
||||
import EventDate from "./EventDate.vue";
|
||||
|
||||
@Component({
|
||||
|
@ -41,7 +41,7 @@ import EventDate from "./EventDate.vue";
|
|||
})
|
||||
export default class EventItem extends Vue {
|
||||
@Prop()
|
||||
private readonly event!: EventData;
|
||||
private readonly event!: EventModel;
|
||||
|
||||
private get data_string(): string {
|
||||
const locale_string = this.event.start.toLocaleString(
|
||||
|
|
31
ui/src/components/calendar/EventModel.ts
Normal file
31
ui/src/components/calendar/EventModel.ts
Normal file
|
@ -0,0 +1,31 @@
|
|||
import { Model } from "@/assets/Model";
|
||||
import { DateTime, Duration } from "luxon";
|
||||
|
||||
export type EventData = {
|
||||
summary: string;
|
||||
description: string;
|
||||
dtstart: string;
|
||||
dtend: string;
|
||||
};
|
||||
|
||||
export class EventModel extends Model {
|
||||
public summary: string;
|
||||
public description: string;
|
||||
public start: DateTime;
|
||||
public duration: Duration;
|
||||
|
||||
public constructor(json_data: EventData) {
|
||||
super();
|
||||
|
||||
this.summary = json_data.summary;
|
||||
this.description = json_data.description;
|
||||
this.start = DateTime
|
||||
.fromISO(json_data.dtstart)
|
||||
.setLocale(navigator.language);
|
||||
const end = DateTime
|
||||
.fromISO(json_data.dtend)
|
||||
.setLocale(navigator.language);
|
||||
|
||||
this.duration = end.diff(this.start);
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
import { DateTime, Duration } from "luxon";
|
||||
|
||||
class Hashable {
|
||||
public get hash(): string {
|
||||
const str = JSON.stringify(this);
|
||||
|
||||
// source: https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0?permalink_comment_id=2775538#gistcomment-2775538
|
||||
let hash = 0;
|
||||
for (let i = 0; i < str.length; i++)
|
||||
hash = Math.imul(31, hash) + str.charCodeAt(i) | 0;
|
||||
|
||||
return new Uint32Array([hash])[0].toString(36);
|
||||
}
|
||||
}
|
||||
|
||||
export type EventJSONData = {
|
||||
summary: string;
|
||||
description: string;
|
||||
dtstart: string;
|
||||
dtend: string;
|
||||
};
|
||||
|
||||
export class EventData extends Hashable {
|
||||
public summary: string;
|
||||
public description: string;
|
||||
public start: DateTime;
|
||||
public duration: Duration;
|
||||
|
||||
public constructor(json_data: EventJSONData) {
|
||||
super();
|
||||
|
||||
this.summary = json_data.summary;
|
||||
this.description = json_data.description;
|
||||
this.start = DateTime
|
||||
.fromISO(json_data.dtstart)
|
||||
.setLocale(navigator.language);
|
||||
const end = DateTime
|
||||
.fromISO(json_data.dtend)
|
||||
.setLocale(navigator.language);
|
||||
|
||||
this.duration = end.diff(this.start);
|
||||
}
|
||||
}
|
||||
|
||||
export type CalendarJSONData = {
|
||||
title: string;
|
||||
events: Array<EventJSONData>;
|
||||
};
|
||||
|
||||
export class CalendarData extends Hashable {
|
||||
public title: string;
|
||||
public events: Array<EventData>;
|
||||
|
||||
public constructor(json_data: CalendarJSONData) {
|
||||
super();
|
||||
|
||||
this.title = json_data.title
|
||||
|
||||
this.events = [];
|
||||
for (const event_data of json_data.events) {
|
||||
this.events.push(new EventData(event_data))
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue