[WIP] Add/Edit Maintenance with new UI and recurring

pull/1213/head
Louis Lam 2 years ago
parent 9d99c39f30
commit f11dfc8f43

@ -4,6 +4,8 @@ let timezone = require("dayjs/plugin/timezone");
dayjs.extend(utc); dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);
const { BeanModel } = require("redbean-node/dist/bean-model"); const { BeanModel } = require("redbean-node/dist/bean-model");
const { parseVueDatePickerTimeFormat, parseTimeFormatFromVueDatePicker } = require("../../src/util");
const { isArray } = require("chart.js/helpers");
class Maintenance extends BeanModel { class Maintenance extends BeanModel {
@ -13,15 +15,52 @@ class Maintenance extends BeanModel {
* @returns {Object} * @returns {Object}
*/ */
async toPublicJSON() { async toPublicJSON() {
return {
let dateTimeRange = [];
if (this.start_datetime) {
dateTimeRange.push( this.start_datetime);
if (this.end_datetime) {
dateTimeRange.push( this.end_datetime);
}
}
let dateRange = [];
if (this.start_date) {
dateRange.push( this.start_date);
if (this.end_date) {
dateRange.push( this.end_date);
}
}
let timeRange = [];
let startTime = parseVueDatePickerTimeFormat(this.start_time);
timeRange.push(startTime);
let endTime = parseVueDatePickerTimeFormat(this.end_time);
timeRange.push(endTime);
let obj = {
id: this.id, id: this.id,
title: this.title, title: this.title,
description: this.description, description: this.description,
start_date: this.start_date,
end_date: this.end_date,
strategy: this.strategy, strategy: this.strategy,
intervalDay: this.interval_day,
active: !!this.active, active: !!this.active,
dateTimeRange: dateTimeRange,
dateRange: dateRange,
timeRange: timeRange,
weekdays: (this.weekdays) ? JSON.parse(this.weekdays) : [],
daysOfMonth: (this.days_of_month) ? JSON.parse(this.days_of_month) : [],
}; };
if (!isArray(obj.weekdays)) {
obj.weekdays = [];
}
if (!isArray(obj.daysOfMonth)) {
obj.daysOfMonth = [];
}
return obj;
} }
/** /**
@ -31,6 +70,42 @@ class Maintenance extends BeanModel {
async toJSON() { async toJSON() {
return this.toPublicJSON(); return this.toPublicJSON();
} }
static jsonToBean(bean, obj) {
if (obj.id) {
bean.id = obj.id;
}
bean.title = obj.title;
bean.description = obj.description;
bean.strategy = obj.strategy;
bean.interval_day = obj.intervalDay;
bean.active = obj.active;
if (obj.dateRange[0]) {
bean.start_date = obj.dateRange[0];
if (obj.dateRange[1]) {
bean.end_date = obj.dateRange[1];
}
}
if (obj.dateTimeRange[0]) {
bean.start_datetime = obj.dateTimeRange[0];
if (obj.dateTimeRange[1]) {
bean.end_datetime = obj.dateTimeRange[1];
}
}
bean.start_time = parseTimeFormatFromVueDatePicker(obj.timeRange[0]);
bean.end_time = parseTimeFormatFromVueDatePicker(obj.timeRange[1]);
bean.weekdays = JSON.stringify(obj.weekdays);
bean.days_of_month = JSON.stringify(obj.daysOfMonth);
return bean;
}
} }
module.exports = Maintenance; module.exports = Maintenance;

@ -3,6 +3,7 @@ const { log } = require("../../src/util");
const { R } = require("redbean-node"); const { R } = require("redbean-node");
const apicache = require("../modules/apicache"); const apicache = require("../modules/apicache");
const { UptimeKumaServer } = require("../uptime-kuma-server"); const { UptimeKumaServer } = require("../uptime-kuma-server");
const Maintenance = require("../model/maintenance");
const server = UptimeKumaServer.getInstance(); const server = UptimeKumaServer.getInstance();
/** /**
@ -14,9 +15,10 @@ module.exports.maintenanceSocketHandler = (socket) => {
socket.on("addMaintenance", async (maintenance, callback) => { socket.on("addMaintenance", async (maintenance, callback) => {
try { try {
checkLogin(socket); checkLogin(socket);
let bean = R.dispense("maintenance");
bean.import(maintenance); log.debug("maintenance", maintenance);
let bean = Maintenance.jsonToBean(R.dispense("maintenance"), maintenance);
bean.user_id = socket.userID; bean.user_id = socket.userID;
let maintenanceID = await R.store(bean); let maintenanceID = await R.store(bean);
@ -47,10 +49,7 @@ module.exports.maintenanceSocketHandler = (socket) => {
throw new Error("Permission denied."); throw new Error("Permission denied.");
} }
bean.title = maintenance.title; Maintenance.jsonToBean(bean, maintenance);
bean.description = maintenance.description;
bean.start_date = maintenance.start_date;
bean.end_date = maintenance.end_date;
await R.store(bean); await R.store(bean);

@ -366,10 +366,9 @@ export default {
description: "", description: "",
strategy: "single", strategy: "single",
active: 1, active: 1,
recurringStartDate: this.$root.date(dayjs()),
recurringEndDate: "",
intervalDay: 1, intervalDay: 1,
dateTimeRange: [ this.minDate ], dateTimeRange: [ this.minDate ],
dateRange: [],
timeRange: [{ timeRange: [{
hours: 2, hours: 2,
minutes: 0, minutes: 0,
@ -426,6 +425,8 @@ export default {
return this.processing = false; return this.processing = false;
} }
/*
TODO: Temporary disable
if (this.maintenance.start_date >= this.maintenance.end_date) { if (this.maintenance.start_date >= this.maintenance.end_date) {
toast.error(this.$t("maintenanceInvalidDate")); toast.error(this.$t("maintenanceInvalidDate"));
return this.processing = false; return this.processing = false;
@ -438,6 +439,7 @@ export default {
this.maintenance.start_date = this.$root.toUTC(this.maintenance.start_date); this.maintenance.start_date = this.$root.toUTC(this.maintenance.start_date);
this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date); this.maintenance.end_date = this.$root.toUTC(this.maintenance.end_date);
*/
if (this.isAdd) { if (this.isAdd) {
this.$root.addMaintenance(this.maintenance, async (res) => { this.$root.addMaintenance(this.maintenance, async (res) => {

@ -7,7 +7,7 @@
// Backend uses the compiled file util.js // Backend uses the compiled file util.js
// Frontend uses util.ts // Frontend uses util.ts
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0; exports.parseTimeFormatFromVueDatePicker = exports.parseVueDatePickerTimeFormat = exports.getMaintenanceRelativeURL = exports.getMonitorRelativeURL = exports.genSecret = exports.getCryptoRandomInt = exports.getRandomInt = exports.getRandomArbitrary = exports.TimeLogger = exports.polyfill = exports.log = exports.debug = exports.ucfirst = exports.sleep = exports.flipStatus = exports.STATUS_PAGE_MAINTENANCE = exports.STATUS_PAGE_PARTIAL_DOWN = exports.STATUS_PAGE_ALL_UP = exports.STATUS_PAGE_ALL_DOWN = exports.MAINTENANCE = exports.PENDING = exports.UP = exports.DOWN = exports.appName = exports.isDev = void 0;
const _dayjs = require("dayjs"); const _dayjs = require("dayjs");
const dayjs = _dayjs; const dayjs = _dayjs;
exports.isDev = process.env.NODE_ENV === "development"; exports.isDev = process.env.NODE_ENV === "development";
@ -309,3 +309,45 @@ function getMaintenanceRelativeURL(id) {
return "/maintenance/" + id; return "/maintenance/" + id;
} }
exports.getMaintenanceRelativeURL = getMaintenanceRelativeURL; exports.getMaintenanceRelativeURL = getMaintenanceRelativeURL;
/**
* Parse to Time Object that used in VueDatePicker
* @param {string} time E.g. 12:00
* @returns object
*/
function parseVueDatePickerTimeFormat(time) {
if (!time) {
return {
hours: 0,
minutes: 0,
};
}
let array = time.split(":");
if (array.length < 2) {
throw new Error("parseVueDatePickerTimeFormat: Invalid Time");
}
let obj = {
hours: parseInt(array[0]),
minutes: parseInt(array[1]),
seconds: 0,
};
if (array.length >= 3) {
obj.seconds = parseInt(array[2]);
}
return obj;
}
exports.parseVueDatePickerTimeFormat = parseVueDatePickerTimeFormat;
/**
* @returns string e.g. 12:00
*/
function parseTimeFormatFromVueDatePicker(obj) {
if (!obj) {
return obj;
}
let result = "";
result += obj.hours.toString().padStart(2, "0") + ":" + obj.minutes.toString().padStart(2, "0");
if (obj.seconds) {
result += ":" + obj.seconds.toString().padStart(2, "0");
}
return result;
}
exports.parseTimeFormatFromVueDatePicker = parseTimeFormatFromVueDatePicker;

@ -342,3 +342,52 @@ export function getMonitorRelativeURL(id: string) {
export function getMaintenanceRelativeURL(id: string) { export function getMaintenanceRelativeURL(id: string) {
return "/maintenance/" + id; return "/maintenance/" + id;
} }
/**
* Parse to Time Object that used in VueDatePicker
* @param {string} time E.g. 12:00
* @returns object
*/
export function parseVueDatePickerTimeFormat(time: string) {
if (!time) {
return {
hours: 0,
minutes: 0,
};
}
let array = time.split(":");
if (array.length < 2) {
throw new Error("parseVueDatePickerTimeFormat: Invalid Time");
}
let obj = {
hours: parseInt(array[0]),
minutes: parseInt(array[1]),
seconds: 0,
}
if (array.length >= 3) {
obj.seconds = parseInt(array[2]);
}
return obj;
}
/**
* @returns string e.g. 12:00
*/
export function parseTimeFormatFromVueDatePicker(obj : any) {
if (!obj) {
return obj;
}
let result = "";
result += obj.hours.toString().padStart(2, "0") + ":" + obj.minutes.toString().padStart(2, "0")
if (obj.seconds) {
result += ":" + obj.seconds.toString().padStart(2, "0")
}
return result;
}

Loading…
Cancel
Save