diff --git a/public/js/apps/Cis/Cis.js b/public/js/apps/Cis/Cis.js index d4f846f25..6e67ea607 100644 --- a/public/js/apps/Cis/Cis.js +++ b/public/js/apps/Cis/Cis.js @@ -22,6 +22,7 @@ import OtherLvPlan from "../../components/Cis/LvPlan/OtherLvPlan.js"; import ApiRouteInfo from '../../api/factory/routeinfo.js'; import {capitalize} from "../../helpers/StringHelpers.js"; +import { getTodayISO, toDateTime } from "../../helpers/DateHelpers.js"; const ciPath = FHC_JS_DATA_STORAGE_OBJECT.app_root.replace(/(https:|)(^|\/\/)(.*?\/)/g, '') + FHC_JS_DATA_STORAGE_OBJECT.ci_router; const isMobile = window.matchMedia("(max-width: 767px)").matches; @@ -88,7 +89,7 @@ const router = VueRouter.createRouter({ params: { // in this case always populate other params since they are not optional ort_kurzbz: to.params.ort_kurzbz, mode: isMobile ? DEFAULT_MODE_RAUMINFO_MOBILE : DEFAULT_MODE_RAUMINFO_DESKTOP, - focus_date: new Date().toISOString().split("T")[0] + focus_date: getTodayISO() }, }; }, @@ -107,8 +108,7 @@ const router = VueRouter.createRouter({ : (isMobile ? DEFAULT_MODE_RAUMINFO_MOBILE : DEFAULT_MODE_RAUMINFO_DESKTOP); // default to today date if not provided - const d = new Date(route.params.focus_date) - const focus_date = !isNaN(d) ? route.params.focus_date : new Date().toISOString().split("T")[0]; + const focus_date = toDateTime(route.params.focus_date) ? route.params.focus_date : getTodayISO(); // for consistency reasons format the props into one object but actually use a new name to we dont collide with // existing viewData declaration written from codeigniter 3 into routerview tag @@ -127,7 +127,7 @@ const router = VueRouter.createRouter({ name: "RoomInformation", params: { mode: to.params.mode || DEFAULT_MODE_RAUMINFO, - focus_date: to.params.focus_date || new Date().toISOString().split("T")[0], + focus_date: to.params.focus_date || getTodayISO(), ort_kurzbz: route.params.ort_kurzbz } }); diff --git a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js index b3bbeb1a2..23f4ab761 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeMitarbeiterDetail.js @@ -2,7 +2,7 @@ import BsModal from '../../Bootstrap/Modal.js'; import VueDatePicker from '../../vueDatepicker.js.php'; import ApiAbgabe from '../../../api/factory/abgabe.js' import { getDateStyleClass } from "./getDateStyleClass.js"; -import {compareISODateValues, formatDateTime, formatISODate, getViennaTodayISO} from "./dateUtils.js"; +import { compareISODateValues, formatDate, formatDateTime, getTodayISO } from "../../../helpers/DateHelpers.js"; export const AbgabeMitarbeiterDetail = { @@ -174,7 +174,7 @@ export const AbgabeMitarbeiterDetail = { 'fixtermin': false, 'invertedFixtermin': true, 'kurzbz': '', // todo kurzbz textfield value vorschlag für qualgates - 'datum': getViennaTodayISO(), + 'datum': getTodayISO(), 'note': this.allowedNotenOptions.find(opt => opt.note == 9), 'beurteilungsnotiz': '', 'upload_allowed': false, @@ -351,9 +351,7 @@ export const AbgabeMitarbeiterDetail = { } } }, - formatDate(dateParam) { - return formatISODate(dateParam) - }, + formatDate, openCreateNewAbgabeModal() { if(this.projektarbeit?.betreuerart_kurzbz == 'Zweitbegutachter') { // maybe alert that this is not allowed or smth @@ -370,7 +368,7 @@ export const AbgabeMitarbeiterDetail = { 'fixtermin': false, 'invertedFixtermin': true, 'kurzbz': '', - 'datum': getViennaTodayISO(), + 'datum': getTodayISO(), 'note': this.allowedNotenOptions.find(opt => opt.note == 9), 'beurteilungsnotiz': '', 'upload_allowed': typ.upload_allowed_default, @@ -404,7 +402,7 @@ export const AbgabeMitarbeiterDetail = { 'fixtermin': false, 'invertedFixtermin': true, 'kurzbz': '', - 'datum': getViennaTodayISO(), + 'datum': getTodayISO(), 'note': this.allowedNotenOptions.find(opt => opt.note == 9), 'beurteilungsnotiz': '', 'upload_allowed': false, @@ -603,7 +601,7 @@ export const AbgabeMitarbeiterDetail = { 'fixtermin': false, 'invertedFixtermin': true, 'kurzbz': '', - 'datum': getViennaTodayISO(), + 'datum': getTodayISO(), 'note': this.allowedNotenOptions.find(opt => opt.note == 9), 'beurteilungsnotiz': '', 'upload_allowed': typ.upload_allowed_default, diff --git a/public/js/components/Cis/Abgabetool/AbgabeStudentDetail.js b/public/js/components/Cis/Abgabetool/AbgabeStudentDetail.js index 80750babc..6bc447b9f 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeStudentDetail.js +++ b/public/js/components/Cis/Abgabetool/AbgabeStudentDetail.js @@ -3,7 +3,7 @@ import BsModal from '../../Bootstrap/Modal.js'; import VueDatePicker from '../../vueDatepicker.js.php'; import ApiAbgabe from '../../../api/factory/abgabe.js' import FhcOverlay from "../../Overlay/FhcOverlay.js"; -import { formatISODate, getViennaTodayISO } from "./dateUtils.js"; +import { formatDate, getTodayISO } from "../../../helpers/DateHelpers.js"; import { validateThesisTitle } from './titleValidation.js' @@ -248,9 +248,7 @@ export const AbgabeStudentDetail = { window.open(FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + url) }, - formatDate(dateParam) { - return formatISODate(dateParam) - }, + formatDate, async upload(termin) { if (! await this.validate(termin)) @@ -286,7 +284,7 @@ export const AbgabeStudentDetail = { if(res.meta.status == "success") { this.$fhcAlert.alertSuccess(this.$capitalize(this.$p.t('abgabetool/c4fileUploadSuccessv3'))) - termin.abgabedatum = getViennaTodayISO(); + termin.abgabedatum = getTodayISO(); if(res?.data?.signatur !== undefined) { termin.signatur = res.data.signatur } diff --git a/public/js/components/Cis/Abgabetool/AbgabeStudentTimeline.js b/public/js/components/Cis/Abgabetool/AbgabeStudentTimeline.js index 7b2986637..ad0e9f824 100644 --- a/public/js/components/Cis/Abgabetool/AbgabeStudentTimeline.js +++ b/public/js/components/Cis/Abgabetool/AbgabeStudentTimeline.js @@ -1,5 +1,5 @@ import AbgabeterminStatusLegende from "./StatusLegende.js"; -import {formatDateTime} from "./dateUtils.js"; +import { formatDateTime } from "../../../helpers/DateHelpers.js"; export const AbgabeStudentTimeline = { name: "AbgabeStudentTimeline", diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js b/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js index 3d8fc1d79..ab9c78432 100644 --- a/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js +++ b/public/js/components/Cis/Abgabetool/AbgabetoolAssistenz.js @@ -11,7 +11,7 @@ import AbgabeStudentTimeline from "./AbgabeStudentTimeline.js"; import { splitMailsHelper } from "../../../helpers/EmailHelpers.js" import { getDateStyleClass} from "./getDateStyleClass.js"; import { dateFilter } from '../../../tabulator/filters/DatesManual.js'; -import { compareISODateValues, formatISODate, getViennaTodayISO, toViennaDate } from "./dateUtils.js"; +import { compareISODateValues, formatDate, getNow, getTodayISO, toDateTime } from "../../../helpers/DateHelpers.js"; export const AbgabetoolAssistenz = { name: "AbgabetoolAssistenz", @@ -114,7 +114,7 @@ export const AbgabetoolAssistenz = { fixtermin: false, }, serienTermin: Vue.reactive({ - datum: getViennaTodayISO(), + datum: getTodayISO(), bezeichnung: { paabgabetyp_kurzbz: 'zwischen', bezeichnung: 'Zwischenabgabe' @@ -643,7 +643,7 @@ export const AbgabetoolAssistenz = { upload_allowed: false, fixtermin: false, } - this.serienEdit.datum = getViennaTodayISO() + this.serienEdit.datum = getTodayISO() this.serienEdit.bezeichnung = this.abgabeTypeOptions.find(opt => opt.paabgabetyp_kurzbz === 'zwischen') this.serienEdit.kurzbz = '' this.serienEdit.upload_allowed = false @@ -1091,23 +1091,9 @@ export const AbgabetoolAssistenz = { return false; } - const toLuxon = (val) => { - if (!val) return null; - let dt; - if (val instanceof Date) { - dt = luxon.DateTime.fromJSDate(val); - } else if (typeof val === "string") { - dt = toViennaDate(val); - } else { // fallback - dt = luxon.DateTime.fromMillis(Number(val)); - } - - return dt.isValid ? dt : null; - }; - - const rowDate = toLuxon(rowVal); - const von = toLuxon(filterVal[0]); - const bis = toLuxon(filterVal[1]); + const rowDate = toDateTime(rowVal); + const von = toDateTime(filterVal[0]); + const bis = toDateTime(filterVal[1]); // specific day if (von && !bis) { @@ -1128,22 +1114,8 @@ export const AbgabetoolAssistenz = { const rowDate = rowVal.luxonDate; - const toLuxon = (val) => { - if (!val) return null; - let dt; - if (val instanceof Date) { - dt = luxon.DateTime.fromJSDate(val); - } else if (typeof val === "string") { - dt = toViennaDate(val); - } else { // fallback - dt = luxon.DateTime.fromMillis(Number(val)); - } - - return dt.isValid ? dt : null; - }; - - const von = toLuxon(filterVal[0]); - const bis = toLuxon(filterVal[1]); + const von = toDateTime(filterVal[0]); + const bis = toDateTime(filterVal[1]); // specific day if (von && !bis) { @@ -1372,7 +1344,7 @@ export const AbgabetoolAssistenz = { }, checkAbgabetermineProjektarbeit(projekt) { - const now = luxon.DateTime.now() + const now = getNow() // calculate Abgabetermin time diff to now and assign last and next to projekt projekt.abgabetermine.forEach(termin => { @@ -1387,7 +1359,7 @@ export const AbgabetoolAssistenz = { // while already looping through each termin, calculate datestyle beforehand termin.dateStyle = getDateStyleClass(termin, this.notenOptions) - const date = toViennaDate(termin.datum).endOf('day') + const date = toDateTime(termin.datum).endOf('day') termin.luxonDate = date termin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past @@ -1654,9 +1626,7 @@ export const AbgabetoolAssistenz = { getNotenFilterOptionLabel(option) { return option.bezeichnung }, - formatDate(dateParam) { - return formatISODate(dateParam); - }, + formatDate, formAction(cell) { const actionButtons = document.createElement('div'); actionButtons.className = "d-flex gap-3"; @@ -1851,9 +1821,7 @@ export const AbgabetoolAssistenz = { return str }, isPastDate(date) { - const deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day'); - const nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna'); - return nowInVienna > deadline; + return getNow() > toDateTime(date).endOf("day"); }, setDetailComponent(details){ const pa = this.projektarbeiten.find(projektarbeit => projektarbeit.projektarbeit_id == details.projektarbeit_id) diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js b/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js index b13010cad..86c5daed8 100644 --- a/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js +++ b/public/js/components/Cis/Abgabetool/AbgabetoolMitarbeiter.js @@ -7,7 +7,7 @@ import FhcOverlay from "../../Overlay/FhcOverlay.js"; import { getDateStyleClass } from "./getDateStyleClass.js"; import { dateFilter } from '../../../tabulator/filters/DatesManual.js'; import {splitMailsHelper} from "../../../helpers/EmailHelpers.js"; -import { formatISODate, getViennaTodayISO, toViennaDate } from "./dateUtils.js"; +import { formatDate, getNow, getTodayISO, toDateTime } from "../../../helpers/DateHelpers.js"; export const AbgabetoolMitarbeiter = { name: "AbgabetoolMitarbeiter", @@ -54,7 +54,7 @@ export const AbgabetoolMitarbeiter = { allowedNotenOptions: null, notenOptionsNonFinal: null, serienTermin: Vue.reactive({ - datum: getViennaTodayISO(), + datum: getTodayISO(), bezeichnung: { paabgabetyp_kurzbz: 'zwischen', bezeichnung: 'Zwischenabgabe' @@ -668,22 +668,8 @@ export const AbgabetoolMitarbeiter = { const rowDate = rowVal.luxonDate; - const toLuxon = (val) => { - if (!val) return null; - let dt; - if (val instanceof Date) { - dt = luxon.DateTime.fromJSDate(val); - } else if (typeof val === "string") { - dt = toViennaDate(val); - } else { // fallback - dt = luxon.DateTime.fromMillis(Number(val)); - } - - return dt.isValid ? dt : null; - }; - - const von = toLuxon(filterVal[0]); - const bis = toLuxon(filterVal[1]); + const von = toDateTime(filterVal[0]); + const bis = toDateTime(filterVal[1]); // specific day if (von && !bis) { @@ -899,14 +885,14 @@ export const AbgabetoolMitarbeiter = { } }, checkAbgabetermineProjektarbeit(projekt) { - const now = luxon.DateTime.now() + const now = getNow() // calculate Abgabetermin time diff to now and assign last and next to projekt projekt.abgabetermine.forEach(termin => { // while already looping through each termin, calculate datestyle beforehand termin.dateStyle = getDateStyleClass(termin, this.notenOptions) - const date = toViennaDate(termin.datum).endOf('day') + const date = toDateTime(termin.datum).endOf('day') termin.luxonDate = date termin.diffMs = date.toMillis() - now.toMillis(); // positive = future, negative = past @@ -1017,9 +1003,7 @@ export const AbgabetoolMitarbeiter = { getOptionLabelAbgabetyp(option){ return this.$p.t('abgabetool/c4paatyp' + option.paabgabetyp_kurzbz) }, - formatDate(dateParam) { - return formatISODate(dateParam); - }, + formatDate, undoSelection(cell) { // checks if cells row is selected and unselects -> imitates columns which dont trigger row selection // but actually just revert it after the fact @@ -1104,9 +1088,7 @@ export const AbgabetoolMitarbeiter = { return str }, isPastDate(date) { - const deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day'); - const nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna'); - return nowInVienna > deadline; + return getNow() > toDateTime(date).endOf("day"); }, setDetailComponent(details){ this.loading=true diff --git a/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js b/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js index 1c00c21e9..d203c8877 100644 --- a/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js +++ b/public/js/components/Cis/Abgabetool/AbgabetoolStudent.js @@ -4,6 +4,7 @@ import ApiAuthinfo from '../../../api/factory/authinfo.js'; import BsModal from "../../Bootstrap/Modal.js"; import FhcOverlay from "../../Overlay/FhcOverlay.js"; import { getDateStyleClass} from "./getDateStyleClass.js"; +import { getNow, toDateTime } from "../../../helpers/DateHelpers.js"; import { validateThesisTitle } from './titleValidation.js' export const AbgabetoolStudent = { @@ -171,9 +172,7 @@ export const AbgabetoolStudent = { return qgate1positiv && qgate2positiv }, isPastDate(date) { - const deadline = luxon.DateTime.fromISO(date, { zone: 'Europe/Vienna' }).endOf('day'); - const nowInVienna = luxon.DateTime.now().setZone('Europe/Vienna'); - return nowInVienna > deadline; + return getNow() > toDateTime(date).endOf("day"); }, setDetailComponent(details){ this.loading = true diff --git a/public/js/components/Cis/Abgabetool/dateUtils.js b/public/js/components/Cis/Abgabetool/dateUtils.js deleted file mode 100644 index 65971cf0a..000000000 --- a/public/js/components/Cis/Abgabetool/dateUtils.js +++ /dev/null @@ -1,33 +0,0 @@ -const zone = 'Europe/Vienna'; - -export function getViennaTodayISO() { - return luxon.DateTime.now().setZone(zone).toISODate(); -} - -export function formatISODate(dateParam) { - if (!dateParam) return ''; - - const date = luxon.DateTime.fromISO(String(dateParam), { zone }); - return date.isValid ? date.toFormat('dd.MM.yyyy') : ''; -} - -export function formatDateTime(dateParam) { - if (!dateParam) return ''; - - const date = luxon.DateTime.fromSQL(dateParam); - return date.isValid ? date.toFormat("dd.MM.yyyy HH:mm") : ''; -} - -export function toViennaDate(dateParam) { - if (!dateParam) return null; - - return luxon.DateTime.fromISO(String(dateParam), { zone }); -} - -export function compareISODateValues(a, b) { - if (!a && !b) return 0; - if (!a) return 1; - if (!b) return -1; - - return String(a).localeCompare(String(b)); -} diff --git a/public/js/components/Cis/Abgabetool/getDateStyleClass.js b/public/js/components/Cis/Abgabetool/getDateStyleClass.js index b6d8e3b78..823019920 100644 --- a/public/js/components/Cis/Abgabetool/getDateStyleClass.js +++ b/public/js/components/Cis/Abgabetool/getDateStyleClass.js @@ -1,12 +1,12 @@ -const zone = 'Europe/Vienna'; +import { getNow, toDateTime } from "../../../helpers/DateHelpers.js"; export function getDateStyleClass(termin, notenOptions) { - const today = luxon.DateTime.now().setZone(zone); - const datum = luxon.DateTime.fromISO(termin.datum, { zone }).endOf('day'); - const abgabedatum = termin.abgabedatum ? luxon.DateTime.fromISO(termin.abgabedatum, { zone }) : null; - termin.diffindays = datum.diff(today, 'days').days; - const isLate = abgabedatum && abgabedatum > datum; + const today = getNow(); + const datum = toDateTime(termin.datum)?.endOf('day'); + const abgabedatum = toDateTime(termin.abgabedatum); + termin.diffindays = datum ? datum.diff(today, 'days').days : NaN; + const isLate = abgabedatum && datum && abgabedatum > datum; // GRADE STATUS if (termin.note) { diff --git a/public/js/components/Cis/Mylv/LvInfo.js b/public/js/components/Cis/Mylv/LvInfo.js index 4fdbb695d..6cd557ba5 100644 --- a/public/js/components/Cis/Mylv/LvInfo.js +++ b/public/js/components/Cis/Mylv/LvInfo.js @@ -1,4 +1,4 @@ -import { numberPadding, formatDate } from "../../../helpers/DateHelpers.js" +import { formatDate, formatTime } from "../../../helpers/DateHelpers.js" export default { props: { @@ -25,27 +25,14 @@ export default { return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + `/CisVue/Cms/content/${this.event.ort_content_id}` }, start_time: function () { - if (!this.event.start) return 'N/A'; - if (!this.event.start instanceof Date) { - return this.event.start; - } - return numberPadding(this.event.start.getHours()) + ":" + numberPadding(this.event.start.getMinutes()); + return this.event.start ? formatTime(this.event.start) : 'N/A'; }, end_time: function () { - if (!this.event.end) return 'N/A'; - if (!this.event.end instanceof Date) { - return this.event.end; - } - return numberPadding(this.event.end.getHours()) + ":" + numberPadding(this.event.end.getMinutes()); + return this.event.end ? formatTime(this.event.end) : 'N/A'; } }, methods: { - mehtodNumberPadding: function (number) { - return numberPadding(number); - }, - methodFormatDate: function (d) { - return formatDate(d); - }, + methodFormatDate: formatDate, }, template:/*html*/`