70 lines
1.9 KiB
JavaScript
70 lines
1.9 KiB
JavaScript
const DATE_ONLY_RE = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
|
|
|
|
export function resolveAutoFillValue(item, form = {}) {
|
|
const rule = item && item.autoFill;
|
|
if (!rule || !rule.sourceField || !rule.type) return undefined;
|
|
|
|
const sourceValue = form ? form[rule.sourceField] : '';
|
|
if (!sourceValue) return '';
|
|
|
|
if (rule.type === 'addDays') {
|
|
const days = Number(rule.days);
|
|
if (!Number.isFinite(days)) return '';
|
|
return addDays(sourceValue, days);
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export function collectAutoFillChanges(items = [], form = {}) {
|
|
if (!Array.isArray(items)) return [];
|
|
|
|
return items.reduce((changes, item) => {
|
|
if (!item || !item.title) return changes;
|
|
|
|
const nextValue = resolveAutoFillValue(item, form);
|
|
if (nextValue === undefined) return changes;
|
|
|
|
const currentValue = form && form[item.title] !== undefined && form[item.title] !== null
|
|
? String(form[item.title])
|
|
: '';
|
|
if (currentValue !== nextValue) {
|
|
changes.push({ title: item.title, value: nextValue });
|
|
}
|
|
return changes;
|
|
}, []);
|
|
}
|
|
|
|
function addDays(value, days) {
|
|
const date = parseDateOnly(value);
|
|
if (!date) return '';
|
|
date.setUTCDate(date.getUTCDate() + days);
|
|
return formatDateOnly(date);
|
|
}
|
|
|
|
function parseDateOnly(value) {
|
|
const match = String(value || '').trim().match(DATE_ONLY_RE);
|
|
if (!match) return null;
|
|
|
|
const year = Number(match[1]);
|
|
const month = Number(match[2]);
|
|
const day = Number(match[3]);
|
|
const date = new Date(Date.UTC(year, month - 1, day));
|
|
|
|
if (
|
|
date.getUTCFullYear() !== year ||
|
|
date.getUTCMonth() !== month - 1 ||
|
|
date.getUTCDate() !== day
|
|
) {
|
|
return null;
|
|
}
|
|
return date;
|
|
}
|
|
|
|
function formatDateOnly(date) {
|
|
const year = date.getUTCFullYear();
|
|
const month = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
const day = String(date.getUTCDate()).padStart(2, '0');
|
|
return `${year}-${month}-${day}`;
|
|
}
|