diff --git a/client/plugins/format-date-safe.client.js b/client/plugins/format-date-safe.client.js new file mode 100644 index 000000000..bd11a9569 --- /dev/null +++ b/client/plugins/format-date-safe.client.js @@ -0,0 +1,37 @@ +// Wrap app.$formatDate to accept ISO strings / numbers safely +import Vue from 'vue' +import { parseISO, isValid } from 'date-fns' +import format from 'date-fns/format' + +export default ({ app }) => { + const use = (impl) => (v, p) => { + let d = v instanceof Date ? v : null + if (!d && typeof v === 'string') { + const k = parseISO(v) + if (isValid(k)) d = k + } + if (!d && (typeof v === 'number' || typeof v === 'string')) { + const k = new Date(v) + if (isValid(k)) d = k + } + if (!d) return '' + try { + return impl(d, p) + } catch { + try { + return format(d, p || 'yyyy-MM-dd') + } catch { + return '' + } + } + } + if (typeof app.$formatDate === 'function') { + const safe = use((d, p) => app.$formatDate(d, p)) + app.$formatDate = safe + Vue.prototype.$formatDate = safe + } else { + const safe = use((d, p) => format(d, p || 'yyyy-MM-dd')) + app.$formatDate = safe + Vue.prototype.$formatDate = safe + } +}