diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 5d255614d..e9f4c029e 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -1,3 +1,4 @@ +import { Utils } from '/client/lib/utils'; import moment from 'moment/min/moment-with-locales'; import { TAPi18n } from '/imports/i18n'; import { DatePicker } from '/client/lib/datepicker'; diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js index f298a752d..83a202134 100644 --- a/client/lib/datepicker.js +++ b/client/lib/datepicker.js @@ -83,7 +83,8 @@ export class DatePicker extends BlazeComponent { { 'keyup .js-date-field'() { // parse for localized date format in strict mode - const dateMoment = moment(this.find('#date').value, 'L', true); + const normalizedValue = Utils.normalizeDigits(this.find('#date').value); + const dateMoment = moment(normalizedValue, 'L', true); if (dateMoment.isValid()) { this.error.set(''); this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); @@ -91,9 +92,10 @@ export class DatePicker extends BlazeComponent { }, 'keyup .js-time-field'() { // parse for localized time format in strict mode + const normalizedValue = Utils.normalizeDigits(this.find('#time').value); const dateMoment = moment( - this.find('#time').value, - adjustedTimeFormat(), + normalizedValue, + adjustedTimeFormat(), true, ); if (dateMoment.isValid()) { @@ -104,12 +106,14 @@ export class DatePicker extends BlazeComponent { evt.preventDefault(); // if no time was given, init with 12:00 + const timeValue = Utils.normalizeDigits(evt.target.time.value); const time = - evt.target.time.value || - moment(new Date().setHours(12, 0, 0)).format('LT'); + timeValue || + moment(new Date().setHours(12, 0, 0)).format('LT'); const newTime = moment(time, adjustedTimeFormat(), true); - const newDate = moment(evt.target.date.value, 'L', true); - const dateString = `${evt.target.date.value} ${time}`; + const dateValue = Utils.normalizeDigits(evt.target.date.value); + const newDate = moment(dateValue, 'L', true); + const dateString = ${dateValue} ${time}; const newCompleteDate = moment( dateString, `L ${adjustedTimeFormat()}`, diff --git a/client/lib/utils.js b/client/lib/utils.js index 15896e5c3..c2cd8886d 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -11,6 +11,17 @@ Utils = { currentBoard.setColor(currentBoard["background-color"]); } }, + // Normalize non-Western (Persian/Arabic) digits to Western Arabic (0-9) + // This helps with date parsing in non-English languages + normalizeDigits(str) { + if (!str) return str; + const persian = [/۰/g, /۱/g, /۲/g, /۳/g, /۴/g, /۵/g, /۶/g, /۷/g, /۸/g, /۹/g]; + const arabic = [/٠/g, /١/g, /٢/g, /٣/g, /٤/g, /٥/g, /٦/g, /٧/g, /٨/g, /٩/g]; + for (let i = 0; i < 10; i++) { + str = str.replace(persian[i], i).replace(arabic[i], i); + } + return str; + }, /** returns the current board id *