diff --git a/CHANGELOG.md b/CHANGELOG.md index bbd9d9f..0df95e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.36.1] - 2026-04-29 + +### Fixed +- Date input: default date format changed from US (`MM/DD/YYYY`) to day-month-year (`DD.MM.YYYY`) for new users +- Date input: dot-separated dates (`DD.MM.YYYY`) are now accepted in addition to slash-separated dates +- Date input: `dmy` placeholder and display format updated to use dots instead of slashes + ## [0.36.0] - 2026-04-29 ### Added diff --git a/package-lock.json b/package-lock.json index 22c7f40..e22e06c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "oikos", - "version": "0.36.0", + "version": "0.36.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oikos", - "version": "0.36.0", + "version": "0.36.1", "license": "MIT", "dependencies": { "bcrypt": "^6.0.0", diff --git a/package.json b/package.json index cb05482..9f3a45f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oikos", - "version": "0.36.0", + "version": "0.36.1", "description": "Self-hosted family planner - calendar, tasks, shopping, meal planning, budget and more. Private, open-source, no subscription.", "main": "server/index.js", "type": "module", diff --git a/public/i18n.js b/public/i18n.js index 9228070..ee3f587 100644 --- a/public/i18n.js +++ b/public/i18n.js @@ -9,7 +9,7 @@ const SUPPORTED_LOCALES = ['de', 'en', 'es', 'fr', 'it', 'sv', 'el', 'ru', 'tr', const DEFAULT_LOCALE = 'de'; const STORAGE_KEY = 'oikos-locale'; const DATE_FORMAT_KEY = 'oikos-date-format'; -const DEFAULT_DATE_FORMAT = 'mdy'; +const DEFAULT_DATE_FORMAT = 'dmy'; let currentLocale = DEFAULT_LOCALE; let translations = {}; @@ -100,7 +100,7 @@ function formatDateParts(date, useUtc = false) { const month = String((useUtc ? d.getUTCMonth() : d.getMonth()) + 1).padStart(2, '0'); const day = String(useUtc ? d.getUTCDate() : d.getDate()).padStart(2, '0'); switch (getDateFormatPreference()) { - case 'dmy': return `${day}/${month}/${year}`; + case 'dmy': return `${day}.${month}.${year}`; case 'ymd': return `${year}-${month}-${day}`; default: return `${month}/${day}/${year}`; } @@ -127,7 +127,7 @@ export function formatDate(date) { export function dateInputPlaceholder() { switch (getDateFormatPreference()) { - case 'dmy': return 'DD/MM/YYYY'; + case 'dmy': return 'DD.MM.YYYY'; case 'ymd': return 'YYYY-MM-DD'; default: return 'MM/DD/YYYY'; } @@ -145,7 +145,7 @@ export function parseDateInput(value) { const isoMatch = raw.match(/^(\d{4})-(\d{2})-(\d{2})$/); if (isoMatch) return isValidDateParts(isoMatch[1], isoMatch[2], isoMatch[3]) ? raw : ''; - const slashMatch = raw.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/); + const slashMatch = raw.match(/^(\d{1,2})[\/.](\d{1,2})[\/.](\d{4})$/); if (!slashMatch) return ''; const [, first, second, year] = slashMatch;