feat: in filed date & time calculations; eg 2024-12-01 + 5d (#27534)

* feat: add and subtract datetime

* fix: time picker doesn't show correct value

* style: pre-commit

* Revert "fix: time picker doesn't show correct value"

This reverts commit e0650d11252462cba4a9296aa9a4ea8f256c503a.
This commit is contained in:
Ponnusamy 2024-10-11 14:08:24 +05:30 committed by GitHub
parent fe3e22efc9
commit faefcd12b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 75 additions and 3 deletions

View file

@ -142,12 +142,84 @@ frappe.ui.form.ControlDate = class ControlDate extends frappe.ui.form.ControlDat
}
});
}
eval_expression(value, type) {
if (!value || !type) {
return value;
}
const parsed_components = value.match(/[\+\-]\s*\d*\.?\d+\s*[a-zA-Z]/g);
let system_fmt;
switch (type) {
case "date":
system_fmt = "YYYY-MM-DD";
value = frappe.datetime.user_to_str(value, false);
break;
case "time":
system_fmt = "HH:mm:ss";
value = frappe.datetime.user_to_str(value, true);
break;
case "datetime":
system_fmt = "YYYY-MM-DD HH:mm:ss";
value = frappe.datetime.user_to_str(value, false);
break;
}
if (!parsed_components) {
return value;
}
let time_to_add = {};
parsed_components.forEach((component) => {
let operator = component.match(/[\+\-]/)[0];
let number = flt(component.match(/\d*\.?\d+/)[0]);
let unit = component.match(/[a-zA-Z]+/)[0];
let period;
if (operator === "-") {
number = -number;
}
if (["datetime", "date"].includes(type)) {
if (unit.toLowerCase() === "d") {
period = "days";
} else if (unit === "M") {
period = "months";
} else if (unit.toLowerCase() === "y") {
period = "years";
}
}
if (["datetime", "time"].includes(type)) {
if (unit.toLowerCase() === "h") {
period = "hours";
} else if (unit === "m") {
period = "minutes";
} else if (unit.toLowerCase() === "s") {
period = "seconds";
}
}
if (period) {
time_to_add[period] = (time_to_add[period] || 0) + number;
}
});
if (Object.keys(time_to_add).length) {
value = moment(value, system_fmt).add(time_to_add).format(system_fmt);
}
return value;
}
parse(value) {
if (value) {
if (value == "Invalid date") {
return "";
}
return frappe.datetime.user_to_str(value, false, true);
return this.eval_expression(value, "date");
}
}
format_for_input(value) {

View file

@ -37,7 +37,7 @@ frappe.ui.form.ControlDatetime = class ControlDatetime extends frappe.ui.form.Co
}
parse(value) {
if (value) {
value = frappe.datetime.user_to_str(value, false);
value = this.eval_expression(value, "datetime");
if (!frappe.datetime.is_system_time_zone()) {
value = frappe.datetime.convert_to_system_tz(value, true);

View file

@ -107,7 +107,7 @@ frappe.ui.form.ControlTime = class ControlTime extends frappe.ui.form.ControlDat
if (value == "Invalid date") {
value = "";
}
return frappe.datetime.user_to_str(value, true);
return this.eval_expression(value, "time");
}
}
format_for_input(value) {